mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-03 09:59:40 +00:00
138 lines
8 KiB
Markdown
138 lines
8 KiB
Markdown
|
# 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
|
||
|
*/
|
||
|
```
|
||
|
*  `fastbin_victim` ima `fd` koji pokazuje na `relative_offset_heap`
|
||
|
*  `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>
|