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

138 lines
8 KiB
Markdown
Raw Normal View History

# Kuća Romana
<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 [**Porodičnu 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
Ovo je vrlo interesantna tehnika koja je omogućila RCE bez otkrivanja putem lažnih fastbin-ova, napada na unsorted\_bin i relativnih prepisivanja. Međutim, ovo je [**popravljeno**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c).
### Kod
* Primer možete pronaći na [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)
### Cilj
* RCE zloupotrebom relativnih pokazivača
### Zahtevi
* Izmena pokazivača fastbin-a i unsorted bin-a
* Potrebno je da se proba 12 bita nasumičnosti (0.02% šanse) da bi uspelo
## Koraci napada
### Deo 1: Fastbin Chunk pokazuje na \_\_malloc\_hook
Kreirajte nekoliko chunk-ova:
* `fastbin_victim` (0x60, offset 0): UAF chunk kasnije za uređivanje pokazivača heap-a kako bi pokazivao na vrednost LibC-a.
* `chunk2` (0x80, offset 0x70): Za dobro poravnanje
* `main_arena_use` (0x80, offset 0x100)
* `relative_offset_heap` (0x60, offset 0x190): relativni offset na chunk-u 'main\_arena\_use'
Zatim `free(main_arena_use)` što će postaviti ovaj chunk u nesortiranu listu i dobiti pokazivač na `main_arena + 0x68` u oba `fd` i `bk` pokazivača.
Sada je alociran novi chunk `fake_libc_chunk(0x60)` jer će sadržati pokazivače na `main_arena + 0x68` u `fd` i `bk`.
Zatim su oslobođeni `relative_offset_heap` i `fastbin_victim`.
```c
/*
Current heap layout:
0x0: fastbin_victim - size 0x70
0x70: alignment_filler - size 0x90
0x100: fake_libc_chunk - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main - size 0x20
0x190: relative_offset_heap - size 0x70
bin layout:
fastbin: fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
```
* &#x20;`fastbin_victim` ima `fd` koji pokazuje na `relative_offset_heap`
* &#x20;`relative_offset_heap` je odmak udaljenosti od `fake_libc_chunk`, koji sadrži pokazivač na `main_arena + 0x68`
* Menjanjem poslednjeg bajta `fastbin_victim.fd` moguće je naterati `fastbin_victim` da pokazuje na `main_arena + 0x68`
Za prethodne radnje, napadač mora biti sposoban da izmeni fd pokazivač `fastbin_victim`.
Zatim, `main_arena + 0x68` nije toliko interesantan, pa ga modifikujemo tako da pokazuje na **`__malloc_hook`**.
Imajte na umu da `__memalign_hook` obično počinje sa `0x7f` i nulama ispred toga, pa je moguće lažirati ga kao vrednost u `0x70` fast binu. Budući da su poslednja 4 bita adrese **nasumična**, postoji `2^4=16` mogućnosti da vrednost završi tamo gde nas zanima. Zato se ovde vrši BF napad kako bi se ishodilo da chunk završi kao: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.**
(Za više informacija o preostalim bajtovima proverite objašnjenje u [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)[ primeru](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)). Ako BF ne uspe, program jednostavno puca (pa počnite ponovo dok ne uspe).
Zatim, vrše se 2 malloc-a kako bi se uklonila 2 početna fast bin chunka, a zatim se alocira treći kako bi se dobio chunk u **`__malloc_hook:`**
```c
malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);
```
### Deo 2: Napad na nesortiran bin
Za više informacija možete proveriti:
{% content-ref url="unsorted-bin-attack.md" %}
[unsorted-bin-attack.md](unsorted-bin-attack.md)
{% endcontent-ref %}
Ali u osnovi omogućava pisanje `main_arena + 0x68` na bilo koju lokaciju koja je određena u `chunk->bk`. Za napad biramo `__malloc_hook`. Zatim, nakon što ga prepisujemo, koristićemo relativno prepisivanje da bismo pokazali na `one_gadget`.
Za to počinjemo dobijanjem chunk-a i smeštanjem ga u **nesortirani bin**:
```c
uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate
puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
```
Iskoristite UAF u ovom delu da usmerite `unsorted_bin_ptr->bk` na adresu `__malloc_hook` (ovo smo prethodno grubo forsirali).
{% hint style="danger" %}
Imajte na umu da ovaj napad korumpira unsorted bin (takođe i small i large). Zato sada možemo **koristiti alokacije iz fast bina** (kompleksniji programi mogu vršiti druge alokacije i srušiti se), i da bismo pokrenuli ovo moramo **alocirati istu veličinu ili će program pasti.**
{% endhint %}
Dakle, da bismo pokrenuli upis `main_arena + 0x68` u `__malloc_hook` nakon postavljanja `__malloc_hook` u `unsorted_bin_ptr->bk`, jednostavno treba da uradimo: **`malloc(0x80)`**
### Korak 3: Postavljanje \_\_malloc\_hook na system
U koraku jedan smo završili kontrolišući chunk koji sadrži `__malloc_hook` (u promenljivoj `malloc_hook_chunk`) i u drugom koraku smo uspeli da upišemo `main_arena + 0x68` ovde.
Sada zloupotrebljavamo delimičan upis u `malloc_hook_chunk` da bismo koristili libc adresu koju smo tamo napisali (`main_arena + 0x68`) da **usmerimo adresu `one_gadget`**.
Ovde je potrebno **grubo forsirati 12 bita nasumičnosti** (više informacija u [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)[ primeru](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)).
Na kraju, kada se ispravna adresa prepiše, **pozovite `malloc` i pokrenite `one_gadget`**.
## Reference
* [https://github.com/shellphish/how2heap](https://github.com/shellphish/how2heap)
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_roman/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_roman/)
<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 PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](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>