
🖖 ماسح شبكات سريع وحديث وسهل الاستخدام
sx هو ماسح شبكات يعمل عبر واجهة الأوامر، مصمم لاتباع فلسفة UNIX.
الهدف من هذا المشروع هو إنشاء أسرع ماسح شبكات مع كود نظيف وبسيط.
أبسط طريقة هي التحميل من إصدارات GitHub ووضع الملف القابل للتنفيذ في مسار PATH الخاص بك.
المتطلبات:
على macOS، قم بتثبيت أدوات سطر الأوامر Xcode أولاً حتى يتمكن CGO من الربط مع libpcap الخاص بالنظام:
xcode-select --install
من جذر شجرة المصدر، قم بتشغيل:
go build
فيما يلي أمثلة سريعة توضح كيف يمكنك مسح الشبكات باستخدام sx.
امسح شبكتك المحلية واعرض عنوان IP وعنوان MAC والشركة المصنعة للأجهزة المتصلة:
sx arp 192.168.0.1/24
مثال على الإخراج:
192.168.0.1 b0:be:76:40:05:8d TP-LINK TECHNOLOGIES CO.,LTD.
192.168.0.111 80:c5:f2:0b:02:e3 AzureWave Technology Inc.
192.168.0.171 88:53:95:2d:3c:af Apple, Inc.
مع مخرجات JSON:
sx arp --json 192.168.0.1/24
مثال على الإخراج:
{"ip":"192.168.0.1","mac":"b0:be:76:40:05:8d","vendor":"TP-LINK TECHNOLOGIES CO.,LTD."}
{"ip":"192.168.0.111","mac":"80:c5:f2:0b:02:e3","vendor":"AzureWave Technology Inc."}
{"ip":"192.168.0.171","mac":"88:53:95:2d:3c:af","vendor":"Apple, Inc."}
انتظر 5 ثوانٍ قبل الخروج لاستقبال حزم الرد المتأخرة، بشكل افتراضي ينتظر sx 300 مللي ثانية:
sx arp --exit-delay 5s 192.168.0.1/24
وضع المسح المباشر الذي يعيد مسح الشبكة كل 10 ثوانٍ:
sx arp 192.168.0.1/24 --live 10s
على عكس nmap والماسحات الضوئية الأخرى التي تقوم ضمنيًا بإجراء طلبات ARP لتحويل عناوين IP إلى عناوين MAC قبل المسح الفعلي، يستخدم sx مفهوم ذاكرة التخزين المؤقت ARP بشكل صريح. ملف ذاكرة التخزين المؤقت ARP هو ملف نصي بسيط يحتوي على سلسلة JSON في كل سطر (ملف JSONL)، والذي يحتوي على نفس حقول JSON مثل مخرجات مسح ARP الموضحة أعلاه. تقرأ مسوحات البروتوكولات الأعلى مستوى مثل TCP و UDP ملف ذاكرة التخزين المؤقت ARP من الإدخال القياسي ثم تبدأ المسح الفعلي.
هذا لا يبسط تصميم البرنامج فحسب، بل يسرع أيضًا عملية المسح، حيث ليس من الضروري إجراء مسح ARP في كل مرة.
لنفترض أن ذاكرة التخزين المؤقت ARP الفعلية موجودة في ملف arp.cache. يمكننا إنشاؤها يدويًا أو استخدام مسح ARP كما هو موضح أدناه:
sx arp 192.168.0.1/24 --json | tee arp.cache
بمجرد أن نحصل على ملف ذاكرة التخزين المؤقت ARP، يمكننا تشغيل مسوحات البروتوكولات الأعلى مستوى مثل مسح TCP SYN:
cat arp.cache | sx tcp -p 1-65535 192.168.0.171
مثال على الإخراج:
192.168.0.171 22
192.168.0.171 443
في هذه الحالة نكتشف أن المنفذين 22 و 443 مفتوحان.
إذا رأيت send: No buffer space available أثناء عمليات المسح الكبيرة، فهذا يعني عادةً أن المرسل يتجاوز مخازن النواة/raw-socket المؤقتة. الإصلاح الأول هو إضافة --rate وتقليل دفعة الإرسال، على سبيل المثال -r 100000/s أو أقل إذا لزم الأمر. على بعض الأنظمة، يمكن أن يساعد ضبط حدود مقبس/مخزن النظام المؤقت أيضًا، ولكن تحديد المعدل هو الإصلاح الأساسي.
مسح بمخرجات JSON:
cat arp.cache | sx tcp --json -p 1-65535 192.168.0.171
مثال على الإخراج:
{"scan":"tcpsyn","ip":"192.168.0.171","port":22}
{"scan":"tcpsyn","ip":"192.168.0.171","port":443}
مسح نطاقات منافذ متعددة:
cat arp.cache | sx tcp -p 1-23,25-443 192.168.0.171
أو منافذ فردية:
cat arp.cache | sx tcp -p 22,443 192.168.0.171
أو استخدم خيار --ports-file لتحديد ملف يحتوي على منافذ أو نطاقات منافذ لمسحها، سطر واحد لكل منها.
مسح أزواج ip/port من ملف بمخرجات JSON:
cat arp.cache | sx tcp --json -f ip_ports_file.jsonl
كل سطر من ملف الإدخال هو سلسلة JSON، يجب أن تحتوي على حقلي ip و port.
ملف إدخال مثال:
{"ip":"10.0.1.1","port":1080}
{"ip":"10.0.2.2","port":1081}
من الممكن تحديد ملف ذاكرة التخزين المؤقت ARP باستخدام الخيارين -a أو --arp-cache:
sx tcp -a arp.cache -p 22,443 192.168.0.171
أو إعادة توجيه الإدخال القياسي:
sx tcp -p 22,443 192.168.0.171 < arp.cache
يمكنك أيضًا استخدام الأمر الفرعي tcp syn بدلاً من tcp:
cat arp.cache | sx tcp syn -p 22 192.168.0.171
الأمر الفرعي tcp هو مجرد اختصار للأمر الفرعي tcp syn ما لم يتم تمرير خيار --flags، انظر أدناه.
يدعم sx المسح باستخدام واجهات الشبكة الافتراضية (wireguard, openvpn, إلخ) وفي هذه الحالة ليس من الضروري استخدام ذاكرة التخزين المؤقت ARP، لأن هذه الواجهات تتطلب حزم IP خام بدلاً من إطارات Ethernet كمدخل. على سبيل المثال، مسح عنوان IP على شبكة vpn:
sx tcp 10.1.27.1 -p 80 --json
تحاول معظم ماسحات الشبكة تفسير نتائج المسح. على سبيل المثال تقول "هذا المنفذ مغلق" بدلاً من "تلقيت RST". أحيانًا تكون على حق. وأحيانًا لا. هذا أسهل للمبتدئين، ولكن عندما تعرف ما تفعله، تستمر في محاولة استنتاج ما حدث بالفعل من تفسير البرنامج، خاصةً لتقنيات المسح الأكثر تقدمًا.
يحاول sx التغلب على هذه المشكلات. فهو يعيد معلومات حول جميع حزم الرد الخاصة بمسوحات TCP FIN و NULL و Xmas ومسوحات TCP المخصصة. تحتوي المعلومات على عنوان IP ومنفذ TCP وجميع أعلام TCP المضبوطة في حزمة الرد.
يستغل مسح TCP FIN وأشكاله الأخرى (NULL و Xmas) القسم 3.9 من RFC793:
وصول القطعة
إذا كانت الحالة CLOSED (أي TCB غير موجود) فإن
يتم التخلص من جميع البيانات في القطعة الواردة. يتم التخلص من القطعة الواردة التي تحتوي على RST. القطعة الواردة التي لا تحتوي على RST تتسبب في إرسال RST كرد. يتم اختيار قيم حقل الإقرار والتسلسل لجعل تسلسل إعادة التعيين مقبولاً لـ TCP الذي أرسل القطعة المخالفة.
لذا يجب أن يعيد المنفذ المغلق حزمة مع علامة RST.
ينص هذا القسم أيضًا على:
إذا كانت الحالة LISTEN فإن
...
أي قطعة تحكم أو تحمل نصًا أخرى (لا تحتوي على SYN) يجب أن تحتوي على ACK وبالتالي سيتم تجاهلها بواسطة معالجة ACK. لا يمكن أن تكون قطعة RST الواردة صالحة، حيث لا يمكن إرسالها ردًا على أي شيء أرسله هذا التجسيد للاتصال. لذا من غير المحتمل أن تصل إلى هنا، ولكن إذا وصلت، فقم بإسقاط القطعة، ثم ارجع.
العبارة الرئيسية هنا: إسقاط القطعة، ثم ارجع. لذا فإن المنفذ المفتوح على معظم أنظمة التشغيل سيسقط حزمة TCP التي تحتوي على أي أعلام باستثناء SYN و ACK و RST.
دعنا نمسح بعض المنفذ المغلق بمسح TCP FIN:
cat arp.cache | sx tcp fin --json -p 23 192.168.0.171
مثال على الإخراج:
{"scan":"tcpfin","ip":"192.168.0.171","port":23,"flags":"ar"}
يحتوي حقل flags على جميع أعلام TCP في حزمة الرد، حيث يمثل كل حرف أحد أعلام TCP:
s - علم SYNa - علم ACKf - علم FINr - علم RSTp - علم PSHu - علم URGe - علم ECEc - علم CWRn - علم NSفي هذه الحالة نكتشف أن المنفذ 23 أرسل حزمة رد مع أعلام ACK و RST مضبوطة (استجابة نموذجية لمنفذ مغلق وفقًا لـ RFC793).
إذا قمنا بمسح منفذ مفتوح، فلن نحصل على رد (ما لم يكن جدار الحماية يزور الردود).
يمكن إجراء أنواع أخرى من مسوحات TCP بالقياس.
مسح TCP NULL:
cat arp.cache | sx tcp null --json -p 23 192.168.0.171
مسح TCP Xmas:
cat arp.cache | sx tcp xmas --json -p 23 192.168.0.171
من الممكن إرسال حزم TCP بأعلام TCP مخصصة باستخدام خيار --flags.
دعنا نرسل حزمة TCP مع أعلام SYN و FIN و ACK مضبوطة لبصمة نظام التشغيل البعيد:
cat arp.cache | sx tcp --flags syn,fin,ack --json -p 23 192.168.0.171
لن تستجيب Windows و MacOS لهذه الحزمة، لكن Linux سيرسل حزمة رد مع علامة RST.
الوسائط الممكنة لخيار --flags:
syn - علم SYNack - علم ACKfin - علم FINrst - علم RSTpsh - علم PSHurg - علم URGece - علم ECEcwr - علم CWRns - علم NSيمكن أن يساعد sx في التحقق من منافذ UDP المفتوحة. يستغل مسح UDP القسم 4.1.3.1 من RFC1122:
إذا وصلت رزمة بيانات موجهة إلى منفذ UDP لا يوجد له استدعاء LISTEN معلق، فيجب على UDP إرسال رسالة ICMP Port Unreachable.
على غرار مسوحات TCP، يعيد sx معلومات حول جميع حزم ICMP الردية لمسح UDP. تحتوي المعلومات على عنوان IP ونوع حزمة ICMP والرمز المضبوط في حزمة الرد.
على سبيل المثال، لاكتشاف خادم DNS على مضيف، قم بتشغيل:
cat arp.cache | sx udp --json -p 53 192.168.0.171
مثال على الإخراج:
{"scan":"udp","ip":"192.168.0.171","icmp":{"type":3,"code":3}}
في هذه الحالة نكتشف أن المضيف أرسل حزمة رد ICMP بنوع Destination Unreachable ورمز Port Unreachable (استجابة نموذجية لمنفذ مغلق وفقًا لـ RFC1122).
عادةً ما تقوم جدران الحماية بتعيين رمز ICMP مختلف عن Port Unreachable وبالتالي يمكن اكتشافها بسهولة.
في بعض الأحيان تحتاج إلى الحد من السرعة التي يتم بها إرسال الحزم المُنشأة. يمكن القيام بذلك باستخدام خيار --rate.
على سبيل المثال، للحد من السرعة إلى حزمة واحدة كل 5 ثوانٍ:
cat arp.cache | sx tcp --rate 1/5s --json -p 22,80,443 192.168.0.171
في بعض الأحيان تحتاج إلى استبعاد بعض عناوين IP والشبكات الفرعية من المسح. يمكن القيام بذلك باستخدام خيار --exclude. يحدد ملفًا يحتوي على عناوين IP أو شبكات فرعية بترميز CIDR لاستبعادها، سطر واحد لكل منها.
على سبيل المثال، لاستبعاد عناوين RFC 1918، أنشئ ملفًا ips.txt بالمحتوى التالي:
10.0.0.0/8
172.16.0.0/16
192.168.0.0/16
يمكنك أيضًا إدراج تعليقات وأسطر فارغة:
# استبعاد عناوين RFC 1918
10.0.0.0/8 # تعليق 1
172.16.0.0/12 # تعليق 2
192.168.0.0/16 # تعليق 3
0.0.0.0/8 # تستخدم في إجراءات التهيئة (RFC 6890)
# استبعاد عناوين RFC 5735
127.0.0.0/8 # عنوان الاسترجاع
192.0.0.0/24 # كتلة محجوزة لتعيينات بروتوكول IETF
224.0.0.0/4 # مخصصة للاستخدام في تعيينات عناوين IPv4 المتعددة
240.0.0.0/4 # محجوزة للاستخدام المستقبلي
# استبعاد شبكة Amazon
3.0.0.0/8
# عناوين IP صالحة أيضًا
1.1.1.1
وقم بتشغيل مسح مع خيار --exclude ips.txt.
كمثال على تكوين المسح، يمكنك الجمع بين مسح ARP و TCP SYN لإنشاء ماسح منفذ TCP حي يمسح شبكة LAN بأكملها بشكل دوري.
ابدأ مسح ARP الحي واحفظ النتائج في ملف arp.cache:
sx arp 192.168.0.1/24 --live 10s --json | tee arp.cache
في محطة طرفية أخرى، ابدأ مسح TCP SYN:
while true; do sx tcp -p 1-65535 -a arp.cache -f arp.cache; sleep 30; done
يمكن لـ sx اكتشاف وكلاء SOCKS5 النشطين. للمسح، يجب عليك تحديد نطاق IP أو ملف JSONL بأزواج ip/port.
على سبيل المثال، مسح نطاق IP:
sx socks -p 1080 10.0.0.1/16
مسح أزواج ip/port من ملف بمخرجات JSON:
sx socks --json -f ip_ports_file.jsonl
كل سطر من ملف الإدخال هو سلسلة JSON، يجب أن تحتوي على حقلي ip و port.
ملف إدخال مثال:
{"ip":"10.0.1.1","port":1080}
{"ip":"10.0.2.2","port":1081}
يمكنك أيضًا تحديد نطاق من المنافذ لمسحها:
sx socks -p 1080-4567 -f ips_file.jsonl
في هذه الحالة، سيتم أخذ عناوين IP فقط من الملف ولم يعد حقل port ضروريًا.
sx help
المساهمات والمشكلات وطلبات الميزات مرحب بها.
الشعار من تصميم mikhailtsoy.com
هذا المشروع مرخص بموجب رخصة MIT. راجع ملف LICENSE للحصول على النص الكامل للترخيص.