
Rawソケットベースのネットワークパケットスニファで、ネットワークインターフェースからTCP/IPパケットをキャプチャして分解し、セキュリティ分析や教育用途に使用します。
GNU/Linux 向けのネットワークトラフィックモニター — 旧称 Packet-Sniffer。フレームは 1 つ以上のネットワークインターフェースから raw ソケットでキャプチャされ、カーネル自身によってタイムスタンプが付与され、 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 レポートは完全な Hop-by-Hop チェーンを
レンダリングします) および Neighbor Discovery (Router/Neighbor
Solicitation または Advertisement はターゲットアドレスとリンク層
オプションを表示します)、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 の場合) ファイルの終端であっても
同様です: 3 つすべてが同じクリーンシャットダウンをトリガーします。
いくつかのお気に入りの組み合わせ:
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
ライブキャプチャには raw ソケットが必要で、Linux では root
(sudo rootwire -i eth0) またはインタープリタに CAP_NET_RAW
ケーパビリティを付与することを意味します。-r でのファイル再生には
特権は一切必要ありません。クローンからは
sudo .venv/bin/python -m rootwire として実行します。
capture.py の capture_async() は生のフレームを生成します —
インターフェースごとに 1 つの AF_PACKET ソケットからマージされ、
それぞれが到着時にカーネル自身によってタイムスタンプが付与されます
(SO_TIMESTAMPNS、ユーザースペースのクロック読み取りではありません) —
(bytes, timestamp, interface) のタプルとして。-r でのファイルからの
再生は pcap.py のフレームを同じ形に適応させてから、どちらのソースも
decoder.py に到達します。decoder.py は各フレームのプロトコル
チェーンを不変の DecodedFrame に変換します。出力 — 画面レンダラー、
NDJSON ストリーム、pcap ライター、統計コレクター — は 1 つの小さな
Output インターフェースを通じてすべてのフレームを消費します。
長いキャプチャ中にメモリが一定に保たれる理由や出力を追加する方法を
含む完全なツアーは
ARCHITECTURE.md にあります。
raw ソケット以外はすべてどの OS でも動作するため、テストスイート — 実際にキャプチャされたトラフィックの 65 フレームのコーパスを パイプライン全体を通して再生するものを含む — は root も Linux も 必要としません:
uv run pytest
バグレポートとプルリクエストを歓迎します。CONTRIBUTING.md では、開発セットアップ、CI が実行するチェック、そしてここで良い プルリクエストとはどのようなものかを説明しています。
このリポジトリに含まれるコードを、事前の相互同意なしにターゲットに 対して使用することは、その一部または全部を問わず、違法です。 適用されるすべての地方、州、および連邦法を遵守することは エンドユーザーの責任です。
開発者は一切の責任を負わず、このリポジトリに含まれるコードが、 偶発的であるかその他であるかを問わず、脅威アクターまたは不正な エンティティによって、システムおよびその関連リソースのセキュリティ、 プライバシー、機密性、完全性、および/または可用性を侵害する手段として 利用されることによって引き起こされるいかなる誤用または損害についても 責任を負いません。この文脈において「侵害」という用語は、今後、 上記のシステムに存在する既知または未知の脆弱性の悪用の活用として 理解され、これにはセキュリティ制御の実装、人間によるものまたは 電子的に可能にされたものが含まれますが、これらに限定されません。
このコードの使用は、宣言された目的がシステムの脆弱性を発見および 緩和し、それぞれの脅威モデルで定義された悪意のあるエージェントに よって使用される侵害およびエクスプロイトへの露出を制限することである 教育環境または承認されたペネトレーションテスト業務に直接 関連する状況においてのみ、開発者によって承認されます。