본문 바로가기
Wargame Write-Up/Webhacking.kr

[Webhacking.kr] (Web) 4번 풀이 (old-4)

by snwo 2020. 3. 20.

문제화면이다. 암호화되어있는 문자열같은데, 

복호화해서 Password 를 맞춰야되는것 같다.


 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?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>
 

10000000salt_for_you 부터 99999999salt_for_you 까지 중에, 랜덤값을 500 번 sha1 암호화해서 출력해주는것같다.

sha1 은 단방향해시함수로, 복호화할수가없다..

그렇다면 레인보우테이블을 만들어서 원래값을 맞추면되겠다.


[ 레인보우테이블 ]

 

레인보우테이블은 sha1 같은 해시함수들로 만들수있는값을 왕창 저장한 표이다.

 

10000000salt_for_you 부터 99999999salt_for_you 까지

500번 sha1 암호화한값들을 저장해놓으면 어떠한 값이 출력되도

원래 문자열을 알 수 가 있다.

 

하지만 약 1억개를 다 만들수없으니,

20% 만 만들어서 레인보우테이블에 있는지 확인하자


[ python ]

 

적정 스레드 수 : 코어개수 * 2 이라고한다.

내cpu는  4코어니까, 스레드 8개를 만들어서

1250000 개씩 나눠서 테이블을 만든뒤, 합치면 되겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import hashlib
import threading
 
salt="salt_for_you"
 
def sha(x):
    f=open(str(x)+".txt","w")
    for i in range(10000000+1250000*x,11250000+1250000*x):
        s=str(i)+salt
        for j in range(0,500):
            s=hashlib.sha1(s.encode('utf-8')).hexdigest()
        f.write(str(i)+" : "+s+"\n")
    f.close()
 
def find_hash(f):
    while 1:
        hashstr=input("input hash : ")
        a=f.find(hashstr)
        if a!=-1:
            print(f[a-11:a-2]+"salt_for_you")
            break
        else:
            print("Nop")
 
if __name__=="__main__":
    for i in range(0,8):
        t=threading.Thread(target=sha,args=(i,))
        t.start()
        
    t.join()
 
    rainbow=open("rainbow.txt","a")
    for i in range(0,8):
        file=open(str(i)+".txt","r")
        rainbow.write(file.read())
    rainbow.close()
    
    rainbow=open("rainbow.txt","r")
    find_hash(rainbow.read())
    rainbow.close()
 

엄청난 기다림의 시간을 가지고 기다리면

input : 이라고 뜬다.

페이지 hash값 새로고침해가며 계속 붙여넣기하면, 언젠간 XXXXXXXXsalt_for_you 가 뜰것이다.(20%의 확률)

 XXXXXXXXsalt_for_you 를 복사해서 password에 붙여넣으면 문제가풀린다.



[ 주의 ]

 

로그인 되어있는지 확인하고하자