호빵둥이 IT Blog

Webhacking.kr 4번 풀이 :: 호빵둥이 IT Blog 본문

프로그래밍/[워게임]Webhacking.kr

Webhacking.kr 4번 풀이 :: 호빵둥이 IT Blog

d2n0s4ur 2020. 5. 14. 20:00

 

 

 

 

 

 

안녕하세요!

 

오늘은 워게임, Webhacking.kr Chellenge 4번 문제를 풀어보도록 하겠습니다.

 

이번 문제는 레인보우 테이블을 사용한 문제입니다. 문제를 보기 앞서 간단하게 레인보우 테이블이 무엇인지, 확인해 보도록 하겠습니다.

 

 

 

 

 

#레인보우 테이블


레인보우 테이블(Rainbow Table)이란, MD5, SHA-1, SHA-2 등 해시함수를 사용해서 만들 수 있는 값들을 모두 저장한 표라고 할 수 있습니다.

 

말 그대로, 만들 수 있는 모든 값들을 넣어둔 테이블이므로 용량이 엄청나게 큰 게 사실입니다.

 

영어 대소문자, 숫자만 사용한다고 가정하면, 총 사용되는 문자는 62개이고, 이 문자열이 n개의 문자로 이루어져 있다면 총 62^n개의 문자열이 있고, 이에 해당하는 모든 해시값을 저장해 둔 파일이 레인보우 테이블이 되겠습니다.

 

레인보우 테이블은 실제로 엄청난 파일 크기를 자랑합니다.

 

 


https://project-rainbowcrack.com/table.htm

 

List of Rainbow Tables

List of Rainbow Tables This page lists the rainbow tables we generated. LM rainbow tables speed up cracking of password hashes from Windows 2000 and Windows XP operating system. NTLM rainbow tables speed up cracking of password hashes from Windows Vista an

project-rainbowcrack.com

 

(간단한 레인보우 테이블을 확인할 수 있는 사이트)


 

 

 

평문이 1~10글자임에도 레인보우 테이블의 크기는 기본 GB단위를 넘는다.

 

 

이렇듯, 레인보우 테이블은 파일 크기도 매우 크고 일반인이 사용하는 장비(컴퓨터)는 이를 다루기가 힘들어 사실상 기업이나 단체에서 사용하는 경우가 많습니다.

 

레인보우 테이블은 크게 두가지 이유로 인해 만들어졌습니다.

 

1. 무차별 대입 공격(Bruth Force)시 빠른 비밀번호의 유추


무차별 대입 공격, 말 그대로 비밀번호에 모든 문자를 대입하는 것을 뜻합니다.

 

예를 들어서 해커가 다른 사용자의 컴퓨터에 접속할 수 있다고 가정합시다. 사용자 계정의 암호는 모르는 상태에서 레인보우 테이블을 이용하면 사용자의 암호를 유추하고, 이를 통해 해당 컴퓨터의 최고 권한인 관리자 계정까지 탈취할 수 있게 됩니다.

 

실제로 레인보우 테이블을 활용한 윈도우즈 계정의 암호를 찾는 툴이 존재하며, 이를 이용한 해킹 사례도 있습니다.

 

 

 

 

 

2. 해시값에서 평문 값을 추출하기 위해서


해시함수는 복호화가 불가능한 것으로 유명합니다. 한번 평문을 암호문으로 암호화하는 것은 가능하지만, 암호문은 복호문으로 복호화하는 알고리즘은 존재하지 않습니다.

 

즉, 이 세상에 존재하는 모든 평문의 암호문을 저장해서, 암호문으로부터 평문을 유추하자는 취지로 레인보우 테이블이 만들어진 것입니다.

 

또, 해시 값은 비슷한 평문끼리는 암호문도 비슷하다고 합니다. 이를 이용해서 레인보우 테이블을 조금 더 효율적이게 만들 수 있습니다.

 

 

이제 문제를 풀어볼까요?

 

 

 

 

 

#문제 보기


https://webhacking.kr/challenge/web-04/ 로 접속해서 문제를 확인해 보겠습니다.


 

Challenge 4

2131cdf61c84510649ceedfcf50aaadcd06d0333

webhacking.kr


 

 

 

 

https://webhacking.kr/challenge/web-04/ 에 접속한 모습

 

 

문제를 보니, 저 해시값에 따라 암호가 바뀐다는 것을 유추할 수 있습니다.

 

F5를 누르면

 

 

 

F5를 누르고 나니 해시값이 바뀐 모습

 

 

무작위적으로 해시값이 바뀐 모습을 확인할 수 있습니다.

 

이제, [view-source]를 눌러 소스코드를 분석해보도록 하겠습니다.

 

 

 

#소스코드 분석하


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
  include "../../config.php";
  if($_GET['view-source'== 1) view_source();
?><html>
<head>
<title>Challenge 4</title>
<style type="text/css">
body { background:black; color:white; font-size:9pt; }
table { color:white; font-size:10pt; }
</style>
</head>
<body><br><br>
<center>
<?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>
<form method=post>
<table border=0 align=center cellpadding=10>
<tr><td colspan=3 style=background:silver;color:green;><b><?=$hash?></b></td></tr>
<tr align=center><td>Password</td><td><input name=key type=text size=30></td><td><input type=submit></td></tr>
</table>
</form>
<a href=?view-source=1>[view-source]</a>
</center>
</body>
</html>
cs

 

14번째 줄 ~ 20번째 줄만 따로 보도록 하겠습니다.

 

1
2
3
4
5
6
7
<?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);
?>
cs

 

 

