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

Basic Information

Za više informacija o tome šta je unsorted bin, pogledajte ovu stranicu:

Bins & Memory Allocations

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 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 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čine 0xfc*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čine 0x1f8 da se dobije 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
  • 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