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

9 KiB
Raw Blame History

Tcache Bin Attack

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Red Team του HackTricks AWS)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Βασικές Πληροφορίες

Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα tcache bin ελέγξτε αυτήν τη σελίδα:

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

Καταρχάς, σημειώστε ότι το Tcache εισήχθη στην έκδοση glibc 2.26.

Η επίθεση Tcache που προτάθηκε στη σελίδα guyinatuxido είναι πολύ παρόμοια με την επίθεση fast bin όπου ο στόχος είναι να αντικατασταθεί ο δείκτης προς το επόμενο τμήμα στο bin μέσα σε ένα ελεύθερο τμήμα με μια τυχαία διεύθυνση, έτσι ώστε αργότερα να είναι δυνατή η εκχώρηση αυτής της συγκεκριμένης διεύθυνσης και ενδεχομένως η αντικατάσταση δεικτών.

Ωστόσο, σήμερα, αν εκτελέσετε τον αναφερόμενο κώδικα, θα λάβετε το σφάλμα: malloc(): unaligned tcache chunk detected. Έτσι, είναι απαραίτητο να γράψετε ως διεύθυνση στον νέο δείκτη μια ευθυγραμμισμένη διεύθυνση (ή να εκτελέσετε αρκετές φορές το δυαδικό αρχείο ώστε η γραμμένη διεύθυνση να είναι πράγματι ευθυγραμμισμένη).

Επίθεση δεικτών tcache indexes

Συνήθως είναι δυνατόν να βρεθεί στην αρχή της στοίβας ένα τμήμα που περιέχει τον αριθμό των τμημάτων ανά δείκτη μέσα στο tcache και τη διεύθυνση του κεφαλαίου τμήματος κάθε δείκτη tcache. Αν για κάποιο λόγο είναι δυνατόν να τροποποιηθούν αυτές οι πληροφορίες, θα ήταν δυνατό να κάνετε το κεφάλαιο τμήμα κάποιου δείκτη να δείχνει σε μια επιθυμητή διεύθυνση (όπως το malloc hook) για να εκχωρηθεί στη συνέχεια ένα τμήμα μεγέθους του δείκτη και να αντικατασταθούν τα περιεχόμενα του malloc hook σε αυτήν την περίπτωση.

Examples

  • CTF https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html
  • Libc info leak: It's possible to fill the tcaches, add a chunk into the unsorted list, empty the tcache and re-allocate the chunk from the unsorted bin only overwriting the first 8B, leaving the second address to libc from the chunk intact so we can read it.
  • Tcache attack: The binary is vulnerable a 1B heap overflow. This will be abuse to change the size header of an allocated chunk making it bigger. Then, this chunk will be freed, adding it to the tcache of chunks of the fake size. Then, we will allocate a chunk with the faked size, and the previous chunk will be returned knowing that this chunk was actually smaller and this grants up the opportunity to overwrite the next chunk in memory.
    We will abuse this to overwrite the next chunk's FD pointer to point to malloc_hook, so then its possible to alloc 2 pointers: first the legit pointer we just modified, and then the second allocation will return a chunk in malloc_hook that it's possible to abuse to write a one gadget.
  • CTF https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html
  • Libc info leak: There is a use after free and a double free. In this writeup the author leaked an address of libc by readnig the address of a chunk placed in a small bin (like leaking it from the unsorted bin but from the small one)
  • Tcache attack: A Tcache is performed via a double free. The same chunk is freed twice, so inside the Tcache the chunk will point to itself. Then, it's allocated, its FD pointer is modified to point to the free hook and then it's allocated again so the next chunk in the list is going to be in the free hook. Then, this is also allocated and it's possible to write a the address of system here so when a malloc containing "/bin/sh" is freed we get a shell.
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html
  • The main vuln here is the capacity to free any address in the heap by indicating its offset
  • Tcache indexes attack: It's possible to allocate and free a chunk of a size that when stored inside the tcache chunk (the chunk with the info of the tcache bins) will generate an address with the value 0x100. This is because the tcache stores the amount of chunks on each bin in different bytes, therefore one chunk in one specific index generates the value 0x100.
  • Then, this value looks like there is a chunk of size 0x100. Allowing to abuse it by free this address. This will add that address to the index of chunks of size 0x100 in the tcache.
  • Then, allocating a chunk of size 0x100, the previous address will be returned as a chunk, allowing to overwrite other tcache indexes.
    For example putting the address of malloc hook in one of them and allocating a chunk of the size of that index will grant a chunk in calloc hook, which allows for writing a one gadget to get a s shell.
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html
  • Same vulnerability as before with one extra restriction
  • Tcache indexes attack: Similar attack to the previous one but using less steps by freeing the chunk that contains the tcache info so it's address is added to the tcache index of its size so it's possible to allocate that size and get the tcache chunk info as a chunk, which allows to add free hook as the address of one index, alloc it, and write a one gadget on it.
Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!

Other ways to support HackTricks: