تحليل ثغرة معالجة الملف ANI Files Handling لمتصفح الإنترنت لنظام وندوز Internet Explorer6

عام 0 geek4arab
Spread the love

سنبدأ اليوم بدراسة نوع جديد من الثغرات الأمنية التي يقع بها مبرمجي الانظمة والبرامج
ثغره لا تعتمد على الفيض Overflow ولاعلى المعالجة المنظمة SEH ولا على المتغيرات اصلا
إنما تعتمد على الحيله ,,, وهي ماتسمى ثغرات معالجة الملفات او Files Handling

نبدأ في الموضوع,,,
من أكثر الأوامر إستخدام في لغة السي هو المايكرو strcpyهذا المايكرو يقوم
بنقل سلسلة نصية إلى اخرى مثل strcpy(str1,str2)عندما تقوم بتنفيذ هذا الامر
يقوم المعالج بنقل كامل محتوى النص 2وهو str2 إلى محتوى النص1 وهو str1
دون مراعاه أحجام المتغيرات ومخازن البيانات

فمثلا لو كان حجم str2 أكبر من حجم str1 سيقوم المعالج بتنفيذ الامر وبشكل
مباشر ستحدث ثغرة فيض بلانقاش ولذلك تجد ان مايكرو strcpy مخيف لدى
مبرمجي الأنظمة ويتم إختباره أكثر من مرة وغالبا مايتم تجنب أستخدامه
وفي هذه الحاله يستبدل بالأمر memcpy وهو مشابه لل strcpy إلى في
نقطة واحده وهي تحديد الحجم ,, مثال لإستخدام memcpy بهذا الشكل
نقل str2 إلى str1 تساوي memcpy(str1,str2,10)
تلاحظ انه تم إضافه بارمتر جديد ويمثل حجم النص الذي سيتم نقله بالبايت وفي
مثالنا يتم نقل 10 أحرف فقط. قد تعتقد انه في هذه الحاله تم حصر الثغرات بشكل
نهائي ولن تحدث ثغرة فيض أبداً ؟ بالفعل لن تحدث ثغرة
فيض ولكن قد تحدث ثغرة معالجه ,, لأن عقدة المايكرو memcpy في تحديد الأحجام

بعطيك مثال لنفرض انك تريد قرائة ملف نصي يحتوي على بيانات موظف مثلاً
بكل بساطة ستنفذ الامر strcpy وستقرأ كامل الملف النصي, ولكن لو طلب
منك قرائة إسم الموظف في السطر 4فقط وإظهارة في هذه الحال لن تستطيع معرفة
حجم الإسم ولا مكان وجودة في الملف ,,, ولذلك ستحتاج إلى قانون تكتبة في
بداية الملف تستطيع عن طريقة الوصول إلى أي مكان في الملف , وهذا
مايعرف بترويسة الملف وهذا القانون مستخدم في كل ملفات أنظمة التشغيل

والآن بدينا ندخل في الموضوع , ملف ani او ملفات المؤشرات والصور والفيديو
كلها تحتوي على ترويسه تستطيع من خلالها الوصول الى اي مكان في الملف
نبدأ ونتعرف على طريقة تقسيم ترويسه ملفات ani :
إذا فتحت ملف ani بأي محرر هكس ستلاحظ التالي
أول 4 بايت = RIFF وتدل على تنسيق الملف
ثاني4 بايت = حجم بيانات الملف كامل بالهكس (بعد تنفيذ قانون العكس للمعالج)
ثالث4 بايت = ACON وتمثل معرف الملف للمؤشر

بعد ذلك يأتي قانون جديد للتقسيم ويسمى القوائم او list وهو بسيط جدا
يبدأ بإسم القائمة من 4 بايت ثم حجم بيانات القائمة من 4 بايت ثم محتوى بيانات القائمة
بمعنى [4 بايت إسم القائمة – 4بايت حجم القائمة -….بيانات القائمة]
وهذا مثال يوضح قانون تقسيم القوائم
شغل برنامج olly او اي محرر هكس , من قائمة view إختر file
توجه لمجلد المؤشرات وهو C:\WINDOWS\Cursors وإختر اي مؤشر
وهذه صوره توضح طريقه التقسيم بالتفصيل

هل رأيت التقسيم ؟إستطاع احد مكتشفي ثغرات الأنظمة من التحايل على النظام
في قانون list وذلك بتوجيه التحكم لتحميل قائمة تحتوي في الأحساس على كود تنفيذي
او ما يعرف ب shellcode و تمكن بالتغيير في أحجام القوائم لينقل التنفيذ إلى shellcode
وبهذه الطريقه إنتشرت فايروسات كثيرة تدخل الجهاز عن طريق هذه الثغره

أكيد نحتاج تفصيل أكثر عن الموضوع ولذلك نحتاج مثال تطبيقي . سنضع المثال
نفسه الذي ظهر به
اول فايروس استغل هذه الثغره , ولذلك إذا اردت تكملت المثال أغلق برامج الحماية
لأنها تعتبر كل الملفات التي سنتخدمها في المثال فايروسات ؟!! وثاني شيء هذا
المثال مطبق في نظام وندوز xp بدون اي تحديثات أمنية لاsp1 و sp2 يعني sp0
بعد ان تستوفي الشروط حمل الملف من هنا:
ANI.zip

