Unsorted Bin Attack
Reading time: 7 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Basic Information
Za više informacija o tome šta je unsorted bin, pogledajte ovu stranicu:
Unsorted liste mogu da upisuju adresu u unsorted_chunks (av)
u bk
adresu chunk-a. Stoga, ako napadač može da modifikuje adresu bk
pokazivača u chunk-u unutar unsorted bin-a, mogao bi da upisuje tu adresu u proizvoljnu adresu što bi moglo biti korisno za otkrivanje Glibc adresa ili zaobići neku od odbrana.
Dakle, u suštini, ovaj napad omogućava da se postavi velika brojka na proizvoljnu adresu. Ova velika brojka je adresa, koja može biti adresa heap-a ili Glibc adresa. Tipičan cilj je global_max_fast
kako bi se omogućilo kreiranje fast bin bin-ova sa većim veličinama (i prelazak iz unsorted bin napada u fast bin napad).
tip
P>ogledajte primer dat u https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle i koristeći 0x4000 i 0x5000 umesto 0x400 i 0x500 kao veličine chunk-ova (da bi se izbegao Tcache) moguće je videti da se danas greška malloc(): unsorted double linked list corrupted
aktivira.
Stoga, ovaj unsorted bin napad sada (pored drugih provera) takođe zahteva da se može popraviti dvostruko povezani spisak tako da se zaobiđe victim->bk->fd == victim
ili ne victim->fd == av (arena)
, što znači da adresa na koju želimo da pišemo mora imati adresu lažnog chunk-a u svom fd
položaju i da lažni chunk fd
pokazuje na arenu.
caution
Imajte na umu da ovaj napad korumpira unsorted bin (takođe mali i veliki). Dakle, možemo samo koristiti alokacije iz fast bin-a sada (kompleksniji program može raditi druge alokacije i srušiti se), a da bismo to aktivirali, moramo alokirati istu veličinu ili će se program srušiti.
Imajte na umu da prepisivanje global_max_fast
može pomoći u ovom slučaju verujući da će fast bin moći da se brine o svim ostalim alokacijama dok se eksploatacija ne završi.
Kod od guyinatuxedo to vrlo dobro objašnjava, iako ako modifikujete malloc-ove da alocirate dovoljno veliku memoriju da ne završite u Tcache-u, možete videti da se prethodno pomenuta greška pojavljuje sprečavajući ovu tehniku: malloc(): unsorted double linked list corrupted
Unsorted Bin Infoleak Attack
Ovo je zapravo vrlo osnovni koncept. Chunk-ovi u unsorted bin-u će imati pokazivače. Prvi chunk u unsorted bin-u će zapravo imati fd
i bk
linkove koji upućuju na deo glavne arene (Glibc).
Stoga, ako možete staviti chunk unutar unsorted bin-a i pročitati ga (use after free) ili ponovo ga alocirati bez prepisivanja barem 1 od pokazivača da biste zatim pročitali ga, možete imati Glibc info leak.
Sličan napad korišćen u ovom izveštaju bio je zloupotreba strukture od 4 chunk-a (A, B, C i D - D je samo da spreči konsolidaciju sa top chunk-om) tako da je korišćen null byte overflow u B da bi C ukazivao da je B neiskorišćen. Takođe, u B su podaci prev_size
modifikovani tako da je veličina umesto veličine B bila A+B.
Zatim je C dealokiran, i konsolidovan sa A+B (ali je B još uvek bio u upotrebi). Novi chunk veličine A je alociran i zatim su adrese libc otkrivene napisane u B odakle su otkrivene.
References & Other examples
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap
- Cilj je prepisati globalnu promenljivu sa vrednošću većom od 4869 kako bi bilo moguće dobiti zastavicu i PIE nije omogućen.
- Moguće je generisati chunk-ove proizvoljnih veličina i postoji heap overflow sa željenom veličinom.
- Napad počinje kreiranjem 3 chunk-a: chunk0 za zloupotrebu overflow-a, chunk1 da bude overflow-ovan i chunk2 da top chunk ne konsoliduje prethodne.
- Zatim, chunk1 se oslobađa i chunk0 se overflow-uje tako da
bk
pokazivač chunk-a1 pokazuje na:bk = magic - 0x10
- Zatim, chunk3 se alocira sa istom veličinom kao chunk1, što će aktivirati unsorted bin napad i modifikovati vrednost globalne promenljive, omogućavajući dobijanje zastavice.
- https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html
- Funkcija merge je ranjiva jer ako su oba prosleđena indeksa ista, ona će realloc-ovati na njemu i zatim ga osloboditi, ali vraćajući pokazivač na tu oslobođenu oblast koja se može koristiti.
- Stoga, 2 chunk-a su kreirana: chunk0 koji će se spojiti sa samim sobom i chunk1 da spreči konsolidaciju sa top chunk-om. Zatim, merge funkcija se poziva sa chunk0 dva puta što će izazvati use after free.
- Zatim,
view
funkcija se poziva sa indeksom 2 (što je indeks chunk-a koji je use after free), što će otkriti libc adresu. - Kako binarni fajl ima zaštite da samo malloc veličine veće od
global_max_fast
mogu da se koriste, koristiće se unsorted bin napad da prepiše globalnu promenljivuglobal_max_fast
. - Zatim, moguće je pozvati edit funkciju sa indeksom 2 (pokazivač use after free) i prepisati
bk
pokazivač da pokazuje nap64(global_max_fast-0x10)
. Zatim, kreiranje novog chunk-a koristi prethodno kompromitovanu oslobođenu adresu (0x20) će aktivirati unsorted bin napad prepisujućiglobal_max_fast
sa veoma velikom vrednošću, omogućavajući sada kreiranje chunk-ova u fast bin-ovima. - Sada se izvodi fast bin napad:
- Prvo je otkriveno da je moguće raditi sa fast chunk-ovima veličine 200 na lokaciji
__free_hook
: gef➤ p &__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
- Ako uspemo da dobijemo fast chunk veličine 0x200 na ovoj lokaciji, biće moguće prepisati pokazivač funkcije koja će biti izvršena
- Za to, kreira se novi chunk veličine
0xfc
i merge funkcija se poziva sa tim pokazivačem dva puta, na ovaj način dobijamo pokazivač na oslobođeni chunk veličine0xfc*2 = 0x1f8
u fast bin-u. - Zatim, edit funkcija se poziva na ovom chunk-u da modifikuje
fd
adresu ovog fast bin-a da pokazuje na prethodnu__free_hook
funkciju. - Zatim, kreira se chunk veličine
0x1f8
da se povuče iz fast bin-a prethodni beskorisni chunk tako da se kreira još jedan chunk veličine0x1f8
da se dobije fast bin chunk u__free_hook
koji se prepisuje sa adresom funkcijesystem
. - I konačno, chunk koji sadrži string
/bin/sh\x00
se oslobađa pozivajući delete funkciju, aktivirajući__free_hook
funkciju koja pokazuje na system sa/bin/sh\x00
kao parametrom. - CTF https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html
- Još jedan primer zloupotrebe 1B overflow-a za konsolidaciju chunk-ova u unsorted bin-u i dobijanje libc infoleak-a, a zatim izvođenje fast bin napada za prepisivanje malloc hook-a sa adresom jednog gadget-a.
- Robot Factory. BlackHat MEA CTF 2022
- Možemo samo alocirati chunk-ove veličine veće od
0x100
. - Prepisivanje
global_max_fast
koristeći Unsorted Bin napad (radi 1/16 puta zbog ASLR, jer treba da modifikujemo 12 bitova, ali moramo modifikovati 16 bitova). - Fast Bin napad za modifikaciju globalnog niza chunk-ova. Ovo daje proizvoljnu read/write primitivu, koja omogućava modifikaciju GOT-a i postavljanje neke funkcije da pokazuje na
system
.
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.