문제페이지는 해당페이지와 같다.
초록색 글자의 해시값과 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 입력칸에 입력한다.
문제가 풀리는 것을 확인할 수 있다.
'프로젝트 > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge(old) 6번 문제 (0) | 2021.07.05 |
---|---|
[Webhacking.kr] Challenge(old) 5번 문제 (0) | 2021.07.02 |
[Webhacking.kr] Challenge(old) 3번 문제 (0) | 2021.07.01 |
[Webhacking.kr] Challenge(old) 2번 문제 (0) | 2021.06.29 |
[Webhacking.kr] Challenge(old) 1번 문제 (0) | 2021.06.29 |