什么是 CTF
CTF 全称 Capture the Flag,译为「夺旗赛」,是一种比赛形式。比赛中,选手会得到一个题面(可能是一段话、一个压缩包、一张图片、一个网站、一个链接、一份源码、一个程序等),选手需要根据题面,通过各种手法找到或得到诸如 flag{xxx}
的内容,这便是此题的答案。
走出洞穴的第一步
如果你还没有掌握一门编程语言,建议先从编程语言入手,C 语言或者 Python,培养对编程的感觉。只要你掌握了一门语言,再学习其他语言便能够触类旁通。
如果你此前从未接触过 CTF,你可能需要先了解其形式,即通过一些在线靶场或新生赛的低门槛题目进行适应。下面的一些公益新生赛事或平台或许会对你有所帮助:
随后,你应当选定一个方向,作为你主攻方向。例如,对网络感兴趣、有基础的同学可能更适合 Web 方向,而对程序运行底层逻辑、二进制感兴趣的可能更适合逆向(Reverse)和 Pwn,等等。
然后,当你接触到特定的题目时,你会遇到特定的知识点。设计得当的引导会控制好你所接触的「新事物」的量。这个时候,辅以实践,你再通过搜索、询问等各种方式学习知识细节,或许会轻松许多。
如果你在寻求更细节和全面的指导,可以查看 CTF Wiki 或由探姬师傅主导的 Hello CTF 等网站。注意,与传统的课堂教育模式不同,这些网站并不要求你立即并全部掌握其中的内容,而是充当一个手册供你速查。
对于自己无能为力的题,记得在赛后根据题解(WriteUp)进行复现。温故而知新,可以为师矣。
我还没有准备好
参与 CTF 赛事,是一个不断在历练中成长的过程,是对自我螺旋上升式的提升,是理论与实践相结合的又一深入尝试。请时刻铭记:充分发挥自己的主观能动性,在实践中成长。
搜索引擎是你生涯中最重要的伙伴之一,请珍爱并善于使用它。如何高效使用搜索引擎是对信息搜集和快速查找知识的考查,你需要通过大量实践和碰壁以养成该能力。推荐的搜索引擎有:
- 必应(Bing)国际版
- Google 搜索
- DuckDuckGo
- 带有联网或搜索功能的 AI
此外,BiliBili 也是不错的选择。
常见的搜索技巧有:
- 搜索时采用关键词搜索,以便能最大限度匹配到需要的内容
- 中文无法搜索到资源时考虑使用英文关键词
- 借用 AI 得知具体的搜索方向和关键词
此外,必备的知识迁移能力和动手尝试(试错)能力是不可或缺的。
在这趟旅途中,请收藏对你帮助巨大或需要日后查阅的链接或文档。值得一提的是,偶尔的旅途记录或许将在某些时刻发挥意想不到的作用,例如知识速查、快速回顾等。
我只是个萌新,为什么他们叫我师傅?
CTF 圈子中,CTFer 们通常以 “ 师傅 “ 相互称呼。
什么是 WriteUp?
又称作 WP,是记录 CTF 比赛中解题过程的文章,通常包含题目描述、解题思路、解题过程、源码分析、脚本分析等内容。当然你也可以简单理解为解题报告 —— 题解。
什么是p’y?
师傅之间题目的交流,多个CTFer解同一道题
其他名词解释
- 一把梭 代指一类解题过程或者方法,一般指将题目中给出的对应的附件 / 代码 / 密文等,直接丢到某个工具或者网站上,就能得到 flag 的解题方法。(闲鱼是最好的一把梭)
- 套娃 一是指一些题目比如说加密题,嵌套了多层的加密,需要多次解密才能得到 flag,即一道题中可能涉及到多个知识点的考察; 二是带有一定贬义意义,通常指出题人只是为了出题而出题,单纯的、一味的、向题目中叠加 tricks,导致本来就不新颖的题目还变得更加复杂,使得题目的难度无意义的变高。
开始
前置条件
首先,请确保你拥有一台 PC、计算机的基本使用能力、可见互联网的探索能力。
请确保你具有以下账户:
一个 Github 账号
Git
这将作为你下载开源资源的主要工具,同时使用其附带的 Git Bash,允许你在 Windows 中使用一些简易的 Linux 命令。
一个可用的 Linux 虚拟机:在任何网络攻防中,Linux 操作系统是必要的。
Windows 下虚拟机可以选择 WSL/WSL 2.0 或 VMware Workstation 或 Virtual Box,可选的 Linux 发行版为 Ubuntu 或 Kali Linux.
如果你是深度 Linux 用户,可考虑 Arch Linux 裸机.
一个功能强大的文本编辑器
它将伴随你大部分的时间,强烈推荐 VSCode.
至此,你已经具备了 CTF 入门的条件。
Web
CTF 中的 Web 方向通常指的是通过阅读阅读网站源码,或是根据网站已给信息,实现对网站的漏洞利用。
例如,通过输入框输入一些精心设计的内容,可以获取到网站的数据或者服务器权限。
这是由于网站是由前端和后端构成的。前端指的是你看到的、能接触到的内容,而后端则是服务器对你发起的网络请求进行一定的处理等操作。通过构造一些请求从而达到「欺骗」后端的目的,实现对后端服务器的部分控制。
常见的 Web 题型有 SQL 注入、模板注入(SSTI)、PHP 漏洞利用等。
收拾行李
Web 方向需要有较强的代码阅读能力(即便是未接触过的代码,不要求会写,但需能够阅读),以及搜索能力。
以下建议可能能够帮助你提升代码阅读能力,但任何事物都是循序渐进的,你也可以在做题的同时学习和成长。
- 学习和掌握 Python 语言
- 在做题中遇到难以读懂的代码时询问搜索引擎或 AI
下面是一些你需要了解的概念或过程,若你此前并不了解,请自行通过搜索引擎或视频网站学习:
- IP 地址、端口、域名
- 通过网址访问网页的通信过程
- Linux 操作系统和其基本使用
- 终端、命令提示符
- Web 服务器,常见的 Web 服务器
- 常见的编程语言,用于 Web 服务器编程的常见编程语言
- HTTP 报文格式
- 浏览器 Cookie
- 正则表达式
此外,你还需要了解开源和熟悉 Github,并最好具备访问全球互联网的能力。
注意事项
Web 安全技术威胁性大,请勿用于攻击和测试境内的目标,未授权的攻击测试行为将承担巨大的法律责任。若您决心踏上这一旅途,请立志成为一名将技术服务于社会和人民的安全从业人员(白帽子)。
出发远航
下面将列举一些常见的考点,以便你在入门的旅途中找到搜索的方向。一些词汇你可能感到陌生,你也并不需要立即掌握它们,但需要你遇到时能学习并铭记在心,这将非常考查你的知识接受能力和自学能力。这里将不会列举相对进阶的知识点。
- PHP 考点
- 弱类型比较
- PHP 伪协议
- PHP 反序列化
- PHP 版本引发的
- MySQL 数据库考点
- 联合注入
- 报错注入
- 布尔注入
- 延时盲注(时间盲注)
- 模板注入(SSTI)
常见的利用方式(思路)有:
- 任意文件读/写
- 远程代码执行(RCE)
- 服务端请求伪造(SSRF)
- 路径穿越
密码学
简单来说,密码学是一种用来研究如何加密来保护信息,如何解密获取信息的学问。
为什么学密码
可以了解、开创并实现现代密码学的 RSA 算法、未来将抵御量子计算机的格密码等的「后量子密码技术」,以及学到在特殊情况下我们用现代计算机来破解特定的 RSA 现代密码和后量子密码技术的攻击手段。
准备工作
你需要准备以下工具:
- PC(一般不限操作系统)
- Python 编程语言和环境
- yafu 软件程序
- 一款笔记软件或网站
- 草稿纸和笔(随电脑携带的,经常需要演算关系式)
- 大数分解 factordb 网站
其它一些帮助性较大的网站:
- NSSCTF 探索商城
- CTF Wiki
- OI Wiki(包含一些更深的数学知识)
除此之外,在学习的途中还会遇到很多有意思的工具或网站。
学习路线
Python 编程基础
下载 Python,选择一款集成开发环境(IDE,如 PyCharm 或 VSCode),并配置好 Python 环境。
密码学基础
你需要了解下面这些知识点:
- 理解模运算
- 逆元计算的运用(暂时不要求理解)
- RSA 公钥加密算法(可参考文章:RSA 入门)
- 理解海纳百川的 k 和无所不能的公因数
逆向工程
逆向工程通常是在没有源代码的情况下对软件进行分析,相对于正向的代码编程来说,逻辑通常是反过来的,需要有好的代码分析和反向思维能力。
0x01. 学习 C 语言代码
C 语言是逆向工程的基础,务必重点学习以下内容。
- 流程控制:if、switch、goto、break
- 指针操作:引用,解引用,取地址,数组与指针转化
- 数据类型:熟记 char、int、int64 等类型大小
- 可逆运算:异或运算、算数运算、移位与循环移位运算
0x02. 学习常见加密
加密是逆向工程对抗的核心,务必熟记加密算法原理和特征,这样在面对混淆和魔改加密时才能游刃有余。
- TEA 系列加密: TEA、XTEA、XXTEA
- RC4 加密
- AES/DES 加密
- 16 进制编码
- Base64 编码
加密特征识别可参阅:常见加密算法特征识别
常见加密不是一成不变的模板,死记硬背不可能通杀,请务必读懂加密过程和大致原理。
0x03. 脚本代码编写
脚本编写是一项很重要的能力,你需要熟悉 C 语言和 Python,并且减少代码出错的可能性。平时的解题脚本一定要收集好,并找时间整理,比赛争分夺秒,好的解题模板可以帮你快速夺得一血。
0x04. 逆向工具的使用
IDA: 二进制方向工具,90% 的题都会用到,务必熟悉使用
Jadx-gui: Java 代码反编译工具,安卓软件和 Java 程序都会用到。
Jeb: 面相安卓逆向的利器,有 Java 代码反混淆功能
Pyinstxtractor: 解包 Python 编写的 exe 文件
Uncompyle6: 反编译 Python 大部分版本字节码(PYC 文件)
Xdbg: 动调神器
Misc
「如果一道题不适合放在其它的方向,那么 misc 永远能收留它。」
—— yixinBC
「每一个 misc 手都是一个隐藏的全栈✌。」
—— w3nx1z1
安全领域不止 Web、逆向等方向,Misc 涵盖了剩下的一些部分,同时也对一些强分类方向的细枝末节进行考查,像是对安全领域的碎片进行整理,因此称为「杂项(Miscellaneous)」。常见的 Misc 题型包括:编码、隐写、流量分析、压缩包分析、AI、取证、社会工程学、区块链、沙箱逃逸等等。
学习 Misc 的第一步
Misc 突出的就是庞杂,涉猎内容十分广泛。但也正因如此,一些知识点往往并不是很高深(至少入门是如此),请放心地搜索并学习它。
在 Misc 的道路上走得远些对其它方向是有些帮助的,你可能会享受那种使用奇技淫巧解决问题的快感,当然,更多的时间则是在与出题人对脑洞。
下面是一些你需要具备的基础能力:✌
- 极强的信息搜集能力,包括但不限于互联网搜索、文件信息收集、社会工程学等
- 对至少一门编程语言(最好是 Python)的掌握
下面这些网站或许会帮助到你,它们是对常见题型的归类和整理,你可以当做速查手册:
还有一些方向内大师傅的博客,等待你的探索。
编码
编码指的是将一个字符串通过某种法则变化为另一个字符串。
隐写
隐写术是一种将秘密信息隐藏在普通数据中的技术。在 CTF 竞赛中,Misc 类别通常涉及到各种隐写技巧,包括但不限于文本、图像和音频隐写。
压缩包
有时你会得到一个损坏或加密的压缩包,你需要获取压缩包中的内容。这就需要多种修复、攻击等技巧。
流量分析
流量分析是Misc 中重要的考点,也是 Web 安全分析、工业互联网安全中技能的重要组成部分。当黑客攻入你的计算机并被你发现后,你可能能够通过网络设备等留下的日志,查看过去发生的网络流量等情况,从而分析出黑客的行为。
取证
通俗地讲,取证要求你化身电子侦探,找到隐藏在数字存储介质里的犯罪者活动记录,或恢复使用者的使用轨迹,比如解密聊天记录、恢复被加密的文件等等。正如其名,这项技术往往用于查找罪行相关物证或间接物证。
Pwn
Pwn 是干什么的?好吃🐎?
Pwn 是由 own 引申而来的,它表示玩家处于胜利的优势。在黑客语法的俚语中,Pwn 是指攻破设备或者系统,发音类似「砰」。对黑客而言,利用一些漏洞成功实施黑客攻击,获取到服务器的权限并操纵,那么,This server just got pwned!
Pwn 需要的不仅是基本的 C 语言、汇编语言以及逆向功底,还有程序运行相关的知识。因此,你也可以选择先在逆向(Reverse)方向深造,当有一定了解后再来学习 Pwn 便会轻便许多。