一款面向 GNU/Linux 的网络流量监控工具 —— 前身为 Packet-Sniffer。它通过原始套接字从一个或多个网络接口捕获帧, 由内核自身打上时间戳,使用 NETProtocols 库逐层解码, 并实时渲染、写入纳秒级精度的 pcap 文件,或作为 JSON 流式输出:
[>] Frame #4 at 15:42:07 (wlan0, 74 bytes)
[+] Ethernet 3c:7c:3f:1a:be:22 -> 9c:1e:95:aa:01:5f
EtherType: IPv4
[+] IPv4 192.168.1.96 -> 142.250.79.78
TTL: 64 | Flags: Don't fragment (DF) | Total Length: 60 | ID: 39754
Protocol: TCP | Checksum: 0x2b51
[+] TCP 51888 -> 443
Flags: 0x002 (SYN) | Seq: 3598801521 | Ack: 0
Window: 64240 | Checksum: 0x2008
Options: Maximum Segment Size (1460), SACK Permitted, Timestamps (3644437524, 0), No-Operation, Window Scale (7)
解码器覆盖 Ethernet(802.1Q VLAN 标签,包括嵌套的 QinQ
标签)、ARP、IPv4(解码选项与分片)、IPv6
包括扩展头(一份 MLD 报告会渲染其完整的
逐跳链)以及 邻居发现(路由器/邻居
请求或通告会显示其目标地址与链路层
选项)、ICMPv4/v6、TCP(感知选项的载荷偏移、解码
选项)和 UDP。每个 IPv4/ICMPv4/ICMPv6/TCP/UDP 校验和都会
与重新计算的结果进行比对验证,不匹配时会在行内标记
(Checksum: 0x0000 [!] mismatch (expected 0x1a2b))—— 这对
损坏或被伪造的流量是一个真实信号,而对未重组的
分片则保持静默,因为线路上的校验和覆盖的是 RootWire 从不
重建的数据报。畸形或截断的帧会被诊断,而不是让捕获
崩溃;未知协议会优雅地终止协议链;16 层上限可防止精心构造的
扩展头堆叠造成放大 —— 无论网络送来什么,捕获都能存活。
pipx install rootwire # or: uv tool install rootwire
或使用 uv 从克隆的仓库运行:
git clone https://github.com/EONRaider/RootWire.git
cd RootWire
uv sync
rootwire [-h] [-i INTERFACE] [-r FILE] [-w FILE]
[--filter NAME_OR_EXPR] [--json] [-d] [--version]
options:
-i, --interface interface to capture frames from; repeat to capture on
several interfaces concurrently (default: all interfaces)
-r, --read FILE replay frames from a pcap or pcapng file instead of live
capture (no privileges required; mutually exclusive
with -i)
-w, --write FILE also write every captured frame to a classic pcap file
--filter NAME_OR_EXPR
attach a kernel-side capture filter so only matching
frames reach userspace: a canned name (arp, ip6, tcp,
udp) or a filter expression -- protocols tcp/udp/icmp/
arp/ip/ip6; host/port, each optionally prefixed with
src/dst; and/or/not; parentheses (e.g. "tcp and port
80"); live capture only
--json one NDJSON object per frame on stdout (banner and
statistics stay on stderr): pipe straight into jq
-d, --data also display each frame's raw payload (ignored with --json)
捕获统计信息 —— 帧数、字节数、帧/秒、畸形/截断
计数、按协议分类的统计 —— 会在捕获结束时报告到 stderr,
无论是 Ctrl-C、SIGTERM,还是(对于 -r)文件结束:这三种情况
都会触发相同的干净关闭。一些常用组合:
sudo rootwire -i eth0 -w session.pcap # capture and keep the evidence
sudo rootwire -i eth0 --filter tcp # drop non-TCP in the kernel
sudo rootwire -i eth0 --filter "tcp and port 80" # kernel-side filter expression
sudo rootwire -i eth0 -i wlan0 # merge two interfaces into one stream
rootwire -r session.pcap # inspect it later, no root
rootwire -r session.pcap --json | jq . # machine-readable analysis
实时捕获需要原始套接字,在 Linux 上这意味着 root
(sudo rootwire -i eth0)或授予解释器
CAP_NET_RAW 能力。使用 -r 回放文件从不需要
特权。从克隆的仓库运行时,以 sudo .venv/bin/python -m rootwire 运行。
capture.py 的 capture_async() 产出原始帧 —— 从每个接口的
一个 AF_PACKET 套接字合并而来,每个帧都由内核
在到达时自身打上时间戳(SO_TIMESTAMPNS,而非用户空间时钟读取)——
以 (bytes, timestamp, interface) 三元组的形式;使用 -r 从文件回放时,
会将 pcap.py 的帧适配
成相同的形状,然后任一来源都会到达 decoder.py,它
将每个帧的协议链遍历为一个不可变的 DecodedFrame。
输出端 —— 屏幕渲染器、NDJSON 流、pcap 写入器、
统计收集器 —— 都通过一个小的 Output
接口消费每个帧。完整导览,包括为何在长时间
捕获期间内存保持平稳,以及如何添加一个输出,见
ARCHITECTURE.md。
除原始套接字外,所有内容都可在任何操作系统上运行,因此测试套件 —— 其中包含一个由 65 帧真实捕获流量组成的语料库,通过整个 流水线回放 —— 既不需要 root 也不需要 Linux:
uv run pytest
欢迎提交错误报告和拉取请求。CONTRIBUTING.md 涵盖了开发环境设置、CI 运行的检查,以及在这里 什么样的拉取请求才算好。
使用本仓库中包含的代码,无论是部分还是 全部,用于未经事先相互同意的情况下攻击目标,都是 非法的。遵守所有适用的 地方、州和联邦法律是最终用户的责任。
开发者不承担任何责任,对于本仓库中包含的任何代码 在任何情况下(无论是意外还是其他情况)被威胁行为者或未经授权的实体 用作破坏系统及其相关资源的安全性、隐私性、机密性、完整性和/或可用性的手段 所造成的误用或损害,开发者概不负责。在此语境下, 术语“破坏”此后应理解为利用 所述系统中存在的已知或未知漏洞,包括但不限于 安全控制的实现,无论是人为还是 电子方式启用的。
开发者仅在那些直接与教育环境或 授权的渗透测试工作相关的情况下认可使用此代码,这些工作的声明目的是 发现和缓解系统中的漏洞,限制 其暴露于恶意行为者根据其各自威胁模型所采用的破坏和利用手段。