Unsorted Bin Attack
Last updated
Last updated
Μάθετε & εξασκηθείτε στο Hacking του AWS:Εκπαίδευση HackTricks AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο Hacking του GCP: Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)
Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα unsorted bin ελέγξτε αυτήν τη σελίδα:
Bins & Memory AllocationsΟι μη ταξινομημένες λίστες είναι σε θέση να γράψουν τη διεύθυνση στο unsorted_chunks (av)
στη διεύθυνση bk
του κομματιού. Επομένως, αν ένας επιτιθέμενος μπορεί να τροποποιήσει τη διεύθυνση του δείκτη bk
σε ένα κομμάτι μέσα στο unsorted bin, θα μπορούσε να γράψει αυτήν τη διεύθυνση σε μια αυθαίρετη διεύθυνση που θα μπορούσε να βοηθήσει στη διαρροή μιας διεύθυνσης Glibc ή στην παράκαμψη ορισμένων μέτρων προστασίας.
Έτσι, βασικά, αυτή η επίθεση επιτρέπει να οριστεί ένα μεγάλο αριθμό σε μια αυθαίρετη διεύθυνση. Αυτός ο μεγάλος αριθμός είναι μια διεύθυνση, η οποία θα μπορούσε να είναι μια διεύθυνση στο heap ή μια διεύθυνση Glibc. Ένας τυπικός στόχος είναι το global_max_fast
για να επιτραπεί η δημιουργία fast bin bins με μεγαλύτερα μεγέθη (και να περάσει από μια επίθεση unsorted bin σε μια επίθεση fast bin).
Κοιτάζοντας το παράδειγμα που παρέχεται στο https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle και χρησιμοποιώντας τα 0x4000 και 0x5000 αντί για τα 0x400 και 0x500 ως μεγέθη κομματιών (για να αποφευχθεί η Tcache) είναι δυνατό να δούμε ότι σήμερα προκαλείται το σφάλμα malloc(): unsorted double linked list corrupted
.
Επομένως, αυτή η επίθεση unsorted bin τώρα (μεταξύ άλλων ελέγχων) απαιτεί επίσης να είναι δυνατή η επιδιόρθωση της διπλής συνδεδεμένης λίστας ώστε να παρακαμφθεί αυτό victim->bk->fd == victim
ή όχι victim->fd == av (arena)
, που σημαίνει ότι η διεύθυνση όπου θέλουμε να γράψουμε πρέπει να έχει τη διεύθυνση του ψεύτικου κομματιού στη θέση του fd
και ότι το ψεύτικο κομμάτι fd
δείχνει στην αρένα.
Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (επομένως και τα μικρά και μεγάλα). Έτσι, μπορούμε μόνο να χρησιμοποιήσουμε εκχωρήσεις από το fast bin τώρα (ένα πιο πολύπλοκο πρόγραμμα ενδέχεται να κάνει άλλες εκχωρήσεις και να καταρρεύσει), και για να προκαλέσουμε αυτό πρέπει να εκχωρήσουμε το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.
Σημειώστε ότι η αντικατάσταση του global_max_fast
μπορεί να βοηθήσει σε αυτήν την περίπτωση εμπιστευόμενοι ότι το fast bin θα είναι σε θέση να φροντίσει όλες τις άλλες εκχωρήσεις μέχρι να ολοκληρωθεί η εκμετάλλευση.
Ο κώδικας από τον guyinatuxedo το εξηγεί πολύ καλά, αν και αν τροποποιήσετε τις κλήσεις malloc για να εκχωρήσετε μνήμη αρκετά μεγάλη ώστε να μην καταλήξετε σε Tcache, μπορείτε να δείτε ότι εμφανίζεται το προαναφερθέν σφάλμα που αποτρέπει αυτήν την τεχνική: malloc(): unsorted double linked list corrupted
Αυτό είναι πραγματικά ένα πολύ βασικό έννοια. Τα κομμάτια στο unsorted bin θα έχουν δείκτες. Το πρώτο κομμάτι στο unsorted bin θα έχει πραγματικά τους fd
και bk
συνδέσμους που δείχνουν σε μέρος της κύριας αρένας (Glibc).
Επομένως, αν μπορείτε να τοποθετήσετε ένα κομμάτι μέσα σε ένα unsorted bin και να το διαβάσετε (χρήση μετά από απελευθέρωση) ή να το εκχωρήσετε ξανά χωρίς να αντικαταστήσετε τουλάχιστον 1 από τους δείκτες για να το διαβάσετε μετά, μπορείτε να έχετε μια διαρροή πληροφοριών Glibc.
Μια παρόμοια επίθεση που χρησιμοποιήθηκε σε αυτήν την ανάλυση, ήταν να καταχραστεί μια δομή 4 κομματιών (Α, Β, Γ και Δ - το Δ είναι μόνο για να αποτρέψει τη συγχώνευση με το κομμάτι κορυφής) έτσι ώστε ένας υπερχείλιση με κενό byte στο Β να κάνει τον Γ να υποδεικνύει ότι το Β δεν χρησιμοποιείται. Επίσης, στο Β τα δεδομένα prev_size
τροποποιήθηκαν έτσι ώστε το μέγεθος αντί να είναι το μέγεθος του Β να είναι Α+Β.
Στη συνέχεια απελευθερώθηκε ο Γ και συγχωνεύτηκε με το Α+Β (αλλά το Β ήταν ακόμα σε χρήση). Ένα νέο κομμάτι μεγέθους Α εκχωρήθηκε και στη συνέχεια οι διευθύνσεις που διέρρευσαν από την Glibc γράφτηκαν στο Β από όπου διέρρευσαν.
Ο στόχος είναι να αντικατασταθεί μια παγκόσμια μεταβλητή με μια τιμή μεγαλύτερη από 4869 για να είναι δυνατή η λήψη της σημαίας και το PIE δεν είναι ενεργοποιημένο.
Είναι δυνατό να δημιουργηθούν κομμάτια αυθαίρετου μεγέθους και υπάρχει υπερχείλιση στο heap με το επιθυμητό μέγεθος.
Η επίθεση ξεκινά δημιουργώντας 3 κομμάτια: το κομμάτι0 για να καταχραστεί την υπερχείλιση, το κομμάτι1 για να υποστεί υπερχείλιση και 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
Εάν καταφέρουμε να αποκτήσουμε ένα γρήγορο κομμάτι μεγέθους 0x200 σε αυτήν τη θέση, θα είναι δυνατό να αντικαταστήσουμε ένα δείκτη συνάρτησης που θα εκτελεστεί
Για αυτό, δημιουργείται ένα νέο κομμάτι μεγέθους 0xfc
και καλείται η συνάρτηση συγχώνευσης με αυτόν τον δείκτη δύο φορές, με αυτόν τον τρόπο αποκτούμε ένα δείκτη προς ένα ελεύθερο κομμάτι μεγέθους 0xfc*2 = 0x1f8
στο γρήγορο κομμάτι.
Στη συνέχεια, καλείται η συνάρτηση επεξεργασίας σε αυτό το κομμάτι για να τροποποιήσει τη διεύθυνση fd
αυτού του γρήγορου κομματιού ώστε να δείχνει στην προηγούμενη συνάρτηση __free_hook
.
Στη συνέχεια, δημιουργείται ένα κομμάτι με μέγεθος 0x1f8
για να ανακτήσει από το γρήγορο κομμάτι το προηγούμενο άχρηστο κομμάτι, έτσι δημιουργείται ένα άλλο κομμάτι μεγέθους 0x1f8
για να λάβει ένα κομμάτι γρήγορου κομματιού στο __free_hook
το οποίο αντικαθίσταται με τη διεύθυνση της συνάρτησης system
.
Και τέλος ένα κομμάτι που περιέχει τη συμβολοσειρά /bin/sh\x00
απελευθερώνεται καλώντας τη συνάρτηση διαγραφής, ενεργοποιώντας τη συνάρτηση __free_hook
που δείχνει στο σύστημα με το /bin/sh\x00
ως παράμετρο.
Ένα άλλο παράδειγμα κατάχρησης ενός υπερχείλισης 1B για να συγχωνεύσει κομμάτια στον μη ταξινομημένο κάδο και να αποκτήσει μια διαρροή πληροφοριών της libc και στη συνέχεια να εκτελέσει μια επίθεση γρήγορου κομματιού για να αντικαταστήσει τον δείκτη malloc με μια διεύθυνση one gadget
Μπορούμε να δεσμεύσουμε μόνο κομμάτια μεγέθους μεγαλύτερου από 0x100
.
Αντικατάσταση του global_max_fast
χρησιμοποιώντας μια επίθεση Unsorted Bin (λειτουργεί 1/16 φορές λόγω ASLR, επειδή πρέπει να τροποποιήσουμε 12 bits, αλλά πρέπει να τροποποιήσουμε 16 bits).
Επίθεση Fast Bin για τροποποίηση ενός παγκόσμιου πίνακα κομματιών. Αυτό παρέχει ένα αυθαίρετο ανάγνωσης/εγγραφής πρωτογενές, το οποίο επιτρέπει την τροποποίηση του GOT και την ρύθμιση κάποιας συνάρτησης να δείχνει στο system
.