WarGame/Webhacking.kr

[Webhacking.kr] old-04 Answer

Old-04 Domain & Tool

  • 구분 : Rainbow Table
  • 문제풀이에 사용된 도구 
    • python 3.10
      • Module : requests

Old-04 Question & Answer

들어가면 딱봐도 해시값처럼 보이는 정보와 Password를 입력할 수 있는 Textfield가 있다. 아래 View source라는 태그도 보이니, 이번문제또한 코드를 읽고 푸는 문제라고 판단했다. 확인하면 아래와 같은 php코드를 볼 수 있다.

 

<?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>

중간의 코드만을 강조해서 한번만 다시보자

<?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);
?>

코드의 동작은 key라는 값이 post로 payload에 전달되면 그 값을 chall4라는 세션값과 비교한다. chall4는 10,000,000에서 99,999,999라는 값에 "salt_for_you"라는 값이 salting된 SHA1의 해시인데, 해시나온값을 피드백으로 500번 해싱을 반복한다. 그래서 문제는 화면에 보이는 값이 무엇을 해시한것인지 확인한느것이다.

 

맨처음에는 해시값을 계산하는 python스크립트를 짰다. 다만 평균적으로 5,000,000 * 500의 해시계산이 이루어지는것은 아무리 해시가 빨라도 보통의 웹세션시간안으로 계산할 수 없다고 생각했다. 그래서 "Rainbow Table"을 만들었다. 

A rainbow table is a precomputed table for caching the output of cryptographic 
hash functions, usually for cracking password hashes.

출처 : 위키백과 https://en.wikipedia.org/wiki/Rainbow_table

해석하면 Rainbow Table은 보통 패스워드 해시값을 크랙하기 위해 사전에 계산된 해시값을 모음이다. 아래와 같은 방식으로 rainbow_table을 생성하였고, 문제를 해결할 당시에는 requests 모듈이 session을 유지시켜 주지 않다보니, 계산된 hash값을 찾아주는 함수로 웹페이지상에서 풀었다.

from requests import post
import hashlib
import time
import concurrent.futures


target = ""

def iter_sha1(value) :
    cal_val = str(value)+"salt_for_you"
    for _ in range(500) :
        cal_val = sha1_generator(cal_val)
    return cal_val
    ##eturn str(value)+"salt_for_you"

def sha1_generator(inval:str):
    m = hashlib.sha1()
    m.update(inval.encode())
    return m.hexdigest()

## 웹페이지에 접속하여 find("해시값")으로 rainbow_table 추적
def find(key) :
    with open("./rainbow_table.dat","r") as f :

        while(True) :
            line = f.readline()

            if(key==line.split(" ")[0]) :
                answer = {"key":line.split(" ")[1].strip()+"salt_for_you"}
                print(line.split(" ")[0],answer)
                break
            

if __name__=="__main__" :

    FILE_NAME ="./rainbow_table.dat"

    url = "https://webhacking.kr/challenge/web-04"
    header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
    cookie = {"PHPSESSID":"//본인의 PHPSESSID //",}

    res = post(url, headers=header, cookies=cookie)
    
    start = 10000000
    end = 99999999
    unit = 50000
    index = 0

    start_time= time.time()
    while(True) :
        field = [x for x in range(int(start+(index*unit)),int(start+((index+1)*unit)))]
        
        with concurrent.futures.ProcessPoolExecutor() as executor:
            with open(FILE_NAME,"a") as f:
                for val, result in zip(field, executor.map(iter_sha1, field)):
                    f.write(result+" "+str(val)+"\n")
                    
        index += 1
        index %= (end-start)//unit
        mid =time.time()
        print(field[0],"현재시각",int(mid-start_time),"s")

 

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

[Webhacking.kr] old-06 Answer  (0) 2022.07.10
[Webhacking.kr] old-05 Answer  (0) 2022.07.10
[Webhacking.kr] old-03 Answer  (0) 2022.07.07
[Webhacking.kr] old-02 Answer  (0) 2022.07.07
[Webhacking.kr] 서문 & old-01 Answer  (0) 2022.07.05