مقال : مدخل الى ثغرات الفيض Buffer Overflow
السلام عليكم
نستعرض اليوم اساسيات مهمة لثغرات الفيض Buffer Overflow ونوضح استخدامتها ومدى خطورتها وطرق استغلالها.
تحدث ثغرات الفيض Buffer Overflow عندما يتم كتابة بيانات زائدة فى البفر اكثر مما ينبغى وتحدث نتيجة عدم التحقق من مدخلات المستخدم الذى استطاع ان يضيف بيانات اكثر مما يحمله البفر. اكثر تعريف مبسط لهذه الثغرة هو انه عندما تملىء كوب ماء عن اخره فيحدث فيض للماء خارج الكوب .
هذه الثغرة تلزم معرفة بلغة السى ولغة الأسمبلى .
البفر buffer هو جزء من الذاكرة لحمل البيانات بشكل مؤقت وله حجم ثابت.
الهيب heap هو جزء من الذاكرة وحجمه يتغير بحسب متطلبات وعمليات البرنامج.
الستاك “المكدس” stack هو جزء من الذاكرة والتى تستخدمه دوال البرنامج .PUSH تضيف بيانات الى stack .وPOP تحذف بيانات من stack.
مثال مبسط لتوضيح الفكرة “لاحظ الكود التالى” :
المصفوفة buffer تتكون من 10 بايت .عندما نريد اضافة اى بيانات ف index لدينا من صفر الى 9 .لكننا استخدمنا 10 من اجل اضافة القيمة i فيحدث الفيض فالمصوفة فاضت عن حجمها الطبيعى .
لنوضح اكثر “لاحظ الكود التالى” :
سنملىء المصفوفة buffer بما يزيد عن حجمها الطبيعى لذا استخدمنا الدالة srtcpy لإضافة هذه السلسلة النصية Buffer Overflow isecur1ty وبالطبع حجمها اكبر من حجم المصفوفة وبالتالى سيحدث خطأ فى الذاكرة ويتوقف البرنامج لحدوث crash.
خطورة ثغرات الفيض Buffer Overflow :
ثغرات الفيض تسبب توقف البرنامج وتقوم بتنفيذ اكواد خبيثة “shell code” خارج نطاق اكواد البرنامج مما تسبب الحصول على صلاحيات اعلى او الإختراق الكامل.
تستخدم ايضا فى هجمات حرمان الخدمة dos attack على المواقع.
انواع ثغرات الفيض Buffer Overflow :
Stack Overflow
Heap Overflow
Format String Overflow
منها اللوكال local داخل الشبكة المحلية او سيرفر لك صلاحيات عليه
ومنها الريموت remote خارج الشبكة وفيه يتم الإختراق عن طريق ip وله شروط اخرى.
لإستغلال ثغرات الفيض سنحتاج اولا: الى شيل كود والذى سيتم تشغيله بجهاز الهدف وتنفيذ ما فيه اوامر وتانى تكون غالبا اختراق الهدف .يمكن ان تكتب الشيل كود بنفسك لكنه عملية معقدة وتحتاج خبرة او يمكنك تكوين شيل كود من خلال مشروع الميتاسبلويت وهذه هى الطريقة الأسهل والأنسب للمبتدئين.
ثانيا:سنحتاج تحديد المكان اللازم لحقن الشيل كود وذلك عن طريق استخدام المنقح وليكن مثلا GDB
مثال1 من نوع Stack Overflow
هذا البرنامج يأخذ مدخلات المستخدم ثم يقوم بطباعتها وعرضها
عند تشغيل البرنامج وادخال اقل من 256 بايت يعمل البرنامج ويطبع القيمة المخزنة فى buffer ولكن ماذا اذا كانت القيمة اكبر من 256 بايت :سيظهر الخطأ التالى
يمكنك ان تفتح البرنامج بالمنقح وتكتشف ما المشكلة .
مثال2 من نوع Stack Overflow
برنامج بسيط يطلب الباسود من المستخدم .اذا كان الباسورد هو isecur1ty يعرض لك ان الباسورد صحيح ويمنحك صلاحيات الروت واى باسورد اخر سيعرض لك Wrong Password
لكن لو حجم الباسورد اكبر من حجم buffer سيعرض لك Wrong Password ولكنه سيمنحك صلاحيات كاملة كما لو كنت الأدمن وبدون معرفة لكلمة المرور الصحيحة
وذلك لأن الدالة ()gets مصابة فلا تتحقق من القيم .
اساسيات GDB:
افتح الترمنال واكتب gdb واضغط انتر
اهم الأوامر :
run:لتشغيل البرنامج المراد تنقيحه
quit:لغلق المنقح
break:لعمل نقطة توقف مثلا عن السطر رقم 20 break buffer.c:20
info break:لعرض نقاط التوقف
list :لعرض السورس كود
continue :لإستكمال تشغيل البرنامج
backtrace:لعرض المكدس stack
info registers:لعرض المسجلات registers
help:لعرض الأوامر وشرحها
لمنع ثغرات الفيض :
1/استبدل الدوال التقليدية بدوال امنة
مثلا استخدم ()fgets بدلا من ()gets
و ()strncmp بدلا من ()strcmp
()strncpy بدلا من ()strcpy
2/استخدام ادوات لفحص الكود تلقائيا مثل its4
3/استخدام ادوات لمراقبة العمليات فى الذاكرة مثل valgrind memcheck
4/استخدام اداوت تتحقق من stack مثل StackGuard
الى هنا ينتهى المقال اى استفسار لا تتردد فى السؤال.
السلام
لكن هل تغرة البفر تظهر داخل المصفوفات فقط
وعليكم السلام ..راجع المقال ستجد الإجابة :]
السلام عليكم
مقالة رائعة بفعل
لكن كنت افضل انها اتكون علي هيئة دورة بسيطة تعريف بالاساسيات المتعبة لمعرفة الثغرة و انشاء الشيل كود و عمل اكسبلويت كامله لثغرة
و اتمني منكم فعل ذلك
وشكراً
مع مزيد من التقدم
وعليكم السلام ..سنعمل على ذلك
الله ينور يا حمادة شرح اكثر من رائع ومنسق ,, 😉
ربنا يخليك 😀
شكرا جزيلا لك
هل بإمكانك وضع شرح كيفيه عمل شل كود خاص بك ؟
او القيام بدورة في اوفر فلو ؟
..سنعمل على ذلك
ممكن توضيح كيف الدالة strcmp ممكن تكون ضارة عبر مثال؟
الدالة لا تتحقق من القيم ..راجع اخر مثال
راجع السؤال، |ممكن توضيح كيف الدالة strcmp ممكن تكون ضارة عبر مثال؟|
أنت كتبت: وذلك لأن الدالة ()gets مصابة فلا تتحقق من القيم .
أتكلم عن strcmp :/
بوست اكتر من رآئع احودة
بس كدا انتا زاولتنى بين الهندسة العكسية والبفر لما دخلت فى حتة الـ stack
يعنى انا لو بفهم هندسة عكسية هيبقى ساهل بالنسبالى البفر
او بمعنى اخر
هل فى علاقة بين الاوفر فلو والهندسة العكسية ؟
اكيد فى علاقة وهتسهل عليك الفهم
بارك الله فيك، شرح أكثر من رائع للأساسيات
وفي انتظار الدروس القادمة، وأرجو أن يتم التطرق إلى ماهية ال stack protections وكيفية تجاوزها
وال Format String وال heap overflow
جارى العمل على دورة متكاملة
أخ محمود الدورة اللتي تعملون عليها تبدأ بأساسيات الأسمبلي أم لثغرات الفيض خاصة ؟
تناول بعض الأساسيات منها نظرة على الأسمبلى
اتمنى ان تتواصل معي اخوي
عزبزي اولا تسلم على المجهود الرائع الذي تقدمه لخدمة المحتوى العربي التوعوي والارشادي لكل ما يتعلق بامن المعلومات
ثانيا عندي تنبيه وهو المثال السابق بخصوص كلمة السر اعتقد جنابك كاتبها بالعكس يعني كاتب اذا كانت الكلمة isecur1ty فاكتب كلمة السر خاطئة
تحياتي لك