This is an old revision of the document!
Curs 12 - Securitatea sistemelor de operare
Demo-uri
Pentru parcurgerea demo-urilor, folosiți arhiva aferentă.
Bitul de set-user-ID-on-execution
Intrați în directorul 1-setuid/
.
Consultați fișierul setuid-test.c
.
Compilați fișierul folosind comanda make
.
Folosiți ls -l
pentru a obține informații complete despre executabilul setuid-test
.
Ca utilizator neprevilegiat rulați executabilul:
./setuid-test
Observați cele trei tipuri de identificatori de utilizatori: user id, effective user ID, saved set-user-ID.
Observați că se poate reveni la utilizator privilegiat, dacă cel puțin unul dintre identificatorii de utilizatori este 0 (root
) (temporary privilege drop).
-
Intrați în directorul 2-shellcode/
.
Consultați fișierul shellcode-samples.c
.
Acele variabile se găsesc în forma binară și în fișierul binary-shellcodes
.
Folosiți
objdump
pentru a dezasambla fișierul:
objdump -D -b binary -mi386 binary-shellcodes
Se afișează instrucțiunile dezasamblate; au fost plasate niște instrucțiuni de tip nop
între cele trei shellcode-uri.
Observați apelul int $0x80
, reprezentând trap pentru acces în kernel space (apel de sistem).
Shellcode-ul din variabila shellcode_write
realizează un apel write
, iar shellcode-urile din variabilele shellcode_exec
, respectiv shellcode_exec_sh
deschid o sesiune de shell.
Pentru compilare va trebui să folosiți un sistem pe 32 de biți, precum mașina virtuală de Linux de SO.
Compilați fișierul folosind comanda make
.
Rulați fișierul obținut:
./shellcode-samples
Înlocuiți, în main
, variabila shellcode_exec
cu shellcode_exec_sh
și, respectiv, shellcode_write
, recompilați si rulați, din nou, fișierul obținut.
Exploit de tip stack buffer overflow
Intrați în directorul 3-exploit/
.
Consultați fișierul exploit.c
.
Pentru compilare va trebui să folosiți un sistem pe 32 de biți, precum mașina virtuală de Linux de SO.
Compilați fișierul folosind comanda make
.
Consultați fișierul run-exploit.sh
.
Argumentul trimis conține un shellcode (21 de octeți), urmat de un padding de 23 de caractere a
și adresa de start a bufferului.
Adresa de start a buffer-ului este suprascrisă în zona cu adresa de retur a funcției main
. Când funcția main
se încheie se face jump pe stivă și se execută shellcode-ul.
Padding-ul este necesar pentru a acoperi cei 32 de octeți ai buffer-ului și un padding de aliniere pe stivă dispus de compilator între buffer și salvarea frame pointer-ului (ebp) pe stivă.
-
Rulați scriptul:
./run-exploit.sh
și observați deschiderea unui nou shell.