본문 바로가기
웹 해킹/Webhacking.kr

[Webhacking.kr] old-04

by L3m0n S0ju 2021. 8. 26.

 

 

 

문제 서버에 접속하면 위에 암호화된 16진수가 출력되는데 아래 소스코드를 보면 sha1 알고리즘으로 암호화되었음을 알 수 있습니다.

 

 


<?php
  
include "../../config.php";
  if(
$_GET['view-source'] == 1view_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 // bruteforce 공격을 약 1억번 반복해야하는데 매번 1초동안 정지하므로 불가능

  if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4); // 입력한 키 값이 chall4 값과 같으면 성공
$hash rand(10000000,99999999)."salt_for_you"// ex) hash = 15645665salt_for_you

$_SESSION['chall4'] = $hash; // chall4 값을 hash 변수에 저장
  for(
$i=0;$i<500;$i++) $hash sha1($hash); // hash 변수 500번 암호화
?><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>

 

 

 

 


<?php
  sleep
(1); // anti brute force // bruteforce 공격을 약 1억번 반복해야하는데 매번 1초동안 정지하므로 불가능

  if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4); // 입력한 키 값이 chall4 값과 같으면 성공
$hash rand(10000000,99999999)."salt_for_you"// ex) hash = 15645665salt_for_you

$_SESSION['chall4'] = $hash; // chall4 값을 hash 변수에 저장
  for(
$i=0;$i<500;$i++) $hash sha1($hash); // hash 변수 500번 암호화
?><br>

 

 

핵심 php 코드를 살펴보면 경우의 수를 계산하면 1억가지 경우의 수가 존재하고 각 경우의수에서 500번 암호화하여 레인보우 테이블(Rainbow Table)을 만들면 chall4 값을 찾을 수 있다. 레인보우 테이블 생성 코드는 아래와 같다.

 

 

 

 

 

 


import hashlib

 

def sha(num):

    data = f"{num}salt_for_you" // f-string을 이용하여 랜덤값 삽입

    for i in range(500):

        data = hashlib.sha1(data.encode('utf-8')).hexdigest()

    return data

 

f = open("rainbow_table.txt","w")

for i in range(10000000, 100000000):

    f.write(f"{i}: {sha(i)}\n"

f.close()

 

 

 

 


테이블을 만드는데 6시간이나 걸린다. 용량이 매우 크다. grep 명령어로 웹페이지의 해시값을 검색하면 숫자 짝이 하나 출력되는데 뒤에 salt_for_you를 붙이고 문제 서버에 입력하면 성공이다.

 

 

 

 

 


'

 

 

 

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-06  (0) 2021.08.27
[Webhacking.kr] old-05  (0) 2021.08.26
[Webhacking.kr] old-03  (0) 2021.08.26
[Webhacking.kr] old-02  (0) 2021.08.25
[Webhacking.kr] old-01  (0) 2021.08.25

댓글