يعد الماسح الضوئي للشبكة عنصرًا مهمًا لمسؤول الشبكة بالإضافة إلى اختبار الاختراق. يسمح للمستخدم بتعيين الشبكة للعثور على الأجهزة المتصلة بنفس الشبكة.
في هذا المقال ، سنقوم ببناء ماسح ضوئي بسيط للشبكة باستخدام مكتبة Scapy في Python.إذا لم يكن لديك مكتبة scapy مثبتة ، فراجع الوثائق الرسمية لـ scapy للتثبيت.
أولاً ، سنحتاج إلى استيراد الطرق الأساسية من scapy:
from scapy.all import ARP, Ether, srp
Code language: JavaScript (javascript)
ثانيًا ، سنحتاج إلى تقديم طلب ARP كما هو موضح في الصورة التالية:

سيرسل الماسح الضوئي للشبكة طلب ARP للإشارة إلى من لديه عنوان IP معين ، لنفترض “192.168.1.1” ، سيرد مالك عنوان IP (الهدف) تلقائيًا قائلاً إنه “192.168.1.1” ، مع هذا الرد ، سيتم أيضًا تضمين عنوان MAC في الحزمة ، وهذا يسمح لنا باسترداد عناوين IP و MAC لمستخدمي الشبكة بنجاح في وقت واحد عندما نرسل حزمة بث (إرسال حزمة إلى جميع الأجهزة في الشبكة).
استجابة ARP موضحة في الشكل التالي:

لذا ، دعونا نصنع هذه الحزم:
target_ip = "192.168.1.1/24"
#IP Address for the destination
#create ARP packet
arp = ARP(pdst=target_ip)
#create the Ether broadcast packet
#ff:ff:ff:ff:ff:ff MAC address indicates broadcasting
ether = Ether(dst="ff:ff:ff:ff:ff:ff")
#stack them
packet = ether/arp
Code language: PHP (php)
ملحوظة: إذا لم تكن على دراية بالرمز “/ 24” أو “/ 16” بعد عنوان IP ، فهو في الأساس نطاق IP هنا ، على سبيل المثال “192.168.1.1/24” هو نطاق من “192.168.1.0 “إلى” 192.168.1.255 “، يرجى قراءة المزيد حول CIDR Notation.
الآن قمنا بإنشاء هذه الحزم ، نحتاج إلى إرسالها باستخدام srp() الدالة التي ترسل وتستقبل الحزم في الطبقة 2 ، نقوم بتعيين المهلة على 3 حتى لا يتعثر البرنامج النصي:
result = srp(packet, timeout=3)[0]
النتيجة الآن قائمة أزواج بتنسيق (sent_packet ، Received_packet) ، دعنا نكررها:
# a list of clients, we will fill this in the upcoming loop
clients = []
for sent, received in result:
# for each response, append ip and mac address to `clients` list
clients.append({'ip': received.psrc, 'mac': received.hwsrc})
Code language: PHP (php)
الآن كل ما علينا فعله هو طباعة هذه القائمة التي ملأناها للتو:
# print clients
print("Available devices in the network:")
print("IP" + " "*18+"MAC")
for client in clients:
print("{:16} {}".format(client['ip'], client['mac']))
Code language: PHP (php)
الكود كامل
from scapy.all import ARP, Ether, srp
target_ip = "192.168.1.1/24"
# IP Address for the destination
# create ARP packet
arp = ARP(pdst=target_ip)
# create the Ether broadcast packet
# ff:ff:ff:ff:ff:ff MAC address indicates broadcasting
ether = Ether(dst="ff:ff:ff:ff:ff:ff")
# stack them
packet = ether/arp
result = srp(packet, timeout=3, verbose=0)[0]
# a list of clients, we will fill this in the upcoming loop
clients = []
for sent, received in result:
# for each response, append ip and mac address to `clients` list
clients.append({'ip': received.psrc, 'mac': received.hwsrc})
# print clients
print("Available devices in the network:")
print("IP" + " "*18+"MAC")
for client in clients:
print("{:16} {}".format(client['ip'], client['mac']))
Code language: PHP (php)
فيما يلي لقطة شاشة لنتائجي في شبكتي:
