8 KiB
Kuća Romana
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
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!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte Porodičnu PEASS, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitteru 🐦 @hacktricks_live.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
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.
Kod
- Primer možete pronaći na 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 poravnanjemain_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
.
/*
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
imafd
koji pokazuje narelative_offset_heap
-
relative_offset_heap
je odmak udaljenosti odfake_libc_chunk
, koji sadrži pokazivač namain_arena + 0x68
- Menjanjem poslednjeg bajta
fastbin_victim.fd
moguće je nateratifastbin_victim
da pokazuje namain_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 primeru). 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:
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 {% 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:
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 primeru).
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/blob/master/glibc_2.23/house_of_roman.c
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
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!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi](https://t.me/peass) ili nas pratite na Twitteru 🐦 @hacktricks_live.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.