wargame : https://webhacking.kr/
✔️ 문제
문제는 다음과 같다.
이상한 해쉬값처럼 생긴 것과 view-source가 보인다.
✔️ 풀이
소스를 보게 되면, 보낼 password가 key이고
해당 key가 $_SESSION['chall4']와 일치하면 문제가 풀린다.
해당 key 값은 $hash 라는 변수에 담기게 되는데,
rand(10000000, 99999999)에 "salt_for_you"라는 문자열을 결합한 것을
sha1 함수에 담아서 반복하고 있는 것을 확인할 수 있다.
또한, sleep(1)을 걸어서 브루트 포스 공격을 방어하는 것으로 보이는데
이에 대한 해결 방법으로 레인보우 테이블을 만드는 것을 떠올렸다.
예전에 한번 풀었었는데 해당 해쉬값을 생성하는 스크립트를 짜서
레인보우 테이블을 만들고 일치하는 값을 찾아내서 입력하는 것이다.
주의해야할 것은 문자열을 인코딩시키지 않으면,
TypeError: Strings must be encoded before hashing
다음과 같은 에러가 발생하게 된다.
다음과 같이 터미널에 random한 숫자를 출력하고 해당 숫자와
문자열을 합쳐서 sha1 해쉬로 돌린 값이 오른쪽에 출력된다.
해당 내용을 레인보우 테이블로 만들기 위해서
txt 파일에 저장하는 스크립트까지 같이 작성해보자.
from hashlib import sha1
result = ""
f = open("old-03.txt", 'w')
for i in range(10000000, 100000000):
result = str(i) + "salt_for_you"
for j in range(0, 500):
result = sha1(result.encode('utf-8'))
result = result.hexdigest()
f.write(str(i) + " > " + result + '\n')
f.close()
다음과 같이 작성하면 현재 폴더보다 한 단계 상위 폴더로
txt 파일이 생기면서 엄청나게 많은 해쉬값이 저장되는데,
우리는 엄청나게 많은 해쉬값을 만들어야 한다.
그러려면 해당 코드로는 굉장히 오래걸린다는 것을 알 수 있는데
이전에 한 4시간 정도 돌려서 마쳤던 기억이 있는데,
파이썬의 멀티 프로세스를 구현하는 것을 통해서
조금 더 빠르게 스크립트를 돌려보자.
(참고: https://scribblinganything.tistory.com/563)
from hashlib import sha1
from multiprocessing import Process
def hash_script(a, b, i):
f = open("old-03" + "_" + str(i) + ".txt", 'w')
result = ""
for i in range(a, b):
result = str(i) + "salt_for_you"
for j in range(0, 500):
result = sha1(result.encode('utf-8'))
result = result.hexdigest()
f.write(str(i) + " > " + result + '\n')
f.close()
return
if __name__ == '__main__':
p1 = Process(target=hash_script, args=(10000000, 20000000, 1))
p2 = Process(target=hash_script, args=(20000000, 30000000, 2))
p3 = Process(target=hash_script, args=(30000000, 40000000, 3))
p4 = Process(target=hash_script, args=(40000000, 50000000, 4))
p5 = Process(target=hash_script, args=(50000000, 60000000, 5))
p6 = Process(target=hash_script, args=(60000000, 70000000, 6))
p7 = Process(target=hash_script, args=(70000000, 80000000, 7))
p8 = Process(target=hash_script, args=(80000000, 90000000, 8))
p9 = Process(target=hash_script, args=(90000000, 100000000, 9))
p1.start()
p2.start()
p3.start()
p4.start()
p5.start()
p6.start()
p7.start()
p8.start()
p9.start()
p1.join()
p2.join()
p3.join()
p4.join()
p5.join()
p6.join()
p7.join()
p8.join()
p9.join()
concurrent.futures 라는 것을 사용하면 좀 더 간편하고
짧게 코드를 쓸 수 있지만, 어차피 하나의 txt 파일이 만들어지는데,
엄청 많은 시간이 소요되는 것이 아니기 때문에 9개의 쪼개진 txt 파일로
만들기로 했고 다음과 같이 코드를 작성하게 되면
old-03_1.txt 파일부터 old-03_9.txt 파일까지 총 9개의 파일이 생성된다.
세션이 새로고침 될 수 있기 때문에 한번 새로 고친 다음에
해당 해쉬값을 9개의 파일에서 찾아보도록 하자.
다음에 해당하는 해쉬값을
notepad 프로그램을 통해서 열린 파일에서 모두 찾기
혹은 일치하는 개수를 찾아서 확인한다음,
해당 salt_for_you 라는 문자열과 결합하여 제출하면...
두둥! 문제풀이에 성공한다.
시간이 오래걸리면 한 15~20분정도 스크립트를 돌리면,
350만개 정도 값이 각 텍스트파일에 생기는데
9개 파일로 따지면 33%정도가 만들어진다.
이정도만으로도 운이 좋으면 금방 찾을 수 있다.
파일을 모두 notepad에 열고 찾기에서 열린 모든 파일에서 찾기를
눌러서 찾으면 위처럼 조금 더 빠르게 찾을 수 있다.
화이팅 💪
'보안 > wargame' 카테고리의 다른 글
[webhackingkr] old-06 (0) | 2023.01.06 |
---|---|
[webhackingkr] old-05 (0) | 2023.01.06 |
[webhackingkr] old-03 (0) | 2023.01.04 |
[webhacking.kr] old-02 (0) | 2023.01.03 |
[webhacking.kr] old-01 (0) | 2023.01.03 |