webhacking.kr - old 06 (base64)
문제를 들어가면 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에서 한번 풀어봤다.
리눅스 워게임 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