hacktricks/binary-exploitation/libc-heap/large-bin-attack.md

7.6 KiB
Raw Blame History

Επίθεση Large Bin

{% hint style="success" %} Μάθετε & εξασκηθείτε στο AWS Hacking:Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)

Υποστηρίξτε το HackTricks
{% endhint %}

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

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

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

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

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

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

  • Ένα μεγάλο κομμάτι είναι εκχωρημένο
  • Ένα μεγάλο κομμάτι μικρότερο από το πρώτο αλλά στον ίδιο δείκτη είναι εκχωρημένο
  • Πρέπει να είναι μικρότερο ώστε στο bin να πάει πρώτο
  • (Δημιουργείται ένα κομμάτι για να αποτρέψει τη συγχώνευση με το κομμάτι στην κορυφή)
  • Στη συνέχεια, το πρώτο μεγάλο κομμάτι απελευθερώνεται και εκχωρείται ένα νέο κομμάτι μεγαλύτερο από αυτό -> Το Κομμάτι1 πηγαίνει στο μεγάλο bin
  • Στη συνέχεια, το δεύτερο μεγάλο κομμάτι απελευθερώνεται
  • Τώρα, η ευπάθεια: Ο επιτιθέμενος μπορεί να τροποποιήσει το chunk1->bk_nextsize σε [target-0x20]
  • Στη συνέχεια, εκχωρείται ένα μεγαλύτερο κομμάτι από το κομμάτι 2, έτσι το κομμάτι2 εισάγεται στο μεγάλο bin αντικαθιστώντας τη διεύθυνση chunk1->bk_nextsize->fd_nextsize με τη διεύθυνση του κομματιού 2

{% hint style="success" %} Υπάρχουν και άλλα πιθανά σενάρια, το θέμα είναι να προστεθεί στο μεγάλο bin ένα κομμάτι που είναι μικρότερο από ένα τρέχον X κομμάτι στο bin, έτσι πρέπει να εισαχθεί ακριβώς πριν από αυτό στο bin, και πρέπει να μπορούμε να τροποποιήσουμε το bk_nextsize του X καθώς εκεί θα γραφτεί η διεύθυνση του μικρότερου κομματιού. {% endhint %}

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

{% code overflow="wrap" %}

/* 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
}

{% endcode %}

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

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

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

  • La casa de papel. HackOn CTF 2024
  • Επίθεση large bin στην ίδια κατάσταση όπως εμφανίζεται στο how2heap.
  • Η γραφή primitive είναι πιο πολύπλοκη, επειδή η global_max_fast είναι άχρηστη εδώ.
  • Απαιτείται FSOP για να ολοκληρωθεί η εκμετάλλευση.

{% hint style="success" %} Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Υποστηρίξτε το HackTricks
{% endhint %}