CTF 流量包:从 PCAP 里把 flag 捞出来
CTF 里的流量包题,一般会给你一个 .pcap、.pcapng 或者压缩包,要求你从网络通信记录里找到 flag。
这类题通常归在 Misc、Forensics 或者流量分析方向,核心不是背命令,而是还原“当时网络里发生了什么”。
简单来说,流量包题就是在问你:
谁和谁通信了?用了什么协议?传了什么内容?有没有被编码、压缩、拆分或者隐藏?
只要能按这个思路一步步排查,大多数入门到中等难度的流量题都能处理。
1. 常用工具
1.1 Wireshark
Wireshark 是做流量包题最常用的图形化工具。
它可以查看每一个数据包,也可以按协议、IP、端口、关键字进行过滤。
常用功能:
- 查看协议统计
- 查看 IP 会话
- 过滤 HTTP、DNS、FTP、ICMP 等协议
- 追踪 TCP 流
- 导出 HTTP 传输文件
- 查看数据包中的明文内容
打开流量包后,最常用的两个入口是:
Statistics -> Protocol Hierarchy
Statistics -> Conversations
第一个用来看有哪些协议,第二个用来看哪些主机之间有通信。
1.2 tshark
tshark 是 Wireshark 的命令行版本,适合批量提取字段。
查看流量包基本内容:
tshark -r traffic.pcap
查看 HTTP 请求:
tshark -r traffic.pcap -Y "http.request"
提取 DNS 查询域名:
tshark -r traffic.pcap -Y "dns.qry.name" -T fields -e dns.qry.name
提取 ICMP 数据字段:
tshark -r traffic.pcap -Y "icmp" -T fields -e data
1.3 strings
strings 适合第一时间粗略搜索明文内容。
strings traffic.pcap | grep -i flag
strings traffic.pcap | grep -i password
strings traffic.pcap | grep -i admin
strings traffic.pcap | grep -i upload
如果题目比较简单,直接用 strings 就可能搜到 flag。
如果搜不到,也可以通过关键词找到可疑请求、账号密码或者文件名。
1.4 binwalk 和 foremost
如果流量包里传输过图片、压缩包、文档等文件,可以尝试分离文件。
binwalk traffic.pcap
foremost traffic.pcap
不过这类工具更适合作为辅助。做流量分析时,优先还是应该先看协议和会话。
2. 拿到流量包后的基本流程
2.1 先看题目描述
题目描述往往会给方向,比如:
- “管理员登录时泄露了密码”
- “黑客上传了一个文件”
- “DNS 请求里藏着秘密”
- “有人通过 ICMP 传输了 flag”
- “还原键盘输入”
- “找到攻击者下载的文件”
如果题目提到 HTTP,就优先看 HTTP 请求和响应。
如果题目提到 DNS,就优先提取域名。
如果题目提到键盘,就考虑 USB HID 流量。
如果题目提到上传、下载,就要注意文件导出。
很多时候,题目描述已经把最重要的协议告诉你了。
2.2 看协议统计
在 Wireshark 中打开:
Statistics -> Protocol Hierarchy
重点观察:
- 有没有 HTTP、FTP、DNS、ICMP 等明文协议
- 有没有 USB、Bluetooth、802.11 等特殊流量
- TCP、UDP 流量比例是否异常
- 是否存在 TLS 加密流量
如果 HTTP 占比很高,大概率要看网页请求。
如果 DNS 查询很多,而且域名看起来很长、很乱,就要怀疑 DNS 隐写。
如果 ICMP 包很多,就要看 data 字段。
如果出现 FTP,优先找明文账号密码和传输文件。
2.3 看通信会话
打开:
Statistics -> Conversations
重点关注:
- 哪两个 IP 之间通信最多
- 是否有异常外部 IP
- 是否有大流量连接
- 是否出现可疑端口
- 是否有明显的上传或下载行为
常见端口可以先记住这些:
21 FTP
22 SSH
25 SMTP
53 DNS
80 HTTP
110 POP3
143 IMAP
443 HTTPS
3306 MySQL
6379 Redis
如果发现某条 TCP 会话数据量特别大,很可能里面传了文件或者关键内容。
3. Wireshark 常用过滤语法
做题时过滤器用得越熟,找线索越快。
3.1 按协议过滤
http
dns
ftp
icmp
tcp
udp
usb
3.2 按 IP 过滤
ip.addr == 192.168.1.10
ip.src == 192.168.1.10
ip.dst == 192.168.1.10
3.3 按端口过滤
tcp.port == 80
tcp.srcport == 8080
tcp.dstport == 21
udp.port == 53
3.4 按关键字搜索
frame contains "flag"
frame contains "password"
frame contains "admin"
frame contains "ctf"
如果是 HTTP,也可以写得更具体:
http contains "flag"
http contains "password"
3.5 查看某一条 TCP 流
tcp.stream eq 0
tcp.stream eq 1
tcp.stream eq 2
右键某个 TCP 包:
Follow -> TCP Stream
这是流量题里最常用的操作之一。
因为单个数据包可能只是一小段内容,追踪 TCP 流才能看到完整请求和响应。
4. HTTP 流量分析
HTTP 是最常见的流量题协议,因为它经常是明文。
4.1 过滤 HTTP 请求
只看 HTTP:
http
只看 HTTP 请求:
http.request
只看 GET 请求:
http.request.method == "GET"
只看 POST 请求:
http.request.method == "POST"
POST 请求尤其值得关注,因为登录、提交表单、上传文件经常使用 POST。
4.2 重点看哪些位置
HTTP 流量中常见线索位置:
- URL 参数
- POST 表单
- Cookie
- Authorization 头
- Referer
- User-Agent
- 响应正文
- 文件上传内容
- 返回的压缩包、图片、脚本
例如看到请求:
POST /login.php HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
username=admin&password=YWRtaW4xMjM=
YWRtaW4xMjM= 看起来像 Base64,解码后是:
admin123
这类账号密码可能就是后续解压文件、登录后台或者提交 flag 的关键。
4.3 导出 HTTP 文件
如果 HTTP 中传输了文件,可以在 Wireshark 中导出:
File -> Export Objects -> HTTP
导出后检查文件类型:
file suspicious_file
如果是压缩包,就尝试解压。
如果是图片,就考虑图片隐写。
如果是脚本,就查看源码。
如果文件名、响应内容或注释里有奇怪字符串,也要尝试解码。
5. FTP 流量分析
FTP 在 CTF 中非常友好,因为用户名、密码和命令很多时候都是明文。
过滤 FTP:
ftp
常见内容:
USER admin
PASS 123456
如果发现传输文件,继续看:
ftp-data
可以右键追踪 TCP 流,尝试还原传输内容。
FTP 题常见考点:
- 找登录账号密码
- 找上传或下载的文件名
- 还原传输文件
- 从文件中继续解密或隐写分析
6. DNS 隐写分析
DNS 题经常把数据拆开放在子域名里。
过滤 DNS:
dns
提取查询域名:
tshark -r traffic.pcap -Y "dns.qry.name" -T fields -e dns.qry.name
可能会看到类似内容:
ZmxhZ3s.example.com
ZG5zXw.example.com
c2VjcmV0fQ.example.com
取出前面的子域名并拼接:
ZmxhZ3sZG5zXwc2VjcmV0fQ
然后尝试 Base64、Hex、URL 编码等方式解码。
DNS 隐写常见特征:
- 子域名很长
- 域名由大量随机字符组成
- 多个请求的子域名可以拼接
- 出现明显的 Base64 字符集
- 查询频率异常高
如果域名里出现 -、_、数字和大小写字母混合,也可以考虑 Base64 URL Safe 编码。
7. ICMP 流量分析
ICMP 就是常见的 ping 协议。
CTF 中经常把信息藏在 ICMP 的 data 字段里。
过滤 ICMP:
icmp
提取 ICMP 数据:
tshark -r traffic.pcap -Y "icmp" -T fields -e data
如果得到的是十六进制字符串,例如:
666c61677b69636d705f7365637265747d
可以用 Python 转换:
data = "666c61677b69636d705f7365637265747d"
print(bytes.fromhex(data).decode())
输出:
flag{icmp_secret}
ICMP 题要注意去重。
因为 ping 通常有 request 和 reply,如果直接把所有 ICMP 数据都拼接,可能会重复一遍。
可以只看请求包:
icmp.type == 8
或者只看响应包:
icmp.type == 0
8. TCP 流追踪
TCP 流追踪是流量包题的核心操作。
在 Wireshark 中选中一个 TCP 包,右键:
Follow -> TCP Stream
然后可以看到这条连接中完整的客户端和服务器通信。
如果想看不同 TCP 流,可以使用:
tcp.stream eq 0
tcp.stream eq 1
tcp.stream eq 2
遇到下面这些情况,优先追踪 TCP 流:
- HTTP 请求内容显示不完整
- FTP 传输文件
- 可疑端口上有大量数据
- 看到一部分 flag 或编码字符串
- 数据包被拆成很多段
追踪 TCP 流后,可以切换显示方式:
ASCII
Raw
Hex Dump
如果要导出原始数据,可以选择 Raw 后保存。
9. USB 键盘流量分析
有些题给的不是网络流量,而是 USB 抓包。
常见题型是还原键盘输入。
过滤 USB 数据:
usb.capdata
提取字段:
tshark -r usb.pcap -T fields -e usb.capdata
键盘 HID 数据通常类似:
00:00:04:00:00:00:00:00
00:00:05:00:00:00:00:00
00:00:06:00:00:00:00:00
第三个字节通常表示按键码。
例如:
04 -> a
05 -> b
06 -> c
如果第一个字节是 02 或 20,通常表示按下了 Shift,需要转换成大写或符号。
USB 键盘题常见流程:
- 提取
usb.capdata - 过滤空数据
- 取出按键码
- 根据 HID 键盘映射表还原字符
- 处理 Shift、Backspace、Enter 等特殊按键
10. 常见编码和解码思路
流量包里的 flag 不一定直接出现,经常会被编码。
10.1 Base64
特征:
- 常见字符是大小写字母、数字、
+、/ - 末尾可能有
= - 长度通常是 4 的倍数
示例:
ZmxhZ3t0ZXN0X2ZsYWd9
解码:
echo ZmxhZ3t0ZXN0X2ZsYWd9 | base64 -d
10.2 Hex
特征:
- 只包含
0-9a-fA-F - 长度通常是偶数
示例:
666c61677b6865785f656e636f64657d
Python 解码:
print(bytes.fromhex("666c61677b6865785f656e636f64657d").decode())
10.3 URL 编码
特征:
%66%6c%61%67%7b%75%72%6c%7d
Python 解码:
from urllib.parse import unquote
print(unquote("%66%6c%61%67%7b%75%72%6c%7d"))
10.4 压缩数据
如果看到文件头或数据特征,可以考虑压缩:
1f 8b gzip
78 9c zlib
50 4b zip
89 50 4e 47 png
ff d8 ff jpg
做题时要对 magic bytes 敏感。
有时候流量里传输的是文件内容,但是后缀名可能是假的。
11. 一个通用排查清单
拿到流量包后,可以按这个顺序做:
- 看题目描述,判断可能协议。
- 用
strings搜索flag、admin、password、ctf。 - 用 Wireshark 看
Protocol Hierarchy。 - 用
Conversations找大流量会话。 - 过滤 HTTP、FTP、DNS、ICMP 等常见协议。
- 对可疑 TCP 连接执行
Follow TCP Stream。 - 如果有 HTTP 文件传输,使用
Export Objects导出。 - 对可疑字符串尝试 Base64、Hex、URL 编码。
- 对导出的文件继续做隐写、解压、脚本分析。
- 如果数据被拆分,用 tshark 提取字段后写脚本拼接。
这个流程不一定每题都完整走一遍,但它能帮你避免一上来就乱翻包。
12. 做题时的经验
12.1 不要只盯着 flag
很多题不会直接出现 flag{}。
它可能先给你一个密码、一个压缩包、一个图片、一个脚本或者一个 key。
所以除了搜索 flag,还要搜索:
admin
password
pass
login
upload
download
secret
key
token
ctf
12.2 数据量大的连接优先看
如果某条 TCP 连接明显比其他连接大,里面很可能传了文件。
这种连接通常比零散的小请求更有价值。
12.3 明文协议优先看
HTTP、FTP、DNS、ICMP 这类协议更容易出题。
如果流量里存在这些协议,先分析它们,通常比一开始研究 TLS 更高效。
12.4 看到异常长字符串就尝试解码
CTF 题目里,异常长的字符串往往不是随机出现的。
如果它出现在 URL、Cookie、POST 参数、DNS 子域名、ICMP data 字段中,就很值得拿出来解码。
12.5 能脚本化就脚本化
如果要拼接几百条 DNS 查询、ICMP 数据或者 USB 键盘输入,不要手工复制。
用 tshark 提取字段,再用 Python 处理,会稳定很多。
13. 总结
CTF 流量包题的的分析路线:
题目描述 -> 协议统计 -> 会话分析 -> 协议过滤 -> TCP 流追踪 -> 数据提取 -> 编码解码 -> 文件分析
遇到 HTTP,就看请求、响应、Cookie、POST 和文件导出。
遇到 FTP,就找账号密码和传输文件。
遇到 DNS,就提取域名并尝试拼接解码。
遇到 ICMP,就看 data 字段。
遇到 USB,就按 HID 键盘数据还原输入。

说些什么吧!