# Unsorted Bin Attack {{#include ../../banners/hacktricks-training.md}} ## Basic Information Za više informacija o tome šta je unsorted bin, pogledajte ovu stranicu: {{#ref}} bins-and-memory-allocations.md {{#endref}} 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 na 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](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 izbegnete 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 na svojoj `fd` poziciji 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**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) 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**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html), 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 označio 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 iz libc-a koje su procurile upisane u B odakle su procurile. ## References & Other examples - [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap**](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**](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 **procuriti libc adresu**. - Kako binarni program ima zaštite da samo malloc-uje veličine veće od **`global_max_fast`**, tako da se ne koristi fastbin, koristiće se unsorted bin napad da prepiše globalnu promenljivu `global_max_fast`. - Zatim, moguće je pozvati edit funkciju sa indeksom 2 (pokazivač use after free) i prepisati `bk` pokazivač da pokazuje na `p64(global_max_fast-0x10)`. Zatim, kreiranje novog chunk-a koristi prethodno kompromitovanu oslobođenu adresu (0x20) će **aktivirati unsorted bin napad** prepisujući `global_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 **`__free_hook`** lokaciji: -
gef➤  p &__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
gef➤  x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6074f: 0x0000000000000000      0x0000000000000200
0x7ff1e9e6075f: 0x0000000000000000      0x0000000000000000
0x7ff1e9e6076f :      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čine `0xfc*2 = 0x1f8` u fast bin-u. - Zatim, poziva se edit funkcija 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čine `0x1f8` da bi se dobio fast bin chunk u **`__free_hook`** koji se prepisuje sa adresom funkcije **`system`**. - 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**](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**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/) - Možemo alocirati samo chunk-ove veličine veće od `0x100`. - Prepisivanje `global_max_fast` koristeći Unsorted Bin napad (radi 1/16 puta zbog ASLR, jer moramo modifikovati 12 bita, ali moramo modifikovati 16 bita). - 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`. {{#include ../../banners/hacktricks-training.md}}