Wireshark 4.2 实战:从CTF流量包中提取5类隐藏文件的完整流程
Wireshark 4.2 实战:从CTF流量包中提取5类隐藏文件的完整流程
在网络安全竞赛(CTF)中,流量分析题往往是最考验选手综合能力的题型之一。这类题目通常会提供一个网络流量捕获文件(pcap/pcapng),要求参赛者从中挖掘出隐藏的flag或关键信息。本文将系统性地介绍如何利用Wireshark 4.2从CTF流量包中识别并提取五种常见类型的隐藏文件,包括压缩包、图片、文档、可执行文件和数据库文件。
1. 流量分析基础与环境准备
1.1 Wireshark 4.2的核心改进
Wireshark 4.2版本在流量分析方面带来了多项重要改进:
- 增强的协议解析:新增了对QUIC、HTTP/3等现代协议的支持
- 改进的过滤语法:支持更复杂的逻辑表达式组合
- 性能优化:大文件处理速度提升约30%
- 新的统计功能:新增"会话时序图"和"协议分层统计"
1.2 基础分析流程
典型的CTF流量分析包含以下步骤:
- 初步扫描:使用
Ctrl+F搜索常见flag格式(如flag{、CTF{) - 协议统计:通过"Statistics"→"Protocol Hierarchy"了解流量组成
- 关键会话筛选:根据协议类型过滤可疑会话(如
http.request.method=="POST") - 数据提取:从TCP流或HTTP响应中提取潜在的有效载荷
- 文件还原:识别文件特征并重建原始文件
提示:Wireshark默认只显示数据包头部信息,要查看完整载荷需要右键选择"Follow TCP Stream"或"Follow HTTP Stream"
2. 五类隐藏文件的提取技术
2.1 压缩文件提取
压缩文件(ZIP/RAR/7z)在CTF中常见于以下场景:
- 通过HTTP上传/下载
- 隐藏在TCP流的分段传输中
- 经过Base64等编码后传输
识别特征:
- ZIP:文件头
50 4B 03 04(PK..) - RAR:文件头
52 61 72 21(Rar!) - 7z:文件头
37 7A BC AF 27 1C(7z¼¯')
提取步骤:
- 使用显示过滤器定位可疑流量:
tcp contains "PK" || tcp contains "Rar" || http contains "PK" - 追踪TCP/HTTP流,复制十六进制数据
- 使用xxd转换为二进制:
echo "504B0304..." | xxd -r -p > output.zip - 修复可能损坏的文件头(特别是菜刀流量需去除
X@Y等前缀)
实战案例: 在分析某次CTF比赛的"菜刀流量"题目时,发现以下特征:
- HTTP POST请求中包含
z0=、z1=等参数 - 参数值经过Base64编码,解码后可见
PK头 - 去除前32字节的WebShell特征码后成功提取ZIP文件
2.2 图片文件提取
图片文件(PNG/JPG/GIF)的常见隐藏方式:
- 直接作为HTTP响应体
- 隐藏在DNS查询的TXT记录中
- 通过USB或蓝牙协议传输
识别特征:
- PNG:文件头
89 50 4E 47(‰PNG) - JPEG:文件头
FF D8 FF E0(ÿØÿà) - GIF:文件头
47 49 46 38(GIF8)
提取方法对比:
| 方法 | 适用场景 | 操作命令 |
|---|---|---|
| 直接导出 | HTTP响应中包含完整图片 | 文件→导出对象→HTTP |
| 十六进制重建 | 图片被分割在多个TCP包中 | 合并所有相关数据包载荷 |
| Base64解码 | 图片经过编码传输 | `echo "BASE64" |
| 协议特定提取 | 工业协议/蓝牙传输 | 使用专用解析脚本 |
高级技巧:
- 使用
binwalk扫描提取嵌入文件:binwalk -e suspicious.pcap - 对于被分割的图片,可以使用
tshark重组:tshark -r capture.pcap -Y "tcp.stream eq 5" -T fields -e data.data | tr -d '\n' | xxd -r -p > image.jpg
2.3 文档文件提取
文档文件(PDF/DOCX/XLSX)的提取难点在于:
- 现代Office文档实质是ZIP压缩包
- 可能被加密或故意损坏
- 流量中常以分块编码传输
识别特征:
- PDF:文件头
25 50 44 46(%PDF) - DOCX:包含
word/document.xml - XLSX:包含
xl/workbook.xml
提取流程:
- 定位文档传输的HTTP请求:
http.content_type contains "application/vnd.openxmlformats" - 使用Wireshark的"导出对象"功能
- 若文档损坏,尝试修复文件头:
- 确保ZIP文件以
PK开头 - 检查中央目录记录是否完整
- 确保ZIP文件以
实战技巧:
- 使用
olevba提取Office文档中的宏代码:olevba extracted.docx - 对于加密文档,在流量中搜索
password等关键词 - 检查文档属性可能隐藏flag(
exiftool命令)
2.4 可执行文件提取
恶意软件分析是CTF的常见题型,需要提取:
- PE文件(Windows可执行文件)
- ELF文件(Linux可执行文件)
- Shell脚本
识别特征:
- PE:
4D 5A(MZ)头,后跟PE\0\0 - ELF:
7F 45 4C 46(.ELF) - Shell脚本:以
#!/bin/bash开头
分析方法:
- 使用
file命令确认文件类型:file extracted.bin - 对PE文件使用
strings查找敏感信息:strings -n 8 malware.exe | grep -i flag - 使用
pedump分析PE结构:pedump -i malware.exe
特殊案例: 某次CTF中出现过通过USB键盘流量传输的可执行文件:
- 需先提取USB中断传输的数据
- 使用
tshark过滤HID数据:tshark -r usb.pcap -Y "usb.transfer_type == 0x01" -T fields -e usb.capdata > keystrokes.txt - 通过Python脚本重建原始输入
2.5 数据库文件提取
数据库文件(SQLite/MySQL dump)常见于:
- Web应用的数据备份
- 通过SQL注入获取的数据
- 内存中的数据库临时文件
识别特征:
- SQLite:
53 51 4C 69 74 65(SQLite) - MySQL dump:包含
INSERT INTO语句
提取策略:
- 搜索常见的SQL语句:
tcp contains "SELECT" || tcp contains "UNION" - 对于SQLite文件,使用
sqlite3命令行工具:sqlite3 extracted.db ".dump" - 检查Wireshark的"导出分组字节流"功能
SQL注入流量分析:
- 定位注入点:
http.request.uri contains "id=" - 追踪注入过程:
tcp.stream eq 3 - 提取返回的数据:
tshark -r sqli.pcap -Y "tcp.stream eq 3 && tcp.dstport == 80" -T fields -e text
3. 高级分析技巧
3.1 非标准协议分析
工业协议和物联网设备常使用自定义协议:
- Modbus:端口502,功能码标识操作类型
- S7comm:西门子PLC协议,端口102
- DNP3:电力系统协议,端口20000
分析方法:
- 识别未知协议端口:
tcp.port == 9999 - 分析通信模式(请求/响应结构)
- 提取有效载荷进行解码
案例: 某次工业CTF题目中,flag隐藏在Modbus的保持寄存器中:
- 使用
modbus-cli与模拟PLC交互:modbus read --host 192.168.1.100 --port 502 --unit-id 1 --register-type holding --address 0 --count 10 - 将读取的寄存器值转换为ASCII
3.2 加密流量分析
对于HTTPS/SSL加密流量:
- 检查是否有SSL密钥日志文件
- 在Wireshark中配置TLS解密:
- 编辑→首选项→Protocols→TLS
- 添加(Pre)-Master-Secret log路径
- 分析解密后的HTTP流量
特别情况: 当没有密钥时,可以:
- 检查证书信息(可能有提示)
- 分析DNS查询记录
- 查看TLS握手阶段的明文信息
3.3 内存取证结合
从内存转储中提取网络信息:
- 使用Volatility分析网络连接:
volatility -f memory.dump --profile=Win7SP1x64 netscan - 提取相关进程的内存
- 重建TCP流内容
4. 自动化分析脚本
4.1 常用Python库
from scapy.all import * import dpkt import pyshark4.2 文件提取自动化脚本
import pyshark import re import base64 def extract_files(pcap_path): cap = pyshark.FileCapture(pcap_path, display_filter='http') files = [] for pkt in cap: if hasattr(pkt.http, 'file_data'): data = pkt.http.file_data.binary_value files.append(('http', data)) elif hasattr(pkt.http, 'response_for_uri'): uri = pkt.http.response_for_uri if re.search(r'\.(zip|rar|7z|png|jpg|pdf)$', uri, re.I): files.append(('http_uri', uri)) return files4.3 USB键盘流量解码
def decode_usb_capture(pcap_path): cap = pyshark.FileCapture(pcap_path, display_filter='usb.capdata') keymap = {...} # USB HID键码映射 output = [] for pkt in cap: if hasattr(pkt, 'usb'): data = pkt.usb.capdata.replace(':', '') if len(data) >= 8: hid_code = int(data[4:6], 16) if hid_code in keymap: output.append(keymap[hid_code]) return ''.join(output)5. 实战案例解析
5.1 案例1:多层嵌套压缩包
题目特征:
- HTTP流量为主,包含多个ZIP文件下载
- 内层压缩包使用非常见密码
解决步骤:
- 导出所有HTTP对象
- 使用
binwalk递归扫描:binwalk -e --matryoshka --depth=5 challenge.pcap - 在注释中找到密码提示:
unzip -l inner.zip | grep -i comment - 使用
fcrackzip暴力破解:fcrackzip -u -D -p rockyou.txt inner.zip
5.2 案例2:DNS隐蔽通道
题目特征:
- 大量DNS TXT查询
- 查询域名具有规律性
分析方法:
- 提取所有DNS查询:
tshark -r dns.pcap -Y "dns and dns.qry.type == 16" -T fields -e dns.qry.name - 解码Base32编码的子域名:
import base64 base64.b32decode("NVXXEZLN".encode()).decode() - 重组分片传输的文件
5.3 案例3:工业协议中的图片
题目特征:
- Modbus TCP流量
- 寄存器值看似随机但范围固定
解决步骤:
- 过滤Modbus响应:
tcp.port == 502 && modbus.func_code == 3 - 提取保持寄存器值:
values = [0x89, 0x50, 0x4E, 0x47, ...] # 从流量中提取 with open('flag.png', 'wb') as f: f.write(bytes(values)) - 修复可能错位的文件头
在实际CTF比赛中,遇到过一个特别刁钻的题目,将PNG文件分割存储在多个Modbus设备的寄存器中,需要先确定正确的设备顺序,再组合各设备返回的寄存器值才能重建完整图片。这种题目不仅考验协议分析能力,还需要耐心和系统性思维。
