هجمات حجب الخدمة: SYN Flood والتّصدي لها في لينكس

هجمات حجب الخدمة كما هو واضح من اسمها يسعى فيها المهاجم إلى منع المستخدمين من الوصول إلى موقع أو خدمة ما. هناك أشكال متعدّدة لحجب الخدمة، في هذه المقالة ستناول نوعاً منها وهو SYN flood.

عندما يقوم نظام ما (حاسوب المستخدم المنزلي مثلاً) بالاتصال بنظام آخر طلباً لخدمة ما (مثلاً موقع على الإنترنت)، باستخدام برتوكول TCP فإن نظام المستخدم يقوم بمحاولة إنشاء اتصال مع الموقع (الخادم)، تعرف هذه المحاولة بـ Three HandShake (المصافحة الثلاثيّة إن صحّت التّرجمة 🙂 كما نرى في الشكل التّالي:

اتصال TCP

بعد ACK التي أرساله المستخدم للخادم، يتمّ فتح اتصال بين الاثنين لتبادل المعلومات (مثلاً محتوى صفحة على الإنترنت).

ولكن ما الذي سيحدث لو لم يقم المستخدم بإرسال الـ ACK للخادم؟ هذا يعني أنّ هناك نصف اتصال بين الخادم والمستخدم. ما الذي سيحدث لو قام مستخدم آخر بفتح اتصال؟ وثالث؟ ورابع؟ الخادم يقوم بحفظ معلومات الاتصال الخادم بكل مستخدم في ذاكرته. هذه الذّاكرة محدودة. عدد كبير من أنصاف الاتصال سيملئ ذاكرة الخادم. عندها سيتوقف الخادم عن استقبال اتصالات جديدة، وهو ما يؤدي في النّهاية إلى حجب الخدمة عن الموقع.

ولكن كيف يمكننا أن نقوم بفتح أنصاف اتصال مع الخادم؟

يمكننا القيام بذلك بسهولة إذا قمنا بعملية انتحال للعناوين (IP Spoofing). الخادم يتعامل مع هذا الاتصال على أنّه اتصال حقيقي وبالتّالي يقوم بإرسال SYN-ACK لهذا العنوان المزيّف، ولكنّه لن يحصل في المقابل على ACK المكمّلة للاتصال.

لا بد الآن أن يتسأل المرء، أليس هناك وقت معين يقوم الخادم فيه بالانتظار وبعدها يقوم باغلاق هذا الاتصال، وهذا بدوره سيؤدي على توفر مكان لاتصال جديد؟ أقول لك أنّ كلامك صحيح. ولكن ماذا لو استمر المهاجم بإرسال SYN إلى الخادم من خلال العناين المنتحلة وبوقت أسرع من الوقت الذي ينتظره الخادم؟ عندها سيجد الخادم صعوبة في استقبال اتصالات جديدة وهو ما يؤدي إلى حجب الخدمة في نهاية المطاف.

لنشاهد مثال على ذلك

في هذا المثال سنستخدم scapy، وهي أداة تستخدم في بناء (أو التلاعب) بحزم البروتوكولات.

send(IP(src=RandIP('10.0.0.0/8'), dst='192.168.1.8')/TCP(sport=RandShort(),dport=80),loop=1)

حسب ما هو واضح أعلاه اخترنا الشبكة 10.0.0.0/8 كأساس في العناوين المنتحلة، والضحيّة هو 192.168.1.8 والذي يقدم خدمة عبارة عن موقع ما.

الآن نقوم بالتّسمع على الشبكة عن طريق استخدام tcpdump لنشاهد شكل الحزم الخارجة

كما نشاهد في الصورة أعلاه عيّنة من العناوين المنتحلة والتي تقوم بإسارل SYN إلى الخادم.

لننتقل الآن إلى الخادم لنرى مالذي يحدث هناك

حالة الاتصال على الخادم

كما نشاهد في الشكل أعلاه هناك عدد كبير من انصاف الاتصال ممثلة في الحالة SYN_RECV ساعدتنا في اكتشافها الأداة netstat. بعد فترة قصيرة من انطلاق الهجوم توقف الموقع عن العمل.

الآن وبعد أن شاهدنا الهجوم، لا بدّ أن يكون السؤال المتبادر للأذهان هو كيف نتصدى لهكذا هجوم؟ هناك عدّة حلول تساعدنا في التقليل من آثار هذا الهجوم (لاحظ تقليل وليس التخلص)، نطرح هنا بعض الإعدادات التي يمكن تغيرها في نواة النّظام.
الإعدادات التي ندخلها على النّظام هي:

1- زيادة سعة طابور TCP للاتصال النّصف مفتوحة

يمكن انجاز ذلك عبر تعديل قيمة الطابور  net.ipv4.tcp_max_syn_backlog إلى قيمة أكبر. القيمة الافتراضيّة هي 1024، يمكننا مضاعفتها لغاية 65536.

2- تقليل وقت الانتظار لاكمال اتصال نصف مفتوح

يمكن القيام بذلك عبر تعديل القيمة net.ipv4.tcp_synack_retries إلى 1 حيث أنّ القيمة الافتراضيّة هي 5. كل اتصال يستغرق حوالي 35 ثانية لذلك الوقت الافتراضي هو 180 ثانية.

3- تقليل كعكات TCP

يمكن القيام بذلك عبر تعديل القيمة net.ipv4.tcp_syncookies إلى 1 لتفعيل هذه الخاصيّة. القيمة الافتراضيّة هي 0.

بعض الأبحاث تنصح بعدم تفعيل syncookies كوسيلة للتّصدي لهجمات حجب الخدمة. ولكن من خلال تجربتي في الموضوع وجدّت أنّها أفضل تعديل يمكن أن يؤدي إلى الحدّ من هجوم حجب خدمة SYN flood عند مقارنته بالمتغيّرات الأخرى. فمثلاً بعد رفعي لقيمة backlog إلى الحدّ الأقصى بقي الخادم غير قادر على استقبال اتصالات جديدة وبالتالي تصفح الموقع التجريبي كان متعذراً. تغيير هذه القيمة ساعد فوراً في الحدّ من شدّة الهجوم وهو ما مكنني من تصفح الموقع بدون مشاكل.

ملاحظة: يمكن ترك قيمة ال backlog الافتراضيّة كما هي عند تفيعل syncookies.

في حال اعادة تشغيل النّظام فإنّ التعديلات التي أدخلتها سترجع الى قيمها الإفتراضيّة لذلك لضمان بقاء التعديلات حتى بعد إعادة التشغيل قم بتحديث الملف sysctl.conf والموجود في المجلّد /etc

آخيراً يمكننا وضع قاعدة في الجدار النّاري لتّحكم بعدد الاتصالات القادمة من عنوان معيّن:

iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT

هنا حدّدنا القيمة ب 16 أي اتصال آخر يأتينا من المستخدم سيتم رفضه. مشكلة هذه الطريقة أنّ المستخدم العادي (وليس المهاجم) قد يتأثر بهذا التّحديد.

في هذا المقال تناولنا مثال على إحدى هجمات حجب الخدمة وهو SYN flood وطرق التّصدي له في لينكس. هجمات حجب الخدمة لن يتمّ التخلص منها بشكل نهائي، بل للأسف سيزداد انتشارها وقوّتها مع انتشار الإنترنت وحصول المستخدمين على سرعات عالية في منازلهم. يمكن للمواقع التّصدي لهذا النّوع من الهجمات بإدخال بعض التعديلات على النّظام نفسه، أو من خلال إعدادات الجدار النّاري على النّظام.

نبذة عن الكاتب

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

التعليقات:

أضف تعليقاً | عدد التعليقات: (11)

  1. يقول KING SABRI:

    سلمت يداك يا بشار

    كأنك أعطيتني هدية أحتاجها !! 😀

    تحياتي واحترامي

  2. يقول Hit-Man:

    السلام عليكم أخي
    شكرا لك أخي على المقال
    تحياتي لك أخي بشار

  3. يقول أحمد حسن:

    مشكور بشار على هذة المقالة الرائعة و بصراحة اعجبني جدا طريقة السرد وشرح مفهوم و كيفية حدوث هجمات Syn Flood و ايضا طرحك لبعض طرق للتقيل من هجمات syn عن طريق ظبط اعدادات الـ sysctl و شرح كل من الأعدادات 🙂

    اسمح لي ان اضيف ايضا انه يمكن استخدام الـ iptables في التصدى لمثل هذا النوع من الهجمات مصاحبا مع اعدادات sysctl للحصول على نتائج أفضل .

    1) اولا التأكد من انه الإتصلات القادمة للخادم هي غير مشبوه و تحمل syn و الا نقوم برفضها :

    iptables -A INPUT -p tcp ! –syn -m state –state NEW -j DROP

    2) حجب لأي اتصلات قادمة تحمل Packet Fragmentation

    iptables -A INPUT -f -j DROP

    3) حجب لأي malformed XMAS packets و رفضها :

    iptables -A INPUT -p tcp –tcp-flags ALL ALL -j DROP

    4) ايضا حجبmalformed null packets

    iptables -A INPIT -p tcp –tcp-flags ALL NONE -j DROP

    حجب invaild syn packets بإستخدام tcp flags

    iptables -A INPUT -p tcp –tcp-flags ALL ACK,RST,SYN,FIN -j DROP
    iptables -A INPUT -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP
    iptables -A INPUT -p tcp –tcp-flags SYN,RST SYN,RST -j DROP

    انشاء chain مثلا بأسم syn-attack و نقوم بتحديد عدد معين لطلبات syn القادمة من كل اتصال في خلال الثانية الواحدة مثلا استقابل 3 طلبات حد اقصى 3 / ثانية :

    iptables -N syn-attack
    iptables -A INPUT -p tcp –syn -j syn-attack
    iptables -A syn-attack -m limit –limit 1/s –limit-burst 3 -j RETURN
    iptables -A syn-attack -j DROP

    –limit 1/s : الوقت المحدد للإستقابل syn و هو ثانية
    –limit-burst 3 : الحد الأقصى لـ limit و هو 3

    * يمكنك تغير الإعدادت limit بما يناسب مواصفات الخادم و الnetwork الخاصة بك

    و بصراحة الحديث يطول في هذا الموضوع و تتعدد و تختلف طرق التصدى و التقليل من هجمات المختلفة لحجب الخدمة DDOS و بأذن اللًه تعالى سوف نحاول ان نقوم بتغطية و سلسلة مفصلة لهجمات حجب الخدمة و التصدي لها ان شاء اللًه في مجتمع الحماية 🙂

  4. يقول علي الوشلي:

    الله عليكم حقيقي طرق جدا مهمه
    استفدت الكثير من هذا المقال
    موفق والى الامام
    اتمنى المزيد

  5. يقول ديما:

    شكرا جدا على هذه المعلومات لكن ممكن تفيدونا أكثر بتوضيح أمثلة ارتكبت على ارض الواقع لمثل هذه الجرائم ؟؟

  6. يقول مبتدى:

    السلام عليكم
    مشكورر اخي على الشررح الجميل

    لاكن هل يوجد تصدي لهجمات فلود على المودم <UDP flood

    وشكراً

  7. يقول mezahost:

    السلام عليكم ورحمة الله وبركاته
    النوع دا من الهجوم صعب ايقافه حتي بالاعدادات التي ذكرت بالموضوع حتي خدمه الكلاود التي تعتمد علي تشفير الهوست نيم يمكن تخطيها فعملية الايقاف تعتمد علي حجم الهجوم المتعرض اليه فلو كبير فافضل حل انك تقوم بعمل nullrout لاي بي السيرفر والانتظار لحين انتهاء الهجوم

    ولعمل اعداد الحمايه من هذا النوع من الهجمات من خلال ال csf الشهير طبق الاعدادات الاتيه

    SYNFLOOD = “1”

    SYNFLOOD_RATE = “20/s”

    SYNFLOOD_BURST = “5”

    يمكنك تغييرها كما يتوافق معك وخاصه لو كنت تتعرض لهجوم

    معني الاعدادات الي بالاعلي ان الفاير وول سيقوم بحجب اي شخص يقوم بعمل 20 اتصال في الثانيه ان كرره 5 مرات

    واخيرا اثناء الهجوم قم بتفعيل ال PORTFLOOD ايضا

    بالتوفيق

  8. يقول Ali Jassim:

    شرح جميل .. اشكرك على المشاركة لنشر العلم…
    بخصوص الامر في الآيبي تيبل الفايرول لللنكس ..هل ممكن تشرح لنا الاختصارات مثلا
    iptables -p tcp –syn –dport 80 -m connlimit –connlimit-above 16 –connlimit-mask 24 -j REJECT

    -p = بروتوكول
    dport = دستنيشن بورت
    -m = ؟؟
    فيعني هذا الامور نحتاجها ..

أكتب تعليق