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流量分析包含以下步骤:

  1. 初步扫描:使用Ctrl+F搜索常见flag格式(如flag{CTF{
  2. 协议统计:通过"Statistics"→"Protocol Hierarchy"了解流量组成
  3. 关键会话筛选:根据协议类型过滤可疑会话(如http.request.method=="POST"
  4. 数据提取:从TCP流或HTTP响应中提取潜在的有效载荷
  5. 文件还原:识别文件特征并重建原始文件

提示: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¼¯')

提取步骤

  1. 使用显示过滤器定位可疑流量:
    tcp contains "PK" || tcp contains "Rar" || http contains "PK"
  2. 追踪TCP/HTTP流,复制十六进制数据
  3. 使用xxd转换为二进制:
    echo "504B0304..." | xxd -r -p > output.zip
  4. 修复可能损坏的文件头(特别是菜刀流量需去除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

提取流程

  1. 定位文档传输的HTTP请求:
    http.content_type contains "application/vnd.openxmlformats"
  2. 使用Wireshark的"导出对象"功能
  3. 若文档损坏,尝试修复文件头:
    • 确保ZIP文件以PK开头
    • 检查中央目录记录是否完整

实战技巧

  • 使用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开头

分析方法

  1. 使用file命令确认文件类型:
    file extracted.bin
  2. 对PE文件使用strings查找敏感信息:
    strings -n 8 malware.exe | grep -i flag
  3. 使用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语句

提取策略

  1. 搜索常见的SQL语句:
    tcp contains "SELECT" || tcp contains "UNION"
  2. 对于SQLite文件,使用sqlite3命令行工具:
    sqlite3 extracted.db ".dump"
  3. 检查Wireshark的"导出分组字节流"功能

SQL注入流量分析

  1. 定位注入点:
    http.request.uri contains "id="
  2. 追踪注入过程:
    tcp.stream eq 3
  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

分析方法

  1. 识别未知协议端口:
    tcp.port == 9999
  2. 分析通信模式(请求/响应结构)
  3. 提取有效载荷进行解码

案例: 某次工业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加密流量:

  1. 检查是否有SSL密钥日志文件
  2. 在Wireshark中配置TLS解密:
    • 编辑→首选项→Protocols→TLS
    • 添加(Pre)-Master-Secret log路径
  3. 分析解密后的HTTP流量

特别情况: 当没有密钥时,可以:

  • 检查证书信息(可能有提示)
  • 分析DNS查询记录
  • 查看TLS握手阶段的明文信息

3.3 内存取证结合

从内存转储中提取网络信息:

  1. 使用Volatility分析网络连接:
    volatility -f memory.dump --profile=Win7SP1x64 netscan
  2. 提取相关进程的内存
  3. 重建TCP流内容

4. 自动化分析脚本

4.1 常用Python库

from scapy.all import * import dpkt import pyshark

4.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 files

4.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文件下载
  • 内层压缩包使用非常见密码

解决步骤

  1. 导出所有HTTP对象
  2. 使用binwalk递归扫描:
    binwalk -e --matryoshka --depth=5 challenge.pcap
  3. 在注释中找到密码提示:
    unzip -l inner.zip | grep -i comment
  4. 使用fcrackzip暴力破解:
    fcrackzip -u -D -p rockyou.txt inner.zip

5.2 案例2:DNS隐蔽通道

题目特征

  • 大量DNS TXT查询
  • 查询域名具有规律性

分析方法

  1. 提取所有DNS查询:
    tshark -r dns.pcap -Y "dns and dns.qry.type == 16" -T fields -e dns.qry.name
  2. 解码Base32编码的子域名:
    import base64 base64.b32decode("NVXXEZLN".encode()).decode()
  3. 重组分片传输的文件

5.3 案例3:工业协议中的图片

题目特征

  • Modbus TCP流量
  • 寄存器值看似随机但范围固定

解决步骤

  1. 过滤Modbus响应:
    tcp.port == 502 && modbus.func_code == 3
  2. 提取保持寄存器值:
    values = [0x89, 0x50, 0x4E, 0x47, ...] # 从流量中提取 with open('flag.png', 'wb') as f: f.write(bytes(values))
  3. 修复可能错位的文件头

在实际CTF比赛中,遇到过一个特别刁钻的题目,将PNG文件分割存储在多个Modbus设备的寄存器中,需要先确定正确的设备顺序,再组合各设备返回的寄存器值才能重建完整图片。这种题目不仅考验协议分析能力,还需要耐心和系统性思维。