
Sniffer de pacotes de rede baseado em socket bruto que captura e desmonta pacotes TCP/IP de interfaces de rede para análise de segurança e uso educacional.
# RootWire
[](https://www.codefactor.io/repository/github/eonraider/rootwire)
[](https://github.com/EONRaider/RootWire/actions/workflows/ci.yml)
[](https://pypi.org/project/rootwire/)


[](LICENSE)
Um monitor de tráfego de rede para GNU/Linux — *anteriormente conhecido como
Packet-Sniffer*. Os frames são capturados de uma ou mais interfaces de
rede com um raw socket, com timestamp gerado pelo próprio kernel,
decodificados camada por camada com a biblioteca
[NETProtocols](https://github.com/EONRaider/NETProtocols), e
renderizados ao vivo, gravados em pcap com precisão de nanossegundos, ou transmitidos 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)
```
O decodificador cobre Ethernet (tags VLAN 802.1Q, incluindo marcação QinQ
aninhada), ARP, IPv4 (**opções decodificadas** e fragmentos), IPv6
**incluindo cabeçalhos de extensão** (um relatório MLD renderiza sua cadeia
Hop-by-Hop completa) e **Neighbor Discovery** (uma Router/Neighbor
Solicitation ou Advertisement mostra seu endereço de destino e opções de
camada de enlace), ICMPv4/v6, TCP (offsets de payload cientes de opções, **opções
decodificadas**) e UDP. Todo checksum IPv4/ICMPv4/ICMPv6/TCP/UDP é
verificado contra uma recomputação, sinalizando uma incompatibilidade inline
(`Checksum: 0x0000 [!] mismatch (expected 0x1a2b)`) — um sinal real
para tráfego corrompido ou falsificado, silencioso para um fragmento não
remontado, onde o checksum do fio cobre um datagrama que o RootWire nunca
reconstrói. Frames malformados ou truncados são diagnosticados em vez de
derrubar a captura, protocolos desconhecidos encerram a cadeia graciosamente, e
um limite de 16 camadas impede que pilhas de cabeçalhos de extensão forjadas amplifiquem —
a captura sobrevive a tudo o que a rede entregar.
## Instalação
```
pipx install rootwire # or: uv tool install rootwire
```
Ou execute a partir de um clone com [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)
```
As estatísticas de captura — frames, bytes, frames/s, contagens de
malformados/truncados, totais por protocolo — são reportadas em stderr quando a captura
termina, seja por Ctrl-C, `SIGTERM`, ou (para `-r`) fim de arquivo: todos
os três disparam o mesmo encerramento limpo. Algumas combinações 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
```
A captura ao vivo precisa de um raw socket, o que no Linux significa root
(`sudo rootwire -i eth0`) ou conceder ao interpretador a
capacidade `CAP_NET_RAW`. Reproduzir arquivos com `-r` nunca precisa de
privilégios. A partir de um clone, execute como `sudo .venv/bin/python -m rootwire`.
## Como funciona
O `capture_async()` de `capture.py` produz frames brutos — mesclados de um
socket `AF_PACKET` por interface, cada um com timestamp gerado pelo próprio kernel
na chegada (`SO_TIMESTAMPNS`, não uma leitura de relógio em espaço de usuário) — como
triplas `(bytes, timestamp, interface)`; reproduzir de um arquivo com
`-r` adapta os frames de `pcap.py`
para essa mesma forma antes que qualquer fonte chegue a `decoder.py`, que
percorre a cadeia de protocolos de cada frame em um `DecodedFrame` imutável.
As saídas — o renderizador de tela, o stream NDJSON, o gravador pcap, o
coletor de estatísticas — consomem cada frame através de uma pequena interface
`Output`. O tour completo, incluindo por que a memória permanece estável durante capturas
longas e como adicionar uma saída, está em
[ARCHITECTURE.md](https://github.com/eonraider/packet-sniffer/blob/master/ARCHITECTURE.md).
Tudo exceto o raw socket roda em qualquer SO, então a suíte de testes —
que inclui um corpus de 65 frames de tráfego real capturado reproduzido
por todo o pipeline — não precisa nem de root nem de Linux:
```
uv run pytest
```
## Contribuindo
Relatórios de bugs e pull requests são bem-vindos. [CONTRIBUTING.md](https://github.com/eonraider/packet-sniffer/blob/master/CONTRIBUTING.md)
cobre a configuração de desenvolvimento, as verificações que a CI executa, e como um bom pull request
se parece aqui.
## Aviso Legal
O uso do código contido neste repositório, seja em parte ou em sua
totalidade, para engajar alvos sem consentimento mútuo prévio é
ilegal. **É responsabilidade do usuário final obedecer a todas as leis
locais, estaduais e federais aplicáveis.**
Os desenvolvedores não assumem **nenhuma responsabilidade** e não são responsáveis por usos indevidos
ou danos causados por qualquer código contido neste repositório em qualquer
evento em que, acidental ou de outra forma, ele venha a ser utilizado por um
agente de ameaça ou entidade não autorizada como meio de comprometer a
segurança, privacidade, confidencialidade, integridade e/ou disponibilidade de
sistemas e seus recursos associados. Neste contexto, o termo
"comprometer" é doravante entendido como a alavancagem da exploração
de vulnerabilidades conhecidas ou desconhecidas presentes nos referidos sistemas, incluindo,
mas não se limitando a, a implementação de controles de segurança, humanos ou
habilitados eletronicamente.
O uso deste código é **somente** endossado pelos desenvolvedores naquelas
circunstâncias diretamente relacionadas a **ambientes educacionais** ou
**engajamentos de teste de penetração autorizados** cujo propósito declarado
seja o de encontrar e mitigar vulnerabilidades em sistemas, limitando
sua exposição a comprometimentos e exploits empregados por agentes maliciosos
conforme definido em seus respectivos modelos de ameaça.
## Licença
[AGPL-3.0](https://github.com/eonraider/packet-sniffer/blob/master/LICENSE)