
Сниффер сетевых пакетов на основе raw-сокетов, который захватывает и разбирает TCP/IP-пакеты с сетевых интерфейсов для анализа безопасности и образовательных целей.
Монитор сетевого трафика для GNU/Linux — ранее известный как Packet-Sniffer. Кадры захватываются с одного или нескольких сетевых интерфейсов через 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 (теги VLAN 802.1Q, включая вложенную
тегирование 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) конец файла: все три случая
запускают одно и то же чистое завершение. Несколько любимых комбинаций:
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_async() из capture.py выдаёт сырые кадры — объединённые из
одного сокета AF_PACKET на интерфейс, каждый с меткой времени от самого
ядра в момент прибытия (SO_TIMESTAMPNS, а не чтение часов из
пространства пользователя) — в виде троек (bytes, timestamp, interface);
воспроизведение из файла с -r адаптирует кадры из pcap.py
в ту же форму, прежде чем любой из источников достигнет decoder.py,
который проходит по цепочке протоколов каждого кадра, формируя неизменяемый
DecodedFrame. Выходы — экранный рендерер, поток NDJSON, модуль записи
pcap, сборщик статистики — потребляют каждый кадр через один небольшой
интерфейс Output. Полный обзор, включая объяснение того, почему память
остаётся стабильной при длительных захватах и как добавить выход, находится
в ARCHITECTURE.md.
Всё, кроме raw-сокета, работает в любой ОС, поэтому набор тестов — включающий корпус из 65 кадров реального захваченного трафика, воспроизводимый через весь конвейер — не требует ни root, ни Linux:
uv run pytest
Отчёты об ошибках и pull-запросы приветствуются. CONTRIBUTING.md описывает настройку среды разработки, проверки, выполняемые CI, и то, как выглядит хороший pull-запрос в этом проекте.
Использование кода, содержащегося в этом репозитории, как частично, так и полностью, для воздействия на цели без предварительного взаимного согласия является незаконным. Ответственность за соблюдение всех применимых местных, региональных и федеральных законов лежит на конечном пользователе.
Разработчики не принимают на себя никакой ответственности и не несут ответственности за неправомерное использование или ущерб, вызванный любым кодом, содержащимся в этом репозитории, в любом случае, случайно или иным образом, если он будет использован угрожающим агентом или несанкционированным субъектом как средство для компрометации безопасности, приватности, конфиденциальности, целостности и/или доступности систем и связанных с ними ресурсов. В этом контексте термин «компрометация» далее понимается как использование эксплуатации известных или неизвестных уязвимостей, присутствующих в указанных системах, включая, но не ограничиваясь, реализацией средств контроля безопасности, как человеческих, так и электронных.