
Raw 소켓 기반 네트워크 패킷 스니퍼로, 보안 분석 및 교육용으로 네트워크 인터페이스에서 TCP/IP 패킷을 캡처하고 분해합니다.
GNU/Linux용 네트워크 트래픽 모니터 — 이전 명칭은 Packet-Sniffer. 하나 이상의 네트워크 인터페이스에서 raw socket으로 프레임을 캡처하고, 커널 자체에서 타임스탬프를 기록하며, NETProtocols 라이브러리로 계층별로 디코딩한 뒤, 실시간으로 렌더링하거나, 나노초 정밀도의 pcap으로 기록하거나, 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)
디코더는 Ethernet(802.1Q VLAN 태그, 중첩 QinQ 태깅 포함), ARP,
IPv4(디코딩된 옵션 및 단편), IPv6(확장 헤더 포함 — MLD
리포트는 전체 Hop-by-Hop 체인을 렌더링함) 및 Neighbor
Discovery(Router/Neighbor Solicitation 또는 Advertisement는
대상 주소와 링크 계층 옵션을 표시함), ICMPv4/v6, TCP(옵션을
인식하는 페이로드 오프셋, 디코딩된 옵션) 및 UDP를
커버합니다. 모든 IPv4/ICMPv4/ICMPv6/TCP/UDP 체크섬은 재계산과
대조하여 검증되며, 불일치 시 인라인으로 표시됩니다
(Checksum: 0x0000 [!] mismatch (expected 0x1a2b)) — 이는
손상되거나 스푸핑된 트래픽에 대한 실제 신호이며, 재조립되지 않은
단편에 대해서는 조용합니다. 이 경우 와이어 체크섬은 RootWire가
결코 재구성하지 않는 데이터그램을 대상으로 하기 때문입니다.
손상되거나 잘린 프레임은 캡처를 중단시키는 대신 진단되며, 알 수
없는 프로토콜은 체인을 우아하게 종료하고, 16계층 상한은 조작된
확장 헤더 스택이 증폭되는 것을 방지합니다 — 캡처는 네트워크가
전달하는 무엇이든 견뎌냅니다.
pipx install rootwire # or: uv tool install rootwire
또는 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)
캡처 통계 — 프레임, 바이트, 프레임/초, 손상/잘림 개수, 프로토콜별
집계 — 는 캡처가 종료될 때 stderr로 보고됩니다. Ctrl-C, SIGTERM,
또는 (-r의 경우) 파일 끝 중 어느 것이든 세 가지 모두 동일한
정상 종료를 트리거합니다. 몇 가지 유용한 조합:
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
라이브 캡처는 raw socket이 필요하며, Linux에서는 root
(sudo rootwire -i eth0) 또는 인터프리터에 CAP_NET_RAW 권한을
부여해야 합니다. -r로 파일을 재생하는 경우에는 권한이 전혀
필요하지 않습니다. 클론에서 실행하려면
sudo .venv/bin/python -m rootwire로 실행하세요.
capture.py의 capture_async()는 인터페이스당 하나의
AF_PACKET 소켓에서 병합된 raw 프레임을 — 각각 도착 시 커널
자체에서 타임스탬프가 기록됨(SO_TIMESTAMPNS, 사용자 공간 시계
읽기가 아님) — (bytes, timestamp, interface) 튜플로
생성합니다. -r로 파일에서 재생하는 경우 pcap.py의 프레임을
동일한 형태로 변환한 후, 두 소스 중 어느 것이든 decoder.py에
도달하면 각 프레임의 프로토콜 체인을 불변의 DecodedFrame으로
순회합니다. 출력 — 화면 렌더러, NDJSON 스트림, pcap 작성기, 통계
수집기 — 는 하나의 작은 Output 인터페이스를 통해 모든 프레임을
소비합니다. 장시간 캡처 중에도 메모리가 일정하게 유지되는 이유와
출력을 추가하는 방법을 포함한 전체 안내는
ARCHITECTURE.md에 있습니다.
raw socket을 제외한 모든 것은 어떤 OS에서든 실행되므로, 전체 파이프라인을 통해 재생되는 실제 캡처 트래픽의 65프레임 코퍼스를 포함하는 테스트 스위트는 root나 Linux가 필요하지 않습니다:
uv run pytest
버그 보고와 풀 리퀘스트를 환영합니다. CONTRIBUTING.md는 개발 환경 설정, CI가 실행하는 검사, 그리고 이곳에서 좋은 풀 리퀘스트란 어떤 것인지를 다룹니다.
이 저장소에 포함된 코드를, 부분적으로든 전체적으로든, 사전 상호 동의 없이 대상을 공격하는 데 사용하는 것은 불법입니다. 모든 적용 가능한 지방, 주 및 연방 법률을 준수하는 것은 최종 사용자의 책임입니다.
개발자는 어떠한 책임도 지지 않으며, 이 저장소에 포함된 코드가 사고든 아니든 위협 행위자나 비인가 주체에 의해 시스템 및 관련 자원의 보안, 프라이버시, 기밀성, 무결성 및/또는 가용성을 손상시키는 수단으로 사용되는 어떤 경우에도 그로 인한 오용이나 손해에 대해 책임지지 않습니다. 이 맥락에서 "손상"이라는 용어는 이후 해당 시스템에 존재하는 알려진 또는 알려지지 않은 취약점의 악용 — 보안 통제의 구현, 인간 또는 전자적으로 가능하게 된 것을 포함하되 이에 국한되지 않음 — 을 활용하는 것으로 이해됩니다.
이 코드의 사용은 선언된 목적이 시스템의 취약점을 찾아 완화하고, 각자의 위협 모델에 정의된 악의적 행위자가 사용하는 손상 및 익스플로잇에 대한 노출을 제한하는 것인 교육 환경 또는 승인된 침투 테스트 계약과 직접적으로 관련된 상황에서만 개발자에 의해 승인됩니다.