DEFCON 22 CTF参赛记

8月5日

感谢赞助商安全宝给我们的支持,不然我们即使有决赛入场券也难以成行。去年参加DEFCON 21 CTF时,由于航班延误到第二天,比赛前一天才到达Las Vegas,把大家都弄得疲惫不堪。吸取去年的教训,今年我们决定提前两天到。我和zTrix、cbmixx、DeadCat等同行,从北京出发,其他伙伴则从上海出发。巧的是和TombKeeper一个航班……

从San Francisco到Las Vegas

369天后,Las Vegas,我又回来了!

到达后与从上海出发的伙伴们汇合,在比较便宜的The Quad Resort and Hotel入住。条件比较艰苦,洗澡用水的温度似乎不能调节。无线网的access code要单独购买,一个code只供一个设备一天。单设备的限制似乎是通过硬件地址实现的,因此可以用手机连接WiFi,通过Android的“USB网路共用”功能让电脑把它识别为一张USB无线网卡,再用hostapd开设热点,启动DHCP和DNS服务器比如dnsmasq,再设置iptables规则:

1
2
sysctl net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING ! -o lo -j MASQUERADE

晚上步行到去年曾去过的一家中餐馆吃饭。

8月6日

早饭在Quad大楼里的Hash House a go go吃,吃得很饱,这个西餐味道还可以接受。饭菜的量很足,我们便没吃午饭。下午大家还在忙碌地准备比赛。Kelwin电脑的硬盘坏了,去买电脑了,也有几位去购物了。

我和fqj1994在研究通用防御方案:seccomp、LD_PRELOAD等,我还在弄一些要部署到gamebox上的服务。

留在宾馆的人磨到了傍晚,大家开始商量怎么解决晚饭问题。我们最后去了The LINQ里的一家匹萨店,旁边有世界最高的摩天轮。大家看着各自点的主食都没什么食欲,我和cbmixx交换得到了匹萨,但还是感觉不好吃,最后只吃了四分之一。大家好像都没怎么吃的样子,但也觉得都剩下不太好意思,因此打包带走了一些,“祸害”购物回来还没吃完饭的伙伴们。

8月7日

从The Quad离开入住Rio All-Suite Hotel and Casino,这也是DEFCON会场所在地。我们8个人住两间双人房,一间4人,加了一张床。

道具珍藏版房卡和进入会场的凭证badge入手:

房卡
badge

中午和腾讯来参会的人一起吃饭。

大概下午大家才发现DEFCON CTF规则中说比赛时,外网和gamebox环境使用同一根网线,使用了VLAN,其中外网的VLAN ID为999。研究了一下发现我需要这么做:

1
ip l a l enp14s0 name eth0 type vlan id 999

然后用ip r配置路由。

黑客云集的地方果然好可怕,晚上出去觅食时看到一台坏(pwn)掉的机器:

Kelwin等去超市采购物品,买了一个200多美元的Linksys路由器。回来后大家折腾了一下,发现没法配置我们需要的透明VLAN环境:为连入的设备提供两个地址,一个用于gamebox网络环境,一个用于外网。

8月8日 CTF Day 1

Capture the Flag是DEFCON的一个分会场,CTF分三天进行。今天是比赛第一天,10:00开始,到20:00结束。

一部分同学先去会场了。为了节省时间,大家选择泡面作为早饭。其实另外一层原因是来这里几天发现找到可以吃得食物还是很不容易的。泡面感觉比这里的多数食物都美味得多。

去年配置网络网络花了很长时间。没想到今年也出岔子了,一台原本打算用于作为路由器的电脑挂掉了,不得不花了好一会儿配置了另一台电脑顶替。

今年主办方没有提供描述规则的纸,但感觉一切和去年大同小异,应该还是零和形式的游戏。Gamebox系统仍旧是ARMv7的Ubuntu,这次版本更新到了14.04 LTS。每5分钟为一轮,主办方会更新各个服务的flag,通过夺取其他队伍的flag得分。当有队伍服务被主办方检测为down后,服务正常的队伍可以平分其失去的flag。但具体的分数计算方式主办方没有说明。首先放出的两道题是wdub和eliza,wdub是一个web服务,eliza则是一个星际贸易的游戏,可执行文件是i386的,要用qemu模拟执行。

主办方提供了积分榜,客户端需要用证书向服务端认证。今年的页面计时部分的脚本似乎写得比较低效,Chrome里页面的CPU占用率居高不下。

很多队伍一开始就在扣分,可能原因是用上了通用防御,但没主意到主办方在各个服务里都读取了/dev/tcp以提供机器指纹信息,SLA也会用到。

来参加DEFCON的一些国内公司的人给我们带了外卖,感谢他们!

下午有队伍进行全场DoS,我们没法用ssh连接gamebox。过了近一小时才恢复,主办方重启了gamebox。后来又开启了新服务imap,之后又开放了服务badge。badge是一个硬件服务,算是本次比赛比较新颖的地方。

HITCON修补服务的方式很新颖,把栈迁到环境变量区,使得利用变得非常困难。

