Tcache Bin Attack
Μάθετε & εξασκηθείτε στο Hacking του AWS:Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο Hacking του GCP:
Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)
Βασικές Πληροφορίες
Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα Tcache bin ελέγξτε αυτήν τη σελίδα:
Bins & Memory AllocationsΚαταρχάς, σημειώστε ότι το Tcache εισήχθη στην έκδοση Glibc 2.26.
Η επίθεση Tcache (επίσης γνωστή ως δηλητηρίαση Tcache) που προτάθηκε στη σελίδα guyinatuxido είναι πολύ παρόμοια με την επίθεση fast bin όπου ο στόχος είναι να αντικατασταθεί ο δείκτης προς το επόμενο τμήμα στο bin μέσα σε ένα ελεύθερο τμήμα με μια τυχαία διεύθυνση, ώστε αργότερα να είναι δυνατή η εκχώρηση αυτής της συγκεκριμένης διεύθυνσης και ενδεχομένως η αντικατάσταση δεικτών.
Ωστόσο, σήμερα, αν εκτελέσετε τον αναφερόμενο κώδικα, θα λάβετε το σφάλμα: malloc(): unaligned tcache chunk detected
. Έτσι, είναι απαραίτητο να γράψετε ως διεύθυνση στον νέο δείκτη μια ευθυγραμμισμένη διεύθυνση (ή να εκτελέσετε αρκετές φορές το δυαδικό αρχείο ώστε η γραμμένη διεύθυνση να είναι πραγματικά ευθυγραμμισμένη).
Επιθέσεις δεικτών Tcache
Συνήθως είναι δυνατό να βρείτε στην αρχή της στοίβας ένα τμήμα που περιέχει τον αριθμό τμημάτων ανά δείκτη μέσα στο tcache και τη διεύθυνση του κεφαλαίου τμήματος κάθε δείκτη tcache. Αν για κάποιο λόγο είναι δυνατό να τροποποιηθούν αυτές οι πληροφορίες, θα ήταν δυνατό να κάνετε το κεφάλαιο τμήμα κάποιου δείκτη να δείχνει σε μια επιθυμητή διεύθυνση (όπως το __malloc_hook
) ώστε στη συνέχεια να εκχωρηθεί ένα τμήμα με το μέγεθος του δείκτη και να αντικατασταθούν τα περιεχόμενα του __malloc_hook
σε αυτήν την περίπτωση.
Παραδείγματα
Διαρροή πληροφοριών Libc: Είναι δυνατό να γεμίσετε τα tcaches, να προσθέσετε ένα τμήμα στη λίστα μη ταξινομημένων, να αδειάσετε το tcache και να επανα-εκχωρήσετε το τμήμα από τη λίστα μη ταξινομημένων αλλάζοντας μόνο τα πρώτα 8B, αφήνοντας τη δεύτερη διεύθυνση προς το Libc από το τμήμα ακέραια έτσι ώστε να μπορούμε να τη διαβάσουμε.
Επίθεση Tcache: Το δυαδικό αρχείο είναι ευάλωτο σε ένα 1B υπερχείλιση στη στοίβα. Αυτό θα εκμεταλλευτεί για να αλλάξει το κεφαλίδα μεγέθους ενός εκχωρημένου τμήματος κάνοντάς το μεγαλύτερο. Στη συνέχεια, αυτό το τμήμα θα ελευθερωθεί, προσθέτοντάς το στο tcache τμημάτων με το ψευδές μέγεθος. Στη συνέχεια, θα εκχωρηθεί ένα τμήμα με το πλαστό μέγεθος, και το προηγούμενο τμήμα θα επιστραφεί γνωρίζοντας ότι αυτό το τμήμα ήταν πραγματικά μικρότερο και αυτό προσφέρει τη δυνατότητα να αντικατασταθεί ο επόμενος δείκτης στη μνήμη. Θα εκμεταλλευτούμε αυτό για να αντικαταστήσουμε τον δείκτη FD του επόμενου τμήματος ώστε να δείχνει στο
malloc_hook
, έτσι ώστε είναι δυνατό να εκχωρηθούν 2 δείκτες: πρώτα ο νόμιμος δείκτης που μόλις τροποποιήσαμε, και στη συνέχεια η δεύτερη εκχώρηση θα επιστρέψει ένα τμήμα στοmalloc_hook
που είναι δυνατό να εκμεταλλευτεί για να γραφτεί ένα one gadget.Διαρροή πληροφοριών Libc: Υπάρχει ένα use after free και ένα double free. Σε αυτήν την ανάλυση ο συγγραφέας διέρρευσε μια διεύθυνση του Libc διαβάζοντας τη διεύθυνση ενός τμήματος που τοποθετήθηκε σε ένα μικρό bin (όπως να το διαρρεύσει από το unsorted bin αλλά από το μικρό).
Επίθεση Tcache: Μια Tcache πραγματοποιείται μέσω ενός διπλού free. Το ίδιο τμήμα ελευθερώνεται δύο φορές, έτσι μέσα στο Tcache το τμήμα θα δείχνει στον εαυτό του. Στη συνέχεια, εκχωρείται, ο δείκτης FD του τροποποιείται ώστε να δείχνει στο free hook και στη συνέχεια εκχωρείται ξανά, έτσι το επόμενο τμήμα στη λίστα θα βρίσκεται στο free hook. Στη συνέχεια, αυτό επίσης εκχωρείται και είναι δυνατό να γραφτεί η διεύθυνση του
system
εδώ, έτσι όταν ένα malloc που περιέχει"/bin/sh"
ελευθερωθεί, λαμβάνουμε ένα κέλυφος.Η κύρια ευπάθεια εδώ είναι η δυνατότητα να
ελευθερώσετε
οποιαδήποτε διεύθυνση στη στοίβα δηλώνοντας την οφσετ.Επίθεση δεικτών Tcache: Είναι δυνατό να εκχωρηθεί και να ελευθερωθεί ένα τμήμα με μέγεθος που όταν αποθηκευτεί μέσα στο tcache τμήμα (το τμήμα με τις πληροφορίες των tcache bins) θα δημιουργήσει μια διεύθυνση με την τιμή 0x100. Αυτό συμβαίνει επειδή το tcache αποθηκεύει τον αριθμό των τμημάτων σε κάθε bin σε διαφορετικά bytes, επομένως ένα τμήμα σε ένα συγκεκριμένο δείκτη δημιουργεί την τιμή 0x100.
Στη συνέχεια, αυτή η τιμή μοιάζει ότι υπάρχει ένα τμήμα μεγέθους 0x100. Επιτρέποντας να εκμεταλ
Συμμετέχετε στη 💬 ομάδα Discord ή την ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
Κοινοποιήστε χάκινγκ κόλπα υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.
Last updated