
Analyseur de paquets réseau basé sur des sockets bruts qui capture et désassemble les paquets TCP/IP provenant des interfaces réseau, à des fins d'analyse de sécurité et d'utilisation pédagogique.
Un moniteur de trafic réseau pour GNU/Linux — anciennement connu sous le nom de Packet-Sniffer. Les trames sont capturées depuis une ou plusieurs interfaces réseau via un socket brut, horodatées par le noyau lui-même, décodées couche par couche avec la bibliothèque NETProtocols, puis affichées en direct, écrites dans un fichier pcap à précision nanoseconde, ou diffusées en 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)
Le décodeur couvre Ethernet (tags VLAN 802.1Q, y compris l'empilement QinQ
imbriqué), ARP, IPv4 (options décodées et fragments), IPv6
y compris les en-têtes d'extension (un rapport MLD affiche toute sa
chaîne Hop-by-Hop) et Neighbor Discovery (une sollicitation ou
annonce Router/Neighbor affiche son adresse cible et ses options de
couche liaison), ICMPv4/v6, TCP (décalages de charge utile tenant compte des options, options
décodées) et UDP. Chaque somme de contrôle IPv4/ICMPv4/ICMPv6/TCP/UDP est
vérifiée par rapport à un recalcul, signalant une incohérence en ligne
(Checksum: 0x0000 [!] mismatch (expected 0x1a2b)) — un signal réel
pour le trafic corrompu ou usurpé, silencieux pour un fragment non réassemblé,
où la somme de contrôle sur le fil couvre un datagramme que RootWire ne
reconstruit jamais. Les trames malformées ou tronquées sont diagnostiquées au lieu de
faire planter la capture, les protocoles inconnus terminent la chaîne proprement, et
une limite de 16 couches empêche les piles d'en-têtes d'extension forgées d'amplifier —
la capture survit à tout ce que le réseau lui livre.
pipx install rootwire # or: uv tool install rootwire
Ou exécutez depuis un clone avec 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)
Les statistiques de capture — trames, octets, trames/s, comptages
malformées/tronquées, décomptes par protocole — sont rapportées sur stderr lorsque la capture
se termine, que ce soit par Ctrl-C, SIGTERM, ou (pour -r) fin de fichier : les
trois déclenchent le même arrêt propre. Quelques combinaisons favorites :
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
La capture en direct nécessite un socket brut, ce qui sous Linux signifie root
(sudo rootwire -i eth0) ou accorder à l'interpréteur la
capacité CAP_NET_RAW. La relecture de fichiers avec -r ne nécessite jamais
de privilèges. Depuis un clone, exécutez-le avec sudo .venv/bin/python -m rootwire.
La fonction capture_async() de capture.py produit des trames brutes — fusionnées depuis un
socket AF_PACKET par interface, chacune horodatée par le noyau
lui-même à l'arrivée (SO_TIMESTAMPNS, pas une lecture d'horloge en espace utilisateur) — sous forme de
triplets (bytes, timestamp, interface) ; la relecture depuis un fichier avec
-r adapte les trames de pcap.py
à cette même forme avant que l'une ou l'autre source n'atteigne decoder.py, qui
parcourt la chaîne de protocoles de chaque trame pour produire un DecodedFrame immuable.
Les sorties — le rendu à l'écran, le flux NDJSON, l'écrivain pcap, le
collecteur de statistiques — consomment chaque trame via une petite interface Output.
La visite complète, y compris pourquoi la mémoire reste stable pendant les longues
captures et comment ajouter une sortie, se trouve dans
ARCHITECTURE.md.
Tout sauf le socket brut fonctionne sur n'importe quel OS, donc la suite de tests — qui inclut un corpus de 65 trames de trafic réellement capturé rejoué à travers tout le pipeline — ne nécessite ni root ni Linux :
uv run pytest
Les rapports de bugs et les pull requests sont les bienvenus. CONTRIBUTING.md couvre la configuration de développement, les vérifications exécutées par la CI, et ce à quoi ressemble une bonne pull request ici.
L'utilisation du code contenu dans ce dépôt, en partie ou dans son intégralité, pour cibler des cibles sans consentement mutuel préalable est illégale. Il est de la responsabilité de l'utilisateur final de respecter toutes les lois locales, étatiques et fédérales applicables.
Les développeurs n'assument aucune responsabilité et ne sont pas responsables des mauvais usages ou des dommages causés par tout code contenu dans ce dépôt, dans quelque cas que ce soit, accidentellement ou autrement, s'il venait à être utilisé par un agent de menace ou une entité non autorisée comme moyen de compromettre la sécurité, la vie privée, la confidentialité, l'intégrité et/ou la disponibilité des systèmes et de leurs ressources associées. Dans ce contexte, le terme « compromettre » est désormais compris comme l'exploitation de vulnérabilités connues ou inconnues présentes dans lesdits systèmes, y compris, mais sans s'y limiter, la mise en œuvre de contrôles de sécurité, humains ou activés électroniquement.