From Zero To X

zTrix's Blog

DEFCON 22 CTF 总结

Las Vegas 归来已经几天,时差还不经意地骚扰我,顿感身体素质实在不行。

今年 blue-lotus 最终拿到了第五名,还算是一个不错的成绩,于是记录一下今年的得失与教训,回味一下这两周的精彩。

吸取了去年航班延误的教训,今年提前了两天出发,于 8 月 5 日出发,继续坐最便宜的 UA888。去年延误给的 10% off 的 coupon 在真正购买机票的时候居然不能使用,不得不怒吐一槽。

巧的是在北京国际机场碰上了即将去 blackhat 演讲的教主 tombkeeper,近距离感受了一下 “面有萌色,心有丘壑” 的大师风范。路上我们一直期待教主给我们讲讲段子,特别是演示一下如何给出一个 “小伙子好好干” 眼神,可惜一直未能如愿。

今年的赛前准备做的还是比较充分的,比赛前两天又继续增强了通用防御的一些技术和自动攻击框架,同时去超市买了一大堆吃的和饮料(今年领队老师和马杰的签证都悲剧了,目测就要没人给我们各种订餐了,TT)。Kelwin 还忙里偷闲去 blackhat 逛了一圈。

然而比赛前还是出现了各种不顺利的事情,首先是 Kelwin 的 老年 MBP 实在招架不住,镁光 SSD 直接 crash,启动不能(一查居然是多年前的镁光 SSD 固件门,这个发作时间真是巧的无奈),于是 Kelwin 信用卡一掏,立刻去 apple store 买了一个新的 rmbp。(估计他想着旧的 MBP 回国换个硬盘还能继续使用,结果回国之后发现遇上机场暴力托运,MBP 的屏幕已坏。。感谢为 blue-lotus 积攒 RP,队长功不可没。。)

第二件不顺利的事情在于现场的网络环境配置。今年的环境和去年又有所不同,虽然仍然是一根网线进来,但是内网和外网通过 tagged vlan 来区分,然而我们并没有带支持 vlan 的网络设备。虽然临时买了一个 linksys 高端路由器号称支持 vlan,但是试用之后发现不能同时支持两个 vlan,只好放弃。

5 号早上 9 点赶到现场搭建网络,10 点就会开始比赛,于是只有紧张的一个小时来配置 vlan,好在我们带了几个额外的机器,于是就先取 mac mini。悲剧的事情是我们没有显示器,在我一次强制断电之后,mac mini 似乎直接挂了,不能启动,没办法只好借了一个显示器过来,发现 mac mini 在漫无休止地检查硬盘。于是前功尽弃,只好立刻换另外一个 samsung 笔记本来作为网关,又折腾了很久,等完全折腾好网络,队员可以同时正常访问内外网的时候,已经 12 点了,于是开赛一个小时的时间又手忙脚乱的就浪费掉了,和去年一样,硬件准备还是不够充分,一开赛就甚为慌乱,实在不是一个好事情,这里不得不检讨。

第三件不顺利的事情仍然来自于硬件准备,虽然带够了网络设备,网线,插线板,但是我方设备仍然实在太弱,网线都很短,插线板也很短,乱七八糟的散乱在地上,队员进出实在不便,好几次碰掉了电源,幸好没有碰掉网线造成悲剧。但是看其他队伍各种高大上的设备箱,还带有五颜六色灯光闪烁效果,就知道差距太大。未来如果还有机会,至少要带线足够长的网线和插线板,全部部署在桌子上,井井有条,至少给自己队员带来心理上的条理感,不至于太过慌乱。此乃一个教训。

8 月 8 日,比赛第一天

比赛形式与去年大同小异,甚至连规则都不发布了。仍然是 odroid 的 ARMv7 开发板,所不同的是,使用了 qemu 运行了 x86 等不同架构的 binary,甚至还有个 badge,是 MSP430 单片机,于是今年实际上是多架构平台,这增加了不小的挑战。

比赛开始我们就准备部署一些通用防御措施,然而做逆向的童鞋很快发现 binary 里面存在诸如读取 /dev/ctf 来做验证的保护措施,于是只能放弃了一些比较激进的防御措施,先静观其变。

