• 0
HGB

ما معنى Syn Flood

سؤال

22 : syn_attacks

عند بدأ أي جلسة إتصال بإستخدام TCP/IP فإن العملية تسمى ب TCP/IP handshaking وهي تتم كالتالي :

1. يرسل الجهاز client رسالة إتصال syn للجهاز البعيد .

2. يرد الجهاز البعيد ب syn_ack على ال client إن كان المنفذ المراد الإتصال به مفتوح .وإلا يرد ب RST .

3. تبدأ الجلسة الفعلية لبدأ نقل البيانات بأن يرسل بعد ذلك client رسالة ack للجهاز البعيد .

الآن لإستغلال عملية الإتصال الطبيعية هذه في شن هجوم على جهاز بعيد يجب أن نعرف أنه عند بدأ إتصال جديد مع السيرفر فإن السيرفر يقوم بإضافة مدخل syn بإسم ip الجهاز client الذي أرسل إشارة syn ليستطيع متابعة تسلسل عملية الإتصال . عندما تتم الإضافة يتم تخصيص جزء من موارد السيرفر لإستقبال وإتمام هذه العملية .

يتم تخصيص جزء من الذاكرة يسمى ب backlog مخصص فقط لتضاف إليه طلبات syn الجديدة وستظهر على شكل SYN_RECV من netstat


# netstat -n | grep SYN_RECV

tcp 0 0 10.100.0.200:21 237.177.154.8:25882 SYN_RECV -

tcp 0 0 10.100.0.200:21 236.15.133.204:2577 SYN_RECV -

tcp 0 0 10.100.0.200:21 127.160.6.129:51748 SYN_RECV -

tcp 0 0 10.100.0.200:21 230.220.13.25:47393 SYN_RECV -

tcp 0 0 10.100.0.200:21 227.200.204.182:60427 SYN_RECV -

tcp 0 0 10.100.0.200:21 232.115.18.38:278 SYN_RECV -

tcp 0 0 10.100.0.200:21 229.116.95.96:5122 SYN_RECV -

tcp 0 0 10.100.0.200:21 236.219.139.207:49162 SYN_RECV -

tcp 0 0 10.100.0.200:21 238.100.72.228:37899 SYN_RECV -

لو قمنا بإرسال طلبات SYN كثيرة للسيرفر فإنها كافية لعمل flood لملأ ال backlog مما يشكل هجوم DOS بحيث لايستطيع السيرفر إستقبال أي إتصال حقيقي جديد . حيث أن عمليات syn attack في الحقيقة ليست three way handshaking والتي تسمى أيضا ب full-open tcp/ip connection , وإنما هجوم syn يعتمد على أن لانكمل الإتصال الحقيقي الكامل وأن لانرد على syn_ack المرسلة من السيرفر أساسا .

إن لم يصل للسيرفر رد على syn_ack التي قام بإرسالها لل client برد ack صحيح يتم حذف مدخل syn من السيرفر بعد مرور 3 دقائق " في سيرفرات linux - بشكل إفتراضي" حيث سيحاول فيها أن يعاود إرسال syn_ack خمس مرات لل client عسى أن يجد رد ack لإكمال الإتصال .

الآن syn_flood سهل التحقيق ونحتاج أن نعرف شيء واحد إضافي , ماحجم ال backlog ؟ القيمة الإفراضية ل backlog في linux هي 1024 مما يعني تخزين 1024 جلسة إتصال غير مكتملة وبعدها سيبدأ السيرفر بعمل DORP لكل syn إضافي قادم !

بالتالي لتشكيل هجوم syn flood يجب أن نقوم بعمل ip spoofing وإرسال كمية syn packets كبيرة لتشكيل الإتصال الأولي , و syn packet يتم إنشاءها بالطبع بشكل إفتراضي من جميع البرامج التي تعمل على بروتكول tcp/ip بدأ من المتصفحات وكل البرامج التي تعتمد على الإنترنت وغيرها الكثير .

syn packet يتم إنشاءها بعمل set ل syn flag في TCP Header وتوجد 8 flags كما هو واضح في الصورة :

post-19273-1224097001_thumb.jpg

توجد عدة أدوات في open source تنفذ أمور كثيرة جدا وإحدى الأدوات التي من خلالها تستطيع إنشاء packet بالشكل الذي تريده وبكل التفاصيل في كل six layers هي الأداة hping مثلا :


hping -S 10.10.10.1 --fast -p DEST_PORT

هنا -S تعني إعمل على syn flag و --fast أرسل 10 packets في الثانية , -p المنفذ البعيد لعمل إتصال معه , ووجب أن أذكر أن hping لايقوم بالإتصال بشكل رئيسي ك ICMP وإنما بال TCP/IP بشكل إفتراضي مالم نحدد ذلك .

للوقاية من هذا النوع من الهجمات يوجد طريقين :

الأول : زيادة حجم backlog و تقليل الزمن اللازم لحذف مدخل syn من ال backlog .

لزيادة حجم backlog وعدد syn connections اليتيمة في لنكس يتم الأمر عن طريق sysctl كالتالي :


sysctl -w net.ipv4.tcp_max_syn_backlog = "2048"

ولتقليل الزمن اللازم لحذف طلب الإتصال syn سنحوله من 3 دقائق ليصبح 45 ثانية ويمكن تقليله ل 21 أو 9 ثواني بتعديل القيمة net.ipv4.tcp_synack_retries كالتالي :


sysctl -w net.ipv4.tcp_synack_retries =3

القيم:

1 = 9 ثواني

2 = 21 ثانية

3 = 45 ثانية

5 = 3 دقائق

الآن يمكن للسيرفر أن يتحمل عدد طلبات أكبر وأن ينظف ال backlog بشكل أسرع مما ينعكس على أداء السيرفر أيضا بشكل عام .

الحل الثاني (وهو أبسط) : ويسمى بال syn_cookies

syn_cookies عبارة عن آلية عن طريقها نستطيع أن لانضيف مداخل لل backlog وأن لا نتعامل مع TCP/IP stack إلا لو تحقق full open connection بتحقق :

(syn-->syn_ack-->ack)

لكن هنا السؤال المهم , كيف سنعرف أن ack القادم من client هو رد حقيقي valid ل syn_ack الذي أرسله السيرفر لي ؟ بمعنى آخر كيف أميز ال ack الحقيقي من الآخر spoofed ؟

لمعرفة ذلك يجب أن نراجع نقطة مهمة :

عندما أقول ack valid أو أقول syn_ack valid فهذا يعتمد على قيمتين موجودتين في packet المرسلة تحديدا في بارامتري ACK و sequence ولتحقيق إتصال full حقيقي يجب أن يكون كالتالي :

1. أرسل syn للسيرفر وقيمة عشوائية في sequence نرمز لها ب بحجم لايزيد عن بايتين

2. السيرفر يرد ب syn_ack ويضع قيمة عشوائية أيضا في sequence ويضع في خانة acknowledgement قيمة sequence المرسلة في syn الأول + 1

3. يرد ال client ب قيمة sequence تستسخدم لاحقا في تحديد بقية ال packets في حالة حدوث fragmentation لو كان حجم ال window أكبر منMMS وهو1460 , وأيضا والأهم يضع في ack قيمة seq من ال syn_ack المستلمة + 1

هكذا تكون الجلسة قد بدأت ويمكن بعدها أن يتم تبادل البيانات , الآن من الكلام السابق يمكن وبدون أي تعديل على tcp/ip scheme وبدون أي متابعة ل syn الجديدة وبدون تخزينها في backlog أن نتأكد من صحة ack الأخير القادم بوضع قيمة محسوبة مسبقا في ack عند إرسال syn_ack كالتالي :

عرف :

t = أول 5 بت من ack عداد يزيد واحد كل 64 ثانية

m = الثلاث بت التالية قيمة mms المستلمة من syn packet

s = بقية ال 24 بت من قيمة seq التي ستجهز وترسل ل client ك syn_ack

الآن هذه البارامترات أرسلت في 32bit في خانة seq لل client بالتالي هو سيرد ب ack = seq + 1 أيضا كما تم الإتفاق عليه في ack المرسل الأخير .

ومن هنا يمكن أن نقوم بطرح 1 من القيمة المستلمة في السيرفر وعمل decode للقيم والتحقق من أن الإتصال valid ببساطة وأنه تابع ل valid 3 way handshaking وليس مزور من الخارج . وبعدها يتم نقل البيانات بشكل طبيعي .

كما تلاحظ بدون أن نحجز موارد ل syn وقت الإرسال "بعد إمتلاء backlog" فلن نحجز ونخصص الموارد إلا بعد أن نتأكد من أن المستخدم جاد ويريد تحقيق إتصال لنقل بيانات بالتالي فهجمات syn عقيمة تماما أمام هذا التعديل , ولتحقيقه في linux يكفي فقط وقت بدء تشغيل linux "الإقلاع" أن يتم التعديل على قيمة من قيم kernel وهي في الملف :etc/proc/sys/net/ipv4/tcp_syncookies بجعلها true أي 1 كالتالي :


echo 1 > /etc/proc/sys/net/ipv4/tcp_syncookies

وتضاف لسكربت يعمل وقت start up للسيرفر ك /etc/rc.sysinit أو /etc/rc.local لتكون القيمة الإفتراضية بشكل دائم .

توجد حلول يدعي أصحابها أنها ممكنة التنفيذ بال firewall وتحديدا iptables في Linux لكني لست متأكد منها !

4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

3 إجابة على هذا السؤال .

  • 0

صراحة موضوع رائع اخي هيثم ،،

بارك الله فيك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الله يعطيك العافية

موضووع قوووووي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يعطيك العافية خوي HGB ,,, لكن بعد اذنك ذا تقدر تشرحلنا طريقة عمل Hardening TCP/IP لنظام ليونكس CentOS 5.3 الجديد,,, لانه بصراحة عندي مقاله حولها لكن سنة 2003 واخاف توقف عمل خدمات معينة او تلخبط امور ثانية بلسيرفر,, ذا ماعليك امر

http://www.securityfocus.com/infocus/1729

هذه المقالة الي قصدي عليها,,,

وماقصرت يلغلا.

تحياتي.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .