【平安CTF赛题】解题思路总结

百家 作者:平安安全应急响应中心 2021-09-28 21:34:06

第五届平安集团CTF大赛已经顺利落下帷幕,本文将对本届比赛的初赛和决赛进行出题思路与解题思路的分析和总结,供新老参赛选手参考。文中的例题均为本届CTF真题,可以在零号平台进行练习。

 

初赛


初赛是典型的CTF模式,即解题模式。解题模式的赛题之间没有关联性,因此参赛队伍可以任意选择擅长的题型进行解答。赛制采用均分制和一血制,即每道题的分值由解答出该题的队伍均分,并且前三个解答出某道题目的队伍会有额外加分。


这就意味为了获取胜利,参赛队伍需要尽可能快地解答出容易题以获得一血加分,尽可能多地解答出困难题以避免分数被稀释,所以参赛队伍内部可以提前分工,按照各自擅长的领域,快速浏览各题型的题目,对于直觉上比较有把握的题优先解答,争取获得一血加分。


回到题目本身,总体而言CTF考察的是套路,即对各类知识点和解题方法的熟悉程度,如果能够掌握常见套路,在比赛时看到题目,基本上就能把考点猜个八九不离十,进而使用对应的解题方式去尝试。


与真实世界的黑盒测试不同,CTF的题名和题干是包含解题线索的,所以选手在答题过程中要仔细审题。


从出题角度来看,常见的考点就那么些,为了确保题目的难度,通常有两种做法,一种是在一道题中加入多个考点,另一种是挖掘新的考点。


对于第一种方式,我们在出题时会尽量避免单纯的堆砌考点,保持题目的连贯性,保证选手在解决了一个考点后能够得到下一个考点的线索。对于第二种方式,命题组中确实有大神能够编写出没见过的题,但多数情况还是参考商业比赛中的新题的出题思路进行出题,即使是没见过的题,知识点总是见过的,无非是换种方式表现出来,所有总体而言,平时多做题,举一反三是非常有用的。


CTF中常见的题型包括MISC、WEB、REVERSE(MOBILE也是REVERSE的一种)、PWN、CRYPTO等,下面按照题型分别介绍出题与解题思路。



MISC


MISC题是比赛中相对而言难度较低的题型,主要考察选手的知识广度而非深度,以及快速学习新知识的能力。由于出题考点涉及的知识面比较广,选手在解题时可能需要开一些脑洞。

各种常见的考点都有相应的解题工具,选手需要提前准备并熟悉工具的使用。推荐选手掌握一种脚本语言用于解题,如python,各类工具库丰富,并且上手简单,书写和运行方便。下面罗列一些常见的考点和解题思路供选手参考。


以“大隐隐于市”为例:


首先拿到的是一张图片,显然按照一般思路这是一道图片隐写题。查找flag字符串和查看文件属性,发现有flag字符串,通过观察图片标志位,显然这里已经在图片外面了。


 

那么尝试使用binwalk分析以下文件尾部是否有拼接其他文件,显然拼接了一个压缩包。

 

但是这个压缩包并不在flag字符串的位置,仔细观察flag位置,发现上面有残缺的zip文件头,补全后可以获取flag所在的压缩包,需要密码,先放一放。


文件尾部的压缩包也有密码,先不急着爆破,观察后发现压缩包内部的文件都是四个字节,符合CRC碰撞的要求,那么使用CRC碰撞即可知道文件内容。



显然这不是flag,只是部分线索,需要进一步分析题目。使用stegsolve观察图片的最低有效位和各个通道,没有发现可疑内容,那么很可能使用了专用的隐写算法。经过尝试发现使用了盲水印,得到第二个线索。

 

使用线索中的密码解压含flag的压缩包,获得flag。

 

WEB


WEB题是比赛中题目占比最大的题型之一,主要考察选手对常见web漏洞的了解,代码审计以及绕waf能力,一般而言考点都是出题者构造的漏洞,并且有一定的防护手段,因此常见的扫描器都是无效的,选手需要手动测试。考点涉及的漏洞都是常见类型的漏洞,比如sql注入、文件上传、命令注入、反序列化等。


对于代码审计题,需要选手掌握java、python、php等常见服务端编程语言的语法和漏洞成因,根据源码构造payload。


对于黑盒测试题,可以根据返回页面的功能大致确定漏洞点,在尝试利用过程中如果发现了waf,需要针对性地绕过,使用常见的绕过方式进行尝试,确定绕过方式,最后编写绕waf的payload获取flag。


以“来找茬”为例


根据题目说明以及页面返回的内容基本可以确定是针对nodejs服务的攻击。

 


首先需要绕过登录认证,使用nosql注入进行绕过,登录后看一个上传页面,那么可能是nodejs的express-upload组件漏洞以及nodejs的原型污染导致的rce,构造相应payload即可,不需要绕过waf。

 

 

REVERSE和PWN


REVERSE和PWN题本质上属于一类题,主要考察选手的二进制分析能力,门槛较高,但是脑洞较少,只要选手基本功扎实就能拿到分数。REVERSE针对Windows、Linux、Android和iOS下的可执行文件和固件。iOS题和固件逆向题由于需要专用的硬件设备,考察的知识点也比较冷门,选手可以选择性放弃。


拿到REVERSE题的第一步是以通过后缀名和文件头确定二进制文件的类型,并使用对应的反编译工具对二进制文件进行反编译,可常见的二进制文件及对应的反编译工具见下表。


