资讯详情

资讯详情

CTF流量分析实战指南:从Wireshark抓包到敏感信息追踪

1. 流量分析题到底在考什么先看清出题人的底牌我在CTF杂项里泡了几年流量分析题是出场率极高的一类。很多人第一次拿到流量包打开Wireshark的瞬间就懵了几万到几十万个包密密麻麻铺在那里根本不知道该看哪里。但做过一定数量题目之后你会意识到流量分析题的战略目标其实非常单一——在一段模拟好的网络通信记录里找回出题人藏起来的敏感信息。想明白这件事做题逻辑就完全不一样了。出题人手里只有两样东西可以操控一是“藏东西的位置”二是“藏东西的姿势”。位置无外乎HTTP请求、TCP流、DNS查询、VoIP通话、USB HID流量这几类常见载体姿势则对应编码、加密、隐写、分片重组这些手段。你要做的就是在流量包里做一次有方向的“考古”——沿着协议的脉络把碎片拼成完整信息。流量分析题的对抗性质和真实世界的应急处置有相似之处蓝队接到告警后要做的不也是抓包、看会话、还原攻击者的行为轨迹吗所以别把这类题仅仅当作出题人刁难你的工具它的训练价值远比表面上大。一个能在流量包里五分钟定位到异常HTTP请求的人去做真实攻防中的进程排查和流量审计上手速度也是肉眼可见的快。那么准备工作该从哪里起步最要紧的其实是心态**先把Wireshark的界面和过滤语法用熟练再谈看题。**很多新手挂在第一关不是能力不行而是包过滤写不利索几千个包能从头翻到尾翻到眼瞎。后面我会用一整节专门讲工具配置和过滤语法的细节因为这里被忽视的功课决定了你做一道题要花十分钟还是半小时。2. 工具与战场准备吃透这些就赢了一半流量分析题在绝大多数情况下用两个工具就能解决Wireshark做协议分析和流量浏览Binwalk或Foremost做文件提取。但所谓“工欲善其事”不同的题目环境和需求工具链的选择是有讲究的我按场景拆开说。2.1 Wireshark基础配置一上来就影响做题效率的动作第一件事是设置好时间显示格式。我习惯将View菜单下的Time Display Format设为“Seconds Since Beginning of Previous Captured Packet”也就是相对时间。这样你按时间顺序追踪攻击链路时每个步骤之间的时间差一目了然不会被绝对时间戳分散注意力。第二件事是Protocol Preferences里的“Allow subdissector to reassemble TCP streams”这个选项必须保留开启。它的作用是允许Wireshark把分段传输的TCP数据重组成完整流否则你在跟踪HTTP流时看到的会是一堆乱序分片没法直接读内容。很多人说“Follow TCP Stream出来的数据乱码”多半就是这里配置不对。第三件事遇到HTTP流量较多的包直接在过滤栏敲http或者http.request会比漫无目的地翻看快得多。我个人的工作流是先看Protocol Hierarchy StatisticsStatistics菜单下这一步能在一秒内告诉你整个包里有哪几种协议、各类流量占比多大。出现异常的协议类别往往就是藏Flag的方向。2.2 辅助工具链的配置逻辑Wireshark负责“看懂流量”但很多时候它提取出来的文件是一团乱麻需要专门工具做二次处理。我自己常备的辅助工具有这几样工具用途使用时机Binwalk固件/文件系统/嵌入式文件扫描流量包里提取出的二进制文件无法直接打开时Foremost按文件签名批量恢复文件流量包里有多个文件碎片时Strings扫文件内的可打印字符串快速捞出可疑关键字时Audacity音频频谱图分析 / 频谱隐写查看VoIP录音还原后疑似藏字时随波逐流 / CTFcrack工具箱编码解码、常见算法脱壳拿到一段疑似编码字符串时这里有一个经验之谈**不要等题目做不下去了才去找工具而是在平时就把工具全部装好、配置好。**网上有很多集成了常见CTF工具的虚拟机镜像比如随波逐流工具箱、PwnTools这些对比起来选一个自己顺手的做题时节省下来的时间可能就是解题的关键。尤其是Windows下的CTF玩家我建议装好Wireshark和Python环境配合Pyshark等库做流量包脚本分析应付大批量包会非常舒服。2.3 两个极容易踩的坑第一个坑是流量包文件本身损坏。题目附件下载下来先看文件头和文件大小是否正常必要时用file命令确认类型用capinfos查看文件是否能被正常解析。我遇到过不止一次出题人故意把pcapng文件改后缀为pcap或者把文件头掐掉一段需要你手动补齐才能打开。这类“隐式前置任务”也是考点之一。第二个坑是流量包太大导致软件卡死。几个GB的包直接塞进Wireshark轻则卡顿重则直接崩溃。这种情况先用tshark或editcap做一次按协议分离或按时间切片只留下需要的部分再打开。命令很简单tshark -r big.pcap -Y http -w http_only.pcap editcap -A 2024-01-01 10:00:00 -B 2024-01-01 10:05:00 big.pcap small.pcap把大包拆成目标明确的小块分析和定位效率会提升一个层级。3. 高频考点一HTTP/HTTPS流量中的敏感信息追踪HTTP流量分析是CTF流量题最经典的考法。原因很简单——HTTP协议明文传输包含的字段极其丰富请求头、响应体、URL参数、Cookie、POST表单里的数据每一处都可能藏Flag。而且这类题出题成本低只需要在服务器端模拟一次简单的业务系统交互再把抓包结果整理成pcapng文件即可。3.1 基础套路Follow HTTP Stream直接揪出Flag最简单的题往往是一个HTTP GET请求里带了一个特殊参数或者响应报文里直接返回了一段Base64编码的字符串。对于这种题我的做法是三步走在过滤器里输入http.request把所有HTTP请求列出来按时间顺序逐条看URL寻找带flag、key、secret、upload等关键字的路径命中目标后右键选择“Follow - HTTP Stream”直接读请求和响应的完整内容这个方式能解决大约三成的基础流量题。需要提醒的是响应体里的内容有时被URL编码或HTML实体编码过一长串%66%6C%61%67这种玩意儿直接用在线解码工具解一下就好。部分题目还会把关键内容放在Cookie里看不到URL异常就顺手点左右键点点Cookie字段成本很低。3.2 POST请求中的加密参数与传参姿势进阶一点的HTTP题Flag藏在POST请求体里。比如模拟一个登录过程用户名或密码字段被做了Base64、MD5注意不是加密是哈希甚至AES加密。不少人看到加密字符串就慌了其实出题人很少使用需要密钥外部提示的加密方式多半是以下几种字符串特征可能编码/加密方式处理思路字母数字组合以结尾Base64直接解Base64形如%uXXXX或%XXURL编码URL Decode和/混在字符串中Base64或Base32按字符集判断结果是32位十六进制MD5在线碰撞或猜明文一串可见字符加乱码XOR或RC4结合流量分析找密钥我遇到一个比较有代表性的题目场景是这样的流量包里有一堆POST请求每个请求都有一条加密的评论出题人生成这段流量时把明文Flag拆成了好几块分别放在连续几次POST请求的某个相同字段里。第一次我只盯着第一个请求找什么都没找到后来把连续几十个POST请求的该字段拼接起来才发现是分段传输。这给我一个很深的印象做流量分析题视野一定要广别局限在某一个数据包里。3.3 HTTP流量里的文件下载与数据渗出痕迹不只是请求/响应里的字符串HTTP流量里还可能藏有被“下载”出来的文件。这类题的常规路径是过滤http.response找到Content-Type为application/octet-stream或image/jpeg的响应包右键导出分组字节流存成文件后再做文件分析。这个场景我还想多说一句。在真实的安全事件中攻击者把内网数据打包后通过HTTP传出去的情况非常常见蓝队分析这类流量时用的方法其实和做题一模一样——判断请求路径的异常、分析响应体大小、还原被传输的文件。所以你练的不只是为了分数更是一套真实可用的流量审计技能。4. 高频考点二从流量包里提取文件Binwalk之外的完整链路文件提取类型的题目会给你一个包含明显二进制传输内容的流量包常见载体有FTP、SMTP、HTTP、SMB有时也会直接以原始TCP流的形态存在。要拿分你就要把隐藏在通信过程中的文件还原出来再对文件本身做进一步分析。4.1 从FTP/SMB流量中还原文件FTP流量特征非常明显端口21是控制流端口20或随机高端口是数据流。在Wireshark里直接过滤ftp或ftp-data能看到完整的文件传输记录和文件大小信息。实战中我遇到这种题时会直接统计ftp-data的长度凡是长度和Flag文件大小对得上的传输片段都值得跟进。SMB流量相对复杂一些Wireshark的解析能力有限时可以考虑用smb2过滤后直接查找READ请求的响应块。有些工具能直接从SMB流量中导出文件比如网络取证分析时常用的手动方式找到Read Response的Data字段把数据部分复制出来存成文件。这里要留意一个细节出题人有时会对文件做分片乱序传输直接用“Follow TCP Stream”导出的数据是错乱的。处理策略是把同一文件的数据块按TCP序号或PDU顺序重新拼接再用foremost对该拼接产物做一次全文件扫描成功率会高很多。4.2 文件头缺失与文件修复从流量中提取出的裸数据经常是残缺的。最常见的问题是文件头缺失——比如一个PNG图片丢失了前8个字节的签名或者一个zip的本地文件头被破坏。面对这类情况补全文件头是基本功。PNG文件的文件头固定是89 50 4E 47 0D 0A 1A 0AJPG固定是FF D8 FF E0或FF D8 FF E1。Windows下可以用十六进制编辑器如010 Editor直接手动补Linux下也可以写个两三行的Python脚本自动把缺失的签名替换进去with open(extracted.bin, rb) as f: data f.read() # 假设数据从PNG的IHDR块开始手动补上前8字节 png_header b\x89PNG\r\n\x1a\n if not data.startswith(png_header): data png_header data with open(fixed.png, wb) as f: f.write(data)修复后的文件用file命令或直接看图软件验证是否正常。有时不光缺文件头还缺文件尾但图片缺尾一般不影响直接查看压缩包缺尾则解压时报错需要根据文件结构补足或跳过冗余数据。4.3 压缩包与伪加密文件提取出来后如果得到的是一个zip压缩包那就进入到解压环节。这里CTF题有很高的概率考到“伪加密”——zip文件末尾的加密标志位被篡改让工具误以为压缩包有密码但实际上根本没有加密。判断伪加密有几个快速方法用binwalk扫描文件看有没有明显的zip结构也可以在Linux下用zipinfo -v查看文件的加密标志位。遇到伪加密时最简单的解法是把zip文件头中对应位置加密标志字节清零或者使用Python的zipfile库直接尝试读取有时它不会检查这个标志位import zipfile z zipfile.ZipFile(flag.zip) try: z.extractall(pwdNone) # 空密码尝试 print(extracted) except RuntimeError as e: print(需要密码:, e)伪加密还有一个更隐蔽的变体真实密码压缩包里出题人提供了一个扭曲后的密码密码可能藏在流量包的注释、DNS请求的某些字段或者图片的EXIF信息里。这时候你要把整个流量包当成一个“线索库”来看而不是专心于某一个协议。5. 高频考点三VoIP通话流量把对话“听”出来VoIP题在CTF流量分析里是相对小众但套路固定的一类一旦掌握了它的玩法拿分率极高。这类题目模拟了网络电话的通信过程把一段语音对话的RTP流保存在pcapng文件里Flag要么直接出现在通话内容中要么被隐藏在通话录音的音频文件里。5.1 如何快速定位VoIP流量从流量包的整体特征来判断VoIP流量主要存在几个标志出现SIP协议的注册或呼叫信令出现UDP上大量连续的高位端口如40000以上数据包RTP协议出现在协议统计列表中。打开Statistics菜单里的Protocol Hierarchy看到SIP和RTP基本就可以断定这题和VoIP录音有关。定位到SIP的INVITE请求后或者直接用过滤器rtp筛选右键选择“VoIP Calls”Wireshark会弹出通话列表窗口。双击某一条通话记录就能进入RTP流分析界面。这里你可以选择播放两端的音频或只播放某一端。5.2 把通话录音完整导出Wireshark的VoIP播放功能虽然方便但导出的音频质量有时会被压缩或重采样影响后续分析。更稳妥的做法是使用wireshark自带的导出功能Telephony - VoIP Calls - Play - 在对话框中勾选需要的音频流然后Export到文件。Wireshark会把RTP的Payload转成.au或.wav格式。导出的音频如果疑似包含人的说话声但听不清通常的原因有两个一是只还原了单声道的一侧可以两只耳朵分开听两端的录音二是音频数据本来就有丢包或抖动这时需要先用Wireshark的“RTP Player”里的通话音质分析看看丢包率。实际做题时我一般会先把两端的录音分别导出用Audacity做降噪、放大或变速处理再逐句听。5.3 通话录音里的音频隐写通话内容本身就是Flag的情况占一小半更多的题目是通话说的是“假的”真正的Flag藏在录音文件的频谱图、波形图或末尾的无声片段里。拿到导出的wav文件后用Audacity直接打开切换到频谱图模式Spectrogram查看你会发现有些内容用人耳听完全无法分辨但在频谱图上一清二楚。这种隐写形式在CTF里很常见一张图片的大小不变但音频文件里最低的几个频段被替换成了另一段数据。我的建议是处理任何录音文件时都养成至少打开频谱图看一眼的习惯成本极低但成功率很高。用过一次后你就知道这个习惯有多值钱。6. 高频考点四DNS与隐蔽信道藏在名字和序号里的信息DNS流量分析题近年来在各类CTF中越来越常见原因是“隐蔽信道”——用正常的网络协议流量携带秘密数据——也是真实攻击者爱用的技术。你做这种题的过程几乎就是一次隐蔽信道检测的演练。6.1 DNS作为数据渗出的通道DNS流量分析里最经典的场景是恶意程序或用户主动把文件内容拆成小段拼接在域名查询的主机名部分通过大量的DNS请求把数据“一点一点送出去”。因为单个DNS查询的域名长度有限这些查询在时间轴上密集出现且域名部分是一长串十六进制或Base64字符串。拿这种题的操作方式十分固定用过滤器dns把DNS流量全列出来看一眼查询名称的分布情况。如果发现某个域名的子域部分明显是十六进制或Base64字符或者域名长度远超正常值就顺着把这些查询记录全部导出tshark -r dns.pcap -Y dns.qry.name -T fields -e dns.qry.name | grep suspicious.example.com把提取出的子域部分拼接起来再按Base64或十六进制解码就能还原出被传输的数据。如果出题人把数据做过逆序处理你拼接出来的内容可能是一段反序的Base64这时把它反转后再解码一个常见的陷阱就在这里。6.2 ICMP隧道与其它隐蔽信道DNS之外ICMP通常表现为操作系统中ping命令的流量也可以作为携带隐秘信息的载体。常见的方式是把数据塞进ICMP Echo Request的Payload部分用Wireshark抓包时会看到明明没人在用网络但每隔固定间隔就有一批ICMP包。处理这类流量我的做法是先按协议统计确认ICMP包的占比和流向再逐条打开ICMP包看Payload字段是否为可打印的ASCII字符。如果是直接提取这些Payload并拼接。此外TCP的某些空闲端口、HTTP的User-Agent字段也是隐蔽信道的高发区。判断的标准就一句话凡是“协议本身不该出现的内容”出现了就有嫌疑。6.3 流量包里的编码切换艺术隐蔽信道题和编码解码的关系很紧密。同样的字符串Base64、Base32、Hex、URL编码、Quoted-Printable编码之间换来换去每一步都是出题人有意设置的障碍。我的建议是先判断字符集范围再对应使用解码工具。具体来说字符集只有大写字母和2到7的字符串多半是Base32字母大小写混合且长度是4的倍数一般是Base64全部是十六进制字符可选Hex解码。在线解码器虽然方便但在CTF比赛现场网络环境不稳定的情况也存在本地备一个随波逐流工具箱或写自己的解码脚本会稳妥许多。7. 高频考点五USB流量分析从HID设备到键盘记录的还原USB流量的CTF题一般是Misc分类的必考内容之一它模拟的是USB键盘、鼠标甚至U盘设备的抓包数据。这类题目的特殊性在于你需要把USB协议传输的原始报文还原成一个个按键事件再反推出使用者敲了什么内容。7.1 识别流量类型键盘还是鼠标拿到USB的pcap文件先用usb过滤再统计一下URB_INTERRUPT in类型的包数量和数据长度。键盘设备的数据包payload通常是8字节鼠标设备则是4个字节左右。以键盘为例8字节内容的第二个字节表示按键的键码后面的几个字节是修饰键状态和扩展键码。出题人可能还设置了一个前置条件某个键盘流量包的数据被分片传输。遇到这种情况要把每个URB的payload按顺序拼起来再解析用tshark导出会比较方便tshark -r usb.pcap -Y usb.capdata -T fields -e usb.capdata7.2 把键码翻译成可读字符得到一串键码之后还要进行一次映射过过程。USB HID键码和ASCII码不是直接对应的比如0x04对应字母a0x05对应b以此类推。网上有现成的HID键码映射表但为了效率我一般会准备一个Python脚本直接把键码列表转换为人类可读的字符串。hid_map { 0x04: a, 0x05: b, 0x06: c, 0x07: d, 0x08: e, 0x09: f, 0x0a: g, 0x0b: h, # 省略其余映射 } def parse_keyboard_report(report_hex): report bytes.fromhex(report_hex) keycode report[2] if keycode in hid_map: shift report[0] 0x02 return hid_map[keycode].upper() if shift else hid_map[keycode] return 还有一个容易出错的点按住Shift键输入大写字母或符号时流量包里会出现修饰键标志。用解析脚本时不能只关注键码还要同时关注第一个字节的修饰键状态否则你费劲破解出来的只是全小写字母答案怎么都对不上。碰到带0x02修饰符的键码要把映射结果转成大写或对应符号。7.3 鼠标流量坐标流也可以藏数据鼠标类USB流量相对较少但一旦出现手法也比较固定把点击事件的坐标值当成某种编码或者直接将一串移动轨迹绘制成图片。解决这类题要学会把payload中的X、Y坐标提取出来后画坐标散点图或连线图直接用Python的matplotlib就能完成。看似复杂实际上就是一个数据可视化过程。8. 做题全流程实战一个典型的流量分析题从零到Flag的完整路径这一节我把前面所有知识点揉在一起走一遍完整的做题路径。你拿到手的是一个大小约20MB的pcapng文件题目名叫“someone forget something”没有更多提示。8.1 第一步宏观侦察阶段打开Wireshark先做三件事。第一看Statistics里的Protocol Hierarchy掌握整体协议占比第二输入http.request看有几个HTTP请求判断业务交互流程第三输入dns看有没有可疑域名。三件事做完我对这个包已经有了一个模糊的画像它有大量HTTP流量、零星DNS记录还有一个明显的FTP传输过程。综合判断这题最可能是HTTP文件下载或FTP文件还原方向。8.2 第二步分析主线把HTTP请求列表扫一遍发现不少POST请求指向一个上传接口内容不断上传。按时间顺序看这些请求的body要么是URL编码的文本要么是二进制上传文件的分片。尝试把body中的二进制内容用“Export Objects - HTTP”导出得到一个名为update_pkg.bin的文件。对update_pkg.bin运行file命令发现它是个gzip压缩包。解压后得到一组png图片用肉眼查看发现大多数图片正常只有最后一张图片的底部有一行奇怪的歪歪扭扭的文字。到这里Flag已经是很明显的事情——它被直接写在这张图片里了。8.3 第三步验证与复盘拿到Flag之前我还会做一次“减负验证”检查DNS流量里有没有额外信息因为有些题目会同时布置多条隐藏线索主路径拿到Flag只是达成了解题条件未必是唯一考点。快速过一遍DNS记录确实没有处理过的痕迹就放心提交答案。这类综合题的做下来其实不到十五分钟比你在网上瞎转大半天效率高得多。关键是前面几个章节里的基础能力扎实拿到包不会慌。9. 关于工具的几句话组合拳永远比单打独斗好用流量分析题的解法从来不是某一个工具的独角戏。Wireshark负责读Foremost/Binwalk负责提取Python负责批量处理Audacity负责音频图片查看器负责视觉每一环都是链路中不可缺失的部分。这里我想特别提一下tshark这个命令行工具。很多人只喜欢开图形界面但当你面对上千个需要批量处理的数据包时图形界面就会拖后腿。tshark可以配合循环和管道实现一键式处理比如批量导出所有HTTP响应里的图片for f in *.pcap; do tshark -r $f -Y http.response image-jpeg -T fields -e http.file_data images.txt done另一个实用原则**尽量在本地保存好你常用的解码转换脚本和工具集不要事事依赖在线工具。**尤其在比赛场景里网络波动、平台限制都会让你体验一把“巧妇难为无米之炊”的滋味。随波逐流工具箱这类集成式工具虽然方便但你也得知道每个功能背后的原理不然遇到变种题照样会卡壳。在做题过程中我形成了这样一个习惯每做一道新奇题型的流量分析题就把流量包文件名、考点、解法、工具命令整理成一段笔记。积累了三四十道题之后你的“流量分析题题型库”就开始有用了——因为很多新题不过是老题型的排列组合。这种整理本身其实就是学CTF最基础也最扎实的方法。就像本文整理的这些题型和套路如果你只当读一篇经验帖看完就完事了价值约等于零真正拿着流量包练几遍把Wireshark面板里的每个按钮都点一遍再做几道不同题型的真题这些内容才真正变成你自己的本事。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →