
مُلتقط حزم شبكة يعتمد على المقابس الخام، يلتقط ويفكك حزم 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
الكاملة الخاصة به) واكتشاف الجوار (Router/Neighbor
Solicitation أو Advertisement يعرض عنوان الهدف وخيارات
طبقة الربط)، وICMPv4/v6، وTCP (إزاحات الحمولة الواعية بالخيارات، خيارات
مفكوكة الترميز) وUDP. يتم التحقق من كل checksum لـ IPv4/ICMPv4/ICMPv6/TCP/UDP
مقابل إعادة حساب، مع الإشارة إلى عدم التطابق في السطر نفسه
(Checksum: 0x0000 [!] mismatch (expected 0x1a2b)) — إشارة حقيقية
لحركة مرور تالفة أو منتحلة، وصامتة بالنسبة لشذرة غير مُعاد تجميعها،
حيث يغطي checksum على السلك مخطط بيانات لا يعيد 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 صلاحيات
الجذر (sudo rootwire -i eth0) أو منح المفسّر قدرة
CAP_NET_RAW. إعادة تشغيل الملفات باستخدام -r لا تحتاج أبدًا إلى
صلاحيات. من نسخة مستنسخة، شغّله كـ sudo .venv/bin/python -m rootwire.
تُنتج capture_async() في capture.py إطارات خام — مدموجة من
socket واحد AF_PACKET لكل واجهة، كل منها بطابع زمني من النواة
نفسها عند الوصول (SO_TIMESTAMPNS، وليس قراءة ساعة من مساحة
المستخدم) — كثلاثيات (bytes, timestamp, interface)؛ وإعادة التشغيل من ملف
باستخدام -r تُكيِّف إطارات pcap.py
في نفس الشكل قبل أن يصل أي من المصدرين إلى decoder.py، الذي
يمشي عبر سلسلة بروتوكولات كل إطار إلى DecodedFrame غير قابل للتغيير.
المخرجات — عارض الشاشة، وبث NDJSON، وكاتب pcap،
وجامع الإحصاءات — تستهلك كل إطار عبر واجهة Output
واحدة صغيرة. الجولة الكاملة، بما في ذلك سبب بقاء الذاكرة ثابتة أثناء
عمليات الالتقاط الطويلة وكيفية إضافة مخرج، موجودة في
ARCHITECTURE.md.
كل شيء عدا raw socket يعمل على أي نظام تشغيل، لذا فإن مجموعة الاختبار — التي تتضمن مجموعة من 65 إطارًا من حركة مرور حقيقية مُلتقطة يُعاد تشغيلها عبر خط الأنابيب بأكمله — لا تحتاج إلى root ولا إلى Linux:
uv run pytest
تقارير الأخطاء وطلبات السحب مرحّب بها. يغطي CONTRIBUTING.md إعداد التطوير، والفحوصات التي تشغّلها CI، وكيف يبدو طلب السحب الجيد هنا.
استخدام الكود الموجود في هذا المستودع، جزئيًا أو كليًا، للتعامل مع أهداف دون موافقة متبادلة مسبقة هو أمر غير قانوني. تقع على عاتق المستخدم النهائي مسؤولية الالتزام بجميع القوانين المحلية والولائية والفيدرالية المعمول بها.
لا يتحمل المطوّرون أي مسؤولية وليسوا مسؤولين عن إساءة الاستخدام أو الأضرار الناجمة عن أي كود موجود في هذا المستودع في أي حالة، عرضًا أو غير ذلك، إذا ما استخدمه وكيل تهديد أو كيان غير مصرّح له كوسيلة لاختراق أمن الأنظمة ومواردها المرتبطة بها، وخصوصيتها، وسريتها، وسلامتها، و/أو إتاحتها. وفي هذا السياق، يُفهم مصطلح "اختراق" من الآن فصاعدًا على أنه استغلال ثغرات معروفة أو غير معروفة موجودة في الأنظمة المذكورة، بما في ذلك، على سبيل المثال لا الحصر، تنفيذ الضوابط الأمنية، البشرية أو المفعّلة إلكترونيًا.
لا يُقرّ المطوّرون باستخدام هذا الكود إلا في تلك الظروف المتعلقة مباشرة بـالبيئات التعليمية أو مهام اختبار الاختراق المصرّح بها التي يكون غرضها المعلن هو اكتشاف الثغرات في الأنظمة والتخفيف منها، والحد من تعرضها للاختراقات والاستغلالات التي يستخدمها الوكلاء الخبيثون كما هو محدد في نماذج التهديد الخاصة بهم.