해쉬코드로 예상되는 글자와 함께 패스워드를 제출하는 창이있다.
그냥 sql injection 넣어보고 시작하자! 역시나 안된다...
밑에 소스코드를 볼수있는곳으로 이동해본다.
<?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>
코드를 보면 10000000~99999999사이의 숫자하나와 salt_for_you를 합쳐서 sha1해쉬함수로 500번 해쉬하여 보여주고 있는것을 볼수있다.
1억-1천 9천만....500번의 해슁.... 코드를 짜서 해결해야 될거같다....
간단하게 파이썬을 이용해 본다.
anaconda jupyternotebook을 이용했다.
from hashlib import sha1
for i in range(10000000,99999999):
password=str(i)+"salt_for_you"
for j in range(0,500):
password=sha1(password.encode('utf-8')).hexdigest()
if('해쉬코드'==password):
print(str(i))
break
하루종일 걸릴거같다. 하루종일 걸리고 메모리라도 터지거나 다시해야한다면 끔찍하다.
파일로 저장해보자
from hashlib import sha1
f=open("list1.csv",'w')#쓰기모드로 파일열기
for i in range(10000000,99999999):
password=str(i)+"salt_for_you"
for j in range(0,500):
password=sha1(password.encode('utf-8')).hexdigest()
f.write(str(i)","+password+"\n")
f.close
파일로 저장해서 찾는방법 이것도 나눠서 하는것을 추천합니다.
from hashlib import sha1
import multiprocessing
import time
f=open("list1.csv",'w')#쓰기모드로 파일열기
start_time=time.time()
def hasing():
for i in range(10000000,99999999):
password=str(i)+"salt_for_you"
for j in range(0,500):
password=sha1(password.encode('utf-8')).hexdigest()
if('9adfd40e1690601bc899738d628b332f11da5684'==password):
print(str(i))
break
list=['p1','p2','p3','p4']
if __name__ == '__main__':
#멀티스레딩 pool 사용
pool = multiprocessing.Pool(processes=4)#현재 시스템에서 사용 할 프로세스 개수
pool.map(hasing,list)
pool.close()
pool.join()
print("%s seconds...." %(time.time()-start_time))#시간이나 재보자...
멀티스레드 이용해서도 해보자.
너무너무 오래걸린다. 범위를 100만에서 1000만정도로 하는게 적당할듯합니다. 아니면 이런 무식한 방법말고 다른방법이 있을지도...
파일로 10번정도 분할해서 찾는방법을 권장드립니다. (무조건 파일로 나눠서 해야합니다 기다리다보면 접속이 끊기고 답을 적을려면 새로운 해쉬코드가 나타납니다! 파일로 만들어서 파일에서 찾아야 합니다.)
꼼수
파일을 10분할해도 파일여는시간만 해도 오래걸립니다. 텍스트로 거의 500메가
찾는데도 오래걸리고 열고 찾는데도 시간이 이만저만 걸리는게 아닙니다.
매번바뀌는 해쉬코드 그렇다면 특정범위만 파일을 만들고 새로고침으로 해쉬코드를 바꿔가면서 찾아보는게 훨씬빠를것으로 예상됩니다.
추후 다른방법을 찾게된다면 수정해 보겠습니다...
'보안 > webhacking' 카테고리의 다른 글
webhacking.kr old-06 (0) | 2019.11.23 |
---|---|
webhacking.kr old-05 (0) | 2019.11.22 |
webhaking.kr old-03 (0) | 2019.11.22 |
webhacking.kr old-02 (0) | 2019.11.22 |
webhaking.kr old-01 (0) | 2019.11.22 |
최근댓글