webhacking.kr - old 06 (base64)

2024. 3. 6. 13:01·Wargame/Webhacking.kr

 

 

문제를 들어가면 ID : guest , PW : 123 qwe로 되어있다 

 

view-source를 클릭해서 소스코드를 봐보자.

 

 

 

 

 

<?php
include "../../config.php";
if($_GET['view_source']) view_source();
if(!$_COOKIE['user']){
  $val_id="guest";
  $val_pw="123qwe";
  for($i=0;$i<20;$i++){
    $val_id=base64_encode($val_id);
    $val_pw=base64_encode($val_pw);
  }
  $val_id=str_replace("1","!",$val_id);
  $val_id=str_replace("2","@",$val_id);
  $val_id=str_replace("3","$",$val_id);
  $val_id=str_replace("4","^",$val_id);
  $val_id=str_replace("5","&",$val_id);
  $val_id=str_replace("6","*",$val_id);
  $val_id=str_replace("7","(",$val_id);
  $val_id=str_replace("8",")",$val_id);

  $val_pw=str_replace("1","!",$val_pw);
  $val_pw=str_replace("2","@",$val_pw);
  $val_pw=str_replace("3","$",$val_pw);
  $val_pw=str_replace("4","^",$val_pw);
  $val_pw=str_replace("5","&",$val_pw);
  $val_pw=str_replace("6","*",$val_pw);
  $val_pw=str_replace("7","(",$val_pw);
  $val_pw=str_replace("8",")",$val_pw);

  Setcookie("user",$val_id,time()+86400,"/challenge/web-06/");
  Setcookie("password",$val_pw,time()+86400,"/challenge/web-06/");
  echo("<meta http-equiv=refresh content=0>");
  exit;
}
?>
<html>
<head>
<title>Challenge 6</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<?php
$decode_id=$_COOKIE['user'];
$decode_pw=$_COOKIE['password'];

$decode_id=str_replace("!","1",$decode_id);
$decode_id=str_replace("@","2",$decode_id);
$decode_id=str_replace("$","3",$decode_id);
$decode_id=str_replace("^","4",$decode_id);
$decode_id=str_replace("&","5",$decode_id);
$decode_id=str_replace("*","6",$decode_id);
$decode_id=str_replace("(","7",$decode_id);
$decode_id=str_replace(")","8",$decode_id);

$decode_pw=str_replace("!","1",$decode_pw);
$decode_pw=str_replace("@","2",$decode_pw);
$decode_pw=str_replace("$","3",$decode_pw);
$decode_pw=str_replace("^","4",$decode_pw);
$decode_pw=str_replace("&","5",$decode_pw);
$decode_pw=str_replace("*","6",$decode_pw);
$decode_pw=str_replace("(","7",$decode_pw);
$decode_pw=str_replace(")","8",$decode_pw);

for($i=0;$i<20;$i++){
  $decode_id=base64_decode($decode_id);
  $decode_pw=base64_decode($decode_pw);
}

echo("<hr><a href=./?view_source=1 style=color:yellow;>view-source</a><br><br>");
echo("ID : $decode_id<br>PW : $decode_pw<hr>");

if($decode_id=="admin" && $decode_pw=="nimda"){
  solve(6);
}
?>
</body>
</html>

 

 

php 코드가 나와있다.

먼저 위에 있는 php에 주요 코드를 한번 읽어보자.

 

