zer0contextlost/pcapr

GitHub: zer0contextlost/pcapr

从网络捕获中自动逆向工程未知协议的字段结构与安全指标,并生成多种解码器和模糊测试脚本的开源分析工具。

Stars: 0 | Forks: 0

# PCAPR **从网络捕获中进行协议逆向工程。** · v0.6.0 为 PCAPR 提供一个 `.pcap` 文件,它会自动发现消息成帧、字段布局和字段语义(魔术字节、长度字段、操作码、校验和、标志位、时间戳)。它还会检测安全指标:C2 信标、TLS 指纹 (JA3)、DNS 隧道、ECB 模式弱加密和 XOR 混淆流。 在任何命令后添加 `--learn` 即可获得每一项发现的纯英文解释 —— 专为学习网络取证的人士打造。 ## 安装 ``` # 推荐 — 使用锁定 deps 进行可重复安装 uv sync # 或者使用 pip pip install -e . ``` 需要 Python 3.11+。通过 `pip install uv` 或从 [astral.sh/uv](https://astral.sh/uv) 安装 `uv`。 ## 快速开始 ``` # 分析捕获数据 — 自动选择最繁忙的端口 pcapr capture.pcap # 固定到特定端口,生成 HTML 报告 pcapr capture.pcap --port 4444 --html report.html # 学习模式 — 用纯英文解释为每个发现添加注释 pcapr capture.pcap --learn pcapr capture.pcap --learn --html report.html # 显示所有端口上的活动协议 pcapr capture.pcap --overview # 探测实时服务 pcapr --probe 10.0.0.1:4444 # 实时捕获(在 Windows 上需要管理员权限 / Npcap) pcapr --live eth0 --port 4444 --duration 30 # 解释字节 0 被如此分类的原因 pcapr capture.pcap --explain 0 # 生成 Wireshark Lua 解码器 pcapr capture.pcap --lua dissector.lua # 生成 Kaitai Struct schema pcapr capture.pcap --kaitai protocol.ksy # 生成并立即针对目标运行 boofuzz pcapr capture.pcap --fuzz 10.0.0.1:4444 ``` ## 安全检测 PCAPR 在每次捕获时都会自动运行安全分析。 ### 信标 / C2 检测 标记消息间时间间隔异常规律的数据流 —— 这是 C2 植入、键盘记录器和计划数据渗漏的典型特征。使用仅在每方向、周期间隔上计算的变异系数(CV = 标准差/平均值)(忽略突发内噪音)。 ``` 2 beaconing stream(s) detected: 10.2.28.88 -> 45.131.214.85 interval=60.1s CV=0.001 [highly regular] direction=server ``` 针对具有记录在案的 60 秒信标间隔的真实 NetSupport RAT 捕获进行了验证。 ### JA3 TLS 指纹识别 当检测到 TLS 时,从 ClientHello 消息中提取 JA3 哈希 —— 这是 TLS 客户端实现的指纹。无论服务器是什么,相同的恶意软件家族都会生成相同的 JA3 哈希。可以在公共威胁情报源中查找这些哈希。 ``` 1 unique JA3 fingerprint(s): 839bbe3ed07fed922ded5aaf714d6842 SNI=example.com ``` 哈希值已对照 `jabedude/ja3-rs` 测试套件进行了验证(Firefox,curl 完全匹配)。 ### DNS 隧道检测 检测通过 DNS 进行的数据渗漏。根据以下方面对每个 DNS 数据流进行评分:查询名称熵、唯一子域名多样性、长名称比率和超大响应。分数超过 30% 的将被标记。 ``` DNS tunneling suspected (score=44%): - 222 unique subdomains out of 222 queries ``` 针对 Elastic iodine 样本捕获进行了验证。 ### XOR 密钥恢复 (`--try-xor`) 使用熵过滤(跳过明文和真正的随机数据)检测 XOR 混淆流,并恢复重复密钥。在逐位置暴力破解之前,使用重合指数法对可能的密钥长度 1-16 进行排序 —— 能够捕获简单的 1/2/4 字节扫描所遗漏的 3、5、6 和 7 字节密钥。存储完整的解密流。 ``` 1 XOR key(s) recovered: key=0x42 entropy 6.81 -> 3.12 (drop 3.69) ``` 使用 `--xor-out DIR` 将每个恢复的流写入 `DIR/stream__.bin`。 ### ECB 模式检测 自动扫描所有高熵流以查找重复的 AES-ECB(16 字节)或 3DES-ECB(8 字节)块模式。ECB 模式独立加密每个块 —— 相同的明文块产生相同的密文,即使没有密钥也会泄露结构。在终端和 HTML 报告中均标记为安全发现。 ``` ECB MODE DETECTED (1 stream — identical plaintext blocks leak as identical ciphertext) AES-ECB stream 10.0.0.1:4444->10.0.0.2:52110 12 repeated / 48 total blocks (25% repeat rate) ``` ### Ciphey 集成 (`--try-ciphey`) 将包含大量文本的流通过管道传递给 [Ciphey](https://github.com/bee-san/Ciphey),以进行经典密码和多层数据编码检测 —— Caesar、Vigenère、Beaufort、ROT13、链式 base64 等。补充了内置的二进制解码器(zlib/gzip/base64/hex):Ciphey 处理文本密码,PCAPR 处理二进制编码。 ``` pip install ciphey # one-time install pcapr capture.pcap --try-ciphey ``` 如果 Ciphey 不在 PATH 中,将优雅地跳过并提示安装方法。 ### 异常评分 每条消息都会根据以下方面进行评分:熵峰值、大小异常值(Tukey 栅栏)、未知操作码值、状态机违规和文本注入模式(SQLi、路径遍历、XSS、命令注入)。高分消息将以带有颜色编码的异常卡片形式显示在 HTML 报告中。 ## 学习模式 (`--learn`) `--learn` 使用纯英文解释对终端输出和 HTML 报告进行注释。专为取证学生和从零开始培养数据包分析技能的人员设计。 **解释内容包括:** - 协议识别的工作原理(端口 + 字节证据、置信度分数、低于阈值时的最佳猜测推理) - 什么是成帧以及检测到的类型(分隔符 / 长度字段 / 变长整数) - 编码与加密 —— 在分析前剥离编解码器时该怎么做 - 负载熵对分析人员的意义(明文 / 压缩 / 加密阈值) - 什么是信标以及为什么即使没有解密 CV 也能使其可检测 - XOR 混淆:重合指数法的作用及其原理 - ECB 模式弱点:为什么相同的明文块会产生相同的密文(ECB 企鹅类比) - Ciphey 结果:什么是经典密码(Caesar、Vigenère、ROT13)以及它们何时出现 - 明文敏感数据:为什么被动 Wi-Fi 嗅探很危险 - 威胁情报:什么是 JA3 哈希源以及如何解释命中(是线索,而非最终定论) - 流量分类:流量配置文件标签的含义 - 状态机推断:它告诉你什么以及为什么它对模糊测试很重要 - 每个操作码分析:为什么相同的字段在不同的消息类型中可以有不同的结构 - TLV 检测:什么是类型-长度-值编码(ASN.1、MQTT、蓝牙示例) - 每种字段类型的词汇表:MAGIC、LENGTH、TYPE_ENUM、SEQUENCE、FLAGS、CHECKSUM、TIMESTAMP、ECHO、IPv4、UUID、STRING 在 HTML 报告中,解释以可折叠的 `
` 元素形式出现 —— 不需要它们的分析人员可以完全忽略它们。 ## PCAPR 学院 (`pcapr-serve`) 本地分析控制台在 `/academy` 路径下包含一个内置的挑战课程。 ``` pcapr-serve # start the server # 打开 http://127.0.0.1:7742/academy ``` **跨越 3 个级别的 11 项结构化挑战:** | 级别 | 挑战 | 学到的内容 | |------|-----------|----------------| | 1 | FTP: 明文凭证 | 明文协议,敏感数据检测 | | 1 | HTTP: 带凭证的表单 POST | HTTP 成帧,POST 正文分析 | | 1 | DNS: 查询和响应结构 | 二进制固定报头成帧,事务 ID | | 1 | ICMP: 回显请求 / 回复 | 最简单的二进制协议,echo/sequence 字段 | | 1 | Telnet: 明文远程终端 | 分隔符成帧,明文终端数据 | | 2 | MQTT: IoT 发布 / 订阅 | 二进制长度前缀成帧,操作码枚举 | | 2 | Redis: RESP 协议 | 文本协议,批量字符串成帧 | | 2 | TLS: ClientHello 和 JA3 指纹识别 | TLS 握手,JA3 提取 | | 2 | Modbus TCP: 工业控制协议 | MBAP 报头,功能码,无身份验证的 OT 风险 | | 3 | XOR 混淆: 密钥恢复 | 基于重合指数的密钥长度估计,熵降 | | 3 | AES-ECB 模式: 密文结构泄露 | 块重复,ECB 弱点 | 每项挑战都展示了目标、可折叠提示和一个一键式的 **Analyze** 按钮,该按钮会以 `--learn` 模式运行完整的流程。进度在重启后依然保留。 将挑战用的 pcap 放在 `~/.cache/pcapr/academy/pcaps/` 中 —— 有关每个挑战的精确 Wireshark 捕获说明,请参见 `ACADEMY_PCAP_WISHLIST.md`。 ## 输出格式 | 标志 | 格式 | 用例 | |------|--------|----------| | *(无)* | 终端 (Rich) | 交互式探索 | | `--html FILE` | HTML | 分享、存档、`--learn` 注释 | | `--json` | JSON | 脚本编写,后处理 | | `--kaitai FILE` | Kaitai Struct | 解析器生成 (Java, Python, C++, …) | | `--lua FILE` | Wireshark Lua | 实时捕获解析 | | `--scapy FILE` | Scapy 层 | Python 工具集成 | | `--fuzz-dict FILE` | AFL/libFuzzer 字典 | 结构感知的模糊测试 | | `--boofuzz FILE` | boofuzz 脚本 | 网络模糊测试 | | `--client-py FILE` | Python 客户端 | 独立的协议客户端 | ## CLI 参考 ### `pcapr` —— 单文件或实时分析 ``` pcapr [OPTIONS] [PCAP_FILE] PCAP_FILE .pcap or .pcapng file to analyze Analysis options: --port, -p INTEGER Filter to a specific port --gap FLOAT Message boundary gap in seconds [default: 0.05] --min-messages INTEGER Minimum messages per stream [default: 5] --overview Print traffic overview table and exit --flag-outliers Score messages for anomalies and report suspicious ones --explain BYTE Print field evidence for byte offset BYTE --learn Annotate report with plain-English explanations Output options: --html FILE Write self-contained HTML report --json Write JSON to stdout --lua FILE Write Wireshark Lua dissector --scapy FILE Write Scapy Packet subclass --kaitai FILE Write Kaitai Struct .ksy spec --fuzz-dict FILE Write AFL/libFuzzer keyword dictionary --boofuzz FILE Write boofuzz fuzzer script --fuzz HOST:PORT Generate and run boofuzz fuzzer immediately --client-py FILE Write standalone Python protocol client Live capture: --live IFACE Capture from interface (requires admin/Npcap) --duration FLOAT Capture duration in seconds [default: 30.0] --save-pcap FILE Save live capture to file --window FLOAT Print preliminary analysis every N seconds [default: 10.0] Encryption analysis: --try-xor Attempt XOR key recovery on high-entropy streams --xor-out DIR Write recovered XOR streams to DIR/stream__.bin --try-ciphey Pipe text-heavy streams to Ciphey (requires: pip install ciphey) --sslkeylog FILE Decrypt TLS sessions via SSLKEYLOGFILE (TLS 1.2 and 1.3) Probing: --probe HOST:PORT Connect and characterize the service ``` ### `pcapr-diff` —— 比较两次捕获 ``` pcapr-diff PCAP_A PCAP_B [--port INTEGER] [--html FILE] ``` 比较同一协议的两次捕获之间的熵、字段布局、方向比和每个操作码的熵。对于检测跨固件版本或 A/B 测试配置的协议更改很有用。 ### `pcapr-replay` —— 重放捕获的会话 ``` pcapr-replay PCAP_FILE --target HOST:PORT [OPTIONS] --mutate Apply mutation strategies (fuzz) --save-responses Write server responses to a pcap --udp Use UDP instead of TCP ``` 在重放之前自动修补动态字段:序列计数器、时间戳、长度字段、校验和和 echo(事务 ID)字段。 ### `pcapr-batch` —— 分析多个捕获 ``` pcapr-batch PCAP_FILES... --out-dir DIR [--port INTEGER] ``` 为每个捕获生成一份 HTML 报告,并生成一个带有熵着色和跨捕获差异比较链接的 `index.html`。 ### `pcapr-serve` —— 本地 Web UI ``` pcapr-serve [--port 7742] [--bind 127.0.0.1] ``` 拖放上传、SHA-256 去重、缓存报告、浏览器内跨捕获差异比较。打开 `http://127.0.0.1:7742`。 ## PCAPR 能推断出什么 **成帧 (Framing)** - 基于分隔符(`\r\n`、`\x00`、自定义字节序列) - 长度字段(1/2/4 字节大端序或小端序前缀) - 变长整数(LEB128、MQTT 样式) - ASCII 长度前缀(njRAT/Xworm 样式:十进制数字 + 分隔符) **字段类型** - `magic` —— 常量前缀字节(协议签名) - `length` —— 编码消息或正文大小 - `type_enum` —— 操作码 / 消息类型(较小的不同值集合) - `sequence` —— 单调递增的计数器 - `echo` —— 从请求镜像到响应中的值(事务 ID) - `flags` —— 位掩码;分解为位级别的子字段 - `checksum` —— 对前述字节计算的 CRC32/CRC16/sum8/sum16 - `timestamp` —— Unix 纪元或类似的时间值 - `ipv4` —— 嵌入在负载中的原始 4 字节地址 - `uuid` —— 128 位 GUID - `string` —— 带有长度前缀或以空字符结尾的 **编码检测** 检测并剥离负载中的 zlib、gzip、zstd、lz4、base64 或 hex 编码,然后重新分析内部协议。 **语义注释** 在字段推断之后,使用真实的语义升级推断出的字段:CRC 验证、时间戳范围检查、IPv4 格式验证、字符串边界检测。 ## USB 设备流量 PCAPR 读取来自 Linux USBMon(`tshark -i usbmon0`,Linux 上的 Wireshark)和 Windows USBPcap(Windows 上的 Wireshark)的 USB 设备捕获。它按端点对流量进行分段,推断字段结构,并对常见的 USB 设备类进行指纹识别。 **支持的 USB 类:** - **USB HID** —— 键盘/鼠标启动协议中断报告(3、4 或 8 字节固定大小的报告) - **USB CDC** —— 串口转 USB:来自调制解调器的 AT 命令流量,串行适配器 - **USB 大容量存储 (BOT)** —— SCSI 仅批量传输(`USBC`/`USCS` 魔术字节) ``` # 分析 USB 捕获数据 — 支持 .pcap 和 .pcapng pcapr usb_device.pcap # 聚焦特定端点 pcapr usb_device.pcap --port 1 # EP 0x01 # 生成 pyusb 客户端(需要 pip install pyusb) pcapr usb_device.pcap --client-py client.py ``` 生成的 `--client-py` 输出使用 `pyusb`(`usb.core.find(idVendor, idProduct)`)而不是套接字。提供您设备的 VID:PID —— 在 Linux 上使用 `lsusb` 或在 Windows 上使用 USBDeview 来查找它。 **捕获命令:** ``` # Linux: 从 usbmon 捕获(需要 usbmon 内核模块) sudo modprobe usbmon tshark -i usbmon0 -w usb_capture.pcap # Windows: 使用安装了 USBPcap 的 Wireshark,或通过 USBPcap CLI 捕获 USBPcapCMD.exe -d \\.\USBPcap1 -o usb_capture.pcap ``` ### JTAG 和 UART JTAG 和 UART 捕获使用逻辑分析仪格式(Sigrok `.sr`,Saleae `.logicdata`),这超出了 pcap 模型的范围。如果有社区需求,我们将添加支持 —— 如果您需要,请提出 issue。 ## 安全研究用例 - **恶意软件 C2 分析** —— 放入一个未知 C2 流量的捕获;在几秒钟内获得字段布局、操作码枚举、信标间隔和 Wireshark 解析器 - **TLS 客户端指纹识别** —— 提取 JA3 哈希并与威胁情报进行交叉比对 -DNS 渗漏检测** —— 对 DNS 流量进行隧道特征评分 - **模糊测试** —— 生成结构感知的 AFL/libFuzzer 词典;使用 `--mutate` 重放来探测实时目标 - **协议审计** —— 在固件更新前后使用 `pcapr-diff` 检测更改 - **CTF** —— 无需手动使用 Wireshark 即可快速适应二进制协议挑战 - **取证学习** —— `--learn` 模式解释每一项发现;可与任何真实的捕获一起使用 ## 真实基准测试 针对带有第三方标签的捕获运行测试 —— 而不是针对为了匹配实现而构造的数据运行。 | 测试 | 来源 | 验证内容 | |------|--------|-----------| | PPA FTP, Telnet, HTTP, DNS, email | Practical Packet Analysis (Sanders, No Starch Press) | 协议识别 | | JA3 Firefox, curl | `jabedude/ja3-rs` 测试套件 (assert_eq! 已验证的哈希) | JA3 指纹识别 | | DNS 隧道 (iodine) | Elastic 示例仓库,已确认的 iodine 会话 | DNS 隧道检测 | | NetSupport RAT 信标 | GitHub 恶意软件分析项目,记录在案的 60 秒间隔 | 信标检测 | ``` pytest tests/test_ground_truth.py -v ``` ## 许可证 Apache 2.0 —— 参见 [LICENSE](LICENSE)。
标签:boofuzz, C2检测, DNS隧道, IP 地址批量处理, JA3, Kaitai Struct, Lua解析器, PCAP解析, Python, Radare2, Scapy, TLS指纹, Wireshark, XOR解混淆, 信标检测, 协议字段推断, 句柄查看, 多架构支持, 安全报告, 弱加密检测, 无后门, 模糊化, 流量监控, 网络协议逆向工程, 网络安全, 网络抓包, 自动化分析, 解码器, 跨站脚本, 隐私保护