晚上大家熬夜分析、修补服务。

8月9日 CTF Day 2

仍旧是10:00开始,20:00结束。

来到比赛现场,赶紧开始运行各种监控服务,今天发现积分榜只显示名次了。名次和昨天结束时还不一样,原来是昨天主办方算错分数了。上午HITCON写了eliza赚取几十万钱然后利用物品种类数的漏洞的exploit,一次exploit可能需要两分钟,因为服务是用qemu-i386-aslr执行的,资源消耗很大,为此服务down了好多次。主办方似乎更新的checker的行为,我们的eliza服务down了很久。

Rio的人要求所有队伍不准带外卖进来,只能买他们指定的汉堡,据说是10美元一个,太坑了!之后闭幕式时主办方宣布明年就不在Rio了,要换到Bally

这一天发生了好多事,不仅有新的服务放出,昨天的三个服务还都升级了,还发生了两次大规模的DoS攻击。
12:10放出了新服务justify。
14:50主办方把wdub换成了wdub-v2-lbs。
可能是出于qemu-i386模拟执行太消耗资源的考虑,17:40主办方把eliza换成了eliza-arm,可以直接执行了。
18:40主办方把imap换成了imap-v2-lbs。

PPP的Brian Pak带给我们四件T恤!

结束时我们排在第四,知道分数对我们的决策会有很大帮助。主办方说大家一定都很期待知道分数,但不肯公布,说明天会公布的。

8月10日 CTF Day 3

今天积分榜直接就不提供了,也看不到名次。10:00开始14:00结束,但最后一天比赛并不是特别激烈。我们的桌子位置又换了,到了中间,另外三边是PPP、HITCON和Dragon Sector,据说是根据前一天结束时的名次排的。

研究了两个晚上的cbmixx发现并修补了badge的拒绝服务漏洞,一开始就patch了服务。也有队伍用了拒绝服务的漏洞,可惜主办方很快就说不允许拒绝服务,我们没有取得什么优势。

有些队伍采用关键字过滤的通用防御方法,把常见的比如cat flag命令给屏蔽了,但是用一些变形方法读取flag依然有效,这个以后要注意。

之后主办方还提到了因为PPP的队伍号问题,他们虽然把badge做出来了但无法得分。主办方太不敬业了,这次比赛出了这么多岔子!

17:00多在DEFCON的闭幕式上宣布前三名,和昨天结束时一样,PPP卫冕,HITCON亚军,Dragon Sector季军。

DeadCat社工能力非凡,去和George Hotz、Ricky Zhou合影了!

比赛合影,从zTrix博客发现的,抄过来吧,郑立鹏提供的:

晚上腾讯的人请客,去Caesars Palace Hotel附近的北京九号吃饭。距离有1 mile,在DeadCat的指引下,我们惊奇地发现走了1 mile后距离终点还有1 mile……

反思

还记得去年初次参加决赛时我们几乎是零准备,比起去年,这次已经有了比较大的进步。
依稀记得去年,大家碰到ARM都有点茫然不知所措,人肉assembler修改指令,发现gdb不能使用就花了很大工夫配置环境,第一天快结束时才配置好。今年大家都准备了ARM环境,除了一上来的网络问题外,没有碰到太多困难,总体上比较顺利。
去年和今年的入口标识牌

感到惭愧的是自己这一年没有太大的进步。两位以可执行文件为食物,输出源代码的逆向机小朋友真得好厉害!今年我们在防护方面做得还不错,各个服务都修补得比较即时,但攻击方面比起前几名有很大的差距。攻击框架有bug,第三天才弄好,攻防的操练也不够。

我们在比赛的策略上也犯了一些错误,对局势的把握不够准确。我们在badget一题上投入了很大的人力,但产出不够,大家都没想到这道题会这么难。主办方三人力一星期精心准备的题果然可怕。在imap上的投入也没有带给我们预期的回报。我们也应该在第一天熬夜去写eliza的exploit,大家没想到第二天HITCON凭借这个可以拿这么多分。没有进一步研究wdub-v2-lbs也导致了第三天频繁失分。

我们写exploit的速度和漏洞利用方面和PPP、HITCON等还有差距,尤其是HITCON,他们在漏洞利用和二进制加固方面有好多值得我们学习的地方。据说第二天PPP也中了HITCON的后门,过了好长时间才发现。可能是比赛前一天在Rio酒店的电梯里遇到了HITCON的队伍,看到三件年份各不相同的codejam衣服,应该是时丕勋、陈庭纬等。看官若是在TopCoder、CodeForces征战过的,应该对他们的ID不会太陌生。这类二进制分析的竞赛,感觉像诸多的competitive programming竞赛一样,我看到了一种职业化的趋势。不知道什么时候这个领域的Online Judge能成熟起来,和算法竞赛只需要提供题目下载和代码提交不同,web、pwn这类题目需要和平台交互,对系统资源有较大的要求。

通用防御技术一年比一年强了,攻防类比赛以后的开展形式不知道会发生什么样的变化。