CTF流量分析实战:Wireshark与WinHex联手提取隐藏图片 📅 2026/6/20 18:03:04 1. 项目概述从流量中“捞”出隐藏的图片在CTFCapture The Flag夺旗赛的杂项Misc题目里流量分析是块硬骨头也是块肥肉。说它硬是因为面对一个动辄几十兆甚至上百兆的pcap文件新手往往两眼一抹黑不知道从哪里下嘴说它肥是因为一旦掌握了方法从看似杂乱无章的TCP流、HTTP请求里找到隐藏的flag那种成就感无与伦比。今天要聊的这个场景就是其中非常经典的一类从网络流量中提取出一张被“藏”起来的图片。这不仅仅是找到一张图那么简单它考察的是你对网络协议的理解、对数据结构的敏感度以及将理论工具Wireshark和二进制工具WinHex结合使用的综合能力。很多朋友在解题时用Wireshark过滤出了疑似图片的数据流却卡在最后一步——不知道如何将这些十六进制数据“变”回一张能打开的图片。这篇文章我就以一个老CTF玩家的视角带你完整走一遍这个流程从流量捕获、协议分析到数据提取、文件重组最后成功“显影”隐藏的图片。2. 核心思路与工具选型解析2.1 为什么是Wireshark WinHex面对一个流量包分析任务工具链的选择直接决定了效率。这里我们锁定了Wireshark和WinHex这一黄金组合这不是随意搭配而是基于它们各自不可替代的优势和在这个特定场景下的互补性。Wireshark协议层面的“显微镜”Wireshark的核心价值在于其无与伦比的协议解析能力。它能把原始的网络字节流按照TCP/IP协议栈的层次清晰地展示出来。比如它能告诉你哪些包是TCP三次握手哪个HTTP请求在下载一个文件这个文件的MIME类型是什么。在找隐藏图片时我们首先依赖Wireshark的过滤和搜索功能协议过滤http可以直接过滤出所有HTTP流量快速定位文件传输。内容搜索在分组字节流中搜索图片文件头如FF D8 FF对应JPEG是定位可疑数据的利器。流追踪追踪TCP流或追踪HTTP流功能能将一次完整的文件传输会话重组让我们看到数据的全貌。但是Wireshark的“重组”功能有时并不完美特别是对于非标准端口传输、或被故意分割、掺杂了其他数据的文件。它擅长告诉我们“数据在哪”和“数据是什么”但对于“如何把数据完整地、干净地抠出来”有时就显得力不从心。WinHex二进制层面的“手术刀”这正是WinHex登场的时候。WinHex是一个十六进制编辑器它不关心协议只关心最原始的字节。你可以把它想象成一把直接对磁盘或文件二进制内容进行精细操作的手术刀。我们的目标是把Wireshark里看到的那段包含图片的十六进制数据原封不动地复制出来保存成一个独立的二进制文件。这个过程中WinHex的关键作用体现在精确复制从Wireshark复制出的十六进制文本可能包含空格、偏移地址等杂质。WinHex允许我们以纯十六进制数值的方式粘贴和编辑确保每个字节都准确无误。文件头尾校验图片文件有固定的文件头Signature和文件尾Trailer。用WinHex可以直观地检查我们提取出的数据开头是不是FF D8 FF E0JPEG结尾是不是FF D9。如果头尾不对图片肯定无法正常显示。修复与微调有时提取的数据可能因为捕获不完整或传输错误缺少几个字节。在WinHex里我们可以手动比对、补全这是纯协议分析工具难以做到的。所以Wireshark负责“发现和定位”WinHex负责“提取和修复”。两者结合一个在宏观协议流中导航一个在微观二进制数据上作业构成了从流量中提取文件的完整闭环。2.2 常见图片隐藏手法与应对策略出题人不会把图片明晃晃地放在一个叫flag.jpg的HTTP请求里。他们通常会采用一些隐蔽手段了解这些手法能让我们有的放矢。隐藏在普通协议流量中这是最基础的方式。图片数据可能通过HTTP、FTP甚至是通过自定义TCP端口传输。关键在于识别出这不是普通文本流量。在Wireshark中关注数据包长度较大且连续的流查看其负载内容。分割存储一张图片被分割成多个小数据包甚至穿插在其他数据包中传输。这时需要利用Wireshark的追踪流功能将整个会话的数据重组后查看。有时分割规律可能藏在包序号或特定标识符里。修改文件头/尾或掺杂垃圾数据为了绕过简单的文件头搜索出题人可能会轻微改动图片的文件魔数Magic Number或者在图片数据中插入一些无关字节。这要求我们在用WinHex提取后具备基本的文件结构知识能识别并去除这些干扰。例如一个正常的PNG文件头是89 50 4E 47但题目可能把它改成了88 50 4E 47这就需要我们根据文件尾和内部数据块结构来综合判断并修正。隐写于其他文件类型高级一点的题目可能将图片数据附加在另一个文件如txt, pdf的末尾或者利用LSB最低有效位隐写术藏在另一张图片的像素数据中。这种情况通常需要更专业的隐写分析工具如Stegsolve, zsteg但第一步往往还是从流量中提取出那个“载体文件”。注意在实际CTF比赛中题目往往是多种手法的组合。我们的核心思路始终是先用Wireshark缩小范围找到最可疑的二进制数据流然后将其完整导出为原始数据最后用WinHex等工具将其修复为一个标准的图像文件。3. 实战演练一步步提取隐藏图片下面我们模拟一个典型的CTF场景使用一个包含隐藏图片的pcapng文件假设文件名为hidden_image.pcapng进行全流程操作。我会穿插讲解每个步骤的意图和可能遇到的坑。3.1 阶段一Wireshark初筛与定位步骤1全局观察与协议统计打开hidden_image.pcapng先别急着过滤。看一眼“统计”菜单下的“协议分级”这能快速了解流量主要由什么协议构成。如果HTTP/HTTPS占比很高那么目标很可能就在里面。同时观察“对话”选项卡查看哪些IP地址之间的通信数据量最大可疑传输往往发生在它们之间。步骤2应用显示过滤器我们的目标是图片图片通常通过HTTP传输且内容类型为image。因此可以尝试以下过滤器http.content_type contains image—— 直接筛选HTTP响应中声明为图片的内容。http.request.method GET http matches \\.(jpg|jpeg|png|gif|bmp)—— 筛选请求图片文件的GET请求。如果上述过滤器没有结果说明图片可能不是通过标准HTTP图片请求传输的。我们需要更通用的方法。步骤3搜索文件特征魔数这是杀手锏。直接在分组字节流中搜索图片的文件头Magic Bytes。按下CtrlF打开搜索框。选择“分组字节流”作为搜索范围。选择“十六进制值”作为搜索类型。输入常见图片格式的魔数JPEG:FF D8 FF E0或FF D8 FF E1PNG:89 50 4E 47 0D 0A 1A 0AGIF:47 49 46 38(GIF8)BMP:42 4D(BM)点击搜索。Wireshark会跳转到第一个匹配的数据包。步骤4分析上下文与追踪流假设我们搜索FF D8 FF找到了一个匹配包。这个包本身可能只包含图片的一小部分。我们需要看到整张图片的数据。在该数据包上右键选择“追踪流” - “TCP流”或“HTTP流”取决于协议。这时会弹出一个新窗口显示重组后的整个会话数据。关键点来了务必注意窗口左下角的“显示和保存数据为”选项一定要选择“原始数据”。这样我们看到的才是纯粹的二进制十六进制表示而不是ASCII/UTF-8解码后的乱码。现在整个TCP流窗口里你应该能看到以FF D8 FF开头的一长串十六进制数据。仔细滚动找到图片数据的结尾JPEG的结尾是FF D9。确认从开头到结尾的数据是连续的图片数据。有时图片数据前后会夹杂着HTTP头部或其他协议数据需要我们用眼睛识别出准确的起止范围。3.2 阶段二数据提取与原始文件保存找到了完整的图片十六进制数据下一步是把它“抠”出来。步骤5复制十六进制数据在Wireshark的“追踪TCP流”窗口中确保显示为“原始数据”。用鼠标从图片文件头的第一个字节如FF开始拖动一直选中到文件尾的最后一个字节如D9。然后右键选择“复制” - “...作为十六进制流”。这个选项至关重要它复制的是形如FFD8FFE0...FFD9的连续十六进制字符串去掉了中间的空格和偏移地址。步骤6使用WinHex创建新文件并粘贴打开WinHex点击“文件”-“新建”创建一个空白文件。大小可以先随意设置比如1KB后面粘贴数据时会自动扩展。点击WinHex主编辑区确保光标在文件开头偏移地址00000000处。最关键的操作点击“编辑”菜单 - “粘贴” - “粘贴Hex文本CtrIShiftV”。一定要选择“粘贴Hex文本”如果直接用CtrlV会把复制的字符串当成ASCII文本写入彻底破坏数据。粘贴后WinHex的编辑区应该显示出一排排规范的十六进制值左侧是偏移地址中间是十六进制数据右侧是对应的ASCII表示。此时你应该能在最右侧的ASCII栏看到一些模糊的可读字符如JFIF、Exif等JPEG标记以及大量乱码正常的图片二进制数据。步骤7检查与修正文件头尾粘贴后第一时间检查文件开头和结尾的几个字节开头确认是否是FF D8 FF E0或FF D8 FF E1等合法的JPEG头。结尾确认最后两个字节是否是FF D9。 如果头尾正确那么文件基本就是完整的。如果发现开头或结尾有多余的字节比如来自HTTP头部的0D 0A 0D 0A等就需要在WinHex中手动删除。用鼠标选中多余的字节按Delete键即可。操作前建议先“文件”-“另存为”备份一份。3.3 阶段三文件修复与最终验证步骤8保存并验证文件在WinHex中点击“文件”-“另存为”将文件保存为extracted_image.jpg根据你的文件头类型选择扩展名。尝试用系统自带的图片查看器打开这个文件。如果成功打开恭喜你已成功提取隐藏图片。仔细查看图片内容flag可能直接写在图片上也可能需要进一步进行图片隐写分析。如果无法打开或显示损坏说明提取过程可能有问题。步骤9故障排查如果图片打不开按以下顺序排查检查头尾用WinHex再次打开保存的文件严格比对文件头尾魔数。这是最常见的问题。检查数据完整性回想在Wireshark复制时是否漏选了开头或结尾的字节是否在TCP流窗口中图片数据中间被其他非图片数据打断如果被打断可能需要分段复制然后在WinHex中手动拼接。检查粘贴方式是否在WinHex中错误地使用了“CtrlV”进行普通粘贴这会导致数据完全错误。必须使用“粘贴Hex文本”。考虑文件修复对于复杂的题目提取出的文件可能确实存在结构性损坏。可以尝试使用专门的图片修复工具或者利用binwalk、foremost等工具尝试从原始数据中重新分离文件。实操心得在Wireshark复制十六进制流时一个非常实用的技巧是先仔细看ASCII栏。图片数据的ASCII栏通常是大片的乱码点状或奇怪字符而HTTP头部等文本数据是可读的英文。你可以通过观察ASCII栏更精确地确定图片二进制数据的起止边界避免把文本数据也复制进去。4. 进阶技巧与深度问题排查掌握了基本流程我们来看看一些更复杂的情况和提升效率的技巧。4.1 处理非HTTP协议及加密流量不是所有图片都走HTTP。它可能通过FTP、TFTP甚至是通过Raw Socket在自定义端口传输。针对FTP过滤ftp或ftp-data。FTP的数据传输通常在一个独立的连接端口20上。你需要找到对应的FTP命令连接端口21确定传输的文件名和方向然后在数据连接中提取。针对自定义TCP流如果协议分级显示有大量未知TCP流量可以尝试按数据包大小排序关注负载长度大且规律的数据包。然后对其使用“追踪TCP流”在原始数据中搜索图片文件头。针对TLS/SSL加密流量如果流量是HTTPS常规方法失效。除非题目提供了服务器私钥在Wireshark中编辑协议首选项SSL协议下添加密钥否则无法解密。但有些CTF题目会使用弱加密或故意留下漏洞或者flag就在加密前的请求URL中这时查看http.request.uri仍然可能发现线索。4.2 利用Wireshark的导出对象功能对于标准的HTTP文件传输Wireshark有一个更快捷的功能“文件”-“导出对象”-“HTTP”。这会列出所有Wireshark识别出的通过HTTP传输的文件。你可以直接在这里看到文件名、内容类型并一键保存。如果目标图片是通过普通HTTP GET请求下载的这个方法比手动提取快得多。但要注意如果图片数据被分割、掺杂或隐藏在非典型HTTP响应中这个功能可能无法正确识别和重组。4.3 当WinHex无法打开“粘贴Hex文本”时这是一个常见坑点。有时从Wireshark复制的十六进制流在WinHex中“粘贴Hex文本”选项是灰色的。这通常是因为复制的内容包含了非十六进制字符如空格、换行、冒号等。解决方案净化数据将复制的文本先粘贴到一个纯文本编辑器如Notepad中。使用替换功能删除所有空格、换行符以及类似0000这样的偏移地址前缀只保留连续的A-F0-9字符。在Notepad中可以使用正则表达式替换查找[^0-9A-Fa-f]替换为空。复制净化后的字符串再到WinHex中使用“粘贴Hex文本”。4.4 常见文件格式头尾速查表在流量中搜索时记住这些关键字节能事半功倍。文件格式文件头十六进制文件尾十六进制备注JPEGFF D8 FF E0或FF D8 FF E1FF D9最常用注意开头可能有FF D8 FF DB等变体PNG89 50 4E 47 0D 0A 1A 0A49 45 4E 44 AE 42 60 82(IEND块)结构严谨由多个数据块组成GIF47 49 46 38 39 61(GIF89a)3B结尾是一个分号BMP42 4D(BM)无固定结尾需根据文件头中的尺寸信息计算ZIP/RAR/7z50 4B 03 04(ZIP) /52 61 72 21(RAR)无固定结尾压缩包内可能藏有图片PDF25 50 44 46(%PDF)25 25 45 4F 46(%%EOF)图片可能嵌入在PDF中4.5 从USB流量或ICMP等特殊协议中提取有些脑洞大开的题目会把数据藏在USB键盘流量、USB存储流量甚至ICMP协议的负载里。USB流量需要先理解USB协议的数据结构。对于USB存储U盘关注SCSI命令和Bulk传输数据。对于键盘关注URB_INTERRUPT in的数据将其中的键值HID Usage ID转换为字符。这类题目通常有专门的脚本或工具如tshark配合特定字段过滤来处理。ICMP/DNS隧道数据被编码后放在ICMP Echo请求/回复的负载区或放在DNS查询的域名中。这类题目需要编写脚本将负载提取并解码可能是Base64、Hex、二进制等。在Wireshark中你可以过滤icmp然后查看数据包详情中Data部分的内容。面对这些特殊协议核心思路不变先用Wireshark过滤出目标协议流量然后想办法将其负载数据Payload以原始形式导出最后分析其编码规律并解码。导出数据时可以使用Wireshark的文件-导出分组字节流功能或者用tshark命令行工具更精确地提取特定字段。5. 自动化脚本辅助与实战思维培养手动操作熟练后为了应对更复杂的比赛或批量分析掌握一些自动化技巧是必要的。使用tsharkWireshark的命令行版本提取数据# 示例从pcap中提取某个TCP流流索引为5的原始数据到文件 tshark -r hidden_image.pcapng -z follow,tcp,raw,5 -q | tail -n 7 | xxd -r -p stream_5.bin # 示例提取所有HTTP响应中内容类型为jpeg的原始数据 tshark -r hidden_image.pcapng -Y http.content_type contains \image/jpeg\ -T fields -e http.file_data --export-objects http,./output_dir/tshark的强大在于可以集成到脚本中实现自动化过滤和提取。-Y指定显示过滤器-T fields -e指定要输出的字段。培养“数据敏感性”实战思维先宏观后微观不要一上来就钻到某个包里。先看协议分级、会话统计对流量全局有个把握。关注异常点特别大或特别小的包、频率异常的请求、非标准端口、含有“flag”、“secret”、“hide”等关键词的字符串。联想出题人意图CTF题目本质是解谜。思考“如果我是出题人我会把图片藏在哪里” 常见套路就那么些做得多了就有感觉。工具只是延伸Wireshark和WinHex是工具核心是你的网络协议知识和数据分析能力。工具操作不熟可以练但分析思路才是根本。最后再分享一个我踩过的坑有一次比赛我用Wireshark追踪TCP流后复制数据用WinHex粘贴Hex文本图片始终损坏。折腾了半小时才发现Wireshark窗口默认的“ASCII”显示模式在复制十六进制流时如果数据里包含0A换行符会导致复制出的十六进制字符串中间被意外截断。解决方案是在Wireshark的“编辑”-“首选项”-“外观”中将“字节流”的显示编码改为“十六数字”然后再进行复制操作这样就得到了纯净的连续十六进制字符串。这个细节在官方文档里都不会提全靠实战积累。所以多动手多遇到问题多解决问题才是提升CTF实战能力最快的方法。