مقال : إستطلاع الشبكة وجمع المعلومات باستخدام لغة البرمجة Python
أول خطوة في أي عملية اختبار اختراق هي مرحلة الاستطلاع وجمع المعلومات عن الشبكة الهدف لتحديد الأجهزة الموجودة في الشبكة ومعرفة نظام التشغيل المستخدم وتحديد البورتات المفتوحة والخدمات التي تعمل على كل جهاز.
في مرحلة الاستطلاع وجمع المعلومات سوف نقوم بكتابة برامج بلغة البرمجة بايثون للقيام بالأمور التالية:
- إكتشاف الأجهزة الموجودة في الشبكة الهدف باستخدام الأمر ping.
- TCP scanner.
- Port Scanner.
إكتشاف الأجهزة الموجودة في الشبكة:
التعليمة ping تقوم بإرسال طلب ICMP ECHO Request إلى الجهاز الهدف، إذا كان الجهاز يعمل ومتصل بالشبكة بشكل صحيح فسوف يرد بإرسال ICMP RCHO Reply Internet Control Message Protocol – ICMP
كما يظهر في الشكل التالي:
تقنية Ping sweep :
تستخدم لفحص عدد من الأجهزة إذا كانت متصلة بالشبكة وذلك ضمن مجال معين لعناوين IP ومن خلال معرفة subnet and network address يمكن لمختبر الاختراق حساب مجال عناوين IP الخاص بالشبكة الهدف.
لنبدأ بالكود البرمجي التالي:
ونتيجة التنفيذ هي كما يلي :
كما تلاحظ فإن هذا البرنامج البسيط هو تنفيذ لتعليمة 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 قم بفتح ملف جديد ثم قم بكتابة الكود التالي:
في البداية قمنا باستيراد 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 scan :
تقنية Ping sweep تعمل من خلال إرسال طلب ICPM ECHO request وإستقبال الإجابة ICMP ECHO reply حيث أن العديد من الشركات تقوم بإيقاف ICMP ECHO reply باستخدام جدار ناري من أجل منع حزم البيانات الخاصة ببرتوكول ICMP وفي مثل هذه الحالة فإن عملية الفحص باستخدام ping sweep لن تعمل ويجب أن نستخدم TCP scan.
لنتعرف على عملية three-way handshake التي تظهر بالشكل التالي :
من أجل بدأ الاتصال فإن الأجهزة تقوم بعملية three-way handshake :
1. المستخدم يرسل SYN ليطلب من السيرفر بدء الجلسلة.
2. السيرفر يرد ويرسل ACK and SYN.
3. المستخدم يرد بإرسال ACK.
سنقوم بكتابة برنامج بلغة البايثون ليقوم بعملية TCP Scan :
الجزء الأول من هذا البرنامج مشابه للبرنامج السابق ping sweep حيث قُمنا بتعريف تابعين ، الأول هو التابع scan والذي يستخدم socket للقيام بمحاولة الاتصال
التعليمة ((result = sock.connect_ex((add,135 تعيد في حال نجاح عملية الاتصال القيمة ‘0’ وفي حال فشل الاتصال تعيد رقم يشير إلى رمز الخطأ، في هذا البرنامج استخدمنا البورت port: 135 (هذا البورت عادةً ما يكون مفتوح في نظام الويندوز).
نتيجة تنفيذ البرنامج هي كما يلي :
كما تلاحظ فإن هذا البرنامج يقوم بعملية فحص لأجهزة ضمن مجال عناوين IP التي يدخلها المستخدم ويعيد عناوين الأجهزة المتصلة بالشبكة.
تحديد الخدمات التي تعمل على الجهاز الهدف :
الآن وبعد أن تمكنا من تحديد الأجهزة الموجودة في الشبكة الهدف سوف نقوم بتحديد الخدمات التي تعمل على كل جهاز، طبعاً الخدمات التي تعمل باستخدام الشبكة. الخدمات التي تعمل باستخدام الشبكة يجب أن تقوم بفتح بورت port ومن رقم البورت المفتوح يمكننا معرفة الخدمة التي تعمل على الجهاز الهدف.
لنفترض أن جهازك مصاب ببرمجية خبيثة من نوع حصان طروادة Trojan والتي تقوم بتسجيل كل حرف تقوم بكاتبه وترسلها بشكل سري إلى المهاجم أو أنها تقوم بفتح اتصال مخفي بين جهازك وجهاز المهاجم.
في هذه الحالة فإن عملية فحص البورتات سوف تساعدك على اكتشاف الخدمات التي تعمل في جهازك وبدون معرفتك.
البورتات لها الأرقام ضمن المجال 0 – 65536 والبورتات الأكثر استخداماً هي ضمن المجال 0 – 1023 (وهي البورتات المستخدمة من قبل النظام).
برنامج Port scanner :
في البرنامج السابق TCP scanner استخدمنا البورت port: 135 للقيام بعملية الاتصال من خلاله في هذا البرنامج سوف نأخذ عنون IP واحد ونحاول الاتصال من خلال استخدام مجال معين من البورتات والتي يقوم المستخدم بتحديده وفي حال نجاح الاتصال فهذا يعني أن البورت مفتوح وفي حال فشل الاتصال هذا يعني أن البورت مغلق.
افتح ملف جديد وقم بكتابة الكود البرمجي التالي :
في البداية قمنا بعرض رسالة على المستخدم تطلب منه إدخال الحرف ‘ D ‘ إذا كان يريد فحص عنوان دومين أو إدخال الحرف ‘ I ‘ إذا كان يردي فحص عنوان IP ثم يتم الطلب من المستخدم أن يقوم بإدخال عنوان الدومين أو عنوان IP للجهاز الهدف.
ثم قمنا بتعريف socket ومحاولة الاتصال مع العنوان الهدف عبر مجال البورتات التي يدخلها المستخدم وفي حال نجاح عملية الاتصال سوف يتم طباعة رقم البورت المفتوح والخدمة التي تعمل عليه.
ونتيجة تنفيذ هذا البرنامج على العنوان IP: 192.168.1.1 وهو عنوان gateway في الشبكة لدي :
نتيجة تنفيذ هذا البرنامج على موقع google.com هي:
كما تلاحظ فإن هذا البرنامج قد قام بعملية فحص للبورتات وقام بتحديد البورتات المفتوحة وتحديد الخدمات التي تعمل على هذه البورتات قمنا بتحديد (socket.defaulttimeout(1 بمقدار ثانية واحدة وهذا يعني أن البرنامج سوف يمضي على الأكثر ثانية واحدة في محاولة الاتصال مع كل بورت، في حال كنت تريد فحص عدد كبير من البورتات يمكنك تقليل هذا الزمن لتتم عملية الفحص الكلية بشكل أسرع.
thanks for this course, good lick
u
جميل
مقال جميل
بس عندي استفسار اذا ممكن !!
أين يتم تنفيذ هذه البرامج (الأكواد) ؟؟
الرجاء الرد على الإميل
chokran
منووو