0xbadcaffe/packrat
GitHub: 0xbadcaffe/packrat
一款面向研究与红蓝团队的终端网络流量取证与关联分析工具。
Stars: 2 | Forks: 0
# 🐀 packrat
.json # full graph — nodes, edges, evidence refs
```
导出功能也支持通过编程方式调用:
```
export_json(engine, path) # full structured export
export_csv_nodes(engine, path) # node table for spreadsheets
export_csv_edges(engine, path) # edge table
export_markdown(engine, paths, clusters, path) # human-readable report
```
### 键盘
| 按键 | 操作 |
|------|------|
| `Tab` | 循环切换模式 |
| `A` | 跳转到邻接表模式 |
| `P` | 跳转到路径模式 |
| `C` | 跳转到簇模式 |
| `E` | 跳转到证据模式 |
| `j / k` | 遍历节点列表 / 滚动路径 / 滚动簇 |
| `Enter` | 选择节点 / 跳转到路径或簇的第一个节点 |
| `Backspace` | 后退(枢纽历史) |
| `p` | 为选中节点计算枢纽建议 |
| `/` | 搜索节点列表 |
| `x` | 导出图谱为 JSON |
| `G` | 从任意位置打开图谱选项卡 |
## 协议工作台(选项卡 W)
单个数据包的十六进制字节检视器。在数据包选项卡中按 **`Enter`** 加载任意数据包。
| 按键 | 操作 |
||------|
| `Enter`(在数据包选项卡) | 将选中数据包加载到工作台 |
| `h / j / k / l` `← ↑ ↓ →` | 逐字节移动光标 |
| `Space` | 切换字节选择 / 扩展范围 |
| `Esc` | 清除选择 |
| `p` | 返回数据包选项卡 |
十六进制与 ASCII 窗格同步滚动。选中的字节会高亮以便复制或对比。
## 主机选项卡(选项卡 H)
被动地从所有观察流量构建主机清单,支持自由形式标签供分析员注释。
| 列 | 描述 |
|--------|------|
| IP | IPv4/IPv6 地址 |
| MAC | 硬件地址(仅以太网) |
| OS 猜测 | 被动的 TTL + 窗口大小指纹 |
| 主机名 | 反向 DNS 或 NBNS 名称(若已见) |
| 数据包 / 字节 | 流量体积 |
| 协议 | 从该主机观察到的协议集合 |
| 标签 | 自由形式分析员标签(橙色显示) |
| 首次 / 最后出现 | 会话时间戳 |
| 按键 | 操作 |
|------|------|
| `j / k` | 滚动 |
| `/ or s` | 按 IP 或主机名搜索 |
| `t` | 为选中主机添加标签(弹出内联标签编辑器) |
| `T` | 从选中主机移除最旧标签 |
| `g` | 跳转到顶部 |
| `c` | 清空主机表 |
| `C` | 清除搜索 |
## 笔记本(选项卡 N)
用于时间戳观察的纯文本分析员笔记本。笔记保存在会话中,并支持标签关联和实时搜索。
| 按键 | 操作 |
|------|------|
| `n` | 新建笔记(弹出内联编辑器) |
| `Enter` | 保存笔记 |
| `Esc` | 取消编辑或清除搜索 |
| `j / k` | 滚动笔记 |
| `g / G` | 跳转到顶部 / 底部 |
| `/` | 打开搜索栏 — 输入时实时过滤笔记 |
| `d` | 删除光标处的笔记(在搜索结果中有效) |
搜索激活时标题显示 `N / 总笔记数`,使用 `j/k` 仅在过滤后的子集中导航。
## TLS 分析(选项卡 T)
基于被动握手分析的实时 TLS 会话追踪。
| 列 | 描述 |
|--------|------|
| 会话 | 源 → 目的端点对 |
| SNI | 服务器名称指示(目标主机名) |
| 版本 | 协商的 TLS 版本 |
| 密码 | 选择的密码套件名称 |
| JA3 | 客户端指纹哈希 |
| JA3S | 服务端指纹哈希 |
| 问题 | 自签名证书、过期证书、弱密码、TLS 告警 |
**详情面板** — 使用 `j/k` 选择一行以打开双栏详情视图:
- **左栏:** 会话、SNI、TLS 版本、密码套件、JA3 哈希、JA3S 哈希、状态(弱密码以红色标记)
- **右栏:** 证书 CN、签发者、过期时间、SANs(主题备用名称)、TLS 告警
弱密码套件(RC4、NULL、3DES、CBC-SHA1)以红色标记。TLS 告警(致命/警告)会显示级别和描述码。
| 按键 | 操作 |
|------|------|
| `j / k` | 选择会话并滚动详情面板 |
| `g / G` | 跳转到顶部 / 底部 |
## 对象(选项卡 O)
从重组的 TCP 流中提取的文件对象。
| 列 | 描述 |
|--------|------|
| ID | 顺序提取 ID |
| 类型 | 检测到的 MIME 类型(例如 `image/png`、`application/pdf`、`application/elf`) |
| 名称 | 带源会话的自动生成标签 |
| 大小 | 字节数 |
| SHA-256 | 提取时计算的十六进制哈希 |
| 来源 | 会话或流标识符 |
| YARA | 匹配到的 YARA 规则名称(若有) |
对象字节在详情视图中可见。大对象会截断显示。
## 规则(选项卡 R)
按数据包评估的用户定义检测规则。规则使用数据包字段上的简单条件语言。
规则从 `~/.config/packrat/rules/`(`.toml` 文件)加载。状态栏显示规则目录路径。
### 条件类型
| 条件 | 示例 |
|-----------|------|
| 协议存在 | `tcp` |
| 字段包含 | `ip.src contains "192.168"` |
| 字段等于 | `tcp.dstport == 22` |
| 数值比较 | `frame.len > 1400` |
| 布尔 AND/OR/NOT | `tcp and ip.dst == 10.0.0.1` |
### 动作
- **告警** — 发出带严重性(INFO / LOW / MEDIUM / HIGH / CRITICAL)的命名告警
- **标签** — 将标签字符串附加到匹配的数据包
- **日志** — 将消息写入规则命中日志
### 控制
| 按键 | 操作 |
|------|------|
| `j / k` | 滚动规则列表 |
| `t` | 切换规则启用/禁用 |
| `r` | 从磁盘重载规则 |
| `C` | 清除所有命中计数器 |
规则触发时,标题栏显示 `⚡ N rules` 黄色徽章。
## 数据包构造器(选项卡 7)
从字段表单构建任意数据包,实时预览原始字节,然后注入或洪水发送。
### 字段
| 字段 | 示例 | 备注 |
|------|------|------|
| 协议 | `TCP` `UDP` `ICMP` `DNS` `HTTP` `ARP` | 设置 IP 协议字节并解析 L4 |
| 源 IP | `192.168.1.100` | IPv4 点分十进制 |
| 目的 IP | `10.0.0.1` | IPv4 点分十进制 |
| 源端口 | `4444` | 仅 TCP/UDP;留空表示 ICMP |
| 目的端口 | `80` | 仅 TCP/UDP |
| TTL | `64` | 1–255 |
| IP 标志 | `DF` `MF` `DF+MF` `0x40` | IPv4 不分片 / 更多分片 |
| L4 标志 | `SYN` `ACK` `SYN+ACK` `PSH+ACK` `FIN+ACK` `RST` | **TCP** — 任意组合用 `+` |
| | `8:0` `echo-request` `ping` `echo-reply` `3:3` | **ICMP** — 类型:代码或名称 |
| | `0x1234` | **UDP** — 校验和覆盖 |
| | `0x02` 或十进制 `18` | 原始十六进制 / 十进制(任意协议) |
| 信息 | `ping test` | 人类可读标签(空白时自动生成) |
| 有效载荷 | `deadbeef` `48656c6c6f` | 附加在传输头之后的十六进制字节 |
### 键盘控制
| 按键 | 操作 |
|------|------|
| `Tab / j / k` | 在字段间移动 |
| `Enter / e` | 编辑聚焦字段 |
| `Esc / Enter` | 确认编辑 |
| `Space / x` | 注入一个数据包 |
| `f` | **切换洪水模式** |
`< / >` | 降低 / 提高洪水速率 |
| `C` | 清除结果 / 停止洪水 |
| `h` | 帮助 |
### 洪水模式
按 **`f`** 启动连续发送,以设定速率持续发送。使用 **`<`** 和 **`>`** 调整速率:
```
1 pps → 10 pps → 100 pps → 1000 pps → 10 000 pps
```
## 差异 PCAP 分析(选项卡 D)
比较两个流量状态以发现变化。工作流:
1. 按 **`B`**(任意位置)对当前数据包列表拍摄快照作为基准。
2. 继续捕获或加载更多流量。
3. 按 **`D`** 计算差异并跳转到差异选项卡。
差异选项卡显示三个并排差异列:
| 列 | 变化内容 |
|--------|------|
| **协议差异** | 出现或消失的协议;数据包计数变化(+绿色 / -红色) |
| **主机差异** | 新的或缺失的 IP 端点;流量体积变化 |
| **端口差异** | 打开或关闭的端口;命中计数变化 |
| 按键 | 操作 |
|------|------|
| `B` | 设置全局基准快照(适用于任意选项卡) |
| `D` | 计算差异并打开差异选项卡 |
| `j / k` | 滚动差异列表 |
| `X` | 清除基准 |
## 安全选项卡(选项卡 9)
跨 12 个子面板的被动实时安全分析。使用 `[ / ]` 或下方字母快捷键导航。
### 子面板
| 按键 | 面板 | 检测内容 |
|------|------|----------|
| `a` | **IDS 告警** | EternalBlue (MS17-010)、BlueKeep (CVE-2019-0708)、Log4Shell (CVE-2021-44228)、Heartbleed、PrintNightmare、NOP 滑车、目录遍历 (`../`)、SQL 注入、XSS、LLMNR/NBNS 中毒、Pass-the-Hash、空 SMB 会话 |
| `c` | **凭证** | HTTP 基本认证、FTP、TELNET、SMTP AUTH、LDAP 绑定的明文明文用户名与密码 |
| `o` | **OS 指纹** | 被动的 TTL + TCP 窗口大小匹配 — 识别 Windows、Linux、macOS、iOS、Android、Cisco、FreeBSD |
| `w` | **ARP 监控** | IP→MAC 映射表;检测到任意 MAC 变更(ARP 欺骗 / MITM)告警 |
| `d` | **DNS 隧道** | 每域名评分:查询频率 + 子域名熵 + 标签长度 → 标记 iodine/dnscat2 风格隧道 |
| `u` | **HTTP 分析** | 方法、路径、响应码、User-Agent |
| `t` | **TLS 弱点** | TLS 1.0、SSL 3.0、RC4 密码套件 (0x0005/0x000a)、证书中的 SHA-1 OID |
| `b` | **暴力破解** | 30 秒滑动窗口,针对 (源, 目的, 端口);阈值 5 次尝试 — 覆盖 SSH/FTP/HTTP 401/SMB |
| `v` | **漏洞模式** | 明文敏感 HTTP 路径 (`/admin`、`/passwd`)、弱 Telnet、匿名 FTP、WMI over 网络 |
| `i` | **IOC 命中** | 匹配已加载的 IOC 列表(IP、域名、哈希、关键词);显示命中类型、匹配值、上下文 |
| — | **[VLAN 智能](#vlan-intelligence-security-tab--vlan-intel)** | 每 VLAN 统计 + 攻击检测:双重标记、DTP、MAC-VLAN 跨越、PCP 滥用、VLAN 1 裸标签 |
| `p` | **PCAP 回放** | 加载并以可调速度回放 `.pcap` 文件 |
**IOC 告警严重性**
| 严重性 | 颜色 | 示例 |
|--------|------|------|
| CRITICAL | 红色 | EternalBlue、Log4Shell、BlueKeep |
| HIGH | 橙色 | Heartbleed、PrintNightmare、Pass-the-Hash |
| MEDIUM | 黄色 | SQL 注入、XSS、NOP 滑车 |
| LOW | 绿色 | LLMNR/NBNS 探测、目录遍历 |
### PCAP 回放(子面板 `p`)
加载 `.pcap` 文件并以可调速度重播到实时流量流中。
| 按键 | 操作 |
|------|------|
| `e` | 编辑文件路径 |
| `Enter` | 加载文件 |
| `Space` | 播放 / 停止 |
| `< / >` | 速度减半 / 加倍(0.125x → 64x) |
速度步长:`0.125x → 0.25x → 0.5x → 1x → 2x → 4x → 8x → 16x → 32x → 64x`
## VLAN 智能(安全选项卡 → VLAN 智能)
完全基于原始以太网帧的被动 802.1Q/802.1ad 分析 — 无需 SPAN 配置或 VLAN 可知交换机管理。
### packrat 跟踪内容
| 指标 | 描述 |
|--------|------|
| 每 VLAN 数据包 / 字节计数 | 按 VLAN ID 的运行总计 |
| 每 VLAN 主机清单 | 在每个 VLAN 上看到的唯一 IP+MAC 对 |
| MAC→VLAN 映射 | 每个 MAC 地址及其出现的 VLAN 集合 |
| QinQ 标签元数据 | 记录外层 S-TAG (0x88a8) 和内层 C-TAG (0x8100) ID |
| PCP / DEI 字段 | 从每帧提取 802.1p 优先级码点 (0–7) 和丢弃资格指示位 |
### 攻击检测
| 告警 | 严重性 | 触发条件 |
|------|--------|----------|
| **QinQ 双重标记** | CRITICAL | 帧同时携带外层 S-TAG 和内层 C-TAG — 经典 VLAN 跳跃攻击 |
| **DTP 协商** | CRITICAL | 发往 `01:00:0c:cc:cc:cc` 的以太网帧 — 可能触发中继协商(交换机欺骗前兆) |
| **MAC 跨多个 VLAN** | WARNING | 同一源 MAC 在两个或更多不同 VLAN 上出现 — 指示 VLAN 跳跃或配置错误的中继 |
| **PCP=7 滥用** | WARNING | 来自非路由源的帧标记为 802.1p 优先级 7(网络控制) — 优先级操纵 |
| **本征 VLAN 1** | WARNING | 任何带标签的流量出现在 VLAN 1 — 违反 CIS/NSA 网络加固指南(VLAN 1 不应承载用户流量) |
告警去重:首次触发后,相同条件需前进 ≥1000 包才会再次触发,避免高流量环境中的告警泛滥。
### 协议树增强
- **802.1Q C-TAG 区段** 显示实时 PCP(带优先级名称:尽力而为、语音、网络控制等)以及 DEI 位
- **802.1ad S-TAG 区段** 添加到 QinQ 帧(外层提供商标签置于内层客户标签之上)
- 整个数据包的 IP 头偏移量计算正确,适用于单标记(额外 4 字节)和双重标记(额外 8 字节)的帧,以及流重组器
### VLAN 作用域流
流的键为 `(src IP, dst IP, src port, dst port, 协议, VLAN ID)`。同一 IP/端口对在不同 VLAN 上通信会被视为独立流(符合路由或多租户捕获的正确行为)。
### UI 布局
VLAN 智能子面板分为两个窗格:
- **顶部 40% — 每 VLAN 统计表:**LAN ID(VLAN 1 为红色)、数据包计数、字节体积、唯一主机数、首次 / 最后出现时间戳
- **底部 60% — 告警表:** 数据包编号、严重性(颜色编码)、类别、完整详情字符串,按最新优先排序
## 端口扫描器(选项卡 0)
| 模式 | 描述 |
|------|------|
| **TCP Connect** | 完整 TCP 握手 — 适用于任何用户,跨平台 |
| **SYN** | 半开放 SYN 扫描(演示模式下模拟;真实模式需 `--features real-capture` + root) |
| **UDP** | UDP 探测并带服务指纹识别 |
| 按键 | 操作 |
|------|------|
| `Tab / j / k` | 在字段间移动 |
| `Enter / e` | 编辑字段 |
| `m` | 循环切换扫描模式 |
| `Space / x` | 开始 / 停止扫描 |
| `Esc` | 取消扫描 |
| `PgDn / PgUp` | 滚动结果 |
| `C` | 清空结果 |
## 路由追踪(选项卡 8)
输入主机名或 IP,按 `Enter` 开始追踪:
```
Hop IP RTT Hostname
1 192.168.1.1 1.2 ms router.local
2 10.0.0.1 4.8 ms -
3 72.14.215.165 8.1 ms -
4 * timeout
5 8.8.8.8 11.3 ms dns.google
```
在 `--features real-capture` 模式下使用系统 `traceroute`(Linux/macOS)或 `tracert`(Windows)。若不可用则自动回退到模拟。
## 流选项卡(选项卡 6)
| 徽章 | 含义 |
|------|------|
| `[BEACON]` | 周期间隔 CV < 0.15、平均间隔 > 0.5 秒 — 可能的 C2 心跳 |
| `[LARGE]` | 流量超过 1 MB — 批量传输或渗出候选 |
| `[ENCRYPTED]` | 有效载荷熵 > 7.2 比特/字节 — 可能加密或压缩 |
| `[SCAN]` | 源 IP 在 5 个或更多不同目标上出现 — 端口/主机扫描 |
流以 `(src, dst, src port, dst port, 协议, VLAN ID)` 为键 — 同一 IP/端口对在不同 VLAN 上会被跟踪为独立流。
### TCP 流重组
在 TCP 流上按 **`f`** 打开跟随流叠加层,显示双向字节流(适用于 HTTP、HTTPS、TLS、SSH、SMB、MySQL、Redis、Kerberos 及 30 多种其他协议)。重组器处理:
- **正确有效载荷偏移** — 从原始字节读取 IP IHL 和 TCP 数据偏移;IP 选项和 TCP 选项均计入;VLAN 与 QinQ 标签正确增加 4 或 8 字节
- **重传抑制** — 每方向序列号跟踪,跳过已见字节(使用环绕 i32 算术);仅追加新数据
- **乱序容忍** — 乱序段立即追加,保持流视图可用
- 最多 500 个并发流,每方向 1 MB
| 按键 | 操作 |
|------|------|
| `b / p / t / s` | 按字节 / 数据包 / 时间 / 信标评分排序 |
| `f` | 打开跟随流叠加层 |
| `Enter` | 跳转到该流的过滤数据包视图 |
## 协议支持
### 第 2 层 / 封装
`以太网 II` `IEEE 802.3` `VLAN 802.1Q (C-TAG)` `QinQ 802.1ad (S-TAG + C-TAG)` `802.1p PCP/DEI` `MPLS` `PPPoE` `VXLAN` `GRE` `WireGuard`
### 第 3 层 / 网络
`IPv4` `IPv6` `ARP` `ICMP` `ICMPv6` `IGMP` `GRE` `VRRP` `IPSec ESP` `IPSec AH`
### 第 4 层
`TCP` `UDP` `GTP v1`
### 应用协议
| 协议 | 端口 | 备注 |
|------|------|------|
| DNS / mDNS | 53 / 5353 | A/AAAA/MX/CNAME 记录 |
| DHCP / DHCPv6 | 67–68 / 546–547 | Discover/Offer/Request/ACK、Solicit/Advertise |
| NTP | 123 | v3/v4、stratum、参考时间戳 |
| PTP (IEEE 1588) | 319/320 | Sync、Delay_Req、Follow_Up、Announce |
| HTTP | 80 / 8080 | GET/POST/PUT/DELETE、URI、Host、响应码 |
| HTTPS/TLS | 443 | TLS 1.3、握手、密码套件 |
| SSH | 22 | 密钥交换 |
| FTP | 20/21 | USER、PASS、RETR、STOR、PASV |
| Telnet | 23 | IAC 选项协商 |
| SMTP | 25/587 | AUTH、MAIL FROM、RCPT TO |
| IMAP / POP3 | 143 / 110 | 邮件检索 |
| SIP | 5060/5061 | INVITE、BYE、ACK、REGISTER、Call-ID |
| BGP | 179 | OPEN、UPDATE、KEEPALIVE、AS path、NLRI |
| LDAP | 389 | Bind、Search、Modify |
| RADIUS | 1812/1813 | Access-Request/Accept/Reject、Accounting |
| QUIC | 443 | RFC 9000、连接 ID |
| SNMP | 161/162 | Trap / 查询 |
| VXLAN | 4789 | VNI、内部以太网/IP |
| GTP | 2152 | v1/v2、G-PDU、TEID |
| MySQL / PostgreSQL / Redis / MongoDB | 3306/5432/6379/27017 | |
| Kafka | 9092 | Produce、Fetch、Metadata |
| AMQP / NATS | 5672 / 4222 | 消息协议 |
| Docker / etcd | 2375 / 2379 | 容器/集群 API |
| RTSP | 554 | 媒体流 |
| RTP / STUN | 5004 / 3478 | 实时媒体与 NAT 穿越 |
| SSDP / NBNS | 1900 / 137 | 发现与 NetBIOS |
| OSPF / EIGRP / RIP | 89 / 88 / 520 | 路由协议 |
| PIM / IGMP | — | 组播 |
| TFTP | 69 | 简单文件传输 |
### OT / 工业协议
| 协议 | 端口 | 备注 |
|------|------|------|
| Modbus/TCP | 502 | FC1–FC16、单元 ID、寄存器地址 |
| MQTT | 1883/8883 | CONNECT、PUBLISH、SUBSCRIBE、主题、QoS |
| OPC-UA | 4840 | Read/Write/Browse、节点 ID |
| DNP3 | 20000 | 从站寻址、功能码 |
| CoAP | 5683/5684 | CON/NON/ACK/RST、URI 路径 |
| BACnet/IP | 47808 | BVLC、对象/属性 |
| S7comm | 102 | Siemens S7 PLC、DB 读/写 |
| EtherNet/IP | 44818 | CIP 封装、RegisterSession |
| IEC-104 | 2404 | IEC 60870-5-104 SCADA |
| SOME/IP | 3049 | 汽车服务导向 |
| DoIP | 13400 | 汽车诊断 over IP |
## 分解器
packrat 支持三种级别的协议分解。
### Lua 分解器(与 Wireshark 兼容,热重载)
将 `.lua` 文件放入 `~/.config/packrat/plugins/` 并按 **`r`** 加载或热重载,无需重启。
**支持的 Wireshark API:**
| 对象 | 描述 |
|------|------|
| `Proto(name, desc)` | 声明新协议 |
| `ProtoField.uint8/16/32/64(abbr, label, base)` | 类型化字段描述符 |
| `ProtoField.bytes/string/bool/ipv4/ether(...)` | 附加字段类型 |
| `base.HEX`, `base.DEC`, `base.OCT`, `base.ASCII` | 显示基数 |
| `DissectorTable.get("tcp.port"):add(port, proto)` | 按 TCP/UDP 端口注册 |
| `buf(offset, length)` → TvbRange | 切片有效载荷 |
| `range:uint()` `:uint8()` `:uint16()` `:uint32()` | 整数提取 |
| `range:int()` `:string()` `:bytes_hex()` `:tohex()` | 字符串 / 十六进制提取 |
| `pinfo.src_port`, `pinfo.dst_port` | 端口访问 |
| `pinfo.cols.protocol = "NAME"` | 覆盖协议列 |
| `tree:add(field, range)` | 将类型化字段添加到详情树 |
| `tree:add(proto, buf(), "Label")` | 添加子树部分 |
| `tree:add("Label", value)` | 添加纯字符串字段 |
**最小示例 — 在 TCP 9999 上的自定义协议:**
```
local myproto = Proto("MyProto", "My Custom Protocol")
local f_magic = ProtoField.uint16("myproto.magic", "Magic", base.HEX)
local f_cmd = ProtoField.uint8 ("myproto.cmd", "Command", base.DEC)
local f_data = ProtoField.bytes ("myproto.data", "Payload")
myproto.fields = { f_magic, f_cmd, f_data }
function myproto.dissector(buf, pinfo, tree)
if buf:len() < 3 then return end
pinfo.cols.protocol = "MyProto"
local subtree = tree:add(myproto, buf(0, buf:len()), "My Protocol")
subtree:add(f_magic, buf(0, 2))
subtree:add(f_cmd, buf(2, 1))
if buf:len() > 3 then
subtree:add(f_data, buf(3, buf:len() - 3))
end
end
DissectorTable.get("tcp.port"):add(9999, myproto)
```
**工业协议示例 — Modbus/TCP 寄存器解析:**
```
local modbus = Proto("Modbus", "Modbus/TCP")
local f_tid = ProtoField.uint16("modbus.tid", "Transaction ID", base.HEX)
local f_pid = ProtoField.uint16("modbus.pid", "Protocol ID", base.HEX)
local f_len = ProtoField.uint16("modbus.len", "Length", base.DEC)
local f_uid = ProtoField.uint8 ("modbus.uid", "Unit ID", base.DEC)
local f_fc = ProtoField.uint8 ("modbus.fc", "Function Code", base.DEC)
local f_reg = ProtoField.uint16("modbus.reg", "Register", base.DEC)
local f_cnt = ProtoField.uint16("modbus.cnt", "Count", base.DEC)
modbus.fields = { f_tid, f_pid, f_len, f_uid, f_fc, f_reg, f_cnt }
local FC_NAMES = {
[1]="Read Coils", [2]="Read Discrete Inputs",
[3]="Read Holding Registers", [4]="Read Input Registers",
[5]="Write Single Coil", [6]="Write Single Register",
[15]="Write Multiple Coils", [16]="Write Multiple Registers",
}
function modbus.dissector(buf, pinfo, tree)
if buf:len() < 8 then return end
pinfo.cols.protocol = "Modbus/TCP"
local fc = buf(7, 1):uint()
local fc_name = FC_NAMES[fc] or ("FC " .. fc)
local sub = tree:add(modbus, buf(0, buf:len()), "Modbus/TCP " .. fc_name)
sub:add(f_tid, buf(0, 2))
sub:add(f_pid, buf(2, 2))
sub:add(f_len, buf(4, 2))
sub:add(f_uid, buf(6, 1))
sub:add(f_fc, buf(7, 1))
if buf:len() >= 12 then
sub:add(f_reg, buf(8, 2))
sub:add(f_cnt, buf(10, 2))
end
end
DissectorTable.get("tcp.port"):add(502, modbus)
```
安装插件:
```
mkdir -p ~/.config/packrat/plugins
cp plugins/example_myproto.lua ~/.config/packrat/plugins/
# 在 packrat 中,按 r — 状态栏显示:Lua: 1 files, 1 dissectors loaded
```
**内置示例:**
| 文件 | 协议 | 端口 |
|------|------|------|
| `plugins/example_myproto.lua` | MyProto | TCP 9999 |
| `plugins/example_modbus.lua` | Modbus/TCP | TCP 502 |
| `plugins/example_mqtt.lua` | MQTT 3.1.1 | TCP 1883/8883 |
### TOML 分解器(静态字段布局,无需脚本)
适用于无条件逻辑的固定格式协议。将 `.toml` 文件放入 `~/.config/packrat/dissectors/`:
```
name = "MyProto"
transport = "tcp"
port = 9999
[[fields]]
offset = 0
length = 2
name = "Magic"
display = "hex"
[[fields]]
offset = 2
length = 1
name = "Command"
display = "dec"
[[fields]]
offset = 3
length = 4
name = "Payload Length"
display = "dec"
```
## 字符串选项卡(选项卡 3)
从数据包有效载荷中提取可打印 ASCII 字符串,并使用内置的 RE/安全字典进行分类。
**熵列:**
- 低 `0–3` — 人类可读,适合作为 RE 目标
- 中 `3–5` — 混合内容
- 高 `5–8` — 可能加密或压缩
**分类:**
| 类别 | 示例 |
|------|------|
| `sensitive` | `password=`, `secret`, `private_key`, `token=` |
| `key` | `BEGIN RSA`, `api_key=`, `ssh-rsa`, `Authorization: Bearer` |
| `shell` | `/bin/sh`, `cmd.exe`, `system(`, `exec(` |
| `ot-proto` | `modbus`, `bacnet`, `opc-ua`, `dnp3` |
| `http` / `http-hdr` | `GET /api`, `Cookie:`, `X-Forwarded-For:` |
| `sql` | `SELECT`, `INSERT`, `DROP TABLE`, `UNION SELECT` |
| `jwt` | `eyJ…` base64 JWT 令牌 |
| `path` | `/etc/passwd`, `C:\Windows\`, `../../` |
| `domain` / `ip` | `api.example.com`, `192.168.1.1` |
按 **`/`** 搜索,**Enter** 保持过滤,**Esc** 清除。
## 分析选项卡(选项卡 2)
| 部分 | 描述 |
|------|------|
| 协议分布 | 各协议的包与字节统计 |
| 顶级会话 | 按字节排序的最繁忙源 IP |
| 对话 | 唯一的 src→dst 会话及其包计数 |
| 端口摘要 | 目标端口及其协议猜测 |
| **魔数** | 检测 ELF、PE/EXE、PNG、JPEG、ZIP、PDF、gzip、OGG、SQLite、SSH 密钥、PEM 等 |
| **XOR 分析** | 暴力破解单字节 XOR(密钥 1–255),报告 >70% 可打印结果 |
| **异常报告** | 非常规端口、SSH/HTTP 在意外端口、高熵明文字符串、信标、扫描 |
## PCAP 录制、导入与重放
**录制:** 按 **`w`** 随时开始写入 `.pcap` 文件(命名为 `packrat_.pcap`)。再次按 **`w`** 刷新并关闭。
**即时导入:** 按 **`L`** 从任意位置打开路径对话框。输入 `.pcap` 文件路径并回车 — 所有数据包立即加载到实时数据包列表及所有分析引擎中(不替换当前会话)。
**重放:** 进入安全选项卡 → 重放子面板(`9` 然后 `p`)。重放的数据包流入实时列表,触发所有分析引擎(包括操作员图谱),并可录制为新 pcap。
## 键盘参考
### 全局
| 按键 | 操作 |
|------|------|
| `1`–`0` | 切换到选项卡 1–10 |
| `H` `N` `T` `O` `R` `W` `G` `D` | 切换到 主机 / 笔记本 / TLS / 对象 / 规则 / 工作台 / 图谱 / 差异 |
| `Space` | 开始/停止捕获 |
| `j / k` `↑ ↓` | 导航 |
| `g / G` | 顶部 / 底部 |
| `/` | 过滤栏(Wireshark 风格 AST 过滤) |
| `?` | 命令面板(搜索所有选项卡/操作) |
| `B` | 为差异分析拍摄基准快照 |
| `L` | 即时加载 PCAP 文件 |
| `i` | 选择捕获接口 |
| `w` | 切换 PCAP 录制 |
| `r` | 热重载 Lua 插件 |
| `h` | 帮助覆盖层 |
| `a` | 自动检查覆盖层(深度分析选中数据包) |
| `X` | 导出案例捆绑包 |
| `C` | 清除 |
| `q` | 退出 |
### 操作员图谱(选项卡 G)
| 按键 | 操作 |
|------|------|
| `Tab` | 循环切换模式 |
| `A` `P` `C` `E` | 跳转到邻接表 / 路径 / 簇 / 证据 |
| `j / k` | 遍历列表 / 滚动 |
| `Enter` | 选择节点 / 跟随路径或簇 |
| `Backspace` | 后退(枢纽历史) |
| `p` | 为选中节点计算枢纽建议 |
| `/` | 搜索节点列表 |
| `x` | 导出图谱为 JSON |
### 构造(选项卡 7)
| 按键 | 操作 |
|------|------|
| `Tab / j / k` | 移动字段焦点 |
| `Enter / e` | 编辑聚焦字段 |
| `Space / x` | 注入一个数据包 |
| `f` | 切换洪水模式 |
| `< / >` | 降低 / 提高洪水速率 |
| `C` | 停止洪水、清除结果 |
| `h` | 帮助 |
### 安全(选项卡 9)
| 按键 | 操作 |
|------|------|
| `[ / ]` | 上一个 / 下一个子面板 |
| `a c o w d u t b v i p` | 跳转到子面板(按字母) |
| `j / k` | 滚动 |
| `g / G` | 顶部 / 底部 |
| `C` | 清除全部 |
子面板字母映射:`a`=IDS · `c`=凭证 · `o`=OS 指纹 · `w`=ARP 监控 · `d`=DNS 隧道 · `u`=HTTP · `t`=TLS · `b`=暴力破解 · `v`=漏洞模式 · `i`=IOC 命中 · (VLAN 智能通过 `[ / ]`)· `p`=PCAP 重放
### 流(选项卡 6)
| 按键 | 操作 |
|------|------|
| `b / p / t / s` | 按字节 / 数据包 / 时间 / 信标评分排序 |
| `f` | 打开跟随流叠加层 |
| `Enter` | 跳转到该流的过滤数据包视图 |
## 过滤语法
按 **`/`** 打开过滤栏。过滤器使用与 Wireshark 兼容的 AST 引擎实时求值。
- 有效时显示 `✓ N matched`(绿色)
- 解析错误显示 `✗ `(红色),回退到简单文本匹配
### 支持的字段名
`ip.src` `ip.dst` `tcp.port` `tcp.srcport` `tcp.dstport` `udp.port` `udp.srcport` `udp.dstport` `frame.len` `frame.number` 以及任意协议名(`tcp`、`udp`、`dns`、`http`、`tls`、`arp`、`icmp` 等)。
## 测试
测试套件使用 [`rstest`](https://github.com/la10736/rstest) 进行参数化测试,并使用 [`insta`](https://insta.rs) 进行快照断言。
| 测试文件 | 测试数 | 覆盖内容 |
|-----------|-------:|----------|
| `tests/filter_tests.rs` | 32 | 显示过滤器解析器与求值器——所有操作符、字段、复合表达式 |
| `tests/event_tests.rs` | 107 | 关键事件处理——各选项卡切换、按键、叠加层、文本模式退出保护 |
| `tests/notebook_tests.rs` | 19 | 笔记本的 CRUD、搜索(文本+标签、不区分大小写)、证据关联、索引清理 |
| `tests/ioc_tests.rs` | 11 | IOC 引擎——IP/域名加载、包检测、后缀匹配、命中元数据 |
| `tests/scenario_tests.rs` | 25 | “安静信标”场景——包体积、协议存在、IOC 种子、主机标签 |
## 平台支持
| 平台 | 状态 |
|------|------|
| Linux | ✅ 完整支持(包括真实捕获与真实路由追踪) |
| macOS | ✅ 完整支持 |
| Windows | ✅ 模拟模式;真实捕获需 Npcap |
| WSL2 | ✅ |
跨编译目标(x86、ARM、ppc、GCC/Clang/MSVC、QEMU)请参考 [BUILD.md](https://github.com/0xbadcaffe/packrat/blob/master/BUILD.md)。
## 许可证
MIT — 参见 [LICENSE](LICENSE)
标签:C2日志可视化, Cargo安装, DNS信息、DNS暴力破解, Elastic Stack, Flood模式, IOC检测, IoT分析, Python安全, rizin, Rust实现, TUI界面, VLAN分析, Waymore结果处理, YARA规则, 包捕获, 协议分析, 协议统计, 反向工程, 可视化界面, 字符串提取, 嵌入式分析, 开源安全工具, 指纹识别, 数据包检查, 数据展示, 数据统计, 权限提升, 注入工具, 流量分析平台, 流量取证, 流量可视化, 流量重放, 熵分析, 端口扫描, 系统分析, 红队, 终端工具, 网络分析, 网络威胁检测, 被动防御, 追踪路由, 逆向工程平台, 通知系统