hacktricks/binary-exploitation/libc-heap/house-of-orange.md

99 lines
9.3 KiB
Markdown
Raw Normal View History

# Kuća od narandžaste boje
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **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 svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>
## 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 ovo više ne funkcioniše (funkcioniše 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 upisati 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 **neuređene 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 neuređene 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 kako bi se vršni blok stavio u neuređenu kantu.
Stari vršni blok je sada u neuređenoj 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 neuređenu 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 neuređenu kantu će biti upisan 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 neuređenu kantu i vidi ovaj deo, pokušaće da ga umetne u malu kantu 4 zbog njegove male veličine. To će dovesti do toga da deo završi na početku liste male kante 4, što je lokacija pokazivača FD dela **`_IO_list_all`** jer smo upisali blisku adresu u **`_IO_list_all`** putem napada na neuređenu kantu.
2. **Pokretanje Malloc Provere**: 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 kako bi se napravila lažna **\_IO\_FILE** struktura. Struktura je pažljivo oblikovana da uključi ključna polja kao što su `_IO_write_base` i `_IO_write_ptr` postavljeni na vrednosti koje prolaze interne provere u libc-u. Dodatno, unutar lažne strukture se kreira jump tabela, gde je pokazivač instrukcije postavljen 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 pravljenje lažne **\_IO\_FILE** strukture koja se preklapa sa starim vršnim blokom koji se trenutno nalazi u neuređenoj 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 je pokazivač instrukcije postavljen 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 neuređenu kantu**: Alocirajte veći deo.
3. **Curenje libc adresa**: Iskoristite ranjivost da čitate iz neuređene kante.
4. **Izvršite napad na neuređenu kantu**: Upisujte 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**: Napravite lažnu strukturu fajla 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)
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>