اختبار الاختراق بلغة البايثون – الجزء الثاني Ping Sweep
الاستطلاع وجمع المعلومات عن الشبكة الهدف:
أول خطوة في أي عملية اختبار اختراق هي مرحلة الاستطلاع وجمع المعلومات عن الشبكة الهدف لتحديد الأجهزة الموجودة في الشبكة ومعرفة نظام التشغيل المستخدم وتحديد البورتات المفتوحة والخدمات التي تعمل على كل جهاز.
في مرحلة الاستطلاع وجمع المعلومات سوف نقوم بكتابة برامج بلغة البرمجة بايثون للقيام بالأمور التالية:
- تحديد الأجهزة الموجودة في الشبكة الهدف.
- تعليمة ping
- TCP scanner
- IP scanner
- Port scanner
أنا افترض أنك على معرفة مسبقة بأساسيات TCP/IP layer
المصطلح (Protocol Data Unit (PDU هو مصطلح عام ويمثل الأمور التالية:
- في application layer فإن PUD يستخدم للإشارة إلى البيانات data
- في transport layer فإن PUD يستخدم للإشارة إلى segment
- في Internet layer فإن PUD يستخدم للإشارة إلى حزم البيانات packet
- في data link layer or network access layer فإن PUD يستخدم للإشارة إلى frame
- في physical layer فإن PUD يستخدم للإشارة إلى Bits
التعليمة ping تقوم بإرسال طلب ICMP ECHO Request إلى الجهاز الهدف، إذا كان الجهاز يعمل ومتصل بالشبكة بشكل صحيح فسوف يرد بإرسال ICMP RCHO Reply
(Internet Control Message Protocol (ICMP
كما يظهر في الشكل التالي:
Ping sweep:
تستخدم لفحص عدد من الأجهزة إذا كانت متصلة بالشبكة وذلك ضمن مجال معين لعناوين IP ومن خلال معرفة subnet and network address يمكن لمختبر الاختراق حساب مجال عناوين IP الخاص بالشبكة الهدف.
لنبدأ بالبرنامج التالي:
ونتيجة التنفيذ هي التالي:
كما تلاحظ فإن هذا البرنامج البسيط هو تنفيذ لتعليمة ping على العنوان الشبكي IP:192.168.1.1
في البداية قمنا باستيراد OS module لكي نستطيع تنفيذ تعليمات نظام التشغيل
في السطر الثاني استخدمنا التعليمة (‘os.popen(‘ping 1 192.168.1.1 والتي تقوم بأخذ التعليمة التي تمرر إليها بشكل سلسلة نصية وتعيد نتيجة تنفيذ هذه التعليمة.
في نظام الويندوز فإن التعليمة ” ping 192.168.1.1 ” تقوم بإرسال طلب ICMP ECHO request إلى الجهاز الهدف
الطريقة ()popen تقوم بإعادة قيمة عبارة عن file object وهي نتيجة تنفيذ التعليمة ping
نتيجة تنفيذ التعليمة ping سوف يتم حفظه في المتغير response
قمنا باستخدام حلقة for والتابع ()readlines من أجل قراءة ملف الخرج file object (الذي يحوي على نتيجة تنفيذ التعليمة ping)
سوف نقوم بتوسيع العملية السابقة وكتابة برنامج بلغة البايثون يقوم بفحص مجال معين من عناوين IP
قم بفتح ملف جديد ثم قم بكتابة الكود التالي:
في البداية قمنا باستيراد OS module لنتمكن من استدعاء تعليمات نظام التشغيل.
وقمنا باستيراد datetime لنتمكن من استدعاء التعليمة التي تحدد الزمن الحالي.
التابع raw_input يقوم بعرض الرسالة الممرة له وينتظر المستخدم ليقوم بإدخال قيمة ليتم حفظها في المتغير net
(الطلب من المستخدم إدخال عنوان IP للشبكة الهدف)
الطريقة النصية ()split تقوم بفصل عنوان IP إلى أربع أجزاء
المتغير net2 سوف يحوي على الأجزاء الثلاثة الأولى من عنوان IP ( مثلاً .192.168.1)
التابع raw_input سوف يعرض رسالة على المستخدم يطلب منه إدخال قيمة عدد لتحديد بداية المجال ليتم حفظه في المتغير st1
وبنفس الطريقة يتم الطلب من المستخدم إدخال قيمة عدد لتحديد نهاية المجال ويتم حفظه في المتغير en1
في حال كنت تستخدم نظام ويندوز فالتعليمة ” ping -n 1 ” تقوم بإرسال حزمة بيانات لمرة واحدة أما إذا كنت تستخدم نظام لينكس فيجب استخدام التعليمة ” ping -c 1 ”
قمنا باستدعاء ()datetime.now لحفظ قيمة الوقت الحالي قبل البدء بعملية الفحص في المتغير t1 وبعد الانتهاء من عملية الفحص قمنا بحفظ قيمة الزمن الحالي في المتغير t2 ومن ثم قمنا بحساب الفرق لمعرفة المدة التي استمرت فيها عملية الفحص.
استخدمنا حلقة for للمرور على عناوين IP ضمن المجال [st1,en1]
التعليمة (addr = net2 + str(ip تخلق عنوان IP كامل ومن ثم استخدامنا هذا العنوان مع تعليمة ping من أجل خلق تعليمة كاملة يتم تمريرها إلى ()popen
التعليمة ((if (line.count(“TTL” تقوم بفحص خرج تعليمة ping لترى فيما إذا كان يحوي على TTL وإذا كانت هذه القيمة موجودة يتم طباعة عنوان IP وعبارة Live لتحديد أن الجهاز متصل بالشبكة
نتيجة تنفيذ هذا البرانامج :
كما تلاحظ فإن هذا البرنامج يمكنه القيام بعملية فحص لأي مجال من عناوين IP ويعيد عناوين الأجهزة المتصلة بالشبكة والمدة الزمنية التي تمت فيها عملية الفحص.
في المقال القادم سوف نتعمق بشكل أكبر وسوف نقوم بكتابة برنامج TCP Scanner وبرنامج Port Scanner لتحديد المنافذ المفتوحة والخدمات التي تعمل على الجهاز الهدف