CTF夺旗赛是计算机安全竞赛的一种形式。国内这一领域当前的规模最大的赛事BCTF“百度杯”全国网络安全技术对抗赛决赛刚刚落下帷幕。作为工作组的一名成员,想分享下自己的参与经历。
网站开发
- 2013年9月,诸葛建伟老师组织了我们进行讨论。
- 学习了怎么把PSD转化为HTML和CSS,花了一天根据提供的PSD网站设计写了初始版本前端。
- kelwin和zTrix觉得太丑提供了新设计。
- 花了一天主体框架换成了现在的样子。
- 之前学过一些Rails,为迎接新的挑战继续学了一些,了解用户注册和邮件发送等实现方式。
- 邮件系统采用
Postfix
,腾讯企业邮箱使用中发现了好些问题。比如不含From:
或To:
首部时smtp.exmail.qq.com
会返回250 Ok: queued as
但实际上丢弃了信件且没有退信。 教育网和电信某线路表现不一致,有部分禁止了AUTH LOGIN
。 - 12日10日网站上线。
- 12月11日南京的新闻发布会宣布大赛正式启动。
- 12月13日网站接受用户注册。
- 2月下旬诸葛建伟老师开始在各校进行巡讲。
初赛
3月5日到7日,清华大学的七名工作组成员与中国海洋大学和浙江大学的各一名成员陆续来到位于南京紫金(江宁)科技创业特别社区的承办单位南京赛宁信息技术有限公司。我们入住的宾馆离公司有十几分钟车程。公司占地面积很大,联系人给我们安排了一个很大的工作场所。
为了吸引用户参加我们设置了“大赛宝贝”的评选,优胜者将担任形象礼仪,并为各自的加油助威,统计队员饮食需求并分发,以及拍照摄影宣传,在团队活动时担任领队等。7日我开发了大赛宝贝展示、投票和解题版等页面,到报名结束时总计有42人报名。
8日到了近2:00我才把各项功能的bug都基本修复。之后大家回宾馆休息,大概6:00我们又来到工作场所。8:00就要开赛了,这两个小时我又添加了场景描述、最后正确提交时间等一系列功能。
初来乍到这道题是选手在新浪微博上关注BCTF后由工作组手动回粉从而推送flag的。关注操作点多了之后触发了微博的保护机制,每次关注都要输入验证码,工作组成员真的好辛苦……
开赛一段时间后我们发现有作弊情况发生。我们根据战队连续两次正确提交的间隔,和其他战队正确提交的间隔,正常解题留下的日志痕迹等多种手段进行作弊行为的侦查。因为大赛宝贝优胜者将获得比较丰厚的奖金,我们注意到还有很多人在网上散布答案,让其他队伍解出题获得投票权为他们指定的女生投票。另外还有不少同学校或是认识的人之间互相交流答案的情况。成都信息工程学院有较多大赛宝贝候选人报名,我们发现有很多投票的人存在作弊现象。我赶忙开发了封禁功能。之前我们的规则里提到了“禁止队伍之间分享任何解题思路及flag,违规者一律取消参赛资格”,我们也确实绝不姑息作弊现象,一经发现即取消参赛资格,并取消所有投票。
我们使用了很多大显示屏监控平台运行状态并显示各种统计信息,以及微博、邮箱和QQ、IRC等聊天工具里选手提出的问题。
21:00左右一部分工作组成员先回宾馆休息,休息到9日3:00多回来监控平台运营;另一部分成员则坚持到3:00多再回去休息, 11:00回到工作场所。这一天我又做了一些开发,修正了网站的一些细节问题。 14:00开始竞争变得非常激烈,前十几名的战队都在争夺前八名, 相对名次变化非常大。 到了下半夜一些成员实在疲惫不堪回宾馆睡觉了。
10日8:00比赛结束,我们知道这一时期很可能产生作弊行为,大家仍然忙碌着维护平台,不敢掉以轻心。
6:00多在审计了他们访问服务的日志后,我们发现“无
名”的提交可疑,向对方打电话询问解法。
7:40多flying
发现某支战队于7:36的一个提交解出了某道题,
但之前有两次错误的提交,较早的那个提交是正确提交的一个前缀,较晚的提交则和正确提交相差一个字符。而这类逆向技术的解答通常是复制粘贴的,刚好错一个字符的可能性非常小。我们为此觉得非常可疑,向该战队的联系人打电话质询题目的解法,对方无法描述清解法细节。这基本证明对方作弊了。对方表示和以前毕业的学长那里进行的讨论。比赛结束了,在交流中对方终于承认的确是提交了别的队伍解题得到的答案。
初赛比赛统计和运营体会
注册并验证的用户共有2547名,其中战队236支,在比赛期间登录网站参与的有至少1576人。除去被封禁的,得分的个人有218个,战队190个,确实是国内规模最大的赛事。除了大陆的对网络安全有兴趣的人士,还有香港的战队VXRL和台湾的战队217参与,还有美国的战队UCSB的PartOfShellphish。另一支台湾的战队Chroot和世界排名第二的美国CMU的PPP也注册了但未解题。
根据参赛战队提供的数据,从中筛选出格式符合规范的,整理得到大陆各省份的参赛人数:
北京 | 287 |
江苏 | 196 |
广东 | 184 |
四川 | 165 |
上海 | 103 |
河南 | 74 |
浙江 | 57 |
黑龙江 | 55 |
山东 | 54 |
重庆 | 52 |
陕西 | 52 |
福建 | 47 |
湖南 | 33 |
湖北 | 30 |
辽宁 | 12 |
天津 | 10 |
安徽 | 9 |
山西 | 7 |
吉林 | 4 |
新疆 | 4 |
甘肃 | 4 |
内蒙古 | 3 |
宁夏 | 1 |
海南 | 1 |
青海 | 1 |
在提供学校或公司信息的战队里,成都信息工程学院和西安电子科技大学参赛人数最多,都有13支队伍,紧随其后的的是浙江大学(8支)、东南大学(7支)、电子科技大学(6支)、南阳理工学院(6支),另外还有19支公司战队。
比赛临结束时调研怎么用R
的ggplot2
绘图。前二十名战队的分数走势如下图:
赛后工作组在微博上发放了一个问卷让参赛选手填写,询问了解BCTF比赛的渠道、对题目的看法、对决赛的期待等。多数是在CTF交流群或者微博了解到比赛,个别是参加西安电子科技大学和杭州电子科技大学的比赛时了解的,也有从看雪论坛或是学长、朋友那里了解的。参加比赛的原因主要是兴趣,想借此学习网络安全的知识,所有人都表示难度偏高。没有入围决赛的队伍也表示希望有直播,能感受一下决赛的氛围。一些战队认为应该再多增设Web安全题目,也有认为需要增加社会工程学题目的。
大家希望赛后能发布题解,以及像Google Code Jam等算法竞赛那样多设置几轮,所有人都表示会参加明年的比赛。
大家希望多出Web题目也和国内安全界重Web有关。国内研究安全的人大多着眼于Web安全,逆向技术和软件漏洞利用方面比较薄弱,和国外强队相比有非常明显的差距。很多人认为题目出得较难,而事实上我们工作组已经考虑到国内战队接触较少,也受限于我们自身的水平,题目是出得比较容易的,相信放到国际比赛中很多强队可以在极短的时间里做出来。比较欣慰的是有选手表示“办的很好阿,特别是抓作弊算是国内最好的了“,这让我们感受到汗水没有白费。
CTF界有一个衡量各战队实力的较为权威的网站http://ctftime.org。它对国际的各项赛事设置了权重,根据http://ctftime.org/前150支战队中对有唯一国家或地区归属的战队的统计,俄罗斯最多,有26支,其次是美国19支、韩国9支、日本9支、法国9支、德国5支、荷兰5支,亚洲国家中伊朗、越南、印度也都有3支战队,而中国大陆只有2支战队。
决赛
决赛分为两天,5月2日和3日。我因为4月20日去广州参加了ASC14超算比赛,一直到27日才回北京,29日来到南京,决赛做的事比较少,基本就做些零碎的打杂活。4月30日使用Highcharts.js
写了一个显示分数趋势的网页http://bctf.cn/final/trend/。学习Redis
的SLAVEOF
。5月1日学习Sinatra
写了显示异常流量的Web服务。之后研究怎么用ssh
执行后台命令。有几个麻烦点:
ruby
是rvm
提供的,ssh服务端的bash
是以非交互式模式运行的,且标准输入输出是管道,不会source
.bashrc
、.bash_profile
等文件。直接用ssh localhost ruby -v
会找不到ruby
- 需要检测到
ruby
进程不存在再执行命令,以防多次执行
可能使用supervisor
之类服务管理器更为合适,但因为某些考虑没有使用,直接用pgrep
判断。
1 | bash -lc "pgrep -fa \"[t]rend.rb\" || cd trend && nohup ruby \"t\"rend.rb build/data.json" &> /dev/null |
5月1日晚在“世纪缘”有个欢迎晚宴,部分工作组成员在互动游戏前提前离开来到比赛场地为继续开发平台和题目。
然后要把VuryLeo的/battlefield/
、/pwningwall/
等移到网站上,以及Redis
的同步等。
实现方法是tcpdump -l
后用awk
把端口号映射为服务名,并产生Apache风格的log管道给logstalgia
。
5月3日学习了server-sent
events,把socket.io
改写为EventSource
。学习了Sammy.js
,用到了http://10.10.10.10/trend/
上,提供了Day
1和Day 2两个图片。比赛结束前一小时封榜,做了少量管理操作。
“HITCON 217”第一天下午分数扶摇直上,比赛结束分数几乎是第二名三倍了。“HITCON 217”战队的成员,感觉上,比大陆好多选手知识全面一些,打了很多比赛,职业选手也确实带来了很多优势。
逸事
比赛过程中有选手把网线接到其他队伍的路由器上物理渗透。
有选手重蹈覆辙,Mac OS
X加上Python的system
被;rm -rf /
命令注入了。如果是Linux较新版本的coreutils
就不会发生了。
“HITCON 217”领队对平台展示部分大为赞赏,主要都是[VuryLeo]的功劳,自己毕竟也贡献绵薄之力,心里美滋滋的。
决赛统计
pwn成功服务的次数等统计数据都在https://gist.github.com/MaskRay/c80215c5c3126482633d里,jq
果真是神器,以前就当pretty
printer用的,太屈才了。
整场两战队排名改变只发生了25次。Day 1下午“HITCON 217”超过“Light4Freedom”成为第一后就再没被其他队伍超过了,和第二名的差距也越来越大。
赛制
赛制很大程度上模仿了DEF CON 21 CTF决赛。零和游戏是很残酷的,好在工作组的NPC可以给大家送分数,也起到了发送提示流量的作用。
1 | # cat states | jq -r '.pwns[] | .pwner as $p | .victim | "\($p)"' | sort | uniq -c | sort -n | grep -v NPC |
对于各服务,唯一掌握漏洞的队伍有极大的优势。当了解的队伍多了之后,防御明显就比攻击重要多了。上表是各战队pwn成功的次数,“无名”攻击次数很多,但攻击得到的分数要和其他攻击队伍平分,而防御没做好一下子就丢10分。
攻防比赛的平台形式,感觉还有很多要改进的地方。因为懒惰和事情太多,没有投入足够的时间,对自己的表现不太满意。
5月4日
0:00和VuryLeo做CodeJam 1B,感觉写算法题的能力日益下降或是夜里状态很差,900多名勉强过了。
这一天的安排是湖畔论道,段海新老师的展示不错,可惜听不大懂。下午有马杰和BCTF工作组同伴的展示傍晚的座谈会还不错。
晚上参观夫子庙,夜游秦淮。
5月5日
工作组成员各自启程踏上归途。