百度杯总决赛Writeups

百度杯总决赛Writeups

作为一个 CTF 菜鸡,第一次参加 AWD 模式的 CTF,毫无经验的我只能被各位 dalao 吊打。很气,特别是PWN的题目

Web


0x01 解题思路

由于是攻防赛制,比赛开始第一时间就上传自己写的 phpwaf,主要作用还是记录日志用。
接着把源码下载下来,php 文件基本都在 / ez_web/admin,接着开始审计。

/ez_web/admin/calc.php
25 行存在 eval() 函数,所以先不管他存不存在漏洞,第一时间注释掉,避免其他被其他选手拿到 flag。(其实我也不知道该怎么利用,直到有 dalao 拿 payload 打我)

/ez_web/admin/db_admin.php
phpMoAdmin 是一款便捷的在线 MongoDB 管理工具,在网上可以搜到两个代码执行漏洞


/ez_web/cgi-bin/test.cgi
据说有破壳漏洞,由于没有复现成功所以就不提了。

这几个利用点都限制了 127.0.0.1 访问,所以要找其他利用点。


/ez_web/cgi-bin/proxy.cgi
这里调用 nodejs,运行的是一个 http 代理,可以利用这里突破 127.0.0.1 限制


还有就是利用漏洞需要登录,所以先请求
/ez_web/cgi-bin/proxy.cgi?target=login.cgi&uname=haozi&passwd=so_easy,再拿 session 去利用漏洞

0x02 攻击对手

在一开始还没找到利用漏洞的时候,已经抓到了其他队的 payload,所以先不管那么多,拿其他队的 payload 猛刷一波。

/ez_web/cgi-bin/proxy.cgi?target=login.cgi&uname=haozi&passwd=so_easy
/ez_web/admin/db_admin.php?collection=111&action=listRows&db=admin&find=array();echo%20file_get_contents('/flag');exit

一开始就修复了漏洞,所以我们队 web 没丢多少分,直到其他队的 pwn 开刷,看着分一直往下掉。dalao 们真的是太可怕了

---------------------------------------------------W&P战队组建及纳新---------------------------------------------------

为提高团队实力,吸引新人、分享技能。白帽100安全攻防实验室特决定组建W&P CTF战队。

W&P名字来自于Whitecap100 CTF of Web&Pwn的缩写。而把Pwn放进战队名字是因当时参加了百度杯总决赛但因没有Pwn选手(当时我们只有三个Web选手)使我们从稳稳的第三一路掉到第八。希望能够牢记Pwn的重要性,几个团队创始人一拍即合决定以原先参加百度杯的人为基础组建一支属于自己的CTF战队。

现战队特向广大CTF爱好者,白帽子招收MISC、PPC、CRYPTO、PWN、REVERSE、WEB、STEGA各类赛题的选手。

当然最重要的是福利了

1.成为白帽100安全攻防实验室核心成员拥有各项特权

2.参加各类比赛,让你一战成名

3.提供就业机会,与多家公司有良好的合作关系。

4.团队专属徽章,彰显你的独特

5.奖金!!

6.过年过节小礼品什么的还是有的


有意加入的请将简历投至 #ctf@whitecap100.org#


------------------------------------------------------------------------------------------------------------------------------------

PWN

ps:此WP为nonick大佬所写,原文链接 unamer/Writeups


0x01. 堆溢出

漏洞位于0x040173A的comment修改中,此处如果长度输入-1将会有无限的堆操作能力,任意的堆覆盖。


这导致可以直接覆写下一个fun结构的头部指针,我通过覆盖函数结构头部的paramlist指针链表来得到任意地址写,当然首先需要布置好链表的结构。

在0x00401D4F的editend函数中,允许对全局变量buf进行任意修改,我就利用这个固定的地址写入paramlist指针,指向atoi之前的8个字节。


完整的exp见autoexp.py

0x02.UAF

漏洞还是在于comment,但是这次是comment之后如果删除这个这个fun结构再次创建一个fun的话,comment指针实际上free掉了并没有置零。造成一个uaf。

利用首先控制第一次comment的大小为22(malloc大小24),然后在创建新的fun的时候,datalist指针和comment指针将会指向同一块内存,通过修改comment导致任意地址读取和写入,和上一个相同的方法拿到shell

完整exp见autoexp2.py

0x03.空指针崩溃

这个漏洞不知道怎么利用,只能造成DOS的效果。漏洞位于函数0x401518。


如果输入错误这个地方会崩溃,但不知如何利用。

0x04.File object覆盖

这个漏洞同不知道如何利用,漏洞位于0x00401D48那个memcpy中,关键在于snprintf的返回值不是那个参数2可以限制的,最大可用返回值是0x492


然后这会覆盖后面的stdout指针,导致崩溃。


总结

还是太菜鸡了,被吊打,也认识到了自己不足的地方,需要提高自动化脚本的编写能力 (手动刷 flag 太累了)

编辑于 2017-04-12