尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CTF流量分析实战:从Wireshark过滤到TCP流重组与文件提取

CTF流量分析实战:从Wireshark过滤到TCP流重组与文件提取 CTF圈子里有个默认共识Misc是新手最容易上手的方向但同时也是最容易“一看就会、一做就废”的题型。尤其是流量分析很多刚入门的同学拿着pcapng文件打开Wireshark之后看着满屏花花绿绿的包脑子一片空白不知道从哪下手。这篇文章我想用一次实战Writeup的形式把流量分析这类题目的完整思路、Wireshark的核心玩法以及我踩过的坑一次性讲清楚。内容会照顾到纯新手也会给有一定基础的朋友补充一些平时文档里不会写的细节。先说清楚这篇文章适合谁如果你是CTF新手想在Misc方向建立信心流量分析一定是最值得投入的题型——它不像逆向和Pwn那样门槛高也不像Web那样需要掌握大量框架漏洞只要会看包、会追踪流、会用过滤器配合一点编码基础和文件结构知识就能解决大部分题目。如果你已经打过几场比赛这篇文章也能帮你整理一套更高效的做题流程尤其是面对那些“流量包巨大、flag藏得刁钻”的情况一套清晰的排查顺序比盲目翻包管用得多。1. 这类题到底在考什么流量分析的四种核心套路先说一个新手最容易产生的误区以为流量分析就是“打开Wireshark肉眼找flag”。实际上CTF里的流量分析题考的不是你抓包的能力那叫渗透测试而是分析已有流量包的能力。出题人预先构造好一次或多次网络通信过程把flag藏在这个过程里你的任务是通过分析数据包还原出这个通信过程找到flag。我总结了一下90%以上的流量分析题跑不出下面四种套路套路一明文传输直接暴露flag。这是最简单的一类HTTP协议、FTP协议、Telnet协议里直接传递了包含flag的字符串。比如一个POST请求里带着flagxxxxx或者一份下载的文件名就叫flag.txt。这类题目的难点不在找flag而在过滤器的使用效率——你要能快速从几千个包里筛出含有关键字的那个。套路二隐藏文件提取。流量里传输了图片、压缩包、文档等文件flag藏在文件内容里。常见的考法有用wget下载的图片实际上是张PNGbinwalk跑一下发现尾部还有隐藏的zip或者HTTP响应里嵌了一张二维码图片扫一扫就是flag。这类题目的本质是文件提取和文件分析。套路三编码与加密数据还原。通信过程中用Base64、URL编码、十六进制等方式对flag做了处理或者使用简单的异或、栅栏密码等古典加密。你需要在流量里找到这些编码后的字符串然后做解码。有些题目会做得更隐蔽比如把flag拆成多段分散在多个包里。套路四协议交互过程还原。这是进阶玩法需要你对各种网络协议本身有了解。典型的有通过TCP流重组还原聊天记录通过USB流量分析键盘敲击通过DNS查询记录还原恶意通信内容甚至是通过蓝牙、Wi-Fi管理帧等冷门协议传递信息。拿到一道题先别急着乱翻花30秒判断它属于哪一类这会直接决定你的排查方向。我自己的习惯是先用下面这个顺序快速预判看包大小分布、看协议统计、看有多少TCP流、看有没有明显的大包通常是文件传输。这一步做完基本能猜出题目的大致考点。2. Wireshark核心技能过滤器才是流量分析的真正武器很多新手学Wireshark上来就学怎么抓包结果抓了一堆无关流量反而把自己绕晕了。CTF流量分析是分析已有的包核心技能不是抓包而是过滤和追踪。我把最常用、最高频的滤镜语法整理成了一套“CTF专用速查表”这套东西我在实际做题时反复用到比背一整本Wireshark手册实用得多。2.1 显示过滤器的黄金三件套IP、端口、协议Wireshark的显示过滤器Display Filter就是用来筛选你关心的包的最基础的就是这三类按IP筛选ip.src 192.168.1.1或ip.dst 192.168.1.1也可以用ip.addr 192.168.1.1同时匹配源和目的。做题的时候多数用ip.addr因为你往往不确定flag是在请求还是响应里。按端口筛选tcp.port 80、tcp.dstport 8080。HTTP默认80HTTPS默认443FTP默认21SSH默认22。看到奇怪的端口要敏感CTF里出题人常把服务跑在非常规端口上比如8888、1337这种。按协议筛选http、dns、ftp、tcp、udp直接输入协议名即可。做这种题我会直接看http因为绝大多数流量分析题都以HTTP协议为主角。实际做题时这几个条件经常组合使用比如ip.src 10.0.0.1 http tcp.port 80。2.2 关键字检索CtrlAltShiftT和CtrlF的组合拳如果题目明确告诉你flag格式CTF比赛一般约定为flag{...}、ctf{...}最暴力的思路就是在流量里直接搜这个字符串。Wireshark支持在数据包字节里搜索字符串快捷键是CtrlShiftFmacOS上略有不同搜索类型选择“String”搜索范围选“Packet details”、“Packet bytes”或者“Packet list”。但这里有个坑很多新手搜flag{搜不到因为数据可能被URL编码过flag%7B、可能是Base64ZmxhZ3s、可能是十六进制666c61677b、甚至可能是分片传输。所以我会用两个交叉验证的方法先用CtrlF搜“flag”这个单词本身能搜到就顺藤摸瓜。搜不到就搜http.request或http.response把所有HTTP请求/响应列出来逐个看参数名和URIflag往往藏在这些地方。另外强烈推荐CtrlAltShiftT或者右键Follow - TCP Stream这个功能可以把整条TCP流的内容重组还原出来相当于把一次完整的HTTP通信内容包含请求头和请求体原样呈现比在包列表里一格一格看高效得多。流量分析题里80%的flag都能在“Follow TCP Stream”之后的文本里找到。这个操作太常用了我一度把它叫“流量分析一把梭”因为很多题目真的就是点开流、复制文本、找flag三步走。2.3 统计工具不点白不点的Protocol HierarchyWireshark的“Statistics - Protocol Hierarchy”能显示所有协议的层次结构和流量占比。这对我来说是做题的第一步先看这个文件里到底有什么协议。有些题目会故意塞入大量ARP广播包作为噪声真正的通信只在某几条TCP流里也有的题目混杂了HTTP、DNS、ICMP但flag藏在ICMP的payload里。看一眼协议统计心里就有数了。类似的还有“Statistics - Conversations”能看到各个IP对之间的通信流量大小。如果发现某条TCP流传输了好几MB数据而其他流只有几百字节那这个“异常大”的流十有八九藏着文件传输值得单独追踪。2.4 抓包过滤器vs显示过滤器别搞混了刚入门的朋友容易混淆这两个概念。抓包过滤器Capture Filter是在抓包之前设置的意思是“只抓我关心的流量”作用是节省磁盘空间但你不做现场抓包根本用不上。显示过滤器Display Filter是抓完或打开pcapng之后用的作用是“从已有流量里挑我想要的”。CTF流量分析题只需要掌握显示过滤器抓包过滤器了解即可。3. 实战Writeup从打开数据包到拿到flag的完整过程下面我用一道模拟题来完整演示做题流程。这道题是我按照CTF Misc流量分析题的常见套路设计的融合了HTTP传输、Base64编码和图片隐写三个考点练完这道题你已经能应对相当一部分流量分析题目了。3.1 题目描述与初始侦查下载下来的文件叫capture.pcapng没有任何题目描述只有一句话“某黑客攻陷了一台服务器并下载了机密文件请找到文件中的flag。”第一步打开文件按CtrlShiftE查看协议统计或者Statistics - Protocol Hierarchy。我看到的统计结果是ARP占了大量包典型的干扰项然后就是HTTP协议集中在192.168.1.105和192.168.1.1之间。再查看Conversations发现这两个IP之间只有两条TCP流其中一条传输了约2MB数据。到这里我就形成了一个初步判断2MB的数据大概率是文件下载聚焦这条TCP流。3.2 过滤HTTP请求与TCP流追踪输入显示过滤器http把所有HTTP包列出来。Wireshark会自动标记HTTP请求GET/POST和响应200 OK。我快速浏览了一下请求URI果然看到一个可疑的GET请求GET /secrets/flag.zip HTTP/1.1注意有些题目并不会把文件名起得这么直白可能是/download/abc123也可能是/upload/file.php这类伪装路径所以不能光看URI猜测还是要配合TCP流追踪来确认内容。右键这个HTTP请求包选择“Follow” - “TCP Stream”。此时弹出一个窗口显示重组后的HTTP报文。最底部有一段乱码——不对仔细看是一串Base64字符串。这个字符串开头是UEsDBBQACAgIAA...我立刻反应过来UEsDB是ZIP文件的Base64编码开头ZIP文件的十六进制文件头是50 4B 03 04Base64编码后就是UEsDB。这里有个小知识点识别Base64编码的文件内容最靠谱的方法是看开头的几个字符根据Base64编码规则常见的文件类型会有固定的可见前缀。比如UEsDB是ZIPiVBORw0KGgo是PNG/9j/4AAQ是JPEG。这个方法比“把Base64全部解码再去识别”快得多。3.3 Base64解码与文件头识别把这段Base64字符串复制出来用Python或者在线工具解码。我习惯用Python因为后续还要做文件分析和隐写提取一条龙解决import base64 b64_data UEsDBBQACAgIAA... 完整Base64字符串粘贴到这里 with open(flag.zip, wb) as f: f.write(base64.b64decode(b64_data))解码出来的flag.zip用file命令验证确认是ZIP压缩包。直接unzip flag.zip如果顺利的话里面应该就是flag文件——但实际CTF题里往往不会这么顺利这是全题的第一个坎解压需要密码或者压缩包本身被做了伪加密处理。3.4 伪加密破解ZIP伪加密的判定与修复这题里unzip提示需要密码。我先尝试了弱密码123456、admin、flag全部失败。然后检查ZIP的加密标志位binwalk flag.zipbinwalk没有检出明显的附加数据。接着用16进制编辑器打开zip文件检查flag.txt对应的条目头。ZIP文件条目头中有一个关键字段通用位标志General Purpose Bit Flag位于文件头偏移4字节处占2个字节。如果这个值的十六进制是09 08说明是伪加密如果是09 00说明是普通加密。我看了一下这个ZIP条目的通用位标志是09 08而00 08才是真加密。所谓“伪加密”就是出题人手动把00改成了09骗过了解压软件其实根本没有加密。修复方法很简单把09 08改回00 08保存后直接解压。# 用Python修复伪加密 with open(flag.zip, rb) as f: data bytearray(f.read()) # 找到通用位标志并修改 data[4] 0x00 # 具体位置依文件而定 with open(flag_fixed.zip, wb) as f: f.write(data)改完后再解压这次成功拿到了flag.txt。你以为到这里就完了我打开flag.txt发现里面写的是一段Base64ZmxhZ3t3aXJlc2hhcmsuY29tX2lzX2Z1bn0。再解码得到flag{wireshark.com_is_fun}。到这里才算是完整的一题。这道题里包含了流量分析最常见的两个隐藏点一是Base64编码隐藏在TCP流中二是ZIP伪加密两个考点任何一个没有经验都会卡住很久。3.5 另一种超常见考点从HTTP响应中提取图片隐写上面的题是把zip藏在HTTP流里还有一种几乎同等高频的考法flag直接藏在HTTP获取的图片里。操作方式是这样的在http过滤结果里看响应包的Content-Type以及Content-Length。如果发现一个响应包响应体特别大而请求只是个普通GET那八成是下载了一个图片。右键Follow TCP Stream选择“Show data as: Raw”——重点来了然后点击“Save as”把你看到的原始数据保存成文件这个文件往往就是一个图片。图片拿到手之后依次尝试三件套strings提取字符串、binwalk检测嵌入文件、steghide隐写提取。CTF流量分析题里的图片很少是“普通图片”要么尾部藏了压缩包要么是LSB隐写要么是Exif信息里写了flag。我见过一道题flag被拆分后分成了两半一半藏在图片的Exif里另一半在另一条流的TCP payload里需要自行拼接。这类题目的核心思路是不要把图片当作图片要当作可能的容器。4. 不同协议下的流量分析进阶HTTP之外的花样HTTP协议是流量分析的“主战场”但CTF题不可能永远只考HTTP。下面这几个进阶方向是我在刷题时真实遇到过、并且花了不少时间才摸清套路的。提前了解它们至少能让你见到题目时不慌。4.1 FTP流量用户名密码最容易漏FTP流量分析难度不高但新手经常犯一个错盯着数据包列表看却不知道FTP的认证过程是在控制连接里以明文传输的。过滤器输入ftp或ftp-data就可以看到两条不同的逻辑链路。ftp控制连接里通常能看到USER和PASS命令flag有时就伪装成密码有时候藏在某个下载的文件里。注意ftp-data是分离的数据连接真正传文件的是这个Follow TCP Stream之后选择原始数据保存流程跟HTTP提取类似但容易忘记。4.2 DNS隧道与exfil流量小但戏多DNS协议流量分析是进阶选手的试金石。正常的DNS请求只有几十字节但如果某个域名形如flag.attacker.com或者子域名部分包含大量字符比如b3BlbnNzbC5jb20.example.com这种那就是DNS隧道也就是有人把数据编码后塞进了域名查询里。遇到这种情况先把DNS请求里的查询名全部导出然后按照分隔符拆解再逐个解码。Wireshark里可以用dns.qry.name这个过滤器字段把所有查询名列出来一目了然。4.3 USB流量键盘和鼠标藏着密码USB流量分析可以算Misc里的一个独立分支这里简单提一下套路。键盘流量每个包的有效数据通常8字节第三个字节对应按键码把一系列按键码按照HID键值表映射成字符就能还原出输入的字符串。鼠标流量则是看位移的偏移量可能是坐标记录也可能隐藏了信息。如果你的题目里看到大量URB_INTERRUPT in的包那大概率就是USB键盘采集题。这类题用Wireshark能打开但处理起来比较繁琐可以配合tshark先导出数据tshark -r capture.pcapng -T fields -e usb.capdata usb_data.txt然后写Python脚本处理键值映射。我最大的经验教训是不要试图在Wireshark图形界面里肉眼看几百个USB包一定要导出来用脚本处理省时省力还不会看漏。4.4 TCP流重组当协议识别失效时有些题目刻意避免使用标准协议纯粹走裸TCP。这时候Wireshark的协议解析器不会显示http或ftp整个包列表看起来就是一个个TCP包。别慌用“Follow TCP Stream”逐条查看很多题目flag就是直接写在TCP payload里的甚至还有那种把flag拆成语录、模拟网络聊天记录的题。我建议的顺序是先看Conversations统计里哪条流数据量最大然后依次Follow这些流把内容全部过一遍。遇到实在没思路的packet右键 - Protocol Preferences关闭某些协议的自动解析可能是破局点因为有时Wireshark把自定义二进制协议误判成了标准协议关闭解析就能看到原始payload。5. 流量分析题实战工具链不只是Wireshark熟练使用Wireshark是基础但做题效率往往取决于你愿不愿意用工具组合。我自己做流量分析题的时候工作流是这样的Wireshark负责看和筛选tshark负责导出数据Python负责解码和还原binwalk和strings负责文件内容提取必要时还会上NetworkMiner这类工具做辅助。我把这些工具的使用姿势整理如下。tsharkWireshark的命令行版本。优势在于批量处理和管道操作。导出HTTP所有请求头tshark -r capture.pcapng -Y http -T fields -e http.request.uri导出所有TCP流的payloadtshark -r capture.pcapng -T fields -e tcp.payload。在做大规模流量分析时tshark的效率远高于图形界面写脚本批量处理题目时更是必备。NetworkMiner一个免费的流量分析辅助工具可以自动从pcapng里提取传输的文件Files标签页还能按主机分组展示通信关系。对新手来说最实用的功能就是“提取文件”比手工Follow TCP Stream再保存要快好几倍。不过要注意NetworkMiner只负责提取文件内容是不是flag还得回到binwalk和strings这一步来验证。binwalk / foremost用于文件分析和隐藏文件提取。binwalk可以检测文件尾部附加的数据foremost可以从原始数据中自动剥离出多种格式的文件。当你在流量里提取出一个看不懂的文件时先跑binwalk看结构再跑foremost看能拆出什么东西。strings 正则strings file | grep -iE flag|ctf|key可以作为快速筛选但有时候flag被拆开藏在不同的行里我用一个更实用的做法把提取出来的所有字符串都导入到文本编辑器中然后用正则([a-zA-Z0-9]{10,})刷一遍长字符串这些长字符串大概率是编码后的flag或者密钥材料。我一般不建议在新手阶段同时上太多工具。先把Wireshark tshark Python这三件套玩熟等题目难度上来了再逐步引入NetworkMiner和foremost效果更好。6. 一键梭哈思路流量分析通用做题流程SOP有了前面的基础我来把整个做题流程总结成一个可复用的SOP。我自己是按这个顺序走的每一步都有明确目的不会东翻翻西翻翻浪费时间。第一步了解全局30秒打开pcapng后先看Statistics - Protocol Hierarchy搞清楚流量里有哪些协议。再看Statistics - Conversations找出通信量最大的IP对和TCP流。这一步的目的是建立全局观判断题目属于哪一类考法。第二步关键字搜索1分钟CtrlF搜“flag”如果搜到了就直接顺着定位。搜不到就搜{、}、ctf等常见字符再搜不到就想一想flag可能被编码成了什么比如ZmxhBase64的fla开头%66%6C%61%67URL编码等。第三步按协议逐块排查3分钟依次使用http、dns、ftp、tcp等过滤器对每种协议的主要流执行Follow TCP Stream重点看有没有文件传输和可疑字符串。这一步做题速度取决于对协议的熟悉度遇到不懂的协议字段右键查看官方描述或者直接转原始字节看内容。第四步文件提取和内容鉴定5分钟凡是发现有文件传输的流量一律提取出原始数据然后依次用file、strings、binwalk做鉴定。这一步最容易出flag也最需要耐心。有一年某CTF的题压缩包里还有一层压缩包套了三四层最后才看到flag纯粹考验耐心和自动化处理脚本的能力。第五步编码转换和密码还原5分钟如果找到的字符串看起来不直观使用CyberChef或者自己写脚本依次尝试Base64、Base32、十六进制、URL解码、ROT13、异或等常见编码方式。CTF有一个不变的真理出题人不会把flag明文扔在流量里但也不会用一个你完全无法破解的加密方式最多是Base64加一次字符反转或者异或一个单字节密钥。多尝试几种总有一款适合。第六步兜底的原始数据检查实在没有思路时选择Statistics - Endpoints查看是否有异常的IP或端口。有时候flag藏在ICMP包里的payload有时藏在UDP端口的高字节序里有时藏在TCP的序列号或者初始窗口中这类题比较偏门但确实有人出。兜底检查的核心原则是不要放过任何看起来“多余”的数据。上面这套流程我在几十道题上验证过除了一些偏门的底层协议题绝大多数题目都能在15分钟内解开。7. 做题经验与常见坑那些让我卡关两小时的教训写到最后分享一些平时文章不会写但实战血泪总结的经验。有些坑我踩过不止一次写出来希望能帮到你。第一个坑TCP流追踪时只看了文本忽略了Raw数据。Wireshark的Follow TCP Stream默认以文本显示但如果传输的是二进制文件文本模式会显示成乱码很多新手以为这是加密数据就放弃了。实际上切换到“Show data as: Raw”再Save as保存就能还原出原始文件。看到乱码先别慌先切Raw看看。第二个坑忘了pcapng可能包含多个接口的流量。有些题目用的是多接口抓包文件在Wireshark左下角接口栏会显示多个编号。有的flag只在某一个接口的流量里如果只盯着默认接口永远找不到。做题时如果感觉包很少、内容很单一检查一下是否有其他接口的流量被折叠了。第三个坑纯手工翻包拒绝写脚本。当流量包里有几百个相似的HTTP请求、每个请求的响应体里都有一段Base64纯手工复制粘贴会把人搞疯。这时候就用tshark导出所有数据再用Python批量Base64解码几秒钟就能完成。CTF是一种效率游戏能用脚本解决的绝不手工做。第四个坑把HTTP响应里的压缩文件直接硬解。有的题目Wireshark会把响应体里的文件内容按“HTML”或者“文本”分块显示导致你复制的Base64不完整。遇到这种情况通过“File - Export Objects - HTTP”直接导出所有HTTP对象这才是最干净的提取方式避免绕过Wireshark重组逻辑造成的截断问题。第五个坑忽略了时间过滤和排序功能。有些题的flag藏在“最早”或者“最晚”的流里模拟攻击链的开始和结束。在Wireshark中点击Time列排序快速找到时间戳异常的那几条记录往往会有意外发现。另外可以用frame.time过滤特定时间段的流量这在流量包特别大时很实用。我在实际做题中最依赖的一个小习惯是每解出一个中间结果马上记录在文本文件里记录下所用过滤器、追踪的流编号、解码方式和解出的字符串。这样如果最终结果不对还能回溯检查是哪一步出了问题不用重新翻包。这个方法在比赛计时场景下特别有用强烈建议一试。流量分析这个方向在CTF里看起来不够酷炫但它其实是信息安全的基本功——每一次真实的安全事件响应都是从流量分析开始的。能把Wireshark玩熟能从杂乱的数据包里准确还原出攻击者的动作这本身就是一项非常实用的能力。这篇文章从流量分析的题型分类、Wireshark核心操作、完整实战Writeup到常见坑技巧都覆盖了希望对你有所帮助。如果在做题时遇到卡壳不妨回到这篇SOP里对照流程大部分时候问题出在“你还没有穷尽所有可能性”。
返回列表