بعد تحميل الملف ستجد صفحه إنترنت html و ملف مؤشر ani , ضعهم في مجلد جديد
شغل متصفح الإنترنت , وبعد ذلك شغل برنامج olly ومن قائمة file ثم Attach
وإختر برنامج المتصفح في الذاكرة
الآن اول خطوة ضع نقطة توقف عند التعليمة الخاصه بقرائه ملفات ani في المتصفح
بإختصار عند العنون 77D540DF ثم شغل البرنامج المراقب F9
بعد ذلك توجه لبرنامج المتصفح ومن قائمة file ثم open وإختر ملف html
بعد ان يقوم برنامج المتصفح بقرائه الصفحه سيجد في الكود ان الصفحه تتطلب تحميل مؤشر
سيتوجه مباشره برنامج المتصفح لتحميل المؤشر وسيقف التنفيذ به عند التعليمه

77D540DF MOV EDI,EAX

تتبع البرنامج وستلاحظ بدايه دوال قرائه الملف وطريقه القرائه لاحظ الصورة

اكيد لاحظت محتوى ملف المؤشر الملغوم بكود تنفيذي وهو shellcode يقوم بفتح
منفذ خلفي backdoor ,, إلى الآن لم يحدث شيء ؟ نكمل الموضوع

حط نقطة توقف ثانيه عند التعليمه

77D74472 MOV EAX,DWORD PTR SS:[ESP+4]

من بدايه هذه التعليمه يحدث التحايل! لاحظ البلوك المسؤل عن قرائه ترويسه ملف المؤشر
مع ملاحظة ان هذا البلوك ينفذ اول مره لقرائه إسم list1 ينفذ كامل البلوك مره اخرى
لتنفيذ محتوى الlist1 وفي المره الثانيه للقرائه يحدث الإستغلال وتنفذ الثغره

77D74472 MOV EAX,DWORD PTR SS:[ESP+4]
77D74476 MOV EDX,DWORD PTR SS:[ESP+C]
77D7447A PUSH ESI
77D7447B MOV ESI,DWORD PTR DS:[EAX+4]
77D7447E LEA ECX,DWORD PTR DS:[ESI+EDX]
77D74481 CMP ECX,DWORD PTR DS:[EAX+8]
77D74484 JA USER32.77D74807
77D7448A PUSH EBX
77D7448B PUSH EDI
77D7448C MOV EDI,DWORD PTR SS:[ESP+14]
77D74490 MOV ECX,EDX
77D74492 MOV EBX,ECX
77D74494 SHR ECX,2
77D74497 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
77D74499 MOV ECX,EBX
77D7449B AND ECX,3
77D7449E REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
77D744A0 ADD DWORD PTR DS:[EAX+4],EDX
77D744A3 XOR EAX,EAX
77D744A5 POP EDI

نبدأ بالتحليل : اول تعليمتين تحدد بدايه محتوى بيانات list1 وهما

77D74472 MOV EAX,DWORD PTR SS:[ESP+4]
77D74476 MOV EDX,DWORD PTR SS:[ESP+C]

ثاني تعليمتين لتحديد حجم بيانات list1 لاحظ

77D7447B MOV ESI,DWORD PTR DS:[EAX+4]
77D7447E LEA ECX,DWORD PTR DS:[ESI+EDX]

بعد ذلك تأتي 4 تعليمات لمعرفه ما إذا كان هنالك list2 واكيد في مثالنا مافي
سيكمل الكود التنفيذ إلى ان يصل إلى الامر المصيري memcpy

77D74497 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>

ضع عند هذه التعليمه نقطة توقف ,, لأن التنفيذ سيعود لنفس الأمر السطر77D74497
لاحظ ستنفذ داله memcpy اول مره وسيتم قرائه إسم list1
وفي المره الثانيه ستنفذ لقرائه محتوى list1 الآن نفذ بإستخدام F8 إلى ان تصل
إلى اول تعليمه قرائه وبعد تنفيذها إضغط F9 ليدور التنفيذ ويرجع مره أخرى إلى بدايه
البلوك الذي وضعناه مسبقاً ولكن هذه المره لقرائه محتوى list1

تتبع الكود بإستخدام امر F8 في أولي إلى ان تصل إلى نفس تعليمه memcpy في المره الثانيه
ولكن لاحظ ماذا يحدث في هذه المره ,, قرائه shellcode

لاحظ في بدايه الموضوع قلنا
ان الداله memcpy تحتاج إلى3 بارمترات لتحديد حجم البيانات التي ستقرأ وفي مثالنا
لاحظ المسجل EDX كيف إستطاع إدخال قيمه كبيره لقرائه كامل الشيل كود ؟؟
إحفظ الرقم37C وتوجه لأول صوره في موضعنا ستجد عليها دائره وتمثل حجم list1
وبعد تنفيذ تعليمه القرائه ضع نقطة توقف جديده عند التعليمه

77D74451 RETN 18

ثم كمل التفيذ إلى ان تصل إلى التعليمه ,, هل تلاحظ شيء غريب في هذه الصوره

اكيد بدأ الشيل كود يؤثر في التنفيذ ,, لاحظ نقل التنفيذ إلى عنوان داخل قسم البيانات
في المتصفح ؟؟؟؟؟ لماذا
لو توجهت للعنوان بتعرف السبب

تعلمية JMP ESP وأكيد esp يساوي بدايه الكود التنفيذي في المكدس
حاول متابعه التنفيذ وستدخل في بدايه ال shellcode وستلاحظ طريقة
تجميع الدوال وبدايه فتح منفذ للإنصات ,,

وسيبقى المنفذ مفتوح إلى ان يجد إتصال من اداة netcat
ليسلم للمهاجم مهمه التحكم في النظام.

وإلى هنا نكون اخذنا فكره عن نوع آخر من الثغرات الامنيه
————————————————————————————
الى لقاء قادم مع موضوع جديد ,, وبالتوفيق

الكاتب geek4arab

geek4arab

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

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