语言
反编译工具
C/C++(exe、dll、so)
IDA
C#(exe)
dnSpy
JAVA(jar)
jd-gui、CFR、IDEA
JAVA(apk)
jadx、JEB
Python(exe、pyc)
python-exe-unpacker、uncompyle6

较低难度的题目在逆向后能拿到完整的汇编和源码,flag可能直接硬编码在代码中或是资源文件中,仔细阅读代码即可。


中等难度的题目会在代码中实现一个编码或是加密算法,需要根据算法和题干倒推flag,此时就要确定使用的编码或者加密算法。


选手需要熟悉常见编码和加密算法的特征,比较简单的算法如异或、ASCII和HEX等可以直接看出来,自定义的算法一般也不会很复杂,可以通过阅读源码分析出来,较为复杂的标准加密算法一般出题者不会去修改内部实现,最多修改一下配置,如Base64修改一个字典,MD5修改初始向量,可以使用一些算法识别插件辅助分析。如果代码量比较大,可以通过执行题目程序时的提示信息反向查找字符串引用,在从打印字符串的位置向上查找考点算法。


较高难度的题目会增加反调试或是加壳,此时就需要动态分析,调试工具包括windows下的od、windbg、x64dbg,linux下的gdb,android的android killer等。反编译工具IDA也可以进行调试,主要针对Android的so文件。


对于反调试,需要选手熟悉常见的反调试方式,找到对应的反调试代码进行patch。对于加壳,可以使用脱壳机试试,不行的话可以使用esp平衡原理手动脱壳。


PWN题一般是Linux下的可执行文件,和REVERSE类似,拿到题第一步是使用IDA逆向成汇编,查看代码逻辑。


PWN题的代码逻辑一般比较简单,在查看代码的过程中需要关注常见的可能有溢出漏洞的函数,如scanf、puts、gets、fputs、fgets、read、write等,通常都是没有严格校验输入长度导致溢出。


确定漏洞点后使用gdb进行安全性检查和调试,根据安全性配置确定payload,根据题目给与的条件确定system函数的地址或是构造gadget,使用pwntools编写poc脚本进行验证。


以“simple-antidebug为例”


拿到apk包后进行反编译,看到主界面onClick的回调调用了native层的submit函数。

 


进一步反编译so文件,从导出表中找到导出的submit函数,查看伪代码,发现调用了encode函数并和固定字符串比较。


 

其实这里根据字符串的特征基本推测可能是base64编码,观察encode的算法,进一步确认是base64算法,并且使用了自定义的字典table。


 

直接使用table的内容解码发现错误,通过查找交叉引用发现table经过transform函数的处理,而transform函数通过initialize函数的调用,在初始化时自动执行。根据transform函数的逻辑,转换字典即可解码。

 


CRYPTO


CRYPTO包括编码与加密,所以经常以MISC和REVERSE题的形式出现。以CRYPTO形式出的题主要有两种出题方式:

第一种是给部分明文和密文或是只给密文,需要选手根据已知信息推测可能的编码和加密方式,一般而言通过密文空间即可大致推断出算法。

第二种是针对标准加密算法的攻击,一般通过题目给予的信息即可大致确定攻击方法。如padding oracle、CBC字节翻转、RSA低加密指数、RSA共模攻击等,题干信息都有明确的特征,选手只要做过该题型的题目即可在下次遇到相似题干时快速确定攻击方式。

以“easy crypto为例”

题干是两行字符串和一个压缩包,压缩包有密码。


先看字符串,从空格的位置以及密文空间判断,第一行可能是简单的移位加密,即凯撒加密,尝试不同的偏移量即可得到明文use base to decrypt unzip password,显然提示第二行是basexx编码,从密文空间判断,包含数字和大写字母A到D,那么是base16,解码后得到KVCEM5K2GBDHKUL2MRWQ====,包含数字和大写字母,那么是base32,解码后得到UDFuZ0FuQzdm,包含大小写字母,那么是base64,解码后得到P1ngAnC7f,已经是明文了,用来解压压缩包。
 


很显然,根据e,n,c和m的命名方式可以确定是RSA,由于e很小,并且给了多组n和c,那么使用低加密指数广播攻击得到flag。
 

决赛


决赛是渗透测试模式,比赛环境模拟真实网络环境,分为外网-内网-核心内网区域,选手需要获取外层网络的主机权限后才能进入下一层网络。与初赛类似,决赛使用了一血制。由于内层网络赛题的分值高于外层网络,如果对自身的实力有信心,在获取到了外层网络进入内层网络的权限后可以将主要的精力放在内层网络,尽快进入核心网络解答高分题。

由于是模拟真实网络环境,题目考点通常包含常见的组件漏洞,所以选手可以根据探测到的web组件,使用搜索引擎搜索公开漏洞。一些送分题可能直接使用公开exp即可获取flag,分值较高的题一般和CTF中的web题一样存在waf,或是一题中包含多个相关考点,需要抽丝剥茧一步一步攻破。

在获得了权限后,尽快搭建代理进入内网,常见的web正向代理可以使用regeorg,sock反向代理可以使用ew,使用获得的隧道上传扫描工具进行内网探测,漏洞挖掘和权限获取。对于题目的解答思路类似ctf中的web,在此不再赘述。


PSRC 公众号欢迎投稿!
请投稿至邮箱:pub_sec@pingan.com.cn
有问题请添加QQ:3409004560


10月16日,深圳站沙龙火热报名中!

戳上图链接,了解活动详情

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接