defcon 22 scoreboard

上午 11 点,最后的亚军 HITCON 因为做了通用防御无法通过检查,导致服务丢分,暂时排在最末,比赛季军 Dragon Sector 可能也做了类似的事情,导致倒数第二。我们由于发现的早,分数基本没扣,于是暂时排在前列。

今年的服务比去年感觉有所简单,当然也有可能是大家都有了 IDA Arm decompiler 的缘故,刚到下午就开始有队伍得分,分数开始发生变化。

defcon 22 scoreboard

HITCON 反应迅速,很快就升到了前面。我们 replay 的速度也不错,加上修补漏洞比较快,于是侥幸排在第二。

第一天感觉下来,在漏洞挖掘上,还是和强队差距很大,我们基本都是在被打的时候,快速反应,快速修补,快速 replay,于是勉强撑过了第一天。第一天结束的时候,我们还没有自己的主动攻击,只有防御做的还算是有一些效果。

defcon 22 scoreboard

第一天快结束的时候的分数榜。

结束以后,我们赶紧回住处草草吃了点饭,开始继续分析。

8 月 9 日,比赛第二天

一夜的分析还是有所收获的,无论如何,我们是带着主动攻击来了,并且一开赛就可以拿 10 余支队伍的 flag,于是打出了一波小高潮。可惜第二天主办方为了防止分数悬殊太大给后面的队伍带来心理压力以至于放弃,就关闭了分数榜,只留名次榜。

只可惜好景不长,各支队伍修补的速度也很快。到了下午,我们的攻击就基本上无法有效进行了,获取的 flag 也很零星,然后上了新服务,我们四处被打,手忙脚乱,十分狼狈。

经过前一天几乎通宵的分析,到了下午大家也都十分疲倦,cbmixx 直接在椅子上打了瞌睡,libmaru 直接表示太困太吵于是就先回住处了。

第二天的中间几个小时是最煎熬的一段时间。也是非常有可能守不住就不断掉名次的时候。

好在熬了几个小时大家终于稍微能振奋一点了,几个服务修补的也还算及时,虽然被打了不少时间。但是在这种慌乱情况下,我们发现的几个漏洞,都没有时间去写攻击。仅有的几个攻击脚本,也都因为太老,而基本攻击不成,而强队又开始不断的发起新的攻击,PPP 的 justify 新攻击一次性可以拿十几只队伍 flag,HITCON 的 eliza 也非常猛。我们在列强的夹击下非常艰难。

主办方放出了攻击视频 http://youtu.be/1UT3qXHduts ,有人说我们打法太过保守,既不攻击别人,也不怎么被别人攻击。实际情况是这个时候我们已经四处挨打了,能补上几个漏洞已经是万幸,想要攻击出去早已无力。

defcon 22 scoreboard

第一天快结束时的名次,虽然名次还在前面,但是我们心里知道与强队的差距,这是不可忽视的。

今年的防御部分我们确实做了很有效的措施,常见的漏洞都先使用 binary harden 的方法,对栈漏洞,直接进行改大栈帧,对 UAF,直接 patch 掉 free 操作等,于是至少可以挡住第一波的进攻。当稳定下来以后,我们再进一步做深度修补,这取得了非常好的效果。这里不得不提及一下 HITCON 思路新颖,他们的栈漏洞 binary harden 方法是直接把栈迁移到环境变量区,于是在一定程度上使得利用非常困难,甚至可以算是彻底修复了栈漏洞,这个比我们加大栈帧的方法高明了不少,确实是一流队伍出奇招啊。

第二天我们仍然尝试做了几个通用防御,结果要么是过不了 SLA 检查,要么就太过激进被主办方警告了,于是便全部放弃了,只留了 inotify flag 检测。

第二天比赛中间安恒老板范渊,还有腾讯等好几拨人过来给我们带了不少吃的,还有不少人也过来支持鼓励我们,非常感谢!没有领队老师在的时候,都靠业界前辈支持了。只不过我们比赛过程中,实在是又累又困又紧张又慌乱,抽不出空与各位朋友好好交流,并不是某位小编说的态度不可一世爱理不理,这希望能够得到大家理解。

