본문 바로가기
정보보안/wargame

[webhacking.kr] challenge(old). old-04

by 민-Zero 2020. 2. 6.

4번 문제에 처음 접근하게 되면 다음과 같은 화면이 나타나게 된다.

password부분에 임의의 아무값이나 입력하게 되면 복잡하게 인코딩된 값이 변경되고 별다른 반응은 보이지 않는다. 따라서 view-source를 통해 해당 페이지의 소스코드를 확인해 봐야 할것 같다.

view-source를 통해 확인한 해당 페이지의 소스코드는 다음과 같다. 페이지의 뷰를 설정하는 부분을 제외하고 문제를 해결하는데 필요한 코드를 해석해 보자

 

sleep(1); // anti brute force

해당 부분은 sleep함수로 코드실행을 함수에 입력한 초만큼 지연시킬수 있다. brute focre 공격에 대비하기 위해 사용했다고 주석으로 설명이 되어있다.

 

if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4);

조건 문으로 세션변수 'chall4'에 값이 설정되어 있으면 isset함수를 통해 True를 반환한다. post방식으로 전송된 값을 key변수에 받고 해당 값과 세션변수 chall4에 저장된 값이 같은지 확인한다. 둘다 True를 반환하면 solve함수를 통해 해당 문제가 해결되는것 같다.

 

$hash = rand(10000000,99999999)."salt_for_you";

만약 위의 조건문이 실행되지 않는다면 solve함수가 실행되지 않고 hash라는 변수에 rand함수를 통해 10000000 부터 99999999 사이의 난수에 "salt_for_you"라는 문자열이 붙어서 저장된다.

 

$_SESSION['chall4'] = $hash;

위에서 입력된 값을 가지는 hash변수에 저장된 값을 세션변수 chall4에 저장한다.


for(
$i=0;$i<500;$i++) $hash = sha1($hash)

반복문을 통해 hash변수에 저장된값이 sha1 해쉬를 통해 500번 해싱된다.

 

<tr><td colspan=3 style=background:silver;color:green;><b><?=$hash?></b></td></tr>

그리고 500번 해싱된 값이 해당 코드를 통해 해당 페이지에서 보여지게 된다.

 

그렇다면 sha1을 통해 500번 해싱되어 보여지는 값을 500번 해싱되기 전의 값을 알아내서 password에 입력하면

<tr align=center><td>Password</td><td><input name=key type=text size=30></td><td><input type=submit></td></tr>

이부분을 통해 key변수에 저장되므로 세션변수의 값과 동일한 값을 가져 조건문을 만족시켜 solve(4)함수가 수행되어 해당 문제를 해결할 수 있는것을 알 수 있다. 하지만 sha1의 경우 일방향 해시함수로 해시값을 사용하여 원본 데이터를 알아낼수는 없다. 따라서 10000000 부터 99999999 사이의 난수에 salt_for_you라는 문자열을 추가한 데이터를 전부 확인하여 해당 페이지에 나와있는 값과 같은 해시값을 가지는 값을 찾아야 한다.

 

 10000000~99999999 사이의 랜덤한 값에 salt_for_you 라는 문자열을 붙인 값을 sha1을 통해 해시값으로 변경한 값을 찾기위해 9천만개의 모든 숫자를 해시값으로 변경하여 텍스트 파일로 저장하였다. 원래 주어진 값과 일치하는 값을 찾으려고 했으나 양이 많아 가끔 문제 페이지의 연결이 끊겨 해시값이 바뀌어서 처음부터 다시 찾아야 하는 상황이 생겨 아예 모든 경우에 대한 값을 전부 저장하였다.

총 5.4GB정도의 txt파일을 얻을 수 있었다.

바꿔야 하는 값이 굉장히 많아서 multiprocessing을 통해 9개의 프로세스를 병렬로 돌려서 4~5시간 정도가 소요되었다. 해당 문서에서 문제에 주어지는 해시값과 일치하는 값을 찾아 password에 입력하면 문제가 풀리게 된다.

제일 마지막 파일에 존재해서 찾는데 오래걸렸지만 결국 알맞은 값을 찾았다.

따라서 해당 문제가 풀리게 된다.

댓글