7.6 KiB
Επίθεση Large Bin
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο AWS Hacking:Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε 💬 στην ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Κοινοποιήστε κόλπα χάκερ υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια στο GitHub.
Βασικές Πληροφορίες
Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα μεγάλο 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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε 💬 στην ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα χάκερ υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια στο GitHub.