اختبار الاختراق بلغة البايثون – الجزء الثالث TCP Scanner and Port Scanner
العديد من الشركات تقوم بإيقاف ICMP ECHO reply باستخدام جدار ناري firewall من أجل منع حزم البيانات الخاصة ببرتوكول ICMP
Ping sweep تعمل من خلال إرسال طلب ICPM ECHO request وإستقبال الإجابة ICMP ECHO reply
في مثل هذه الحالة فإن عملية الفحص باستخدام ping sweep لن تعمل ويجب أن نستخدم TCP scan
TCP Scanner:
أنا أفترض أنك على معرفة مسبقة بعملية three-way handshake التي تظهر بالشكل التالي:
من أجل بدأ الاتصال فإن الأجهزة تقوم بعملية three-way handshake :
- المستخدم يرسل SYN ليطلب من السيرفر بدء الجلسلة.
- السيرفر يرد ويرسل ACK and SYN
- المستخدم يرد بإرسال ACK
سنقوم بكتابة برنامج بلغة البايثون ليقوم بعملية TCP Scanner:
TCPscanner.py
الجزء الأول من هذا البرنامج مشابه للبرنامج السابق 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 واحد ونحاول الاتصال من خلال اسنخدام مجال معين من أرقام البورتات والتي يقوم المستخدم بإدخالها وفي حال نجاح الاتصال فهذا يعني أن البورت مفتوح وفي حال فشل الاتصال هذا يعني أن البورت مغلق.
افتح ملف جديد وقم بكتابة الكود البرمجي التالي:
PortScanner.py
في البداية قمنا بعرض رسالة على المستخدم تطلب منه إدخال الحرف ‘ D ‘ إذا كان يريد فحص عنوان دومين أو إدخال الحرف ‘ I ‘ إذا كان يردي فحص عنوان IP
ثم يتم الطلب من المستخدم أن يقوم بإدخال عنوان الدومين أو عنوان IP للجهاز الهدف.
ثم قمنا بتعريف socket ومحاولة الاتصال مع العنوان الهدف عبر مجال البورتات التي يدخلها المستخدم وفي حال نجاح عملية الاتصال سوف يتم طباعة رقم البورت المفتوح والخدمة التي تعمل عليه.
ونتيجة تنفيذ هذا البرنامج على العنوان IP: 192.168.1.1 وهو عنوان gateway في الشبكة لدي:
نتيجة تنفيذ هذا البرنامج على موقع google.com هي:
كما تلاحظ فإن فإن هذا البرنامج قد قام بعملية فحص للبورتات وقام بتحديد البورتات المفتوحة وتحديد الخدمات التي تعمل على هذه البورتات
قمنا بتحديد (socket.defaulttimeout(1 بمقدار ثانية واحدة وهذا يعني أن البرنامج سوف يمضي على الأكثر ثانية واحدة في محاولة الاتصال مع كل بورت، في حال كنت تريد فحص عدد كبير من البورتات يمكنك تقليل هذا الزمن لتتم عملية الفحص الكلية بشكل أسرع.