缘起

第一次听到“CTF”这个词是在大一上,忘了是在哪个群里。那场是科大办的,我不知哪根筋抽了想去玩玩看。可惜当时对此还完全不了解,不了解它的具体内容,不知道从何开始练习,于是便鸽掉了。但当时还是埋下了对CTF的一些臆想希冀的。

寒假里闲得没事,不知哪根筋又抽了又想到了CTF(想起来了,听英语听力听到writeup一词去搜然后……)。这回找到的网站比较友善,能让我成功拿下一血,wp在网上也很容易找。于是就每天一道或是两道地在上面抄答案做题目。由于我对Web的认识实在肤浅,寒假里真正让我入迷的是社工和加密。当时感觉像见到了老朋友一样,分外亲切。一个题目,一个知识点看似零散,但它们无不联系着更为宏大的,我所未曾了解过的知识块,犹如一箱箱秘宝,予我以莫大的喜悦之感。更重要的是,它们作为一个整体,折射出了一种hacker spirit,一种独到的、创造性的、艺术的看待世界的方式。这一切无不充满我以激情。

当时的日记中也写了一些自己对其的想法,有些话现在读来仍分外亲切,摘要并记录如下:

这些东西怎么会这么有意思呢?完全让我陷进去了,简直是恋爱般的喜悦呐φ(゜▽゜*)♪(虽则我不懂何谓“恋爱般的喜悦”╯︿╰)(2019-03-17)

总之社工这个概念给了我很大的冲击,这是个和生活很贴近的话题,简直可以把日常生活过成推理小说啊!实在浪漫,实在有趣,不过我对此还应有进一步的认识,而且我还是一个社工库也没找到……哈尔滨的杜甫,死活搜不到唉……结果社工题被做成了密码题啊✿◡‿◡(2019-03-15)

密码的话,除去zip伪加密(压缩我还不懂,winhex那界面我目前还适应不了,于是我也只会09改00这样了……)其实也就做了Ook还有Brainfuck两个题,这个时候我有些撑不住了……本来只是去搜一下Brainfuck是个什么算法的,不想这竟然是个编程语言???还™符合图灵完全思想?哈,哈,哈,有意思!不过看到处理个加法都这么麻烦还是有些心累啊。可,啥啥啥?M67还写过这东西的博客???还有更好玩的叫WhiteSpace的语言?Shakespeare?Chef?哈,哈,哈,今天都遇见了什么神仙玩意儿啊!晚上吃饭的时候还看了看乘法什么的实现,嗯……我也要写编译器!(2019-03-15)

密码题……今天真心没状态,网上搜搜竟然连在线凯撒加密都没有,真伤脑筋,只能自己动手了…….水是水过去了,反正对这个不大有兴趣也找不到参考资料。base64那题是真的有意思:从base64,到八进制,到十六进制,到unicode,到十进制,再是unicode……因为不了解unicode的机制捣鼓了半天,这个可以深究一下。杰斐逊在百度上死活搜不到,狗日的百家号。后来只能对着writeup,傻子一样手工算,O(n),再找规律。写了个辅助程序,tmd出了不知道什么鬼问题。想换用python,但苦于还不会用python处理字符串,鸽了吧鸽了吧。之后想了解一下那个富强民主是什么原理的,发现一帮人用这东西开车,想想也是挺好玩的✿◡‿◡说到底今天根本无所学啊(,,Ծ‸Ծ,,)(2019-03-19)

不过,也有沮丧的时刻:

今天搞网络的部分吧?post与get,php中的==与变名变量,还有又是看源码又是console,以及hosts……感觉自己学得完全不系统,这样下来自己能学到什么呢?略感失落便不再做了……(2019-03-22)

这过程中有兴奋也有失落,但不论如何,从中都可以看出CTF是个有其价值的东西,是好玩的东西,是能把人深深揪住的让人先是沮丧而后豁然开朗并大感喜悦的该死的又真他妈有意思的东西。

但是在百度上搜“CTF”(Google的话就好多了,再次抱怨百度真是,太垃圾了),查到的多是让人摸不清头脑的题目,予人困惑的各式各样的工具,还有稀奇古怪的软件。这很容易劝退萌新,让他们对此感到恐惧,觉得自己啥也不会。我觉得这样不好,毕竟每个人都是从啥也不会走过来的。我认为,只要有一些基本的对于计算机(各个方面)的认识,一定信息处理能力,还有坚韧的意志,以及强大的学习与反思能力,等等,都能从CTF中找到乐趣。(只要你相信自己能获得这些能力,很大概率你都能获得它们,虽然不一定深入)

这里,我想记录的是自己的心路历程,给予喜欢信息安全但苦恼不知如何入门的同学一些启迪,如果真能有所启迪那便太好啦!

(后文,dl请忽视)

OK. Let’s jam.

基本架构

