프로젝트/Webhacking.kr

[Webhacking.kr] Challenge(old) 4번 문제

Uggjjini 2021. 7. 2. 12:49

문제페이지는 해당페이지와 같다.

 

 

초록색 글자의 해시값과 password 입력창, 페이지 소스 링크가 있다는 것을 알 수 있다.

 

 

새로고침을 누르면 해시값이 바뀌는 것을 확인할 수 있다.

 

 

페이지에 접속할 때마다 변경되는 해시값에 따라서 패스워드가 다르다는 것이라고 유추할수 있다.

 

 

해당 페이지 소스를 확인해 본다.

 

 

하단의 php 부분을 자세히 봐본다.

 

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

 

 


sleep(1); // anti brute force

 

brute force 공격을 막기위해 sleep(1) 함수가 적용되있다.

 

 if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4);

 

'chall4'라는 세션값이 존재하고 post 형태의 key값이 세션값과 같다면 문제가 풀린다는 것을 알 수 있다.

 

 

$hash = rand(10000000,99999999)."salt_for_you";
 $_SESSION['chall4'] = $hash;

 

$hash 값인 10000000~99999999 사이의 랜덤한 숫자 뒤에 salt_for_you를 붙인 문자열이 $_SESSION['chall4']에 저장된다.

 

 

for($i=0;$i<500;$i++) $hash = sha1($hash);

 

$hash 값을 sha1 해시함수를 이용하여 500번 암호화 시키는 것을 알 수 있다.

 


sha1은 단방향 암호화 방식으로 해시값에서 평문값을 찾지 못한다. 단방향 암호화를 복호화하려면 해시값끼리 비교하는 것이 유일하다. 레인보우 테이블을 이용하여 주어진 해시값을 통하여 평문을 유추해본다.

 

[참고] 레인보우 테이블(Rainbow Table)이란?

MD5, SHA-1, SHA-2 등 해시함수를 사용해서 만들 수 있는 값들을 모두 저장한 표

무차별 대입 공격(Brute Force)시 빠른 비밀번호의 유추를 하거나 해시값에서 평문 값을 추출할 때 사용된다.

 

 

문제를 풀기위해 Python 프로그램으로 레인보우 테이블을 제작하여 사용한다.

 

import hashlib
from multiprocessing import Process


def hashing(num, s, e):
    f = open("HashTest" + str(num) + ".txt", "w")
    for k in range(s, e):
        test_hash = str(k) + "salt_for_you"
        temp = test_hash
        for j in range(0, 500):
            test_hash = hashlib.sha1(test_hash.encode()).hexdigest()
        data = temp + " : " + test_hash + "\n"
        f.write(data)
    f.close()


if __name__ == "__main__":
    START = 10000000
    mulp = []
    for i in range(2, 11):
        mul = Process(target=hashing, args=(i-1, START*(i-1), START*i))
        mulp.append(mul)

    for m in mulp:
        m.start()

    for m in mulp:
        m.join()

[참고] https://min-zero.tistory.com/entry/webhackingkr-challengeold-old-03-1

 

 

10000000~99999999 사이의 모든 값에 salt_for_you라는 문자열을 붙인 값을 sha1 해시함수로 500번 암호화하여 해시값으로 변경하여 텍스트 파일로 저장하는 프로그램이다. 

 

 

multiprocessing을 통해 범위를 나누어 9개의 프로세스를 병렬로 돌려서 시간을 단축시켰다. 

 

 

총 9개의 텍스트 파일이 만들어진것을 확인할 수 있다.

 

 

텍스트파일에서 상단의 해시값을 검색해보면 HashTest8.txt에 해당 해시값이 존재하는것이 확인된다.

 

 

 

해당 해시값과 일치하는 값을 찾아서 문제페이지의 password 입력칸에 입력한다.

 

 

문제가 풀리는 것을 확인할 수 있다.