
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.
# RootWire
[](https://www.codefactor.io/repository/github/eonraider/rootwire)
[](https://github.com/EONRaider/RootWire/actions/workflows/ci.yml)
[](https://pypi.org/project/rootwire/)


[](LICENSE)
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](https://github.com/EONRaider/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.
## Installation
```
pipx install rootwire # or: uv tool install rootwire
```
Ou exécutez depuis un clone avec [uv](https://docs.astral.sh/uv/) :
```
git clone https://github.com/EONRaider/RootWire.git
cd RootWire
uv sync
```
## Utilisation
```
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`.
## Fonctionnement
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](https://github.com/eonraider/packet-sniffer/blob/master/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
```
## Contribution
Les rapports de bugs et les pull requests sont les bienvenus. [CONTRIBUTING.md](https://github.com/eonraider/packet-sniffer/blob/master/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.
## Avertissement légal
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.
L'utilisation de ce code est **uniquement** approuvée par les développeurs dans les
circonstances directement liées aux **environnements éducatifs** ou aux
**engagements de tests d'intrusion autorisés** dont le but déclaré
est de trouver et d'atténuer les vulnérabilités dans les systèmes, en limitant
leur exposition aux compromissions et aux exploits employés par des agents
malveillants tels que définis dans leurs modèles de menace respectifs.
## Licence
[AGPL-3.0](https://github.com/eonraider/packet-sniffer/blob/master/LICENSE)