
Sniffer de paquetes de red basado en sockets sin procesar que captura y desensambla paquetes TCP/IP de interfaces de red para análisis de seguridad y uso educativo.
# 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 monitor de tráfico de red para GNU/Linux — *anteriormente conocido como
Packet-Sniffer*. Las tramas se capturan desde una o varias interfaces de
red con un socket raw, con marca de tiempo del propio kernel, se decodifican
capa por capa con la librería
[NETProtocols](https://github.com/EONRaider/NETProtocols), y se renderizan en
vivo, se escriben a un pcap con precisión de nanosegundos, o se transmiten
como 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)
```
El decodificador cubre Ethernet (etiquetas VLAN 802.1Q, incluyendo el
etiquetado QinQ anidado), ARP, IPv4 (**opciones decodificadas** y
fragmentos), IPv6 **incluyendo cabeceras de extensión** (un informe MLD
renderiza su cadena completa Hop-by-Hop) y **Neighbor Discovery** (una
Solicitud o Anuncio de Router/Neighbor muestra su dirección objetivo y
opciones de capa de enlace), ICMPv4/v6, TCP (offsets de payload conscientes
de opciones, **opciones decodificadas**) y UDP. Cada checksum de
IPv4/ICMPv4/ICMPv6/TCP/UDP se verifica contra un recálculo, marcando una
discrepancia en línea (`Checksum: 0x0000 [!] mismatch (expected 0x1a2b)`) —
una señal real para tráfico corrupto o falsificado, silenciosa para un
fragmento no reensamblado, donde el checksum del cable cubre un datagrama
que RootWire nunca reconstruye. Las tramas malformadas o truncadas se
diagnostican en lugar de hacer fallar la captura, los protocolos
desconocidos terminan la cadena de forma controlada, y un límite de 16
capas evita que pilas de cabeceras de extensión fabricadas amplifiquen —
la captura sobrevive a lo que sea que entregue la red.
## Instalación
```
pipx install rootwire # or: uv tool install rootwire
```
O ejecutar desde un clon con [uv](https://docs.astral.sh/uv/):
```
git clone https://github.com/EONRaider/RootWire.git
cd RootWire
uv sync
```
## Uso
```
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)
```
Las estadísticas de captura — tramas, bytes, tramas/s, conteos de
malformadas/truncadas, recuentos por protocolo — se reportan en stderr
cuando la captura termina, ya sea por Ctrl-C, `SIGTERM`, o (para `-r`) fin
de archivo: los tres desencadenan el mismo apagado limpio. Algunas
combinaciones favoritas:
```
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 captura en vivo necesita un socket raw, lo que en Linux significa root
(`sudo rootwire -i eth0`) o conceder al intérprete la capacidad
`CAP_NET_RAW`. Reproducir archivos con `-r` nunca necesita privilegios.
Desde un clon, ejecútalo como `sudo .venv/bin/python -m rootwire`.
## Cómo funciona
El `capture_async()` de `capture.py` produce tramas raw — fusionadas desde
un socket `AF_PACKET` por interfaz, cada una con marca de tiempo del propio
kernel al llegar (`SO_TIMESTAMPNS`, no una lectura del reloj en espacio de
usuario) — como tuplas `(bytes, timestamp, interface)`; la reproducción
desde un archivo con `-r` adapta las tramas de `pcap.py`
a esa misma forma antes de que cualquiera de las fuentes llegue a
`decoder.py`, que recorre la cadena de protocolos de cada trama hasta un
`DecodedFrame` inmutable. Las salidas — el renderizador de pantalla, el
flujo NDJSON, el escritor de pcap, el recolector de estadísticas —
consumen cada trama a través de una pequeña interfaz `Output`. El recorrido
completo, incluyendo por qué la memoria se mantiene plana durante capturas
largas y cómo añadir una salida, está en
[ARCHITECTURE.md](https://github.com/eonraider/packet-sniffer/blob/master/ARCHITECTURE.md).
Todo excepto el socket raw se ejecuta en cualquier SO, por lo que la suite
de pruebas — que incluye un corpus de 65 tramas de tráfico real capturado
reproducido a través de todo el pipeline — no necesita ni root ni Linux:
```
uv run pytest
```
## Contribuir
Los informes de errores y las pull requests son bienvenidos. [CONTRIBUTING.md](https://github.com/eonraider/packet-sniffer/blob/master/CONTRIBUTING.md)
cubre la configuración de desarrollo, las comprobaciones que ejecuta CI, y
cómo se ve una buena pull request aquí.
## Aviso Legal
El uso del código contenido en este repositorio, ya sea en parte o en su
totalidad, para atacar objetivos sin consentimiento mutuo previo es
ilegal. **Es responsabilidad del usuario final obedecer todas las leyes
locales, estatales y federales aplicables.**
Los desarrolladores no asumen **ninguna responsabilidad** y no son
responsables de los malos usos o daños causados por cualquier código
contenido en este repositorio en cualquier evento en que, accidentalmente
o de otro modo, llegue a ser utilizado por un agente de amenaza o entidad
no autorizada como medio para comprometer la seguridad, privacidad,
confidencialidad, integridad y/o disponibilidad de sistemas y sus recursos
asociados. En este contexto, el término "comprometer" se entiende en
adelante como el aprovechamiento de la explotación de vulnerabilidades
conocidas o desconocidas presentes en dichos sistemas, incluyendo, pero no
limitado a, la implementación de controles de seguridad, habilitados por
humanos o electrónicamente.
El uso de este código es **solo** respaldado por los desarrolladores en
aquellas circunstancias directamente relacionadas con **entornos
educativos** o **compromisos de pruebas de penetración autorizados** cuyo
propósito declarado sea el de encontrar y mitigar vulnerabilidades en
sistemas, limitando su exposición a compromisos y exploits empleados por
agentes maliciosos según se define en sus respectivos modelos de amenaza.
## Licencia
[AGPL-3.0](https://github.com/eonraider/packet-sniffer/blob/master/LICENSE)