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

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:

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

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.

/*
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 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

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u: