mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
100 lines
9.2 KiB
Markdown
100 lines
9.2 KiB
Markdown
# Kuća narandžasta
|
|
|
|
{% hint style="success" %}
|
|
Naučite i vežbajte hakovanje AWS-a:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Naučite i vežbajte hakovanje GCP-a: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Podržite HackTricks</summary>
|
|
|
|
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
|
|
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Podelite hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
## Osnovne informacije
|
|
|
|
### Kod
|
|
|
|
* Pronađite primer na [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c)
|
|
* Tehnika eksploatacije je popravljena u ovom [patch-u](https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=stdlib/abort.c;h=117a507ff88d862445551f2c07abb6e45a716b75;hp=19882f3e3dc1ab830431506329c94dcf1d7cc252;hb=91e7cf982d0104f0e71770f5ae8e3faf352dea9f;hpb=0c25125780083cbba22ed627756548efe282d1a0) tako da više ne radi (radi u verzijama pre 2.26)
|
|
* Isti primer **sa više komentara** na [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
|
|
|
### Cilj
|
|
|
|
* Zloupotreba funkcije `malloc_printerr`
|
|
|
|
### Zahtevi
|
|
|
|
* Prepisivanje veličine vršnog bloka
|
|
* Curenje libc-a i hipa
|
|
|
|
### Pozadina
|
|
|
|
Neophodne informacije iz komentara iz [**ovog primera**](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)**:**
|
|
|
|
Stvar je u tome da su u starijim verzijama libc-a, kada je pozvana funkcija `malloc_printerr`, ona bi **iterirala kroz listu `_IO_FILE` struktura smeštenih u `_IO_list_all`**, i zapravo **izvršila** pokazivač instrukcije u toj strukturi.\
|
|
Ovaj napad će falsifikovati **lažnu `_IO_FILE` strukturu** koju ćemo pisati u **`_IO_list_all`**, i izazvati pokretanje `malloc_printerr`.\
|
|
Zatim će **izvršiti bilo koju adresu** koju smo sačuvali u **`_IO_FILE`** strukturama jump tabele, i dobićemo izvršenje koda
|
|
|
|
### Napad
|
|
|
|
Napad počinje tako što se uspe da se dobije **vršni blok** unutar **nesortirane kante**. To se postiže pozivom `malloc` sa veličinom većom od trenutne veličine vršnog bloka, ali manjom od **`mmp_.mmap_threshold`** (podrazumevano je 128K), što bi inače pokrenulo alokaciju `mmap`. Kada se modifikuje veličina vršnog bloka, važno je osigurati da je **vršni blok + njegova veličina** poravnata sa stranicom i da je bit **prev\_inuse** vršnog bloka uvek postavljen.
|
|
|
|
Da biste dobili vršni blok unutar nesortirane kante, alocirajte deo kako biste kreirali vršni blok, promenite veličinu vršnog bloka (sa prelivanjem u alociranom delu) tako da je **vršni blok + veličina** poravnata sa stranicom sa postavljenim bitom **prev\_inuse**. Zatim alocirajte deo veći od nove veličine vršnog bloka. Imajte na umu da se `free` nikada ne poziva da bi se vršni blok stavio u nesortiranu kantu.
|
|
|
|
Stari vršni blok je sada u nesortiranoj kanti. Pretpostavljajući da možemo čitati podatke unutar njega (možda zbog ranjivosti koja je takođe uzrokovala prelivanje), moguće je procuriti libc adrese iz njega i dobiti adresu **\_IO\_list\_all**.
|
|
|
|
Napad na nesortiranu kantu se izvodi zloupotrebom prelivanja kako bi se napisalo `topChunk->bk->fwd = _IO_list_all - 0x10`. Kada se alocira novi deo, stari vršni blok će biti podeljen, i pokazivač na nesortiranu kantu će biti napisan u **`_IO_list_all`**.
|
|
|
|
Sledeći korak uključuje smanjenje veličine starog vršnog bloka kako bi se uklopio u malu kantu, posebno postavljanjem njegove veličine na **0x61**. Ovo ima dva cilja:
|
|
|
|
1. **Umetanje u malu kantu 4**: Kada `malloc` skenira kroz nesortiranu kantu i vidi ovaj deo, pokušaće da ga ubaci u malu kantu 4 zbog njegove male veličine. To dovodi do toga da deo završi na vrhu liste male kante 4, što je lokacija pokazivača FD dela **`_IO_list_all`** jer smo napisali blisku adresu u **`_IO_list_all`** putem napada na nesortiranu kantu.
|
|
2. **Pokretanje provere Malloc**: Ova manipulacija veličinom dela će naterati `malloc` da izvrši interne provere. Kada proveri veličinu lažnog naprednog dela, koji će biti nula, izazvaće grešku i pozvati `malloc_printerr`.
|
|
|
|
Manipulacija malom kantom će vam omogućiti kontrolu naprednog pokazivača dela. Preklapanje sa **\_IO\_list\_all** se koristi za falsifikovanje lažne **\_IO\_FILE** strukture. Struktura je pažljivo oblikovana da uključi ključna polja poput `_IO_write_base` i `_IO_write_ptr` postavljena na vrednosti koje prolaze interne provere u libc-u. Dodatno, unutar lažne strukture se kreira jump tabela, gde se postavlja pokazivač instrukcije na adresu gde se može izvršiti proizvoljan kod (npr. funkcija `system`).
|
|
|
|
Da sumiramo preostali deo tehnike:
|
|
|
|
* **Smanjite stari vršni blok**: Prilagodite veličinu starog vršnog bloka na **0x61** kako biste ga uklopili u malu kantu.
|
|
* **Postavite lažnu `_IO_FILE` strukturu**: Preklopite stari vršni blok sa lažnom **\_IO\_FILE** strukturom i postavite polja na odgovarajući način da preuzmete kontrolu nad tokom izvršenja.
|
|
|
|
Sledeći korak uključuje falsifikovanje lažne **\_IO\_FILE** strukture koja se preklapa sa starim vršnim blokom koji se trenutno nalazi u nesortiranoj kanti. Prvi bajtovi ove strukture pažljivo su oblikovani da uključe pokazivač na komandu (npr. "/bin/sh") koja će biti izvršena.
|
|
|
|
Ključna polja u lažnoj **\_IO\_FILE** strukturi, poput `_IO_write_base` i `_IO_write_ptr`, postavljena su na vrednosti koje prolaze interne provere u libc-u. Dodatno, unutar lažne strukture se kreira jump tabela, gde se postavlja pokazivač instrukcije na adresu gde se može izvršiti proizvoljan kod. Tipično, to bi bila adresa funkcije `system` ili neke druge funkcije koja može izvršiti shell komande.
|
|
|
|
Napad kulminira kada poziv `malloc` pokrene izvršenje koda putem manipulisane **\_IO\_FILE** strukture. Ovo efikasno omogućava izvršenje proizvoljnog koda, što obično rezultira spawnovanjem shell-a ili izvršavanjem druge zlonamerne payload-a.
|
|
|
|
**Rezime napada:**
|
|
|
|
1. **Postavite vršni blok**: Alocirajte deo i modifikujte veličinu vršnog bloka.
|
|
2. **Prisilite vršni blok u nesortiranu kantu**: Alocirajte veći deo.
|
|
3. **Curenje libc adresa**: Iskoristite ranjivost da čitate iz nesortirane kante.
|
|
4. **Izvršite napad na nesortiranu kantu**: Napišite u **\_IO\_list\_all** korišćenjem prelivanja.
|
|
5. **Smanjite stari vršni blok**: Prilagodite njegovu veličinu da se uklopi u malu kantu.
|
|
6. **Postavite lažnu \_IO\_FILE strukturu**: Falsifikujte lažnu strukturu datoteke da preuzmete kontrolu nad tokom izvršenja.
|
|
7. **Pokrenite izvršenje koda**: Alocirajte deo da izvršite napad i pokrenete proizvoljan kod.
|
|
|
|
Ovaj pristup eksploatiše mehanizme upravljanja hipom, curenje informacija libc-a i prelivanje hipa kako bi se postiglo izvršenje koda bez direktnog pozivanja `free`. Pažljivim oblikovanjem lažne **\_IO\_FILE** strukture i postavljanjem je na pravo mesto, napad može preuzeti kontrolu nad tokom izvršenja tokom standardnih operacija alokacije memorije. Ovo omogućava izvršenje proizvoljnog koda, što potencijalno rezultira shell-om ili drugim zlonamernim aktivnostima.
|
|
## Reference
|
|
|
|
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/)
|
|
* [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
|
|
|
{% hint style="success" %}
|
|
Učite i vežbajte hakovanje AWS-a:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Učite i vežbajte hakovanje GCP-a: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Podržite HackTricks</summary>
|
|
|
|
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
|
|
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Podelite hakovanje trikova slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
|
|
|
</details>
|
|
{% endhint %}
|