<?php
include "../../config.php";
if($_GET['view_source']) view_source();
if(!$_COOKIE['user']){
  $val_id="guest";
  $val_pw="123qwe";
  for($i=0;$i<20;$i++){
    $val_id=base64_encode($val_id);
    $val_pw=base64_encode($val_pw);
  }
  $val_id=str_replace("1","!",$val_id);
  $val_id=str_replace("2","@",$val_id);
  $val_id=str_replace("3","$",$val_id);
  $val_id=str_replace("4","^",$val_id);
  $val_id=str_replace("5","&",$val_id);
  $val_id=str_replace("6","*",$val_id);
  $val_id=str_replace("7","(",$val_id);
  $val_id=str_replace("8",")",$val_id);

  $val_pw=str_replace("1","!",$val_pw);
  $val_pw=str_replace("2","@",$val_pw);
  $val_pw=str_replace("3","$",$val_pw);
  $val_pw=str_replace("4","^",$val_pw);
  $val_pw=str_replace("5","&",$val_pw);
  $val_pw=str_replace("6","*",$val_pw);
  $val_pw=str_replace("7","(",$val_pw);
  $val_pw=str_replace("8",")",$val_pw);

  Setcookie("user",$val_id,time()+86400,"/challenge/web-06/");
  Setcookie("password",$val_pw,time()+86400,"/challenge/web-06/");
  echo("<meta http-equiv=refresh content=0>");
  exit;
}
?>

 

 

위 코드를 보면 'guest' , '123 qwe'를 base64로 20번 인코딩하고 문자열(숫자) 들을 특수기호로 치환하여 쿠키값을 저장했음을 알 수 있다 그러면 현재 쿠키를 한번 살펴보자.

 

 

 

 

base64는 bandit에서 한번 풀어봤다.

https://grayom.tistory.com/12

 

리눅스 워게임 bandit (overthewire.org) 10 Level -> 11 Level

Level 9에서 가져온 키 값을 복사해서 bandit10에 접속해 보자 힌트도 한번 체크 base64로 인코딩된 데이터 가 data.txt 파일 안에 있다고 한다. base64라는 명령어가 키 포인트인 거 같다. 먼저 cat , file를

grayom.tistory.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

확인해 보니 엄청나게 긴 문자열을 볼 수 있다.

20번 반복했으니 그럴 만도 하다.

 

그럼 아래에 있는 php 코드를 확인해 보자.

 

 

 

 

 

 

 

<?php
$decode_id=$_COOKIE['user'];
$decode_pw=$_COOKIE['password'];

$decode_id=str_replace("!","1",$decode_id);
$decode_id=str_replace("@","2",$decode_id);
$decode_id=str_replace("$","3",$decode_id);
$decode_id=str_replace("^","4",$decode_id);
$decode_id=str_replace("&","5",$decode_id);
$decode_id=str_replace("*","6",$decode_id);
$decode_id=str_replace("(","7",$decode_id);
$decode_id=str_replace(")","8",$decode_id);

$decode_pw=str_replace("!","1",$decode_pw);
$decode_pw=str_replace("@","2",$decode_pw);
$decode_pw=str_replace("$","3",$decode_pw);
$decode_pw=str_replace("^","4",$decode_pw);
$decode_pw=str_replace("&","5",$decode_pw);
$decode_pw=str_replace("*","6",$decode_pw);
$decode_pw=str_replace("(","7",$decode_pw);
$decode_pw=str_replace(")","8",$decode_pw);

for($i=0;$i<20;$i++){
  $decode_id=base64_decode($decode_id);
  $decode_pw=base64_decode($decode_pw);
}

echo("<hr><a href=./?view_source=1 style=color:yellow;>view-source</a><br><br>");
echo("ID : $decode_id<br>PW : $decode_pw<hr>");

if($decode_id=="admin" && $decode_pw=="nimda"){
  solve(6);
}
?>

 

 

이 코드는 반대로 암호화된 쿠키값에 대한 복호화하는 코드인 거 같다.

 

중요한 점은 'admin' , 'nimda'라는 user값과 pw 값이다.

이 두 개에 문자열을 첫 번째 코드와 똑같이 20번의 base64로 인코딩 그리고 숫자를 특수문자기호로 바꾸는 작업을 하면 답이 나온다는 것이다.

 

 

힌트는 다 준 거 같다.

그러면 파이썬으로 한번 문제를 해결해 보자.

 

import base64

# 문자열을 Base64로 20번 인코딩하는 함수
def base64_encode_twenty_times(string):
    encoded_string = string.encode('utf-8')  # 문자열을 UTF-8로 인코딩하여 bytes로 변환
    for _ in range(20):  # 20번 반복
        encoded_string = base64.b64encode(encoded_string)  # Base64 인코딩
    return encoded_string.decode('utf-8')  # bytes를 다시 문자열로 디코딩하여 반환

