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

firewall-computers-final

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

  • إكتشاف الأجهزة الموجودة في الشبكة الهدف باستخدام الأمر ping.
  • TCP scanner.
  • Port Scanner.

إكتشاف الأجهزة الموجودة في الشبكة:

التعليمة ping تقوم بإرسال طلب ICMP ECHO Request إلى الجهاز الهدف، إذا كان الجهاز يعمل ومتصل بالشبكة بشكل صحيح فسوف يرد بإرسال ICMP RCHO Reply Internet Control Message Protocol  – ICMP

كما يظهر في الشكل التالي:

ping-request

تقنية Ping sweep :

تستخدم لفحص عدد من الأجهزة إذا كانت متصلة بالشبكة وذلك ضمن مجال معين لعناوين IP ومن خلال معرفة subnet and network address يمكن لمختبر الاختراق حساب مجال عناوين IP الخاص بالشبكة الهدف.

لنبدأ بالكود البرمجي التالي:

ping-sweep-code1

 

ونتيجة التنفيذ هي كما يلي :

ping-sweep-result

كما تلاحظ فإن هذا البرنامج البسيط هو تنفيذ لتعليمة ping على العنوان الشبكي 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 قم بفتح ملف جديد ثم قم بكتابة الكود التالي:

ping-sweep-code

في البداية قمنا باستيراد 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 لتحديد أن الجهاز متصل بالشبكة نتيجة تنفيذ هذا البرانامج :

ping-sweep-result-final

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

تقنية TCP scan : 

تقنية Ping sweep تعمل من خلال إرسال طلب ICPM ECHO request وإستقبال الإجابة ICMP ECHO reply حيث أن العديد من الشركات تقوم بإيقاف ICMP ECHO reply باستخدام جدار ناري من أجل منع حزم البيانات الخاصة ببرتوكول ICMP وفي مثل هذه الحالة فإن عملية الفحص باستخدام ping sweep لن تعمل ويجب أن نستخدم TCP scan.

لنتعرف على عملية three-way handshake التي تظهر بالشكل التالي :

three-way-handshake

من أجل بدأ الاتصال فإن الأجهزة تقوم بعملية three-way handshake :

1. المستخدم يرسل SYN ليطلب من السيرفر بدء الجلسلة.

2. السيرفر يرد ويرسل ACK and SYN.

3. المستخدم يرد بإرسال ACK.

سنقوم بكتابة برنامج بلغة البايثون ليقوم بعملية TCP Scan :

tcp-scan-code

الجزء الأول من هذا البرنامج مشابه للبرنامج السابق ping sweep حيث قُمنا بتعريف تابعين ، الأول هو التابع scan والذي يستخدم socket للقيام بمحاولة الاتصال

التعليمة ((result = sock.connect_ex((add,135 تعيد في حال نجاح عملية الاتصال القيمة ‘0’ وفي حال فشل الاتصال تعيد رقم يشير إلى رمز الخطأ، في هذا البرنامج استخدمنا البورت port: 135 (هذا البورت عادةً ما يكون مفتوح في نظام الويندوز).

نتيجة تنفيذ البرنامج هي كما يلي :

tcp-scan-result

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

تحديد الخدمات التي تعمل على الجهاز الهدف :

الآن وبعد أن تمكنا من تحديد الأجهزة الموجودة في الشبكة الهدف سوف نقوم بتحديد الخدمات التي تعمل على كل جهاز، طبعاً الخدمات التي تعمل باستخدام الشبكة. الخدمات التي تعمل باستخدام الشبكة يجب أن تقوم بفتح بورت port ومن رقم البورت المفتوح يمكننا معرفة الخدمة التي تعمل على الجهاز الهدف.

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

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

البورتات لها الأرقام ضمن المجال 0 – 65536 والبورتات الأكثر استخداماً هي ضمن المجال 0 – 1023 (وهي البورتات المستخدمة من قبل النظام).

برنامج Port scanner :

في البرنامج السابق TCP scanner استخدمنا البورت port: 135 للقيام بعملية الاتصال من خلاله في هذا البرنامج سوف نأخذ عنون IP واحد ونحاول الاتصال من خلال استخدام مجال معين من البورتات والتي يقوم المستخدم بتحديده وفي حال نجاح الاتصال فهذا يعني أن البورت مفتوح وفي حال فشل الاتصال هذا يعني أن البورت مغلق.

افتح ملف جديد وقم بكتابة الكود البرمجي التالي :

port-scanner-code

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

ثم قمنا بتعريف socket ومحاولة الاتصال مع العنوان الهدف عبر مجال البورتات التي يدخلها المستخدم وفي حال نجاح عملية الاتصال سوف يتم طباعة رقم البورت المفتوح والخدمة التي تعمل عليه.

ونتيجة تنفيذ هذا البرنامج على العنوان IP: 192.168.1.1 وهو عنوان gateway في الشبكة لدي :

port-scanner-result

نتيجة تنفيذ هذا البرنامج على موقع google.com هي:

google-port-scanner

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