CTF从入门到放弃...
近俩年来经常被推去参加各种比赛,其中最频繁的一项就是CTF夺旗赛,作为一名万金油选手基本只能在理论题上得得分,一到实操部分都是鸭蛋一颗。虽说自己不是这个专业赛道的,但还是心有不甘,因此在网上找了套教程进行学习,边学习边整理学习笔记,希望有机会能够多拿下几个flag吧……
CTF
什么是CTF
CTF的全称Capture The Flag,直译为“夺旗赛”,起源于1996年举办的DEF CON全球黑客大会,最早是交流安全技术的重要途径。随着时间的推移,CTF竞赛逐渐演变成为信息安全技术竞赛的一种形式,发展成为全球范围网络安全圈的流行比赛,但其比赛形式与内容依然拥有浓厚的黑客精神和黑客文化。近年来,CTF竞赛活动蓬勃发展,国内外各类高质量的CTF竞赛层出不穷,CTF已经成为了学习锻炼信息安全技术,展现安全能力和水平的绝佳平台。
CTF的目标是什么?
CTF参赛队伍的目标是获取尽可能多的flag(旗帜)。参赛队伍需要通过解决信息安全的技术问题来获取flag。
flag可能来自于一台远端的服务器,一个复杂的软件,也可能隐藏在一段通过密码算法或协议加密的数据,或是一组网络流量及音频视频文件中。选手需要综合利用自己掌握的安全技术,并辅以快速学习新知识,通过获取服务器权限,分析并破解软件或是设计解密算法等不限定途径来获取flag。
CTF的比赛形式
解题模式
通常为在线比赛,目前大多数国内外CTF比赛的主流形式,选手自由组队参赛(在线比赛人数一般不做限制)。题目通常在比赛过程中陆续放出。解出一道题目后,提交题目对应的fag即可得分,比赛结束时分高者胜。
攻防模式
通常为现场比赛,多数CTF决赛的比赛形式,选手自由组队参赛,但通常队伍人数会受到限制(3~8人不等)。相比于解题模式,时间更短,比赛中更注重临场反应和解题速度,需要能够快速攻击目标主机并获取主机的权限,考察团队多方面的综合安全能力。
CTF解题模式的题目类型
web安全
通过浏览器访问题目服务器上的网站,寻找网站漏洞(SQL注入,XSS,文件上传,包含漏洞,XXE,SSRF,命令执行,代码审计等),利用网站漏洞获得服务器的部分或全部权限,拿到flag
逆向工程(Reverse)
题目就是一个软件,但通常没有软件的源代码;需要利用工具对软件进行反编译甚至反汇编,从而理解软件内部逻辑和原理,找出与flag计算相关的算法并破解这个算法,获取flag
漏洞挖掘与漏洞利用(PWN,EXPLOIT)
访问一个本地或远程的二进制服务程序,通过逆向工程找出程序中存在的漏洞,并利用程序中的漏洞获取远程服务器的部分或全部权限,拿到flag
密码学(Crypto)
分析题目中的密码算法与协议,利用算法或协议的弱点来计算密钥或对密文进行解密,从而获取flag
调査取证(Misc)
利用隐写术等保护技术将信息隐藏在图像、音频、视频、压缩包中,或者信息就在一段内存镜像或网络流量中,尝试将隐藏的信息恢复出来即可获得flag
移动安全(Mobile)
对安卓和IOS系统的理解,逆向工程等知识。
CTF竞赛工具准备
- 虚拟化软件(VMware Workstation、VirtualBox、Parallers Desktop)
- 环境的安装
a. Python环境的安装(Python2.7或Python3.5二选一)
b. Java环境安装
c. PHP环境安装(PhpStudy) - 浏览器及插件
a. Firefox/Chrome
b. hackbar插件 - 编辑器
a. Nodepad++(https://notepad-plus-plus.org/downloads/)
b. Sublime
c. 010Editor(https://www.sweetscape.com/010editor/) - 虚拟机
a. Kali Linux
b. Windows(Windows7 SP1) - CTF工具包
- Brupsuite
杂项的基本解题思路
文件操作与隐写
文件类型识别
file命令
- 当文件没有后缀名或者有后缀名而无法正常打开时,根据识别出的文件类型来修改后缀名即可正常打开文件。
- 使用场景:不知道后缀名,无法打开文件
- 命令格式:
file <filename>
winhex程序
- 通过winhex程序可以查看文件头类型,根据文件头类型判断出文件类型
- 使用场景:Windows下通过文件头信息判断文件类型。常见的文件头类型如下表所示
| 文件类型 | 文件头 |
|---|---|
| JPEG(jpg) | FFD8FFE1 |
| PNG(png) | 89504E47 |
| GIF(gif) | 47494638 |
| TIFF(tif) | 49492A00 |
| Windows Bitmap(bmp) | 424DC001 |
| ZIP Archive(zip) | 504B0304 |
| RAR Archive(rar) | 52617221 |
| Adobe Photoshop(psd) | 38425053 |
| Rich Text Format(rtf) | 7B5C727466 |
| XML(xml) | 3C3F786D6C |
| HTML(html) | 68746D6C3E |
| Adobe Acrobat(pdf) | 255044462D312E |
| Wave(wav) | 57415645 |
| pcap(pcap) | 4D3C2B1A |
文件头残缺/错误
- 通常文件无法正常打开有两种情况,一种是文件头部残缺,另一种是文件头部字段错误。针对文件头部残缺的情况,使用winhex程序添加相应的文件头,针对头部字段错误,可以找一个相同类型的文件进行替换。
- 使用场景:文件头部残缺或文件头部字段错误无法打开正常文件。
文件分离操作
Binwalk工具
- Binwalk是Linux下用来分析和分离文件的工具,可以快速分辨文件是否由多个文件合并而成,并将文件进行分离。如果分离成功会在目标文件同目录下生成一个形如
_文件名.extracted的文件目录,目录中有分离后的文件。 - Binwalk用法如下:
1 | # 分析文件 |
说明
Binwalk在分离文件的时候,如果分离出的文件带有压缩包,Binwalk会自动帮忙解压
foremost
- 如果Binwalk无法正确分离出文件,可以使用foremost,将目标文件复制到kali中,成功执行后,会在目标文件的文件目录下生成我们设置的目录,目录中会按文件类型分离出文件。
- foremost用法如下:
1 | foremost <filename> -o <输出目录名> |
dd
- 当文件自动分离出错或者因为其他原因无法自动分离时,可以使用dd实现文件手动分离
- dd用法如下:
1 | dd if=源文件 of=目标文件 bs=1 count=1 skip=1 |
- 使用举例
1 | # 假设有一个文件1.txt,文件内容为1234567890abcdefghij |
winhex程序
说明
除了使用dd外,还可以使用winhex程序实现文件手动分离,将目标文件拖入winhex中,找到要分离的部分,点击复制即可;使用010Editor也可以实现。
- 使用场景:Windows下利用winhex程序对文件进行手动分离
010Editor
- 使用010Editor将16进制字符文件导入保存在一个文件
文件合并操作
cat和md5sum
- 使用场景:Linux下将多个文件批量合并成一个文件并进行完整性校验
- cat命令格式:
cat 要合并的文件(用空格隔开) > 合并后的文件 - md5sum命令格式:
md5sum 文件名 - 用法如下:
1 | # 将file01~file03合并成file |
copy和certutil
- 使用场景:Windows下将多个文件批量合并成一个文件并进行完整性校验
- copy命令格式:
copy /B 要合并的文件(用+连接) > 合并后的文件 - certutil命令格式:
certutil -hashfile 文件名 md5 - 用法如下:
1 | # 将file01~file03合并成file |
图片隐写术
待更新……
压缩文件处理
待更新……
流量取证技术
待更新……
安全导航
推荐书籍
- 《白帽子讲Web安全》
- 《web前端黑客技术揭秘》
- 《web安全深度剖析》
- 《Metaspolit渗透测试魔鬼训练营》
- 《黑客攻防技术宝典Web实战篇》
- 《SOL注入攻击与防御》
- 《XSS跨站脚本攻击剖析与防御》
- 《互联网企业安全高级指南》