ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CTF夺旗赛入门指南:从环境搭建到Web、逆向、Pwn实战

CTF夺旗赛入门指南:从环境搭建到Web、逆向、Pwn实战 1. 从零认识CTF夺旗赛它到底是什么为什么值得投入很多人第一次听到CTF这三个字母脑子里浮现的是“黑客”“攻防”“高深莫测”这类词觉得离自己很远。其实CTFCapture The Flag夺旗赛本质上是信息安全领域的一种竞技比赛形式参赛者通过解题或攻防对抗的方式找到题目中隐藏的一段特定字符串——也就是flag提交后获得分数。它像是一场智力闯关游戏只不过闯关的工具不是手柄而是命令行、脚本和你的逻辑推理能力。我接触CTF是从大学社团的一次校内赛开始的当时连Linux基本命令都不太熟第一道Web题卡了整整一个下午。但正是那次经历让我意识到CTF最大的价值不在于你拿了多少分而在于它逼着你去理解一个系统是怎么运转的、一个漏洞是怎么产生的、一段代码为什么会被绕过。这种“从原理到实操”的闭环训练是看再多理论书都换不来的。目前CTF题目主要分为五大方向Web网站漏洞利用、Reverse逆向工程、Pwn二进制漏洞利用、Crypto密码学、Misc杂项。每个方向的门槛和进阶路径不同适合的人群也不一样。Web方向对新手最友好因为HTTP协议、前端代码这些内容日常就能接触到Reverse和Pwn需要一定的汇编和操作系统基础门槛偏高但天花板也高Crypto对数学思维要求较高Misc则五花八门什么都有反而最考验知识面。这篇文章面向的是完全没接触过CTF、或者刚入门但不知道该怎么系统学习的读者。我会从环境搭建讲起把Web、盲注、逆向、Pwn这几个核心方向的基础知识和典型赛题拆开来讲同时穿插我在实际比赛和练习中踩过的坑。你不需要有很深的编程基础但至少要能看懂Python代码会用命令行。提示CTF比赛分为解题模式Jeopardy和攻防模式Attack-Defense新手建议从解题模式入手压力小、反馈快。2. 入门前的环境准备与工具链搭建2.1 操作系统与基础环境选择搞CTFWindows不是不能做但你会花大量时间在环境适配上。我个人的建议是直接上Kali Linux或者Ubuntu前者预装了绝大多数CTF常用工具省去了大量安装配置的时间。如果你不想装双系统用虚拟机VMware或VirtualBox跑一个Kali镜像就行分配4GB内存、40GB硬盘足够应付绝大多数题目。Kali的下载和安装这里不展开网上教程很多。装好之后第一件事是更新源和系统sudo apt update sudo apt upgrade -y然后安装一些基础工具sudo apt install -y python3 python3-pip git curl wget netcat-openbsd binutils gdbPython是CTF中最重要的语言没有之一。写脚本、做计算、处理数据、自动化攻击全靠它。建议把pip也升级到最新版然后装几个常用库pip3 install requests pwntools pycryptodome z3-solver这里重点说几个库的用途。requests用于Web方向的HTTP请求交互比手写socket方便太多pwntools是Pwn方向的标配提供了远程连接、字节打包、shellcode生成等一整套工具pycryptodome处理密码学题目中的加解密z3-solver是约束求解器逆向和Crypto中遇到方程求解时非常好用。2.2 常用工具分类与选型理由CTF工具非常多但新手不需要全都装。我按方向整理了一张表列出最核心的几个方向工具用途选型理由WebBurp Suite抓包改包社区版免费功能足够Webdirsearch目录扫描轻量、速度快ReverseIDA Pro / Ghidra反汇编Ghidra免费且功能强大Reversex64dbg动态调试Windows平台逆向首选Pwnpwntools漏洞利用脚本Python库集成度高Pwnchecksec检查保护机制一条命令看清二进制防护CryptoCyberChef编码解码网页版支持链式操作Misc随波逐流编码转换国内CTF圈常用支持多种编码MiscWireshark流量分析抓包分析的标准工具关于随波逐流CTF编码工具这个在国内比赛中出现频率很高。它支持Base64、URL编码、十六进制、Unicode、摩斯密码等几十种编码的自动识别和转换遇到杂项题里的编码套娃时用它比手动一个个试快得多。不过要注意工具只是辅助你得知道每种编码的原理否则遇到变种就懵了。Burp Suite的社区版对于CTF Web题来说完全够用。安装后需要配置浏览器代理把流量导到Burp的8080端口。具体操作是浏览器设置代理为127.0.0.1:8080然后访问Burp的Proxy页面打开Intercept功能。这样所有HTTP请求都会被拦截你可以修改参数、重放请求、爆破密码。我打Web题的时候Burp基本全程开着因为很多漏洞的利用需要反复调整payload。2.3 靶场搭建与练习平台推荐光看教程不动手等于没学。CTF需要大量的练习而练习就需要靶场。国内比较友好的平台有几个CTF Show、BUUCTF、攻防世界。CTF Show的题目按难度分级从入门到进阶都有适合循序渐进BUUCTF收录了大量比赛真题适合刷题量上来之后去打攻防世界的新手区题目质量不错而且有详细的提示。如果你想在本地搭建靶场可以用Docker。比如搭一个DVWADamn Vulnerable Web Applicationdocker pull vulnerables/web-dvwa docker run -d -p 80:80 vulnerables/web-dvwa然后浏览器访问localhost就能看到DVWA的登录页面默认账号admin密码password。DVWA涵盖了SQL注入、XSS、文件包含、命令执行等常见Web漏洞是入门Web方向的最佳练手环境。注意所有练习和测试必须在你自己的靶场或授权平台上进行未经授权对真实系统进行测试是违法行为。3. CTF Web方向核心知识拆解3.1 Web题目的常见漏洞类型与解题思路Web方向是CTF中题目数量最多、变化最丰富的方向。它的核心逻辑是给你一个网站你要找到网站中存在的漏洞利用漏洞获取flag。flag通常藏在数据库里、服务器文件系统中、或者环境变量里。常见的漏洞类型包括SQL注入通过构造恶意SQL语句绕过认证或读取数据库内容。最经典的场景是登录框输入 or 11 --就能绕过密码验证。文件包含通过控制文件路径参数读取服务器上的敏感文件。比如?file../../etc/passwd。命令执行通过控制系统命令的参数执行任意命令。比如?cmdid。代码审计给你一段PHP或Python源码让你找出其中的逻辑漏洞。SSRF服务端请求伪造让服务器去访问内网资源。反序列化利用序列化和反序列化过程中的漏洞执行代码。我拿一道典型的命令执行题来举例。题目描述是“输入id即可查询到信息但是报错感觉好奇怪”这其实是一个很明显的提示。你访问页面发现有一个输入框输入id后返回了类似uid33(www-data) gid33(www-data) groups33(www-data)的内容。这说明后端直接把你的输入拼接到系统命令里执行了。那么解题思路就很清晰了尝试拼接其他命令。输入id; ls如果返回了目录列表说明命令执行成功。然后你可以用cat读取flag文件id; cat /flag或者用find搜索id; find / -name flag* 2/dev/null这里有个细节很多题目会过滤空格或某些关键词。如果空格被过滤可以用$IFS代替如果cat被过滤可以用tac、head、more等替代。这些绕过技巧需要在实战中积累。3.2 CTF盲注没有回显时怎么拿数据盲注是SQL注入的一种特殊情况特点是页面不会直接返回查询结果你只能通过页面的“是/否”状态来判断注入是否成功。盲注分为布尔盲注和时间盲注两种。布尔盲注的原理是构造一个条件判断语句如果条件为真页面返回正常如果条件为假页面返回异常。通过逐字符比较最终猜出完整的数据。比如SELECT * FROM users WHERE id 1 AND SUBSTRING((SELECT flag FROM flag_table),1,1) f如果页面正常显示说明flag的第一个字符是f。然后依次猜第二个、第三个字符直到拼出完整的flag。时间盲注则是在条件判断的基础上加入延时函数。如果条件为真页面会延迟几秒返回如果为假立即返回。比如SELECT * FROM users WHERE id 1 AND IF(SUBSTRING((SELECT flag FROM flag_table),1,1)f, SLEEP(3), 0)手动盲注效率极低实际比赛中都是用脚本自动化。下面是一个布尔盲注的Python脚本框架import requests url http://target.com/index.php flag chars abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}_- for i in range(1, 50): for c in chars: payload f1 AND SUBSTRING((SELECT flag FROM flag_table),{i},1){c} -- params {id: payload} r requests.get(url, paramsparams) if 正常页面的特征字符串 in r.text: flag c print(f当前flag: {flag}) break else: break print(f最终flag: {flag})这个脚本的逻辑很直接外层循环控制字符位置内层循环遍历所有可能的字符逐个尝试。当页面返回正常特征时说明当前字符猜对了追加到flag变量中。实操心得盲注脚本一定要加异常处理和延时否则请求太快容易被服务器封IP。我一般会在每次请求之间加0.1到0.3秒的sleep。3.3 Web题中的编码与协议陷阱CTF Web题里经常出现各种编码和协议相关的考点。比如URL编码、Base64编码、十六进制编码以及HTTP协议中的各种头部字段。有一类题目是让你通过修改HTTP请求头来绕过限制。比如题目要求“只能从本地访问”那么你可以在请求头中加入X-Forwarded-For: 127.0.0.1。如果题目检查User-Agent你可以改成User-Agent: Googlebot来伪装成搜索引擎爬虫。还有一类题目涉及PHP的伪协议。比如php://filter可以用来读取源码?filephp://filter/convert.base64-encode/resourceindex.php这行payload的作用是让PHP用Base64编码的方式读取index.php的内容。因为直接读取PHP文件会被执行而Base64编码后输出的是编码后的字符串不会被执行你就能看到源码了。data://协议可以用来执行任意代码?filedata://text/plain,?php system(cat /flag); ?php://input可以读取POST请求体中的内容作为PHP代码执行。这些伪协议的利用前提是存在文件包含漏洞而且allow_url_include选项是开启的。实际比赛中出题人往往会设置各种过滤条件你需要结合源码审计来构造绕过方案。4. CTF逆向与Pwn方向入门4.1 逆向工程的基本流程与工具使用逆向工程Reverse Engineering的核心是给你一个编译好的程序你要通过分析它的汇编代码理解它的逻辑找到隐藏的flag或者找出触发flag的条件。入门逆向我建议从Ghidra开始。它是NSA开源的逆向工具功能强大且免费。安装Ghidra需要Java环境装好后创建一个新项目导入目标二进制文件Ghidra会自动进行反汇编和反编译。反编译出来的伪代码可读性很高对于新手来说比直接看汇编友好得多。一个典型的逆向题流程是这样的用file命令查看文件类型file challenge用checksec检查保护机制checksec challenge用Ghidra打开找到main函数分析程序逻辑找到关键比较或判断根据逻辑逆推出正确的输入举个例子假设程序要求你输入一个密码输入正确才输出flag。在Ghidra的反编译视图中你可能会看到这样的代码if (strcmp(input, s3cr3t_p4ssw0rd) 0) { printf(flag{...}); }那么答案就显而易见了。但实际题目不会这么简单通常会涉及异或运算、字符位移、多轮加密等。你需要写一个逆向脚本把加密过程反过来执行。比如遇到这样的逻辑for (int i 0; i len; i) { input[i] ^ 0x42; } if (strcmp(input, encrypted) 0) { ... }那么解密脚本就是encrypted b\x01\x02\x03... # 从程序中提取的加密后数据 flag bytes([b ^ 0x42 for b in encrypted]) print(flag.decode())4.2 Pwn方向从栈溢出了解二进制漏洞利用Pwn是CTF中门槛最高的方向但也是最“硬核”的方向。它的核心是通过分析二进制程序的漏洞构造特殊的输入劫持程序的控制流最终获取shell或读取flag。最经典的Pwn漏洞是栈溢出。原理是程序用一个固定大小的缓冲区接收输入但没有检查输入长度导致超出的数据覆盖了栈上的返回地址。如果你能精确控制返回地址就能让程序跳转到你想要的任何地方。一个最简单的栈溢出利用脚本使用pwntoolsfrom pwn import * p remote(target.com, 9999) elf ELF(./challenge) offset 40 # 填充到返回地址的偏移量 backdoor elf.symbols[backdoor_function] # 程序中隐藏的后门函数 payload bA * offset p64(backdoor) p.sendline(payload) p.interactive()这段脚本的逻辑是先发送40个填充字符然后把返回地址覆盖为后门函数的地址。当程序执行完当前函数返回时就会跳转到后门函数执行。偏移量的确定通常用cyclic模式先生成一串有规律的字符发送后看程序崩溃时EIP/RIP的值然后用cyclic_find反查偏移。from pwn import * print(cyclic(100)) # 发送后崩溃假设RIP 0x6161616c print(cyclic_find(0x6161616c)) # 输出偏移量注意Pwn题一定要先checksec看保护机制。如果开启了Canary栈溢出会被检测到如果开启了PIE地址会随机化如果开启了NX栈上的代码不可执行。不同的保护机制对应不同的绕过方法。4.3 逆向与Pwn的进阶学习路径逆向和Pwn的进阶需要补的基础知识比较多。逆向方向需要掌握汇编语言x86/x64、PE/ELF文件格式、常见加密算法识别、反调试技术。Pwn方向需要掌握栈溢出、堆溢出、格式化字符串、ROP链构造、GOT/PLT劫持。我个人的学习路径是先刷完CTF Show上逆向和Pwn的入门题每道题都写WPWriteup记录自己的分析过程和踩坑点。然后去BUUCTF刷真题遇到不会的就看别人的WP但一定要自己复现一遍。最后可以尝试打一些线上比赛在实战中检验水平。有一个常见的误区是新手一上来就啃《加密与解密》这种大部头结果看了几章就放弃了。我的建议是以题带学遇到不懂的知识点再去查资料这样学习效率最高也最有成就感。5. 赛题详解与实战技巧5.1 杂项题Misc的解题套路Misc是CTF中最“杂”的方向涵盖隐写术、流量分析、编码转换、取证分析等。很多新手觉得Misc靠运气其实它是有套路的。图片隐写是最常见的Misc题型。给你一张图片flag藏在图片的某个角落。常用的排查步骤用file命令查看图片的真实类型有时候扩展名是jpg但实际是png用binwalk检查是否嵌入了其他文件binwalk image.jpg用strings搜索可疑字符串strings image.jpg | grep flag用Stegsolve查看不同颜色通道检查图片的EXIF信息exiftool image.jpg流量分析题通常给你一个pcap文件让你从中提取flag。用Wireshark打开后先看协议分布然后过滤HTTP请求查找可疑的POST数据或文件上传。有时候flag藏在TCP流的某个数据包中用“Follow TCP Stream”就能看到。编码转换题就是各种编码的套娃。比如先Base64再URL编码再十六进制再摩斯密码。用随波逐流CTF编码工具可以自动识别和转换但你要理解每一层编码的原理否则遇到变种就束手无策。5.2 密码学题Crypto的常见考点Crypto方向的题目主要考察各种加密算法的理解和攻击。常见的考点包括古典密码凯撒密码、维吉尼亚密码、栅栏密码、培根密码现代密码RSA、AES、DES、椭圆曲线哈希MD5碰撞、SHA长度扩展攻击随机数MT19937预测、伪随机数种子爆破RSA是Crypto中出现频率最高的。常见的攻击方式包括小公钥指数攻击、共模攻击、低加密指数广播攻击、因数分解攻击。比如当e3且明文很小时可以直接对密文开三次方。import gmpy2 c 123456789 # 密文 e 3 m gmpy2.iroot(c, e) print(m)MT19937是Python的随机数生成器如果题目给出了足够多的连续随机数输出就可以预测后续的随机数。这类题目在近年的CTF中越来越常见需要用到专门的预测脚本。5.3 比赛中的时间管理与策略CTF比赛通常持续24到48小时题目数量从十几道到几十道不等。合理的时间分配比技术能力更重要。我的策略是先扫一遍所有题目按难度分类。签到题和简单题优先做确保基础分拿到。中等难度的题目选自己擅长的方向集中攻克。高难度题目如果半小时内没有思路果断跳过不要死磕。另外善用搜索引擎和社区。CTF比赛中允许查资料遇到不认识的编码、不熟悉的算法直接搜。很多题目都是基于已知漏洞或经典算法改编的网上往往有类似的WP可以参考。实操心得比赛时一定要开一个文档记录每道题的进度和思路否则题目一多容易混乱。我一般用Markdown记每道题记录题目描述、当前思路、尝试过的payload、卡住的点。6. 常见问题与避坑指南6.1 新手最容易踩的五个坑第一个坑环境没配好就开始做题。很多人装了Kali但没更新源pip装不上库做题时各种报错。建议装好系统后先花半小时把基础环境配好该更新的更新该装的库装齐。第二个坑不看题目提示。CTF题目的描述往往包含关键信息。比如“输入id即可查询到信息但是报错感觉好奇怪”这句话已经暗示了命令执行漏洞。再比如“小小查询系统”暗示这是一个SQL查询功能。仔细读题能省很多时间。第三个坑手动盲注。盲注题手动猜字符效率极低一定要写脚本。脚本写好后先在小范围测试确认逻辑正确再跑全量。第四个坑忽略保护机制。Pwn题不checksec就直接写exp结果发现Canary开着、PIE开着payload完全打不通。每道Pwn题的第一步永远是checksec。第五个坑不做记录。比赛时思路切换很快不做记录的话回头再看某道题完全想不起来之前试过什么。建议每道题都写简短的笔记。6.2 工具安装与配置常见报错处理pip安装pwntools报错通常是缺少依赖。先装python3-dev和libssl-dev再重试sudo apt install -y python3-dev libssl-dev libffi-dev build-essential pip3 install pwntoolsGhidra启动报错检查Java版本Ghidra需要JDK 11或以上。用java -version查看如果版本不对手动安装sudo apt install -y openjdk-17-jdkBurp Suite无法抓包检查浏览器代理设置是否正确Burp的Proxy Listener是否开启。如果还是不行试试关闭浏览器的HTTPS拦截或安装Burp的CA证书。Docker靶场启动后无法访问检查端口映射是否正确防火墙是否拦截。用docker ps查看容器状态用docker logs查看日志。6.3 如何高效刷题与总结刷题不是越多越好关键是要总结套路。我建议每做完一道题都写一份简短的WP记录题目类型、核心考点、解题步骤、用到的工具和脚本、踩过的坑。这样下次遇到同类题目直接翻自己的WP就能快速上手。另外定期回顾很重要。我每个月会花一天时间把之前做过的题目重新过一遍尤其是当时没做出来的。随着知识储备的增加很多当时觉得难的题目回头看会豁然开朗。最后加入社区。CTF是一个需要交流的领域一个人闷头学很容易走弯路。可以加入一些CTF学习群或者关注一些活跃的CTF博主。遇到不懂的问题大胆问大部分人都很乐意帮忙。我在实际比赛中的体会是CTF比的不是谁聪明而是谁的知识面广、谁的工具用得好、谁的心态稳。遇到难题不慌一步步排查往往就能找到突破口。这个领域没有捷径但每一步都算数。
返回列表