Large Bin Attack

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Basic Information

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

Bins & Memory Allocations

Είναι δυνατόν να βρείτε ένα εξαιρετικό παράδειγμα στο how2heap - large bin attack.

Βασικά, εδώ μπορείτε να δείτε πώς, στην τελευταία "τρέχουσα" έκδοση της glibc (2.35), δεν ελέγχεται: P->bk_nextsize επιτρέποντας την τροποποίηση μιας αυθαίρετης διεύθυνσης με την τιμή ενός μεγάλου bin chunk αν πληρούνται ορισμένες προϋποθέσεις.

Σε αυτό το παράδειγμα μπορείτε να βρείτε τις εξής προϋποθέσεις:

  • Ένα μεγάλο chunk έχει κατανεμηθεί

  • Ένα μεγάλο chunk μικρότερο από το πρώτο αλλά στην ίδια θέση έχει κατανεμηθεί

  • Πρέπει να είναι μικρότερο ώστε να μπει πρώτο στο bin

  • (Δημιουργείται ένα chunk για να αποτραπεί η συγχώνευση με το κορυφαίο chunk)

  • Στη συνέχεια, το πρώτο μεγάλο chunk απελευθερώνεται και κατανεμηθεί ένα νέο chunk μεγαλύτερο από αυτό -> Chunk1 πηγαίνει στο μεγάλο bin

  • Στη συνέχεια, το δεύτερο μεγάλο chunk απελευθερώνεται

  • Τώρα, η ευπάθεια: Ο επιτιθέμενος μπορεί να τροποποιήσει chunk1->bk_nextsize σε [target-0x20]

  • Στη συνέχεια, κατανεμήθηκε ένα μεγαλύτερο chunk από το chunk 2, έτσι το chunk2 εισάγεται στο μεγάλο bin αντικαθιστώντας τη διεύθυνση chunk1->bk_nextsize->fd_nextsize με τη διεύθυνση του chunk2

Υπάρχουν άλλα πιθανά σενάρια, το θέμα είναι να προσθέσουμε στο μεγάλο bin ένα chunk που είναι μικρότερο από ένα τρέχον X chunk στο bin, έτσι πρέπει να εισαχθεί ακριβώς πριν από αυτό στο bin, και πρέπει να μπορούμε να τροποποιήσουμε το bk_nextsize του X καθώς εκεί θα γραφτεί η διεύθυνση του μικρότερου chunk.

Αυτή είναι η σχετική κωδικοποίηση από το malloc. Έχουν προστεθεί σχόλια για να κατανοήσουμε καλύτερα πώς η διεύθυνση αντικαταστάθηκε:

/* if smaller than smallest, bypass loop below */
assert (chunk_main_arena (bck->bk));
if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk))
{
fwd = bck; // fwd = p1
bck = bck->bk; // bck = p1->bk

victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk)
victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}

Αυτό θα μπορούσε να χρησιμοποιηθεί για να επικαλύψει τη μεταβλητή global_max_fast της libc για να εκμεταλλευτεί μια επίθεση fast bin με μεγαλύτερα κομμάτια.

Μπορείτε να βρείτε μια άλλη εξαιρετική εξήγηση αυτής της επίθεσης στο guyinatuxedo.

Άλλα παραδείγματα

  • Επίθεση large bin στην ίδια κατάσταση όπως εμφανίζεται στο how2heap.

  • Η primitive write είναι πιο περίπλοκη, επειδή το global_max_fast είναι άχρηστο εδώ.

  • Χρειάζεται FSOP για να ολοκληρωθεί η εκμετάλλευση.

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Υποστηρίξτε το HackTricks

Last updated