본문 바로가기
CTF/webhacking.kr

[CTF] webhacking.kr 4번 Write-Up

by spareone 2022. 10. 11.

webhacking.kr 4번 문제풀이 Write Up 입니다.

 

[그림 1] Level 4 페이지

회색 상자에는 이상한 문자열이 있고, 아래쪽에는 패스워드를 입력하는 칸이 있습니다.

view-source를 눌러 소스코드를 보도록 하겠습니다.

[그림 2] Level 4 소스코드

가운데 PHP코드가 핵심인 것 같습니다.

코드를 요약하면 이렇습니다.

1. 한 세션에 10000000 ~ 99999999의 수 중 하나와 "salt_for_you" 문자열의 조합으로 hash를 계산한다.

2. hash 계산은 SHA-1 알고리즘을 이용해 500번 수행한다.

3. 해당 세션에 나온 hash를 이용해 원래의 문자열을 알아내야 한다.

 

즉, [그림 1]에서의 회색 상자 안에 있는 문자열은, 원본 문자열에 SHA-1를 500번 때린 hash값 입니다.

이 hash를 이용해 원본 문자열을 알아내어 제출하면 된다는 겁니다.

 

그런데 hash 함수들은 단방향 함수입니다. 역을 구할 수 없습니다.

따라서 rand(10000000,99999999) + "salt_for_you" 에 해당하는 모든 문자열의 hash를 구하여 기록해 놓는 rainbow table을 만들어야 합니다.

(Rainbow Table은 SHA, MD5 등의 해시 함수를 사용하여 모든 변환 가능한 값들을 저장시킨 table을 말합니다)

 

서버에 직접 모든 문자열을 하나하나 넣는 방법도 있는데 경우의 수가 커서 서버 다운되므로 하면 안 됩니다.

 

Rainbow Table을 기록하는 소스코드를 작성해 봅시다.

import hashlib

f = open('table.txt', 'w')

for i in range(10000000, 100000000):
    text = str(i) + "salt_for_you"
    f.write(text + ' : ')
    for j in range(0, 500):
        text = hashlib.sha1(text.encode()).hexdigest()
    f.write(text + '\n')

f.close()

python으로 작성한 코드입니다. file로 저장하는 이유는 바로 print하기에 경우의 수가 너무 많아 관리하기 어려워집니다.

 

이제 프로그램 작동시키면 되는데, 이거 완성하려면 며칠 걸리기 때문에 적당히 돌리고 Ctrl + C로 종료시킵니다.

며칠 돌려서 완성했다고 해도 문제 풀면 쓸 일이 없어집니다.

 

프로그램 종료 후 해당 소스코드가 있는 폴더에 들어가면 rainbow table이 저장된 txt파일이 만들어져 있습니다.

 

이제 노동을 시작해봅니다.

[그림 3] 문자열의 hash 확인

hash를 복사합니다.

[그림 4] rainbow table에서 해당 hash를 검색하는 모습

찾기 기능을 이용해 해당 hash가 있는지 확인합니다.

검색이 되지 않는다면 F5를 눌러 새로고침을 해 바뀐 hash를 검색합니다. (검색 될 때 까지 반복)

[그림 4] 원본 문자열 입력

원본 문자열을 입력합니다.

[그림 5] 문제 해결 완료 메시지

문제가 정답처리 되었습니다.

[그림 6] 문제 정답처리 이후 페이지

4번 문제 정답률이 낮은데, rainbow table 생성이 오래 걸려서 그런 것 같습니다.

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

[CTF] webhacking.kr 6번 Write-Up  (0) 2022.10.11
[CTF] webhacking.kr 5번 Write-Up  (0) 2022.10.11
[CTF] webhacking.kr 3번 Write-Up  (0) 2022.10.11
[CTF] webhacking.kr 2번 Write-Up  (0) 2022.10.11
[CTF] webhacking.kr 1번 Write-Up  (0) 2022.10.10

댓글