[webhacking.kr] 챌린지4번

2019. 10. 23. 13:54네트워크/모의해킹

웹해킹이 리뉴얼되면서 몇개의 문제가 변경되고, 난이도의 조정이 있는것으로 보입니다.

그중에 4번은 좀 귀찮게 하더라구요.

이번 문제는 파이썬을 이용해 풀었기 때문에 따로 남겨놓으려고 합니다.

 

본래의 문제는 base64를 디코딩만 하면 되는 문제였지만, 지금은 sha1해시로 변경되어 있습니다.

 

 

challenge4

처음엔 별 생각없이 sha1디코드 사이트로 이동했지만 안되더군요. 그래서 view-source를 클릭했습니다.

 

view source

대충보니 표시되어 있는 hash값은 랜덤값+salt_for_you의 문자열을 sha1을 500번을 돌려서 나온 결과값임을 알 수 있습니다. 게다가 서버에 직접 무작위로 때릴 수도 없도록 막아놔서 그냥 로컬에다가 hash 500번을 돌린 결과값을 저장하고, 이걸이용해 서버에서 알려주는 해시값을 비교하는 방식으로 가기로 했습니다.

 

아래의 코드를 이용해 먼저 해시값을 저장했습니다.

import hashlib

print("start")
f = open(r'C:\filepath\filename.txt', 'w')
numhash = hashlib.sha1()
for i in range(10000000,99999999):
    string = str(i) + "salt_for_you"
    numhash = hashlib.sha1(string.encode())
    
    for j in range(500):
        hash = numhash.hexdigest()
        numhash = hashlib.sha1(hash.encode())
    f.write(str(i) + " : " + hash)
    f.write('\n')
    print(i)
print("end")
f.close()

워낙 오래걸려서 대충 1시간만 돌리고, 나머지는 자동화를 만들어서 맞을때 까지 돌리는 것으로 했습니다.

1시간 정도 돌리니 약 100메가정도 나오더군요.

멀티 쓰레드를 이용하면 더 빠르겠지만 그걸 만들정도로 제가 똑똑하지 않거든요.

 

아래의 코드는 만들어놓은 해시값을 불러서 비교하고 맞으면 서버에 결과를 보내는 코드입니다.

#python 3.7
import mmap
import urllib
import http.client
import sys
import time


def findstr(hashtab):
    #file open
    with open(r'C:\Users\kang\Desktop\challenge.txt', 'rb', 0) as file, \
        mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as s:
        # if s.find(b'57e506ab7d1f946f599ecc08965d3ebbef9d1357') != -1:
            # print(s.readline())   
        i = s.find(hashtab.encode())
        if i==-1:
            return -1
        else:
            result = s[i-11:i-3]
            #result = s[i:i+40]
            return result
            


PHPSESSID = "PHPSESSID=omv9q7hs0mq9tsc6oicg6ti52s" #session 값
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", "Content-type": "application/x-www-form-urlencoded", "Accept": "text/html", "Connection": "keep-alive", "Cookie" : PHPSESSID}
domain = "webhacking.kr"
url = "/challenge/web-04/"
params = ""


while True:
    #conn = http.client.HTTPConnection(domain, "80")
    conn = http.client.HTTPSConnection(domain, "443")
    conn.request("GET",url,None,headers)
    #conn.request("POST",url,params,headers)
    response = conn.getresponse().read().decode("utf-8")
    text = str(response)
    i = text.find('green;><b>')
    hashtab = text[i+10:i+50]
    print(hashtab)
    
    temp = findstr(hashtab)
    time.sleep(1)
    if temp == -1:
        print ("not found")
    else:
        flag = findstr(hashtab)
        flag = flag.decode()
        flag = flag + "salt_for_you"
        print (flag)
        params = "key=" + flag
        conn.request("POST",url,params,headers)
        response2 = conn.getresponse().read().decode("utf-8")
        print (response2)
        break
    
print("")

break가 실행되면 해당챌린지는 바로 클리어가 가능하도록 되어있습니다.

 

간단하면서도 노가다성이 짙은 문제였습니다.

위와같은 무식한 방법 외에도 아마 다른 공격 방법이 있을지도 모르겠습니다.

그때는 이런 코드따윈 보지 않으셔도 될겁니다.