假设,你面前有一个TextBox,上面有一串字符,比方说,flag{Y0U_3nj0y_cTf};右边有一个“submit” button。把flag粘贴进去,click on the button,然后它弹出个MessageBox:”correct! And you scored 30 pts”。OK. It’s easy, and it’s for babies.

这大致就是CTF的基本模式了,很简单,是不是?问题在于flag没这么好找。正因如此,这个比赛才叫“Capture The Flag”。作为与赛者,我们要找到隐藏着的flag,submit it。而作为组织者,其任务便是藏好这个flag,千方百计地藏好它,同时要给选手一线,也仅有一线的希望,以制造竞技性与趣味性。

如果你要藏flag,思维发散一下,你会怎么藏呢?既要把它藏得绝对巧妙,也要留出希望,有哪些方案呢?

你可以把它藏到写好的可执行文件里,让选手下载,反编译这个文件并通过阅读理解其中的代码而得到flag,这一类型的便是rev,逆向。

(rev给出的一般是exe文件、elf文件,如果是apk包,那这就是android题了——虽然两类题中心思想都一致)

你可以把它藏到网页中,藏到源码里,藏到备份文件里,藏到HTTP的header标头里——怎么藏都可以。或者你可以不藏,只要用户“无法”访问这个网页就可以了,比如,给人家个403错误,302重定向一下……都可以。这一类关于网络安全的统称web题,它有很多小的分支,此处便不细讲了。需要说明的是web的很多套路都是依据历史上的漏洞改编出来的。能够走先代hacker走过的路,这怎能不叫人眼前一亮呢?

如果你觉得藏东西太没意思,不妨干脆些,直接给出flag——的变体。比如要交的flag是flag{Y0U_3nj0y_cTf},你可以给我ZmxhZyU3QlkwVV8zbmoweV9jVGYlN0Q=。当然,it’s still for babies。也可以给我个9f19c7ac384e737be7d5015461fd988f,但这样就太没意思了,只能反映出你水平不太够,还比较恶意。这类关于加密的便是crypto题,可分为古典与现代两种。(有的赛事会把古典密码学给放到misc里面)

我还可以脑洞大开,放flag到破损的二维码中,“残缺”的图片中,“奇怪”的压缩包里。等等,这些就很杂了,所以称misc,杂项。

以上是一些基本的题型,还有一些其他的分类方法,比如从web里拎出代码审计作为一类,还有pwn,等等。如果是萌新(比如我)的话还是先了解简单的情形,形成个大概的印象为妙。而不要过度纠结对于题型的划分及一些稍难入门的题型。

一次友好的对话

我们拿道水题来进入CTF的奇妙世界吧!网上针对水题的博客一般短得可怕,只有解答,没有思索,私以为这样意义不大。我觉得人的思路是值得记录的,无论是深入的沉思,还是无谓的纠结。

比方说,上面的ZmxhZyU3QlkwVV8zbmoweV9jVGYlN0Q=,我说it’s for babies,这话相信绝大多数CTFer都会赞同,但是如果你没碰过CTF也不了解□□□□□□,你可能会一脸懵逼“woc这啥啊我怎么啥也看不懂好难啊”。别着急,下面是面向萌新的友好讲解~

分析上面的“密文”,它有什么结构呢?大小写都有,还有数字,最后是一个等号。如果你对编码这个词有概念的话,你便可以search for “等号 编码”(注意不要搜”= 编码”),然后你会发现“base64” “utf-8”之类的字样。这些都是啥?搜就是了。搜base64,你看到了“在线解密”的网站,抱着试一试的心态,你成功拿到了flag……

要是你没有关注到这个等号的话,也没事。search for “大写 编码””大小写 编码”,一个个试过去,这个过程可能让你很烦躁,因为你可能没找到有效的信息。没事,search for “CTF 编码”。都可以呀。

如果你对“编码”一词没概念,那也没事。search for “CTF”呗,看看它有哪些题型,看看人家的wp都有啥套路,没准你还会找到CTF wiki这样的网站……总之应该会对“编码”有概念的,应该。

再不成,直接把这串东西拿去搜也行,即便出不来结果,这也是一种尝试。

从上面的例子不难看出,CTF解题的途径是多样化的。就说搜索,也有很多的搜索方案,为什么搜这个可以而搜那个不行,这些,私以为都是需要记录的。而在工具上的选择就更多了,手写脚本、现有工具……达到目标的途径虽然大体思想上一致,但在细节上是有所差异的。player不应只停留在“解题”的层面,而当想想什么样的做法是elegant的(尤其在脚本的编写上),这样或许更能有所提升。

至此你搞出了这道题,但是你可能对于base64还是一脸懵逼:这鬼东西是怎么运作的?于是你search for “base64”,然而搜到了很多重复的内容。要想深入了解这东西,得到“专业”一点的地方,所以要search for “博客园 base64”“简书 base64”“CSDN base64”。(虽然重复的东西还是很多,人云亦云和抄袭的现象仍然很严重,唉国内的互联网环境啊!)走马观花一阵子后,你大致了解了一下这个东西的原理,提出的背景,复杂度,等等。你可以从这个概念扩展出去,了解base64,base32,base16的异同;了解其他简单的编码方案;了解python中encode()的用法,以便今后的解码……有很多方向可供延伸。

