拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CTF流量分析实战:从pcap到flag的完整拆解

1. 项目概述一次CTF流量分析题的完整拆解最近在复现DDCTF2018的流量分析题目时找到了一个非常典型的综合型流量包从拿到pcap到最终提取出flag整个过程涵盖了流量分析最常见的几个核心环节协议筛选、HTTP流追踪、文件提取、隐写分析。这种综合强度在平时的安全学习中其实比较少见大多数字题要么只考单一的HTTP请求分析要么只考单纯的社工密码推导很少有能把流量分析、文件还原、隐写破解串成一线索链的题目。借这次实战我把完整过程和思路整理出来标题取了个“添柴不加火”——因为这个流量包里的“坑”其实不多但线索一个连一个你只需要顺着数据包本身的方向轻轻推一把就能找到真相不需要额外添乱、不需要盲目猜测。对刚入门CTF流量分析的朋友来说这是一个零基础也能顺畅走完的经典案例对已经做过几道流量题的老手来说里面的文件还原手法和隐写探测顺序也有一定参考价值。先说结论这题的核心思路是“先找可疑会话再还原传输文件最后在文件里找隐藏信息”。听起来很简单但实际操作中有不少细节容易卡住新手比如怎么快速定位恶意或异常的TCP/HTTP流、提取出来的文件怎么判断真实类型、文件大小和设备指纹怎么辅助判断隐写手段。这些我都会在接下来的章节里逐一拆开讲。2. 整体思路与方案选型为什么流量分析题要先“宏观后微观”2.1 流量包的宏观扫描是关键第一步拿到一个pcap文件最忌讳的就是直接用Wireshark的Follow TCP Stream逐个去看。一个综合型流量包通常包含几万甚至几十万个数据包如果一上来就扎进细节里很快就会被海量的TCP重传、DNS查询和TLS握手淹没完全找不到重点。正确姿势是先做宏观扫描。打开Wireshark后第一件事是看Statistics下的Protocol Hierarchy快速了解这个流量包里都有哪些协议、各自占比多少。特别是要关注HTTP、DNS、SMB、FTP这类承载业务数据的协议因为CTF流量题的基本盘就是“通过某个应用层协议传输了关键文件或敏感数据”。如果一个流量包里HTTP占比很高那基本可以断定题眼在Web交互上如果出现大量ICMP且载荷异常那就要考虑ICMP隧道或者数据隐写。第二种宏观手段是看Conversations或Endpoints统计哪些IP之间通信量最大、持续时间最长。在综合型题目里通常会有大量正常的背景流量比如系统更新、NTP同步、随机扫描这些都要在宏观层面先筛掉只保留有实质内容交互的对端。我在这次分析里就是用Conversations排序之后立刻发现了一个IP对之间的HTTP流量远高于其他连接这就是突破口。2.2 为什么优先选择Wireshark而不是tcpdump或tshark流量分析工具很多但针对CTF实战和日常流量包分析Wireshark的图形化界面和交互式过滤体验确实有不可替代的优势。tcpdump适合在服务器上抓取实时流量tshark适合批量脚本化处理但当你需要反复在同一组数据包上试不同过滤条件、切换不同追踪视角时Wireshark的“点哪儿看哪儿”效率最高。具体来说有几个功能是流量分析绕不开的一是Display Filter支持千种以上协议字段过滤比如http.request.methodPOST、tcp.stream eq 12能精准切到指定会话二是Follow TCP Stream/UDP Stream以可读文本方式还原一次完整通信内容HTTP请求响应、文件下载原始数据都从这里看三是Export Objects可以把HTTP、SMB、TFTP等协议传输的文件对象直接导出来这一步在流量分析题里出镜率极高。当然命令行工具也并非无用。处理超大流量包几个GB以上或者需要自动化提取全部HTTP对象时tshark配合-Y过滤和--export-objects参数反而比图形界面更快。我的习惯是前期探索用Wireshark批量提取时切tshark。这次题目流量不大全程Wireshark就够用了。2.3 综合型流量题的通用分析路线图综合型流量分析题和单点流量题最大的区别在于它不会把flag直接写在HTTP响应里让你一眼看到而是会把它拆散成多段线索分散在流量包的不同位置。以我的经验一个标准的综合型流量题大概率遵循以下路线第一阶段是“定位异常”。通过宏观统计、过滤条件、时间线分析找出最可疑的通信双方和会话流。第二阶段是“还原行为”。把可疑会话的内容完整提取出来搞清楚攻击者或用户到底做了什么。第三阶段是“提取产物”。如果传输过程中出现文件下载、上传、响应体异常就需要用Export Objects或手动保存原始数据把文件从流量里挖出来。第四阶段是“深度分析”。对提取出的文件做类型识别、隐写探测、压缩包爆破、格式解析最终拿到flag。后面所有章节基本就是按照这个路线来组织的这也是我在多次实战中总结出的最不容易漏线索的套路。3. 核心细节解析与实操要点3.1 用过滤条件快速锁定HTTP可疑请求在打开的流量包中我首先使用http.request过滤出所有HTTP请求行然后逐条浏览。这时候需要注意一个关键点不要只看状态码要关注URI和请求参数。很多题目会把关键路径伪装成静态资源比如/image.php、/upload或者把参数名写得非常迷惑比如file、data、sig。这次遇到的题目里我过滤出HTTP请求后很快看到几个连续的POST请求URI路径指向一个疑似上传接口而且每个POST请求的响应里都带有一段较长的十六进制数据。这种“请求很短、响应很长且内容不规则”的特征要么是文件下载要么是某种加密数据。为了确认我用tcp.stream eq N逐个追踪TCP流逐一查看请求与响应的完整对话。发现其中一条流的响应头里有Content-Disposition: attachment; filenamesecret.png这就是非常明确的文件传输信号。此时候选目标已经锁定。3.2 File - Export Objects一键提取HTTP传输的文件流量分析中还原文件最稳妥的方式就是Wireshark自带的File - Export Objects - HTTP。这一步会列出所有HTTP会话传输过的文件对象包括请求URI、文件名、大小、MIME类型。实际操作中我会特别注意那些Content-Type与文件扩展名不符的对象这种往往是出题人故意隐藏的真实数据。这一次导出的对象列表里有几个PNG图片、一个HTML页面、一个ZIP压缩包。PNG是最可疑的——因为在正常的Web访问记录里图片资源不会恰好出现在我锁定的那条异常TCP流中而且其中一张图的文件大小异常偏大超过了一般图片应有的体积。文件大小异常可能意味着图片尾部拼接了其他数据也可能是LSB隐写导致的数据膨胀。导出这些文件后我先用file命令确认真实类型file secret.png file archive.zip这里补充一个经验file命令识别的结果是第一道关口但有些攻击者会把PNG文件头\x89PNG伪装成其他格式比如在文件头部加上JPG的\xFF\xD8\xFF\xE0这时候file就不会报PNG了。因此更稳妥的方式是直接查看文件头部的十六进制字节xxd secret.png | head -5通过比对已知文件魔数判断文件真实格式。PNG魔数是89 50 4E 47 0D 0A 1A 0AZIP魔数是50 4B 03 04JPEG魔数是FF D8 FF E0。这次检查后确认导出的PNG确实是标准PNGZIP也是标准ZIP没有伪装。3.3 图片隐写探测的顺序很讲究拿到PNG之后下一步就是隐写探测。新手常见的错误是上来就跑Stegsolve逐帧翻看或者直接丢给zsteg但其实应该先做静态属性检查。我会按这个顺序来探查图片隐写第一步看图片的尺寸和文件大小是否匹配。用identify secret.pngImageMagick或Python PIL读取宽高再对比文件实际大小。如果图片尺寸是正常的1920x1080但文件体量只有几十KB基本可以排除空间隐写反过来如果只有400x300却有几MB大概率尾部有附加数据。第二步检查文件尾部。常见的flag要么直接拼接在图片结尾要么藏在ZIP里再拼到图片后面。用binwalk可以快速扫描文件中的嵌入式文件它能识别出多种常见文件类型的起始位置。如果binwalk报告发现了ZIP或RAR那就直接dd从对应偏移切割出来。第三步做LSB隐写分析。这一步我会用zsteg针对PNG/BMP和Stegsolve的手动通道查看。LSB隐写的特点是图片视觉上几乎无变化但最低有效位里藏着数据。zsteg能自动提取遇到的全部隐藏信息Stegsolve则适合手动观察RGB各通道的比特平面看是否有人为痕迹。这次题目中binwalk直接扫描PNG时并没有报告异常但当我用zsteg扫的时候出现了base64编码的字符串。这一步就拿到了第一段线索。3.4 压缩包口令与文件类型的二次校验解出的字符串是一串疑似密码的文本结合流量包中另一个ZIP文件我立刻想到这是一种常见套娃思路先用隐写藏密码再用密码解开压缩包。ZIP文件往往有加密密码强度不高的话可以尝试手动输入强度较高就需要爆破工具了。这里需要注意一个细节在爆破ZIP之前务必先确认ZIP是否真的加密。用zipinfo -v archive.zip查看压缩包信息如果出现File password is required或者加密算法列才需要爆破。有些ZIP只是普通存储直接unzip即可打开。尝试用隐写中提取的密码解压后压缩包里还有一个文件并且又用同样的密码进行了二次加密。这种套娃设计在CTF里很常见本质是为了延长解题链让选手不能一步到位。此时就已经很接近终点了因为最终解出来的文件往往就是flag文本或者flag图片。4. 实操过程与核心环节实现4.1 从流量包还原攻击链的完整过程记录接下来把完整操作流程串起来从打开流量包开始到拿到flag为止。我用的是Wireshark 4.0版本系统环境是Kali Linux不过这些操作在Windows Wireshark环境里完全一样不受平台限制。第一步打开pcap文件先看Statistics - Protocol Hierarchy。输出显示TCP占比超过95%HTTP占比约60%DNS约10%其他都是背景噪声。这基本确认了分析重心在HTTP会话而非底层协议隧道也不是SMB文件共享。第二步Statistics - Conversations按Bytes排序。发现在192.168.x.x和10.x.x.x两个IP之间的通信量远超其他对端而且这种通信量的HTTP请求数量多、响应体积大显然不是普通浏览行为。第三步用http.request过滤所有请求逐条查看URI和参数。目标IP之间的请求集中在几个路径上包括/upload、/download、/image.php很快就发现了异常上传接口。第四步追踪指定TCP流。假设异常流序号是42使用tcp.stream eq 42完整查看请求与响应。响应头里有Content-Disposition: attachment确认是文件下载。随后使用File - Export Objects - HTTP把可疑文件全部保存到本地。到这里流量分析的工作就基本完成了。剩余的时间全部花在文件分析上这其实也是流量分析题的真实状态——流量只是载体文件才是本体。4.2 关键命令与参数的实际执行记录我把操作中实际用到的命令记录在这里方便对照实操。首先是用file和xxd做文件类型确认$ file secret.png secret.png: PNG image data, 400 x 300, 8-bit/color RGBA, non-interlaced $ xxd secret.png | head -3 00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR|PNG头完整IHDR块正常说明图片没有被截断或头部篡改。接着用binwalk扫描$ binwalk secret.png DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 PNG image, 400 x 300没有发现嵌入式文件说明数据不是简单拼在图片里。此时用zsteg做LSB扫描$ zsteg secret.png b1,r,lsb,xy :: text: ZmxhZ3t0aGlzX2lzX2Zha2VfZmxhZ30解出base64字符串后解码得到一组文字。这里我插一句看到base64就解码是默认操作但有些题会在隐写内容里藏多段不同的编码需要仔细观察zsteg输出中每个通道的细节。本次只出现了一段有效base64说明出题人没有在隐写层设置过多分支而把精力放在后续压缩包套路上。4.3 从隐写内容到ZIP解压的衔接细节拿到解码后的字符串后我把它当作ZIP压缩包的密码去尝试。在操作之前我确认了解压目录的权限和磁盘空间避免解压过程中因为路径或空间问题报错影响判断。$ unzip secret.zip Archive: secret.zip [secret.zip] flag.txt password:输入密码后成功解压出flag.txt。如果这一步密码不正确常见的后备手段是使用fcrackzip或john配合字典爆破针对CTF题常用密码字典成功率在中小型密码下通常很高。但本题目显然设计成用隐写密码解锁不需要爆破。需要注意的细节是解压出的flag.txt一定要先cat看看内容。如果内容是明文flag任务就结束了如果内容又指向下一个文件就得继续循环。这次解压出的flag.txt里直接就是最终flag整条解题链到此闭环。4.4 为什么这次叫“添柴不加火”克制分析的价值复盘整个分析过程最值得强调的其实是“不要过度分析”。我看到很多新手解流量题时会在一个可疑PNG上花好几个小时反复扫各种隐写工具却忽略了流量包里还有另一个更明显的ZIP文件等待解压。这个题真正的主线其实是HTTP会话里的ZIP传输 图片隐写密码而不是图片本身藏着多少秘密。“添柴不加火”的核心含义就在这里分析流量时你的角色是观察者和还原者不是干扰者。流量包已经把行为和结果完整记录下来了你要做的只是顺着已有的痕迹一步步还原不要把自己的主观猜测强加到数据上。发现一条路走不通就回到宏观层面重新看流量特征而不是在同一处反复“添柴”制造假线索。5. 常见问题与排查技巧实录5.1 导出文件损坏或无法打开的常见原因流量分析中导出文件打不开是最常见的翻车点之一。主要原因有三个一是HTTP响应被分片传输Wireshark导出的对象可能缺尾部数据二是响应用了Content-Encoding压缩比如gzip导出的原始对象是压缩态而不是实际文件三是传输过程中出现TCP重传和丢包导致敏感数据不完整。针对这些情况排查建议是先用tshark在命令行下对同一目标流重新做一次提取比对文件大小差异其次如果文件有压缩标志先解压再分析最后确认Wireshark的Edit - Preferences - Protocols - TCP中是否开启了“Allow subdissector to reassemble TCP streams”这个选项必须勾选否则Follow TCP Stream看到的可能是乱序片段。5.2 隐写扫描没结果怎么办如果binwalk和zsteg都没发现异常并不代表图片是干净的。这时候我会把图片丢进Stegsolve手动切换到Red plane、Green plane、Blue plane以及对应最低位平面查看特别是RGBA通道中的Alpha通道有时出题人会选择在Alpha通道低位隐藏数据。另外还有一种容易忽略的情况是“基于调色板的PNG隐写”这种图片用常规的LSB工具扫描不容易出结果需要用pngcheck检查IDAT块的数据流分析是否有异常的块长度或冗余数据。如果IDAT块的数量和大小明显不符合压缩规律就有可能是手工构造的特殊数据流。5.3 流量包里没有HTTP对象怎么办有些综合型流量题不走HTTP而是用自定义TCP协议或者DNS隧道来传输数据。此时Export Objects - HTTP就完全派不上用场。正确做法是回到原始TCP流用Follow TCP Stream查看原始数据载荷如果数据是十六进制用Wireshark的Export Packet Bytes保存为二进制文件再进行分析。DNS隧道在流量题里的识别特征是大量DNS查询的域名前缀是随机的、长度较长且子域名部分包含可解码的base64或hex字符串。如果看到这种模式用tshark过滤dns.qry.name再批量提取域名前缀做拼接解码即可。这个技巧在综合型流量题里越来越常见值得专门准备。5.4 排查技巧速查表我把这次实战中触及到的排查点整理成一张速查表方便大家对照使用。问题现象可能原因排查手法HTTP导出对象无法打开TCP分片/Content-Encoding开启TCP流重组tshark二次提取binwalk无结果数据被隐藏在IDAT内部或LSBzsteg多通道扫描Stegsolve手动看压缩包需要密码密码藏在隐写/流量其他位置先看隐写内容再考虑字典爆破流量包巨大无法定位背景流量干扰严重用Conversations按字节数排序优先看大流量对端关键文件被伪装扩展名文件头被修改xxd查看魔数不信任file命令的扩展名判定同一个ZIP多次加密套娃设计保持密码一致循环解压直到出现最终flag文件5.5 实战中的独家心得设备指纹和流量特征的辅助判断最后补充一个冷门但实用的技巧在分析流量时可以留意HTTP请求头里的User-Agent和Accept-Language字段。这些字段看起来无关紧要但在流量分析题里偶尔会作为提示信息存在。比如User-Agent里藏着版本号和操作系统类型而Accept-Language里可能藏着某种语言标识这些都可能成为压缩包密码的一部分。在这次题目中我注意到一个请求的User-Agent设置成了非浏览器的自定义字符串初步怀疑是扫描器或脚本访问。沿着这个特征再追回去果然在那个请求对应的响应体里发现了关键线索。这说明做流量分析时任何一个Header字段都不该轻易跳过出题人最喜欢把线索藏在大家觉得“没用”的地方。结束语做完这道综合型流量分析题我自己最大的体会就是“宏观定位、微观求证”这套方法论确实管用。流量包里永远不缺数据缺的是筛选数据的耐心和方向。你不用猜测攻击者每一步的意图只要把数据当成现场证据老老实实记录、提取、还原最后的flag自然会浮出水面。这正好呼应了题目本身的名字——添柴不加火把火候交给数据自己你只需要看清火苗跳动的方向就够了。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门