另外不得不再次怒吐一槽的是,Rio 居然强制要求所有赛场队伍必须订他们指定外卖,只能付现金,并且不找零钱,强制霸王条款,让人不可理喻。好玩的是 DEFCON closing ceremony 上立刻就宣布明年就不在 Rio 办了,太贵太坑,明年要去 Bally

8 月 10 日,比赛第三天,最后的决战

比赛最后一天只有 4 个小时,但仍然激烈,程度不亚于第二天,因为会有一大波 0day 四面八方砸来。

经过一个晚上又是几乎一个通宵,我们修补了大部分漏洞,并且又写了几个攻击,于是第三天早上,又打出了一小波攻击,但是无济于事,强队实在过于强大,实际上我猜测分数还是在下降的。这个时候 PPP HITCON 还有 Dragon Sector 都显然比我们强很多,我们后面的 Reckless Abandon 和 Men in black hat 进攻势头也很猛,都很有可能超过我们。

然而第三天还是出现了一些状况,使得状况变得更加糟糕。

第一个比较郁闷的事情是,其中有一个服务我们花了将近 2 个小时修补完了,结果被对手放了后门,并且会自动 fork ,kill 的速度比不过 fork 的速度,于是我们的自动 kill shell 脚本没有把后门 kill 掉。后来我们才知道对于这种后门应该先发送 STOP 信号。于是就这样无辜丢了可能将近 250 分。

第二个也很郁闷的事情是,kelwin 的 eliza 攻击脚本已经差不多写完了,然而发现远程攻击速度太慢,还是不能正常获取 flag,等于白白浪费了时间,一直到比赛结束都没有能进行自动攻击,非常可惜。

第三个更加郁闷的事情是,badge 服务第三天有队伍进行了 dos 攻击,我们前面分析了很久的 badge,虽然不能攻击,但是对服务比较熟,于是很快 patch 了这个 dos 攻击的漏洞。于是如果这个攻击一直进行的话,我们将会因为别人的服务 down 掉获取很多分数,结果主办方突然就宣布这个 dos 攻击是不允许的,于是 badge 上我们就几乎没有得分,或者也可能拿了其中一两轮的分数,但是由于我们自己刷 rom 还要 down 一两轮,所以最终都不知道是得分了还是丢分了。

badge 是主办方耗费了不少心血设计的题目,很可惜由于出现各种问题,包括中心服务器的问题等,导致 PPP 早就搞定了没有得分,一直到最后才有 Routards 拿分,但是也基本无法改变局势了,不然一定会造成排名大变。对于主办方是一个非常可惜的事情。

另外还有一个很好玩的事情是,许多队伍的通用防御都做了 shell 命令检测过滤,于是大家都开始写花命令来获取 flag。从最开始最简单的 cat flag,后来慢慢越来越复杂,最后命令变成了

1
A="fla"; B="g"; /usr/b${nyaL}in/ba${blah}se64 "$A$B"

这个检测和防御我们并没有做,如果做的话还是有一定迷惑效果的,以后应该做一下。

由于最后一天主办方完全封榜,看不到分数和排名,大家都是在盲打盲撞,还是比较忐忑的。比赛结束之后,感觉了一下,前三名很可能是 PPP HITCON 和 Dragon Sector,结果果然正好猜中,恭喜他们,特别是 HITCON 和 Dragon Sector 都是第一年参加 DEFCON 决赛,实属不易,令人钦佩。

defcon 22 scoreboard

比赛最终结果在一周后揭晓了,我们处在第五名,与预测差别不大,还是很开心的,毕竟今年实现了突破,实现了快速修补防御,实现了主动攻击,名次上也超过了目标预期,各方面都算是稳步进步了。

感谢

最后要感谢安全宝鼎力赞助支持,支持这么多人参加决赛实在是不小的开销。也感谢安恒范渊(给我们买 Pizza 送饮料,帮忙解决不少后勤问题)、腾讯(有两个部门都请我们吃了饭来支持)、tombkeeper 的鼓励、李康教授的帮助和指导,还有各位来自于阿里等业内公司的朋友,我无法记住全部,在此只能一并道谢!

这里放上比赛结束合影一张,感谢 @郑立鹏 友情提供。

defcon blue-lotus

Comments