This is an old revision of the document!


Curs 12 - Securitatea sistemelor de operare

  • 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

Pentru parcurgerea demo-urilor, folosiți arhiva aferentă.

  1. 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.
      • 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.
      • Observați că executabiul este deținut de root și că are bitul de set-user-ID activat.
    • 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).
      • În momentul în care nici unul dintre identificatorii de utilizatori nu mai este 0, nu se poate reveni la utilizator privilegiat (permanent privilege drop).
  2. Exemplu de 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:
        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
      • 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.
  3. 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 laboratorul 4.
    • Rulați scriptul:
      ./run-exploit.sh

      și observați deschiderea unui nou shell.

  4. 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:
      ./stack-smash-no-protector
      ./stack-smash-protector
      • 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.
so/cursuri/curs-12.1369056063.txt.gz · Last modified: 2013/05/20 16:21 by razvan.deaconescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0