知乎里曾有一个热门回答“智商被碾压是一种怎样的体验”。
由于经常面对异常机智的黑客,雷锋网编辑捂着胸口,表示小心心好痛。但是,如果是看着一群高智商黑客互相“碾压智商”,开展一场技术、策略与智商的较量,感觉还是挺爽的!
ctf(capture the flag)就是这样一种较量,它又被称为“夺旗赛”,是网络安全技术人员之间进行技术竞技的一种比赛形式,起源于1996年defcon全球黑客大会,以比赛形式代替黑客们之间的真实技术比拼。
也就是说,这是一场实打实的火拼啊!
这次,雷锋网宅客频道邀请到了国际顶尖白帽黑客、腾讯安全联合实验室旗下玄武实验室负责人,在国内黑客界被尊称为“tk 教主”的于旸与腾讯安全联合实验室旗下科恩实验室安全研究员腾讯 eee 战队队长谢天忆主讲这次公开课,聚焦 ctf的历史和信息安全人才培养,以及前不久举办的腾讯信息安全争霸赛(tctf)线上预赛试题解读等内容。
【tk教主(左)、谢天忆(右)】
以下是公开课总结文实录 视频,在不妨碍原意的表达上,雷锋网编辑对该实录略有整理和修订:
大家好!我叫于旸,从事安全技术研究工作已经有15年了。爱好比较广泛,接触过很多类安全技术。精通的较少,主要擅长的还是软件安全方面。我现在在腾讯负责玄武实验室的工作,如果你是一个安全爱好者,可以在搜索“腾讯玄武实验室”的微信公众号或微博账号,我们每天会推送国际上最新的安全技术信息。
ctf是什么?
这个概念是从欧美传过来的,字面上是“夺取旗帜”,原本是西方的一种传统户外游戏,相当于我们的丢沙包或者跳大绳。原始的 ctf每个队伍真的有一面旗帜。比赛目标就是夺取位于对方“基地”的旗帜,并带着旗子安全返回自己的基地,当然,实际规则还要更复杂一些,比如还有“监狱”的概念。
后来,“夺旗”的概念也被引入信息安全攻防比赛。因为在比赛中,选手需要通过解开题目,或攻破目标夺得“flag”。
现在,我们用ctf来代指信息安全领域的夺旗比赛。
ctf 的比赛形式有以下几种:
1.真的是“题目”的解题模式,包含逆向、漏洞(也称攻防)、算法、审计、综合……,难度不一,分值不一,越难的题目分值越多。
逆向题一般是一个二进制程序,flag 就藏在这个文件里,需要选手有高超的逆向技巧,找出 flag。
漏洞题一般也是给二进制程序,选手需要从程序中找出漏洞,并写出漏洞利用的攻击代码。虽然做漏洞题一般也需要逆向技巧,但对漏洞技术要求更高,用写出的漏洞利用代码实际攻击成功,才能取得 flag。
算法题是指算法分析题,给你一段某种算法处理过的数据,选手需要对付一个或多个算法。
审计题给出的文件就多种多样了。可能是一张隐藏了信息的图片,看起来像风景照或者人像,但其中有线索指向某个 flag 。也有可能给你一个网络数据包,包含大量网络通信数据,需要你分析。
还有一些难以归类的题目,或者由几类题型组合的题,称为综合题。
解题模式是比较常见的模式,不少 ctf 都选择这种模式,特别是在预赛阶段。
2.攻防模式。
这个模式更加热闹和刀光剑影。因为,它真的是队伍之间进行攻防。攻防模式一般可以分为三种:
第一种,每一支队伍一同攻击同一个目标,考验攻击能力;
第二种,所有参赛队伍进行防守,遭受攻击,考验防守能力;
第三种,结合前两种,综合考验攻防能力。这种模式对技术、战术、策略要求更高。一般是回合制,一个回合五分钟。可以按照自己的策略选择优先攻击或防守,打谁不打谁,队伍自己决定,一个回合暂停一次。
还有一种模式,这种模式在国内不常见,称为“king of the hill”,我把它叫做“山大王”——大家同时攻击一个服务器,比谁占领服务器的时间长,保持自己的控制权,不被别人干掉。这其实和传统夺旗更像,守好自己抢夺的东西,也被人称作“懒人的 ctf”,因为占领方有很大优势,有时候可以打得比较悠闲。
ctf 现状
近几年,国际、国内的ctf种类越来越多。举办ctf的组织方各有目的,有些有政府背景,比如,韩国的 codegate ctf;有些是战队办的,比如,ppp 的 plaidctf,这种比较常见;有些是企业办的,比如腾讯的 tctf ;有些是安全会议牵头办的,比如著名的 def con ctf,实际具体操办的也是战队。defcon ctf是目前还在办的历史最悠久的ctf。最早一届defcon ctf 是 1996年办的。
刚才提到的这些都是公开的ctf。还有一类是不公开的 ctf,不会公开征集报名,开展预赛之类。比如,有些国内、国外企业会举办面向内部员工的 ctf。另外,从公开信息可以了解到,美国国防部从 2014 年开始举办名为“cyberstakes”的 ctf 。美国国防部有一个网络安全人才的培养计划,目标是花3年时间在美国军队里培养 4000 名安全专家。而且标准很具体,要求会挖漏洞,会写exploit。训练的一个环节就是cyberstakes”。而且他们邀请了 david brumley 教授来授课。这位教授是 2016 年 cgc 最后 7 支入围队伍之一 forallsecure 的创始人。cgc 是 ctf 历史上的转折点,不再只是人和人打,而是和机器打。他们招募了一些队伍设计了一套系统,和人类战队打 ctf。就像阿法狗与人类下围棋一样。不过,cgc最后的战胜队还是人类队伍。虽然机器队伍没有横扫千军,但也不是最后一名,还是有两支人类队伍输给了机器。
所以,在安全攻防领域,至少在 ctf 领域,目前人类虽然依然保持优势,但毕竟也有两支失败的队伍,所以,大家要努力。
ctf这两年在国内的发展
ctf最近两年在国内发展迅速,可以从我给的这两个截屏看出来。左边这幅是我在2015年在手机上的截屏,右边这幅是我在2017年的手机上的截图。
大家可以看到,2015年,在谷歌翻译上输入“ctf contests”,翻译是“周大福竞赛”。但在2017年,谷歌翻译就已经认识 ctf了,我觉得这能说明一点问题。
为什么ctf越来越多
教育部高等学校信息安全专业教学指导委员会秘书长封化民曾说过:中国信息安全人才需求将以每年 1.5 万人的速度递增,到 2020 年相关人才需求将增长到 140 万。我还看到毕马威对英国大企业的调查显示:安全人才越来越供不应求,有 52% 的被调查者表示,甚至愿意雇佣有网络犯罪前科的人,因为人才供不应求。美国兰德公司发布的一份报告指出:美国高端信息安全人才存在短缺,尤其是在联邦政府内,这会对国家安全造成不利影响,建议联邦政府放宽雇用规则、投资信息安全教育。
所以,可以看出,安全人才缺乏是一个国际性问题。而 ctf 是培养安全人才的重要手段。我觉得这是近年 ctf 热门的的最重要原因。
学习ctf 的好处
研究安全技术过程中训练出来的思维能力是很有用处的,即使以后不去做网络安全。我经常跟大家讲的一个案例是,1996 年成立的黑客技术团体“w00w00”的成员中至少包括:
whatsapp 的联合创始人
jan koumnapster(世界最早的音乐共享平台) 的联合创始人
shawn fanningarbor networks 的联合创始人
dug songnmap 的开发者
gordon fyodor lyoncountertack 的 cto michael a. davisgoogle 元老
david mckayyammer 安全主管
josha bronsonaccuvant labs 的 joshua j. drake
veracode 的 andrew reiter
这个团体不是特别大,却出了这么多人才。有些人后来虽然没有从事网络安全的工作,但在自己的工作岗位上做得非常出色。
如果,你不但对安全感兴趣,而且想未来从事安全工作,那么就要明白,ctf中的技术对安全工作来说一部分,不是全部。工作中遇到的有些问题可以用 ctf中涉及的知识解决。还有很多问题则需要用到 ctf 之外的技能。
这是京华时报的一个报道截图:有人发现自己一卡通的金额突然变成了4000多万,有一点计算机基础知识的人,一看就知道是怎么回事:处理一卡通的机器在设计中存在问题,扣费没考虑余额,把钱扣成了负数。报道里提到余额被扣成了-1.8元,但当再次把卡插入机器,机器在读取余额时,按无符号数处理,就变出了4000多万。
类似的事情用 ctf 里的知识就能解释。但安全工作中还需要很多其它技能。如果能在比赛之余,找机会接触一下安全行业,了解行业里有哪些角色,了解每种角色需要什么技能,了解自己适合哪种岗位,在将来进入行业时会有很大帮助。
ctf 和现实安全技术工作的关系
打 ctf 是非常好的安全技术能力训练方式,优秀 ctf 选手在从事安全技术工作时也会有很大优势。不过大多数现实中的安全技术工作其实没有 ctf 中的问题那么困难,但会复杂得多。另外,打 ctf 的目标是得分,处理现实安全问题的时候要考虑更多因素,比如,解决问题的同时还要保持业务运行。
我所列出的信息安全技术方向只是粗粗列举,实际上不止这些。ctf直接涉及的只是其中一部分。当然,在 ctf 中训练的基本功可以帮助你比较顺畅地去学习那些没接触过的领域。
另外,除了和 ctf 相关的技术能力,从职业的角度看,通用能力也很重要。比如,很基本的三点:能想清楚、能写清楚、能讲清楚,这体现了你逻辑是否严密、语句是否通顺、表达是否清晰。有些通用能力对专业能力提升也有帮助,比如分析能力、判断能力、规划能力、搜集能力、学习能力、提炼能力。无论以后你想从事什么工作,在学生时代加强这些能力的培养,对你整个人生都会有很大的帮助。
第二部分,谢天忆讲解腾讯 ctf (tctf)初赛题目及解答,由于涉及到很多术语和代码,雷锋网编辑整理了谢天忆的ppt,请读者配合视频直接“服用”。
1.小白对 ctf 感兴趣,能否推荐学习路径?
天忆:我回忆一下当年自己小白时,是怎么学习的。首先,ctf和信息安全相关,信息安全是和计算机科学相关的一门学科,所以先要学习计算机科学的基础知识,比如,学习编程、写算法、数据结构等。我在高中参加信息学竞赛时,考察的是学生的编码能力,对后来学习非常重要。其次,你要学习计算底层的原理知识,比如,计算机的组成结构、cpu的实现原理和汇编语言等,理解为什么一个程序可以跑出这样的一个结果。然后可以再学习更多的上层知识,比如其他高级语言等。在这些基础上,就可以开始学习一些安全相关的特定领域知识,比如逆向分析、漏洞挖掘与利用、web安全或者密码学等。除此之外,掌握数学知识也很重要。
2.有没有专门可以学习 ctf 的入门级网站?
天忆:网上有许多的 wargame 或是 oj 平台,但是风格和难度不一,题目质量也是有好有坏,在练习时要根据自我感觉和实际情况来调整。在github上 ( 有人专门搜集了历年 ctf 比赛的题目和解答,最近三四年的比赛都有。
3. ctf 怎么训练更高效?
天忆:要有自我训练的意识,这个影响是潜移默化的。比如, 把打游戏的时间拿出 50% 来就可以多训练几道题目,或者在做同一道题目的时候不满足于现有的解法,去想想有没有其他更好的方法来解决,要举一反三尽量深挖一道题目。另外,多参加一些比赛也是有益的,特别是高水平的国际比赛,通常这些比赛的题目都会有很高的质量,可以在其中学到更多的东西。
tk : 充分的时间、精力投入是必要的,可能没有太多取巧的办法,天忆可以介绍一下自己的经历供大家参考。
天忆:我在读研究生时接触ctf,但在更早以前,是小时候我爸拿过来一个叫做“中华学习机”的东西,没有图形界面。但我一直保持好奇心,在初中时误打误撞学习编程,觉得非常有趣,而且可以解决复杂的数学问题,发现了计算机的无穷潜力。
读书时,因为课业多,不会专门花时间,但会在业余时间在纸上写写代码,有机会摸到电脑时,就会赶紧敲进去。我本人也不是完全不打游戏,周末会抽时间打游戏,但在研究技术时会百分百投入,这一点非常重要,三、四个小时能抵得上十个小时。
4,为了 ctf ,如何学习逆向和反汇编,有没有书籍推荐?
tk : 这个话题很大,一两句讲不清楚。从我自己的经验看,逆向和反汇编属于门槛比较高的事情,你在门槛外看,会觉得很困难、很痛苦。就像你去学英语,先让你学的不是字母表,而是丢过来一本莎士比亚的著作,所以要有方法度过阵痛期,阵痛期过后,就比较容易了。
所以,要先选几个小目标,虽然有些枯燥,但小目标在逆向和分析后,是能达成一些成果的。举个例子,我最早的逆向是逆向《仙剑奇侠传》的程序,为了能在游戏多得到一些钱,有这样一个目标,达成目标后有正向的反馈激励,就能坚持下去。
一般讲逆向的书都很厚,我不太推荐一开始就去买书,书太厚会造成心理压力。先在网上找几个教程学习一下,学会一点之后再去买书就不怕了,可以跟着书系统地学习。
5.请介绍一下 badtunnel 漏洞的发现过程。
tk : 这是属于设计类和系统多点耦合的问题,我这几年一直在关注这个方向。2015 年 4 月,我去深圳出差,飞机要飞四个小时,我没什么事情做,就在脑子里过了前一阵子看的一些网络协议,忽然有个灵感冒出来,觉得在这个地方可能有问题。不过当时工作比较多,耽搁了,没有验证。直到 6 月的时候,我才写了一个程序去验证,然后发现确实有问题。
6.ctf 队伍的队员应该有哪些技能?
天忆:ctf 题目一般有几个大类,而选手可以选择一个或多个方向进行发展,一个全能型选手往往可以有多个方向的技能,比如,二进制、密码学或者是 web 安全等。但是,作为一个战队整体来说,保持队伍成员的技能多样化是很重要的,这样在碰到各种各样不同类型的题目时都能够有合适的人选来解决,而这样的队伍综合能力才是最强的。
7.这次 tctf 有什么特色?
tk 天忆:这次tctf 是defcon ctf的外卡赛。也就是说,tctf 打好了,直接一个电梯升上去就到拉斯维加斯了。在比赛本身上,我们选用的比赛赛题形式是解题模式,而且题目质量很高。考虑到和 defcon ctf接轨,二进制的题目多一些。defcon ctf主要是二进制的题目,不过我们 tctf 还是尽可能会保持一定多样性。
8.ctf 比赛里有什么特殊套路和技巧?
tk 天忆:攻防模式下有一种“搅屎棍”的做法,对吧?一些比较不会放在明面上的东西比较多,比如,种后门。我记得有次比赛的时候,有个团队知道别人会用wireshark去分析他们的数据,结果他们发了一个漏洞数据在这个包里,别人一抓包就悲剧了。当然,即使用套路,还是要基于你的技术能力。
一个比赛如果都是套路,意义不大。但是,如果通过题目,可以想出没有见过的套路,这就是意义。tctf 解题模式不仅考察技术能力,还能考察别的能力。
以前在 defcon ctf上,很多工作人员的精力也有很多要花在捣蛋的人身上。