# 문자열 치환 함수
def custom_replace(string):
    replacements = {
        '1': '!',
        '2': '@',
        '3': '$',
        '4': '^',
        '5': '&',
        '6': '*',
        '7': '(',
        '8': ')'
    }

    # 문자열을 순회하며 치환된 결과 생성
    replaced_string = ''
    for char in string:
        # 문자가 규칙에 맞는 경우 치환, 그렇지 않으면 그대로 유지
        replaced_string += replacements.get(char, char)
    
    return replaced_string

# 'admin'과 'nimda'를 Base64로 20번 인코딩하고 치환 적용
encoded_admin = base64_encode_twenty_times('admin')
encoded_nimda = base64_encode_twenty_times('nimda')

encoded_admin_replaced = custom_replace(encoded_admin)
encoded_nimda_replaced = custom_replace(encoded_nimda)


print("'admin':", encoded_admin_replaced)
print("'nimda':", encoded_nimda_replaced)

 

 

 

코드에 대한 설명은 주석으로 충분한 거 같다.

 

요약하자면 문자열 admin, nimda를 base64로 20번 인코딩 후 문자열 치환하여 출력이 전부다.

 

이제 다시 쿠키값으로 돌아가서 넣어보자.

 

password 쿠키값에는 nimda에 대한 값을 넣고

 

user 쿠키값에는 admin에 대한 값을 넣도록 하자.

 

코드를 자세히 보고싶은사람은 여기로 가시면 된다.

 

https://github.com/GrayOM/webhacking.kr_python

 

GitHub - GrayOM/webhacking.kr_python

Contribute to GrayOM/webhacking.kr_python development by creating an account on GitHub.

github.com

 

 

 

 

 

 

 

 

 

 

 

 

 

'Wargame > Webhacking.kr' 카테고리의 다른 글

webhacking.kr - old 18 (SQL Injection)  (0) 2024.03.06
webhacking.kr - old 16 (ASCII)  (0) 2024.03.06
webhacking.kr - old 14 (code)  (0) 2024.03.05
webhacking.kr - old 17 (Chrome Console)  (0) 2024.03.05
webhacking.kr - old15 (Javascript)  (0) 2024.03.05
'Wargame/Webhacking.kr' 카테고리의 다른 글
  • webhacking.kr - old 18 (SQL Injection)
  • webhacking.kr - old 16 (ASCII)
  • webhacking.kr - old 14 (code)
  • webhacking.kr - old 17 (Chrome Console)
G_OM
G_OM
최대한 설명 열심히 하려고 합니다. 궁금한 거 있으면 언제든지 물어보셔도 좋습니다.
  • G_OM
    끄적끄적
    G_OM
  • 전체
    오늘
    어제
    • 분류 전체보기 (157)
      • 모의해킹 (18)
      • CTF (22)
      • Wargame (69)
        • Linux_bandit (33)
        • Webhacking.kr (36)
      • DreamHack (52)
        • WEB (14)
        • Reverising (9)
        • System (0)
      • Mobile_security (13)
        • Drozer_Android (4)
        • Frida_Android (1)
        • IOS (1)
        • tool (1)
      • 정보보안기사 (2)
      • IT? (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

    • DreamHack 에 대한 문제들...
  • 인기 글

  • 태그

    워게임
    정보보안기사
    Android
    webhacking
    bandit17
    Dreamhack
    sql injection
    lfi
    Linux wargame
    drozer
    cookies
    bandit20
    bandit30
    OSINT
    php wrapper
    Frida
    insecurebankv2
    리눅스 워게임
    CTF
    url encode
    bandit18
    리눅스
    php
    webhacking.kr
    wargame
    bandit
    난독화
    모의해킹
    Linux
    overthewire
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
G_OM
webhacking.kr - old 06 (base64)
상단으로

티스토리툴바