3번째 줄을 보면, 만약 chall4라는 세션 값이 존재하고, 사용자로부터 POST형식으로 전송받은 key값이 세션의 chall4와 일치하면 문제가 풀린다는 것을 알 수 있습니다.

4번째 줄에 의해, $hash 값은 10000000 ~ 99999999 사이의 랜덤한 숫자 뒤에 'salt_for_you'를 붙인 문자열이 됩니다.

 

즉 $hash는 '68619429salt_for_you' 형식으로 저장됩니다.

 

6번째 줄에서 $hash를 sha1 해시 함수를 사용해서 500번 암호화시킵니다.

 

 

결국 우리는 레인보우 테이블을 이용해 주어진 해시를 통해 평문을 유추해야 됩니다.

 

 

 

 

#문제 풀기


문제를 풀기 위해서, Python프로그램을 사용하도록 하겠습니다.

 

먼저 Python IDLE을 실행시켜 줍니다. 저는 Python 3.6.5 환경에서 테스트를 진행했습니다.

 

 

Python IDLE

 

 

[Ctrl + N]을 눌러 새로운 파일을 만들고 소스코드를 작성했습니다.

 

 

 

문제를 풀 수 있는 소스코드

 

 

 

 

SHA-1 해시함수를 사용하기 위해서는 hashlib라는 라이브러리를 사용해야 합니다.

hashlib 라이브러리에 대한 설명은 하단 링크를 통해 확인해주세요.


https://docs.python.org/3/library/hashlib.html

 

hashlib — Secure hashes and message digests — Python 3.8.3rc1 documentation

hashlib — Secure hashes and message digests Source code: Lib/hashlib.py This module implements a common interface to many different secure hash and message digest algorithms. Included are the FIPS secure hash algorithms SHA1, SHA224, SHA256, SHA384, and

docs.python.org


 

 

이제 제가 짠 소스코드를 한번 분석해보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import hashlib
 
= '483e0332765d7be93a517bcf9eb60c63917ca8ec'
 
for i in range(10000000,99999999+1):
    pw = (str(i)+"salt_for_you")
    for j in range(500):
        pw = hashlib.sha1(pw.encode()).hexdigest()
    print('process' + str(i))
    if(pw == a):
        print('Find Flag : ' + str(i)+"salt_for_you")
        break
 
cs

 

 

3번째 줄에서 a라는 변수에 내가 찾고 싶은 해시값을 넣고

 

5, 6번째 줄에서 나올 수 있는 모든 평문의 경우의 수를 고려해줍니다.

 

이후 7, 8번째 줄에서 모든 경우에 대해서 sha1 함수를 통해 500번 암호화시켜줍니다.

 

이렇게 암호화된 암호문이 내가 원하는 암호문과 일치하게 된다면 평문을 출력하고 끝나는 프로그램입니다.

 

이 프로그램을 계속 돌리면 답을 확인할 수 있지만, 저는 시간상의 문제와 장비의 문제(노트북)로 인해 실제로 값을 구하지는 못했습니다. ( 3시간 정도 돌렸는데 절반도 못했더군요... CPU 사양이 더 좋은 PC에서는 빠를 수 있습니다.)

 

하지만 이를 이용하면 답을 구할 수 있고, 이 답을 이용해서 4번 문제를 풀 수 있습니다.

 

 

 

 

 

#연관된 활동


Python은 인터프리터 언어로, 즉각적이고 코딩이 쉬워 코딩 입문자에게 좋은 프로그래밍 언어 중 하나입니다.

 

저는 C언어로 프로그래밍을 시작했지만, 최근에 코딩을 시작한 분들이라면 Python으로 시작하는 것을 추천드립니다.

 

Pythond은 사용하기도 간편하고 직관적이지만 C언어에 비해서 실행 속도가 굉장히 느립니다.

 

그래서 대부분의 대규모 프로그램은 Python을 사용하지 않고 C나 JAVA 등의 언어를 이용해서 만들어 나갑니다.

 

하지만 이런 간단한 프로그램과 같이 성능을 극한으로 올리는 게 목표가 아닌, 반복수행의 출력 결과를 바로바로 보기 위해서는 Python을 사용하는 것이 좋다고 할 수 있습니다.

 

여러분들도 Python을 간단하게라도 공부하시길 추천드립니다.

 

Python 공부하는데 도움이 될만한 링크를 첨부해드리도록 하겠습니다.

 


https://www.sololearn.com/

 

SoloLearn: Learn to Code

Join Now to learn the basics or advance your existing skills

www.sololearn.com

 

Python 외에도 C++, Java, Javascript 등 여러 가지 언어를 쉽고 빠르게 배울 수 있습니다.

 

직접 해보시는 것을 권장드립니다.

 


 

이상으로 Webhacking 4번 문제 풀이를 마치겠습니다.

 

 

 

 

 

 

포스트 잘 보셨다면 하단에 ♡ 꼭 눌러주시길 부탁드립니다!

(♡ 는 블로거에게 큰 힘이 됩니다)

 

 

 

[이전글] : 2020/05/13 - [SW/[워게임]Webhacking.kr] - Webhacking.kr Challenge 3번 :: 호빵둥이 IT Blog

[다음글] : 2020/05/15 - [SW/[워게임]Webhacking.kr] - Webhacking.kr Challenge 5번 :: 호빵둥이 IT Blog

 

Comments