Wargame/Webhacking.kr

webhacking.kr - old 06 (base64)

G_OM 2024. 3. 6. 13:01

 

 

문제를 들어가면 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