السلام عليكم

نستعرض اليوم اساسيات مهمة لثغرات الفيض Buffer Overflow ونوضح استخدامتها ومدى خطورتها وطرق استغلالها.

تحدث ثغرات الفيض Buffer Overflow عندما يتم كتابة بيانات زائدة  فى البفر اكثر مما ينبغى وتحدث نتيجة عدم التحقق من مدخلات المستخدم الذى استطاع ان يضيف بيانات اكثر مما يحمله البفر. اكثر تعريف مبسط لهذه الثغرة هو انه عندما تملىء كوب ماء عن اخره فيحدث فيض للماء خارج الكوب .

0

هذه الثغرة تلزم معرفة بلغة السى ولغة الأسمبلى .

البفر buffer هو جزء من الذاكرة لحمل البيانات بشكل مؤقت وله حجم ثابت.

الهيب heap هو جزء من الذاكرة وحجمه يتغير بحسب متطلبات وعمليات البرنامج.

الستاك “المكدس” stack  هو جزء من الذاكرة والتى تستخدمه دوال البرنامج .PUSH تضيف بيانات الى stack .وPOP تحذف بيانات من stack.

مثال مبسط لتوضيح الفكرة “لاحظ الكود التالى” :

1

المصفوفة buffer تتكون من 10 بايت .عندما نريد اضافة اى بيانات ف index لدينا من صفر الى 9 .لكننا استخدمنا 10 من اجل اضافة القيمة i فيحدث الفيض فالمصوفة فاضت عن حجمها الطبيعى .

لنوضح اكثر “لاحظ الكود التالى” :

2

سنملىء المصفوفة 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

5

مثال1 من نوع Stack Overflow

3

هذا البرنامج يأخذ مدخلات المستخدم ثم يقوم بطباعتها وعرضها
 عند تشغيل البرنامج وادخال اقل من 256 بايت يعمل البرنامج ويطبع القيمة المخزنة فى buffer ولكن ماذا اذا كانت القيمة اكبر من 256 بايت :سيظهر الخطأ التالى

4

 يمكنك ان تفتح البرنامج بالمنقح وتكتشف ما المشكلة .

مثال2 من نوع Stack Overflow

6

برنامج بسيط يطلب الباسود من المستخدم .اذا كان الباسورد هو isecur1ty يعرض لك ان الباسورد صحيح ويمنحك صلاحيات الروت واى باسورد اخر سيعرض لك Wrong Password

لكن لو حجم  الباسورد اكبر من حجم buffer سيعرض لك Wrong Password ولكنه سيمنحك صلاحيات كاملة كما لو كنت الأدمن وبدون معرفة لكلمة المرور الصحيحة

وذلك لأن الدالة ()gets  مصابة فلا تتحقق من القيم .

اساسيات GDB:

افتح الترمنال واكتب gdb واضغط انتر

7

اهم الأوامر :

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

 الى هنا ينتهى المقال اى استفسار لا تتردد فى السؤال.