개편된 문제


<?php
  include "../../config.php";
  if($_GET['view-source'] == 1) view_source();
?><html>
<head>
<title>Challenge 4</title>
<style type="text/css">
body { background:black; color:white; font-size:9pt; }
table { color:white; font-size:10pt; }
</style>
</head>
<body><br><br>
<center>
<?php
  sleep(1); // anti brute force
  if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4);
  $hash = rand(10000000,99999999)."salt_for_you";
  $_SESSION['chall4'] = $hash;
  for($i=0;$i<500;$i++) $hash = sha1($hash);
?><br>
<form method=post>
<table border=0 align=center cellpadding=10>
<tr><td colspan=3 style=background:silver;color:green;><b><?=$hash?></b></td></tr>
<tr align=center><td>Password</td><td><input name=key type=text size=30></td><td><input type=submit></td></tr>
</table>
</form>
<a href=?view-source=1>[view-source]</a>
</center>
</body>
</html>


1. rand(10000000,99999999)로 나온 값과 "salt_for_you"라는 값을 받아 $hash에 저장합니다.

2. 이후 $hash 값을 sha1 해쉬값으로 500회 반복하여 만듭니다.

3. 세션의 chall4의 값과 만들어진 hash 값이 같으면 문제가 풀립니다.


위의 순서는 코드와는 조금 상이하나, 전체적인 흐름은 맞을 겁니다.


원래는 Rainbow Table을 만들어서 해당하는 값을 찾아내는 Dictionary Bruteforce 공격을 수행하는 것이 정석이지만.

저는 multiprocessing을 이용하여 해당 세션이 만료되기 전에 계산을 하는 python 소스로 공격을 수행하였습니다.


사진에서 나오는 해쉬값을 받아서 계속해서 비교하는 소스입니다.


단, 해당 소스를 실행하기 위해서는 Memory 오류가 날 수 있으니 반드시 Python3 64bit로 실행해주시기 바랍니다.

또한 메모리에 대략 8GB 정도 올라가기 때문에 가능하면 16GB 이상에서 돌릴 것을 당부드립니다. ㅎㅎ

#!/bin/python3
import hashlib
from   multiprocessing import Pool

def sha1_500(string):
    answer = "Your_Hash_Value"
    b  = string
    for i in range(500):
        string = hashlib.sha1(string.encode()).hexdigest()
    if answer == string:
        return b
    else:
        return 'a'


def main():
    answer = "Your_Hash_Value"
    ps_cnt = 8*1
    count  = 0
    pool   = Pool(processes=ps_cnt)

    data   = pool.map(sha1_500, [str(s)+"salt_for_you" for s in range(10000000,99999999)])
    data.sort()

    print("[+] Find Result : ", data[-1])
    print("[+] Find Result : ", data[0] )


if __name__ == "__main__": 
    main()    


위의 소스로는 시간이 꽤 걸릴 것입니다.

만약 rainbow table을 미리 생성하는 소스를 작성하여 실행한 후, 이를 통해 데이터를 쭉 비교하는 것과 비슷한 시간이 걸릴 것으로 예상됩니다.




 

 개편되기 전 문제


[그림 01] level4 시작화면


[그림 01]에서 나타난 위의 문자열을 Decrypt 해야할 것만 같습니다.


맨 뒤에 == 이 있고, 영어 대/소문자, 숫자로 된 문자열을 보아하니 BASE64가 틀림이 없습니다.

BASE64로 디코드해보면, c4033bff94b567a190e33faa551f411caef444f2(40바이트)로 디코딩 됩니다.

40바이트의 해시가 어떤 게 있는가 함을 보니 SHA1이 있습니다.

SHA1으로 c4033bff94b567a190e33faa551f411caef444f2를 디코드 해보면, a94a8fe5ccb19ba61c4c0873d391e987982fbbd3(40바이트)로 디코드 됩니다.

이것도 40바이트로 나오는 걸 보니 SHA1으로 다시 한 번 디코드 해야 할 것 같습니다.

a94a8fe5ccb19ba61c4c0873d391e987982fbbd3를 SHA1으로 디코드하면, test라는 값을 얻을 수 있습니다.


<<해쉬가 이루어지는 과정>>

01. YzQwMzNiZmY5NGI1NjdhMTkwZTMzZmFhNTUxZjQxMWNhZWY0NDRmMg==

02. c4033bff94b567a190e33faa551f411caef444f2

03. a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

04. test



답 : test


처음 SHA1으로 디코딩 했을 때 답이 안 나오는 걸 보니 이게 SHA1이 아닌가 했지만, 다시 40바이트로 나오는 걸 보고 재 디코드 해보았습니다.

하마터면 삽질을 할 뻔 했습니다. 시간을 효율적으로!!

'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.15(50) - old  (0) 2016.06.28
Webhacking.kr_No.14(100) - old  (0) 2016.06.28
Webhacking.kr_No.12(250) - old  (0) 2016.06.28
Webhacking.kr_No.10(250) - old  (0) 2016.06.28
Webhacking.kr_No.06(100) - old  (0) 2016.06.28
Webhacking.kr_No.05(300) - old  (0) 2016.06.26
Webhacking.kr_No.03(350) - old  (0) 2016.06.16
Webhacking.kr_No.01(200) - old  (0) 2016.06.16

+ Recent posts