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.