Jaeseo's Information Security Story

webhakcing.kr - old 4번 - WriteUp 본문

Write UP/webhacking.kr

webhakcing.kr - old 4번 - WriteUp

Jaeseokim 2020. 2. 5. 21:20

일단 문제를 들어가 봅니다!

들어가 보면 이상한 hash값과 password를 입력 할 수 있는 inputbox가 제공되어 있습니다.

view-source를 클릭 하여 소스를 확인해봅니다.

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

소스를 보니 random한 숫자에 salt_for_you를 붙이고 그값을 저장한후 그값을 500번 sha1 hash 한 다음 그값을 보여 주는 것으로 보입니다. hash를 하기전 random.salt_for_you의 값을 알아야지 넘어갈수 있는데 이때 rainbow table를 사용하여 문제를 해결 하면 될것 같습니다.

import hashlib

for i in range(10000000,100000000):
    hash_tmp = str(i)+"salt_for_you"
    f = open("rainbow_table.txt", 'a')
    f.write(hash_tmp+":")
    for j in range (0,500):
        hash_tmp = hashlib.sha1(hash_tmp.encode('utf-8')).hexdigest()
    f.write(hash_tmp+"\n") 
    f.close()


'''
$hash = rand(10000000,99999999)."salt_for_you";
  $_SESSION['chall4'] = $hash;
  for($i=0;$i<500;$i++) $hash = sha1($hash);
'''

스크립트를 돌리게 되면 이렇게 무수히 많은 table이 생성이 되는데 시간이 오래 걸려서 노트북을 계속 켜둘수 없는 관계로 termux를 이용하여 자기전에 스마트폰에서 스크립트를 돌리고 잠을 잤습니다.

 

자고 일어나서 보니 아직도 10/1만 되어 있는 상황이고 스마트폰 배터리가 너무 심각 하게 빨리 소모 되어서 포기했습니다...

 

그래서 이번에는 threading을 통해서 작업을 돌립니다!

import hashlib
import threading

def maketable(i):
  start = i*10000000
  finish = (i+1)*10000000
  print(start,finish)
  for i in range(start,finish):
      hash_tmp = str(i)+"salt_for_you"
      f = open("rainbow_table.txt", 'a')
      f.write(hash_tmp+":")
      for j in range (0,500):
          hash_tmp = hashlib.sha1(hash_tmp.encode('utf-8')).hexdigest()
      f.write(hash_tmp+"\n") 
      f.close()

for i in range(1,10):
  t = threading.Thread(target=maketable,args=(i,))
  t.start()

'''
$hash = rand(10000000,99999999)."salt_for_you";
  $_SESSION['chall4'] = $hash;
  for($i=0;$i<500;$i++) $hash = sha1($hash);
'''

이제 완성된 파일을 봅니다.

약 5.53GB의 파일이 만들어진것을 확인 할 수 있습니다.

이제 grep 명령어를 이용하여 확인을 해봅니다.

예전에 풀었는데 귀찮아서 계속 미루다가 이제서야 올리네요 ㅋㅋ

 

'Write UP > webhacking.kr' 카테고리의 다른 글

webhacking.kr - old 7번 - WriteUp  (0) 2020.01.24
webhakcing.kr - old 5번 - WriteUp  (0) 2020.01.09
webhacking.kr - old 3번 - WriteUp  (0) 2020.01.08
webhacking.kr - old 2번 - writeup  (3) 2020.01.06
Comments