
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.
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, 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.
pipx install rootwire # or: uv tool install rootwire
Ou execute a partir de um clone com 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)
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.
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.
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
Relatórios de bugs e pull requests são bem-vindos. CONTRIBUTING.md cobre a configuração de desenvolvimento, as verificações que a CI executa, e como um bom pull request se parece aqui.
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.