以上,都是从一题延伸出很多方向的例子,也是“以赛促学”的例子。CTF能够让你了解一些有趣的好玩的此前可能未曾了解的东西,为你打开新世界的大门,让你有事可做,有东西可学。

打CTF的流程大致便是这样的:看题->不懂->自学->大概懂->下一题。然后是赛后总结。安全的水很深,涉及的概念多的去了,于是选手也得拼命学,既耗脑力,也费体力。CTFer在赛后脑袋里可能会新增加一箩筐奇奇怪怪的知识,有点像,博物学家?这个词是从卢昌海的博客上看到的,私以为这个比喻实属绝妙。虽然他讲的是软件领域,但是在CTF上这段话也是很适用的,尤其是在接触到了CTF的七七八八的工具之后……

越来越觉得, 某些领域的软件工程师越来越像博物学家。 二十多年前, Java 刚问世, 是学校计算机课的宠儿, 那时的 Java 编程, 每个 class, 每个 method 等等都要设计, 确实有工程师的感觉 (当然, 在 C 程序员看来, 那可能已经是博物学家了)。 然而很多年后再看 Java 编程, 重心变成了从数以百计的 framework 里挑选有用的, 明了其用法, 搞定各种 package 的依赖关系 (当然, 有 Ant、 Maven 等等帮你做这事, 你也得知道那些), 知道各种 annotation 的用法, 等等。 class 和 method 则大都限定到了跟做填充题差不多的程度。 简直可以这么说, 某些领域的软件工程师依赖记忆越来越多过技术, 若不是对现成软件有博物学家般的知识, 几乎寸步难行。

搜索的重要性

信息搜集在CTF中占据相当重要的地位。找到flag便是一种信息搜集,不过这是最终目标。要找到flag,先得了解相关的知识点,而这又要通过信息的搜集。注意在这里,搜集不等于收集。

前面稍稍提了一点搜索在CTF中的应用,可事实上,“搜索”这件事本身还很值得深挖。比如,信息的来源如何?在一个网页中,我又如何筛选出自己需要的信息?针对前一个问题,我们便不能再是总是简单地在百度,综合性的搜索引擎上搜索这一问题,而是倾向于在有着有效信息的网站中搜索,如wikipedia,stack overflow……

百度也不是完全不能用的,虽然它越来越恶心了,百家号也是真的蠢,百度百科也越来越不行。简单地search for “百家号 屏蔽”诸如此类的东西,都可以找出净化百度的方法,然后你还可以了解一下,使用搜索引擎有什么其他技巧。

搜索什么东西也是要考虑的,这应当依据我们现有的疑问来。我困惑于不知这种编码叫什么,所以依据结果的特点去搜索:“等号 编码”;我只想先苟出题目,所以依据需求去搜索:“CTF 编码”,等等。还有,有时候一段很长的文本掺了一些干扰搜索结果的废话,那么这段“废话”得删去。如此的技巧和思路还有很多,这是一个非常零散而大有可谈之处的话题,有空再聊。

搜索也不仅限于搜索引擎中的“search”,在文本中找到有效的信息也是重要的本领。首先,是要了解什么信息是自己需要的,比如文件的文件头,比如ida中这个地址上的变量,比如暴露在文件中的光秃秃的flag。然后便是search for it了,F3。

赛事特点

首先CTF是有些解谜的意味的……尤其是misc。关于解谜我在其他地方谈过一点。这里简单谈谈好了,主要是缺乏反馈——你完全不得而知这样做是否正确,是不是达到flag的其中一步,抑或是一条弯路。具体该走什么样的路,当前走的路是否正途,不会有hint告诉你。(但可以推断出来)在很多情况下,所需要的是脑洞,奇想,灵感。这正是解谜的一大原罪乐趣。灵感并非死盯着题目能“格物致知”出来的,所以还是要快乐CTF呀。

还有是要了解各式各样的知识,对某个事物是如何运作的形成基本的概念模型——不需要很精确,把握好要点就行了。某个领域可能有前人深挖过了,写成文章,得看;某个领域可能有前人深挖过了,做出轮子,得会用。等等等等。无需过度了解背后的原理,大概的了解就够了,但这也并不轻松,需要“特定”的自学能力。(博物学家没这么好当,何况是信息时代的博物学家呢)

结语

看完这些,你就可以去做题啦!

上面的篇章对于解具体的题型可能并无帮助,但它们对CTF的基本模式还有一些全局性的要点给予了直观而较为亲切的介绍。面向的对象是想入坑但心中仍有一丝畏缩的同学,比如之前的我自己。

Stay positive, just enjoy it.


开始于2019-05-19

完稿于2019-05-24