|
| 1 | +--- |
| 2 | +marp: true |
| 3 | +theme: gaia |
| 4 | +class: |
| 5 | + - invert |
| 6 | +paginate: true |
| 7 | +--- |
| 8 | + |
| 9 | +<!-- _class: lead invert --> |
| 10 | + |
| 11 | +# **Laborator III: Suprascrierea Stivei. *Shellcodes*** |
| 12 | + |
| 13 | +--- |
| 14 | + |
| 15 | +# Tabelă de Conținut |
| 16 | + |
| 17 | + |
| 18 | +1. Suprascrierea Stivei |
| 19 | +2. *Shellcodes* |
| 20 | +3. Exerciții |
| 21 | +4. Exemplu Concret |
| 22 | + |
| 23 | +--- |
| 24 | + |
| 25 | +<!-- _class: lead invert --> |
| 26 | + |
| 27 | +# **Suprascrierea Stivei** |
| 28 | + |
| 29 | +--- |
| 30 | + |
| 31 | +# Suprascrierea *Buffer*-ului |
| 32 | + |
| 33 | +- **Buffer**: Zonă temporară de memorie, folosită la un moment dat pentru procesarea sau mutarea datelor. |
| 34 | +- **Suprascrierea Buffer-ului**: Scrierea într-un *buffer* a unor date care depășesc limitele acestuia, suprascriind astfel zone de memorie vecine. |
| 35 | +- Poate apărea la limbaje de programare care nu efectuează o verificare automată a limitelor zonelor de memorie în care se scrie (de exemplu, Assembly, C și C++). |
| 36 | + |
| 37 | +--- |
| 38 | + |
| 39 | +# Categorii de Suprascrieri |
| 40 | + |
| 41 | +- **În Stivă**: Zona de memorie suprascrisă aparține de stiva procesului, *buffer*-ul fiind o variabilă locală. |
| 42 | +- **În *Heap***: Zona de memorie suprascrisă aparține de *heap*, *buffer*-ul fiind o variabilă alocată dinamic. |
| 43 | +- **La Nivel de Tip de Date**: Efectuarea de operațiuni care rezultă într-o valoare ce nu poate fi salvată într-un anumit tip de date. De exemplu, `(char)(2 * 128)` e egal cu `0`. |
| 44 | + |
| 45 | +--- |
| 46 | + |
| 47 | +<!-- _class: lead invert --> |
| 48 | + |
| 49 | +# Funcționare 🖍️ |
| 50 | + |
| 51 | +--- |
| 52 | + |
| 53 | +# Impact |
| 54 | + |
| 55 | +- Modificarea unor variabile |
| 56 | + - Referințe către funcții |
| 57 | + - Canarii |
| 58 | +- Modificarea adreselor de retur |
| 59 | + |
| 60 | +--- |
| 61 | + |
| 62 | +# Mitigări |
| 63 | + |
| 64 | +- Impunerea unei lungimi maxime la copierea în *buffer* |
| 65 | +- Folosirea unor mecanisme de securitate precum: |
| 66 | + - Canarii, impuse la nivel de compilator |
| 67 | + - Data Execution Prevention, implementate la nivel de sistem de operare (Windows) |
| 68 | + - Bitul NX în intrările din tabelele de pagini |
| 69 | + |
| 70 | +--- |
| 71 | + |
| 72 | +<!-- _class: lead invert --> |
| 73 | + |
| 74 | +# ***Shellcodes*** |
| 75 | + |
| 76 | +--- |
| 77 | + |
| 78 | +# *Shellcodes* |
| 79 | + |
| 80 | +- ***Shellcode***: Secvență de coduri de operații folosită în exploatarea de programe pentru efectuarea unor sarcini (de obicei, deschiderea unui *shell*). |
| 81 | +- Scris în Assembly (recomandat datorită controlului mai mare), eventual în C (rezultatul depinde de compilator) |
| 82 | + |
| 83 | +--- |
| 84 | + |
| 85 | +<!-- _class: lead invert --> |
| 86 | + |
| 87 | +# Funcționare 🖍️ |
| 88 | + |
| 89 | +--- |
| 90 | + |
| 91 | +# Limitări în Scrierea *Shellcode*-urilor |
| 92 | + |
| 93 | +- Dimensiunea *buffer*-ului |
| 94 | +- Posibilitatea interpretării unor octeți ca terminator de șir |
| 95 | +- Detectabilitatea operațiunilor efectuate de către soluțiile de securitate |
| 96 | + |
| 97 | +--- |
| 98 | + |
| 99 | +<!-- _class: lead invert --> |
| 100 | + |
| 101 | +# **Exerciții** |
| 102 | + |
| 103 | +--- |
| 104 | + |
| 105 | +# Recomandări |
| 106 | + |
| 107 | +- Folosiți comanda `man` pentru a primi ajutor la rularea anumitor comenzi. |
| 108 | +- Folosiți documentația [pwntools](https://docs.pwntools.com/en/stable/) pentru a identifica metodele de care aveți nevoie. |
| 109 | + |
| 110 | +--- |
| 111 | + |
| 112 | +<!-- _class: lead invert --> |
| 113 | + |
| 114 | + |
| 115 | + |
| 116 | +--- |
| 117 | + |
| 118 | +<!-- _class: lead invert --> |
| 119 | + |
| 120 | +# **Exemplu Concret** |
| 121 | + |
| 122 | +--- |
| 123 | + |
| 124 | +# RCE în Aplicația Client Steam |
| 125 | + |
| 126 | +- [Vulnerabilitate raportată](https://hackerone.com/reports/470520) în 2019, pe HackerOne |
| 127 | +- CVSS de 9.6 |
| 128 | +- Protocol proprietar pentru descoperirea serverelor de jocuri |
| 129 | + |
| 130 | +--- |
| 131 | + |
| 132 | +# Metodă de Exploatare |
| 133 | + |
| 134 | +1. *Fuzzing* efectuat pe protocol pentru a identifica un câmp vulnerabil, specific numelui de utilizator |
| 135 | +2. Suprascrierea *buffer*-ului la nivel de stivă |
| 136 | +3. Depășirea unor limitări provocate de conversia Unicode a numelui (în acest caz, a *payload*-ului) și de caracterele `NULL` |
| 137 | +4. Folosirea unui *shellcode* pentru lansarea `cmd.exe` |
0 commit comments