This shows you the differences between two versions of the page.
so:cursuri:curs-13 [2014/05/12 22:36] traian.popeea |
so:cursuri:curs-13 [2017/02/23 16:34] (current) razvan.deaconescu |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Curs 13 - Securitatea sistemului ====== | ====== Curs 13 - Securitatea sistemului ====== | ||
+ | |||
+ | * [[http://elf.cs.pub.ro/so/res/cursuri/SO_Curs-13.pdf|Curs 13 - Securitatea sistemului (PDF)]] | ||
+ | * Suport curs | ||
+ | * Operating System Concepts Essentials | ||
+ | * Capitolul 13 -- Protection | ||
+ | * Capitolul 14 -- Security | ||
+ | * Secțiunile 14.1, 14.2, 14.5 | ||
+ | * Modern Operating Systems, 3rd Edition | ||
+ | * Capitolul 9 -- Security | ||
+ | * Mai puțin secțiunea 9.6: Exploiting Code Bugs | ||
<html> | <html> | ||
- | <iframe src="http://docs.google.com/viewer?url=http://elf.cs.pub.ro/so/res/cursuri/SO_Curs-13.pdf&embedded=true" width="600" height="480" style="border: none;"> | + | <center> |
+ | <iframe src="https://docs.google.com/viewer?url=http://elf.cs.pub.ro/so/res/cursuri/SO_Curs-13.pdf&embedded=true" width="600" height="480" style="border: none;"> | ||
</iframe> | </iframe> | ||
+ | </center> | ||
</html> | </html> | ||
- | |||
- | * [[http://elf.cs.pub.ro/so/res/cursuri/SO_Curs-13.pdf | Curs 13 - Securitatea sistemului (PDF)]] | ||
- | |||
- | * Suport curs | ||
- | * Operating System Concepts | ||
- | * Capitolul 14 -- Protection | ||
- | * Capitolul 15 -- Security | ||
- | * Secțiunile 15.1, 15.2, 15.5 | ||
- | * Modern Operating Systems | ||
- | * Capitolul 9 -- Security | ||
- | * Secțiunile 9.4, 9.6 | ||
===== Demo-uri ===== | ===== Demo-uri ===== | ||
- | Pentru parcurgerea demo-urilor, folosiți [[http://elf.cs.pub.ro/so/res/cursuri/curs-13.zip|arhiva aferentă]]. | + | Pentru parcurgerea demo-urilor, folosiți [[http://elf.cs.pub.ro/so/res/cursuri/curs-13-demo.zip|arhiva aferentă]]. |
- | <hidden> | ||
- Bitul de set-user-ID-on-execution | - Bitul de set-user-ID-on-execution | ||
- | * Intrați în directorul ''1-setuid/''. | + | * Consultați fișierul ''test.c''. |
- | * Consultați fișierul ''setuid-test.c''. | + | * Scopul acestui program este de a genera un fișier de log care să conțină timestamp-uri aferente fiecărei rulări a sa, de forma ''user: time''. |
- | * Compilați fișierul folosind comanda ''make''. | + | * Numai owner-ul fișierului are drept de scriere asupra fișierului. |
+ | * Folosiți fișierul ''prep_users.sh'' pentru a genera cei doi utilizatori de test. | ||
* Trebuie să aveți drept de sudo pentru a reuși întreg procesul. | * Trebuie să aveți drept de sudo pentru a reuși întreg procesul. | ||
- | * Folosiți ''ls -l'' pentru a obține informații complete despre executabilul ''setuid-test''. | + | * Ca utilizatorul ''master'' (''su - master'') compilați fișierul folosind comanda ''make''. |
- | * Observați că executabiul este deținut de ''root'' și că are bitul de set-user-ID activat. | + | * Folosiți ''ls -l'' pentru a obține informații complete despre executabilul ''test''. |
- | * Ca utilizator neprevilegiat rulați executabilul:<code bash> | + | * Observați că executabiul este deținut de ''master'' și că are bitul de set-user-ID activat.<code bash> |
- | ./setuid-test | + | -rwsr-xr-x 1 master master 12315 2014-05-12 22:33 test |
</code> | </code> | ||
- | * Observați cele trei tipuri de identificatori de utilizatori: //user id//, //effective user ID//, //saved set-user-ID//. | + | * Ca utilizatorul ''worker'' (''su - worker'') rulați executabilul:<code bash> |
- | * Detalii în [[http://man7.org/linux/man-pages/man7/credentials.7.html|pagina de manual credentials]]. | + | ./test |
- | * Observați că se poate reveni la utilizator privilegiat, dacă cel puțin unul dintre identificatorii de utilizatori este 0 (''root'') (//temporary privilege drop//). | + | |
- | * În momentul în care nici unul dintre identificatorii de utilizatori nu mai este 0, nu se poate reveni la utilizator privilegiat (//permanent privilege drop//). | + | |
- | - Exemplu de [[http://www.shell-storm.org/shellcode/|shellcode]] | + | |
- | * Intrați în directorul ''2-shellcode/''. | + | |
- | * Consultați fișierul ''shellcode-samples.c''. | + | |
- | * Urmăriți cele trei variabile de tip shellcode. | + | |
- | * Acele variabile se găsesc în forma binară și în fișierul ''binary-shellcodes''. | + | |
- | * Folosiți ''objdump'' pentru a dezasambla fișierul:<code bash> | + | |
- | objdump -D -b binary -mi386 binary-shellcodes | + | |
</code> | </code> | ||
- | * Se afișează instrucțiunile dezasamblate; au fost plasate niște instrucțiuni de tip ''nop'' între cele trei shellcode-uri. | + | * Observați cele două tipuri de identificatori de utilizatori: //user id//, //effective user ID//.<code> |
- | * Observați apelul ''int $0x80'', reprezentând trap pentru acces în kernel space (//apel de sistem//). | + | worker@erathia:~$ ~master/test |
- | * 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:<code bash> | + | |
- | ./shellcode-samples | + | |
- | </code> | + | |
- | * Observați că se deschide o nouă sesiune de shell. | + | |
- | * Î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''. | + | |
- | * Se încearcă suprascrierea valorii de retur a funcției ''main'' din cadrul parametrului ''argv[1]''. | + | |
- | * 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''. | + | |
- | * Opțiunile de compilare dezactivează stack smashing (''-fno-stack-protector'') și reactivează execuția de cod de pe stivă (''-z execstack''). | + | |
- | * Consultați fișierul ''run-exploit.sh''. | + | |
- | * Acesta compilează fișierul, dacă nu este compilat, dezactivează ASLR (//Address Space Layout Randomization//) și trimite un argument conținând un shellcode programului. | + | |
- | * 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ă. | + | |
- | * Urmăriți dispunerea argumentelor pe stivă în [[:so:laboratoare:laborator-04#stiva|laboratorul 4]]. | + | |
- | * Rulați scriptul:<code bash> | + | |
- | ./run-exploit.sh | + | |
- | </code> și observați deschiderea unui nou shell. | + | |
- | - Protejarea la stack buffer overflow folosind stack smashing protection | + | |
- | * Intrați în directorul ''4-stack-smash/''. | + | |
- | * Consultați fișierul ''stack-smash.c''. | + | |
- | * Observați că bufferul a este suprascris folosind ''memcpy'' cu un șir de dimensiune mai mare, ajungând să producă un stack buffer overflow cu riscul de suprascriere a adresei de retur a funcției main. | + | |
- | * Folosiți comanda ''make'' pentru a compila două executabile: | + | |
- | * ''stack-smash-no-protector'': fără suport de stack smashing; | + | |
- | * ''stack-smash-protector'': cu suport de stack smashing. | + | |
- | * Rulați cele două executabile:<code bash> | + | |
- | ./stack-smash-no-protector | + | |
- | ./stack-smash-protector | + | |
- | </code> | + | |
- | * Observați că nu se întâmplă nimic nevalid în cazul primei rulări, dar apare mesaj specific de eroare în cazul celei de-a doua rulări. | + | |
- | * Programul a fost testat pe un sistem pe care comportamentul este cel de mai sus. | + | |
- | * Dacă pe sistemul vostru nu merge, alterați dimensiunea șirului ''TEST_STRING''. | + | |
- | </hidden> | + | Process started |
+ | |||
+ | Setuid on | ||
+ | Effective user name: master; UID: 1002 | ||
+ | Real user name: worker; UID: 1003 | ||
+ | |||
+ | |||
+ | Giving up setuid until opening the file | ||
+ | |||
+ | Setuid off | ||
+ | Effective user name: worker; UID: 1003 | ||
+ | Real user name: worker; UID: 1003 | ||
+ | |||
+ | |||
+ | Wanting to open the file | ||
+ | |||
+ | Setuid on | ||
+ | Effective user name: master; UID: 1002 | ||
+ | Real user name: worker; UID: 1003 | ||
+ | |||
+ | |||
+ | File opened, giving up setuid | ||
+ | |||
+ | Setuid off | ||
+ | Effective user name: worker; UID: 1003 | ||
+ | Real user name: worker; UID: 1003 | ||
+ | |||
+ | |||
+ | File closed, process done | ||
+ | </code> | ||
+ | * Detalii în [[http://man7.org/linux/man-pages/man7/credentials.7.html|pagina de manual credentials]]. | ||
+ | * Conform principiului least privilege, doar în momentul deschiderii fișierului pentru scriere sunt folosite drepturile utilizatorului owner. | ||
+ | * Observați că se poate reveni la utilizatorul owner al fișierului (//temporary privilege drop//). |