إلتقاط حزم الشبكات على انظمة الويندوز واللينكس

الوصول الى مقابس الخام  على أنظمة الويندوز مختلف قليلا عن انظمة اللينكس ولكننا سنحاول برمجة اداة بسيطة قادرة على القيام بعملية شم حزمة واحدة  على كل من المنصتين السابقتين ، سنقوم بإنشاء كائن مقبس ثم نقوم بتحديد النظام الذي تم تشغيل الأداة عليه ، أنظمة الويندوز تطلب منا تعيين بعض الأعلام الإضافية على مقبس التحكم في الإدخال والإخراج والتي تقوم بتفعيل الوضع اللاأخلاقي (هو وضع يسمح لواجهة الشبكة بإلتقاط البيانات حتى لو كانت موجهة الى عنوان اخر ) .

الوضع اللاأخلاقي أو Promiscuous mode

في الوضع العادي عندما تستقبل واجهة الشبكة لجهازك رسالة ما فانها تتحقق من عنوان المستقبل فإذا كانت تتطابق مع عنوان جهازك فانها تستقبلها وتقوم بالرد في حالة TCP/IP أما إذا كان عنوان المستقبل لا يتطابق مع عنوان جهازك فستقوم بإهمال الرسالة وكفى،ولكن في حالة الوضع اللاأخلاقي فإن واجهة الشبكة لن تقوم بإهمال أي رسالة بل العكس ستستقبل جميع البيانات المارة عبرها .


import socket
import os
#عنوان الجهاز الذي سنلتقط مه
host = "192.168.1.102"
#إنشاء المقبس الخام
if os.name == "nt":
    socket_protocol = socket.IPPROTO_IP
else:
    socket_protocol = socket.IPPROTO_ICMP

sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW
          ,socket_protocol)
sniffer.bind((host, 0))
#ضم رأس الأيبي الى محتوى الشم
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# تفعيل وضع اللاأخلاقي
if os.name == "nt":
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
# قراءة حزمة واحدة
print sniffer.recvfrom(65565)
# في حالة إستعمال الويندوز إيقاف وضع اللاأخلاقي
if os.name == "nt":
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

في البداية قمنا بإنشاء مقبس مع الإعدادات المناسبة لإلتقاط البيانات على واجهة الشبكة


if os.name == "nt":
    socket_protocol = socket.IPPROTO_IP
else:
    socket_protocol = socket.IPPROTO_ICMP
sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW,
          socket_protocol)
sniffer.bind((host, 0))

الفرق نظام لينكس و ويندوز هو ان ويندوز يسمح لنا بإلتقاط جميع البيانات الواردة بغض النظر عن نوع البروتوكول اما لينكس فهو يجبرنا على تحديد نوع البروتوكول الذي نريد إلتقاطه وفي حالتنا هذه قمنا بإختيار بروتوكول ICMP.


socket_protocol=socket.IPPROTO_IP #ويندوز

socket_protocol=socket.IPPROTO_ICMP #لينكس

كما أن عملية تفعيل الوضع اللاأخلاقي تتطلب صلاحية المدير على الوندوز و صلاحية الروت على اللينكس.

بعد ذلك قمنا بتعيين خاصية المقبس التي تقوم بضم رأس برتوكول IP الى الحزمة الملتقطة

sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

الخطوة الموالية تحديد ما إذا كنا نستخدم نظام ويندوز وفي هذه الحالة نقوم بتعيين بعض الإضافات وهي إرسال خاصية التحكم في الإدخال والأخراج الى درايفر بطاقة الشبكة حتى يمكننا من تفعيل الوضع اللاأخلاقي.

if os.name == "nt":
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

الأن نحن جاهزون لبدأ عملية الشم وإلتقاط البيانات وسنقوم بعرض النتائج من دون فك الحزمة وسنتركها في موضوع أخر حتى نفهم العملية أكثر .
واريد أن أنوه أن برنامجنا هذا يقوم بإلتقاط حزمة واحدة فقط ويغلق البرنامج وهذا للتجريب فقط وطبعا يمكنك زيادة عدد الحزم على حسب الحاجة .
بعد حفظ الملف بإسم sniffer.py نتوجه الى سطر الاوامر وقم بتشغيل الأمر التالي :

python sniffer.py

بعد ذلك قم بفتح نافذة جديدة من سطر الاوامر وأكتب الأمر التالي :

ping www.google.dz

بعد تنفيذك لهذا الأمر توجه الى النافذة الاولى من سطر الأوامر وستلاحظ بعض البيانات المشوهة :

('E\x00\x00T\x00\x00\x00\x004\x01\x18\xfd\xd8:\xd3c\xc0\xa8\x01f\x00\x00\x84
{(\xbe\x00\x01l\x7f\xdcU\x12\xed\x0c\x00\x08\t\n\x0b\x0c\r\x0e\x0f\x
10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f
 !"#$%&\'()*+,-./01234567',('216.58.211.99', 0))

وكما لاحظت لقد قمنا بإلتقاط حزمة بروتوكول ICMP ولكنها مشوهة ولا يمكن قراءتها وهذا ما سنكتشفه في المرة القادمة وسنتعلم كيفية إضافة حزم أخرى للإلتقاط بدلا من حزمة واجدة

 

أرجوا أن تقوم بدعمنا عبر نشرك والاعجاب بالموقع

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Post Navigation