0xbadcaffe/packrat

GitHub: 0xbadcaffe/packrat

一款面向研究与红蓝团队的终端网络流量取证与关联分析工具。

Stars: 2 | Forks: 0

# 🐀 packrat

Packrat TUI screenshot

``` __ __ ___________ ____ | | ______________ _/ |_ \____ \__ \ _/ ___\| |/ /\_ __ \__ \\ __\ | |_> > __ \\ \___| < | | \// __ \| | | __(____ /\___ >__|_ \ |__| (____ /__| |__| \/ \/ \/ \/ ``` ## 安装 ``` # 演示/模拟流量(无需 libpcap) cargo install packrat-tui packrat # 真实接口捕获 + 真实路由追踪 cargo install packrat-tui --features real-capture packrat ``` ## 功能概览 | 选项卡 | 按键 | 描述 | |--------|------|------| | **数据包** | `1` | 实时数据包列表、协议详情树、十六进制转储、跟随流叠加 | | **分析** | `2` | 协议统计、顶级会话、对话、端口摘要、魔数、XOR、异常、主机/TLS/流/IOC/规则/YARA 计数 | | **字符串** | `3` | 提取带熵评分的 ASCII 字符串、RE 字典、实时搜索 | | **动态** | `4` | 实时系统调用/信号/网络事件日志 | | **可视化** | `5` | 协议火花线、流量柱状图、顶级 IP、地理端点 | | **流** | `6` | 双向流跟踪器 — 信标/扫描/加密/大文件检测、跟随流 | | **构造** | `7` | 基于表单的数据包构造器(十六进制预览、注入、**洪水模式**) | | **路由追踪** | `8` | 逐跳路径追踪(启用 `--features real-capture` 时使用真实的 `traceroute`/`tracert`) | | **安全** | `9` | 被动 IDS、凭证、OS 指纹、ARP 监控、DNS 隧道、HTTP 分析、TLS 弱点、暴力破解、漏洞模式、**IOC 命中**、**VLAN 智能**、PCAP 回放 | | **扫描器** | `0` | 端口扫描器 — TCP Connect、SYN、UDP 模式并带服务指纹识别 | | **主机** | `H` | 主机清单:IP/MAC/OS/主机名跟踪、每主机协议统计、**自由形式标签** | | **笔记本** | `N` | 分析员笔记 — 带时间戳、标签关联、**可搜索** 并支持实时过滤 | | **TLS** | `T` | TLS 会话表:SNI、密码套件、JA3/JA3S 指纹、**证书 CN/签发者/SANs/过期**、告警检测 | | **对象** | `O` | 从流量中提取的文件对象 — MIME 类型、SHA-256、大小、YARA 命中 | | **规则** | `R` | 用户定义检测规则(字段条件 → 告警/标签/日志动作),实时命中计数、描述列 | | **工作台** | `W` | 十六进制层协议工作台 — 加载任意数据包、光标导航、字节选择 | | **图谱** | `G` | **操作员图谱** — 实时关联图谱将所有工件链接为可导航的相关关系图 | | **差异** | `D` | **差异 PCAP 分析** — 基准快照与当前流量的协议差异、主机差异、端口差异 | ## 操作员图谱(选项卡 G) 操作员图谱是旗舰分析引擎。它通过关联所有分析工件(主机、会话、凭证、证书、令牌、文件、IOC、告警)构建一个实时的、基于时间的关联图谱。 ### 图谱模型 **节点类型(15):** 主机 · 服务 · 会话 · 流 · 身份 · 凭证 · 令牌 · 证书 · 文件对象 · 告警 · IOC · 规则命中 · 协议工件 · 固件工件 · 活动簇 **边类型(20):** 与…通信 · 使用服务 · 属于主机 · 使用认证 · 呈现证书 · 从…提取 · 匹配 IOC · 触发告警 · 解析为 · 关联于 · 相关联 · 同一身份 · 横向移动 · 渗出至 · 命令与控制 · 隧道 · 封装 · 重复使用 · 签名 · 链接 每个节点和边都携带 **溯源信息**(指向数据包的证据引用)、**时间戳**(首次出现 / 最后出现)以及 **命中计数**。 ### 模式 使用 **`Tab`** 循环切换,或直接跳转: | 模式 | 按键 | 描述 | |------|------|------| | **邻域** |(默认)| 选中节点 + 所有进出边,以 ASCII 树呈现 | | **邻接表** | `A` | 可排序的、连接到选中节点的所有边表 | | **路径** | `P` | 启发式攻击路径 — 凭证重用、证书重用、IOC 簇、信标链、告警链 | | **簇** | `C` | 自动发现的节点簇 — 证书重用组、IOC 簇、告警主机、信标对 | | **证据** | `E` | 选中节点的原始证据引用(数据包编号、告警 ID、IOC 命中、YARA 命中、笔记) | ### 风险评分 每个节点都会获得一个**可解释的风险评分**(0–1),基于可观测信号计算: | 类型 | 信号 | |------|------| | 主机 | IOC 命中(+0.35)、告警计数(+0.25)、高严重性告警(+0.15)、观察到的凭证(+0.15)、类信标重复(+0.10) | | 凭证 | 明文(+0.40)、来自多个来源(+0.30) | | 证书 | 自签名(+0.25)、跨会话重用(+0.20) | | IOC | 基准 0.50 + 每个匹配主机 +0.10 | | 告警 | CRITICAL=0.95、HIGH=0.80、MEDIUM=0.55、LOW=0.30 | | 文件对象 | YARA 命中(+0.40)、可执行 MIME(+0.25) | 评分以星级(`★★★☆☆`)显示,并带有颜色编码的风险标签(严重 / 高 / 中 / 低 / 极低)以及详情面板中的可读说明。 ### 攻击路径重建 Packrat 自动发现可疑的多跳模式: | 模式 | 描述 | |------|------| | **凭证重用** | 同一凭证从 2 个或更多不同主机认证 | | **证书重用** | 同一 TLS 证书在 2 个或更多会话中出现 | | **IOC 簇** | 匹配已知不良指示器的主机 | | **告警链** | 风险 >0.5 的主机,且与告警 + IOC、告警 + 凭证或 IOC + 凭证信号重叠 | | **信标** | 通信边命中 ≥20、持续时间 ≥60 秒、速率 0.05–20 包/秒 | ### 枢纽引擎 选择任意节点并按 **`p`** 计算排名枢纽建议——邻居、重用目标、类型特定的关联枢纽,并按分值显示在枢纽栏中。 ### 导出 按 **`x`** 导出当前图谱为 JSON: ``` packrat_graph_.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规则, 包捕获, 协议分析, 协议统计, 反向工程, 可视化界面, 字符串提取, 嵌入式分析, 开源安全工具, 指纹识别, 数据包检查, 数据展示, 数据统计, 权限提升, 注入工具, 流量分析平台, 流量取证, 流量可视化, 流量重放, 熵分析, 端口扫描, 系统分析, 红队, 终端工具, 网络分析, 网络威胁检测, 被动防御, 追踪路由, 逆向工程平台, 通知系统