hacktricks/binary-exploitation/heap/unsorted-bin-attack.md

12 KiB
Raw Blame History

Επίθεση Unsorted Bin

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

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

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

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

Οι μη ταξινομημένες λίστες είναι σε θέση να γράψουν τη διεύθυνση στο unsorted_chunks (av) στη διεύθυνση bk του κομματιού. Επομένως, αν ένας επιτιθέμενος μπορεί να τροποποιήσει τη διεύθυνση του δείκτη bk σε ένα κομμάτι μέσα στο unsorted bin, θα μπορούσε να γράψει αυτήν τη διεύθυνση σε μια αυθαίρετη διεύθυνση που θα μπορούσε να βοηθήσει στη διαρροή μιας διεύθυνσης libc ή στην παράκαμψη κάποιας άμυνας.

Έτσι, βασικά, αυτή η επίθεση επέτρεπε να αντικατασταθεί μια αυθαίρετη διεύθυνση με ένα μεγάλο αριθμό (μια διεύθυνση που θα μπορούσε να είναι μια διεύθυνση στη στοίβα ή μια διεύθυνση libc) όπως μια διεύθυνση στη στοίβα που θα μπορούσε να διαρρεύσει ή μια περιορισμένη όπως η γενική μεταβλητή global_max_fast για να επιτρέψει τη δημιουργία γρήγορων κάδων με μεγαλύτερα μεγέθη (και να περάσει από μια επίθεση unsorted bin σε μια επίθεση fast bin).

{% hint style="success" %} Κοιτάζοντας το παράδειγμα που παρέχεται στο https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle και χρησιμοποιώντας τα 0x4000 και 0x5000 αντί για τα 0x400 και 0x500 ως μεγέθη κομματιών (για να αποφευχθούν οι tcaches) είναι δυνατό να δούμε ότι σήμερα ενεργοποιείται το σφάλμα malloc(): unsorted double linked list corrupted.

Επομένως, αυτή η επίθεση unsorted bin τώρα (μεταξύ άλλων ελέγχων) απαιτεί επίσης να είναι δυνατό να επισκευάσει τη διπλή συνδεδεμένη λίστα έτσι ώστε να παρακαμφθεί το victim->bck->fd == victim ή όχι victim->fd == av (arena). Που σημαίνει ότι η διεύθυνση όπου θέλουμε να γράψουμε πρέπει να έχει τη διεύθυνση του ψεύτικου κομματιού στη θέση του fd και ότι το ψεύτικο κομμάτι fd δείχνει στην αρένα. {% endhint %}

{% hint style="danger" %} Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (επομένως και τους μικρούς και μεγάλους). Έτσι, μπορούμε τώρα να χρησιμοποιήσουμε εκχωρήσεις από τους γρήγορους κάδους (ένα πιο πολύπλοκο πρόγραμμα μπορεί να κάνει άλλες εκχωρήσεις και να καταρρεύσει), και για να ενεργοποιήσουμε αυτό πρέπει να εκχωρήσουμε το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.

Σημειώστε ότι η καθορισμός του global_max_fast μπορεί να βοηθήσει σε αυτήν την περίπτωση εμπιστευόμενος ότι ο γρήγορος κάδος θα είναι σε θέση να φροντίσει όλες τις άλλες εκχωρήσεις μέχρι να ολοκληρωθεί η εκμετάλλευση. {% endhint %}

Ο κώδικας από τον guyinatuxedo το εξηγεί πολύ καλά, αν και αν τροποποιήσετε τις κλήσεις malloc για να εκχωρήσετε μνήμη αρκετά μεγάλη ώστε να μην καταλήξει σε tcache, μπορείτε να δείτε ότι εμφανίζεται το προαναφερθέν σφάλμα που αποτρέπει αυτήν την τεχνική: malloc(): unsorted double linked list corrupted

Επίθεση Unsorted Bin Infoleak

Αυτό είναι πραγματικά ένα πολύ βασικό έννοια. Τα κομμάτια στο unsorted bin θα έχουν διπλούς δείκτες για να δημιουργήσουν τον κάδο. Το πρώτο κομμάτι στο unsorted bin θα έχει πραγματικά τους FD και BK δείκτες που δείχνουν σε ένα μέρος της κύριας αρένας (libc).
Επομένως, αν μπορείτε να τοποθετήσετε ένα κομμάτι μέσα σε ένα unsorted bin και να το διαβάσετε (χρήση μετά από απελευθέρωση) ή να το εκχωρήσετε ξανά χωρίς να αντικαταστήσετε τουλάχιστον 1 από τους δείκτες για να το διαβάσετε, μπορείτε να έχετε μια διαρροή πληροφοριών της libc.

Μια παρόμοια επίθεση που χρησιμοποιήθηκε σε αυτήν την ανάλυση, ήταν να καταχραστεί μια δομή 4 κομματιών (Α, Β, Γ και Δ - το Δ είναι μόνο για να αποτρέψει τη συγχώνευση με το κομμάτι κορυφής) έτσι ώστε μια υπερχείλιση με μηδενικό byte στο Β να χρησιμοποιηθεί για να κάνει το Γ να υποδεικνύει ότι το Β δεν χρησιμοποιείται. Επίσης, στο Β τα δεδομένα prev_size τροποποιήθηκαν έτσι ώστε το μέγεθος αντί να είναι το μέγεθος του Β να είναι Α+Β.
Στη συνέχεια απελευθερώθηκε το Γ και συγχωνεύτηκε με το Α+Β (αλλά το Β ήταν ακόμα σε χρήση). Ένα νέο κομμάτι μεγέθους Α εκχωρήθηκε και στη συνέχεια οι διευθύνσεις της libc που διέρρευσαν γράφτηκαν στο Β από όπου διέρρευσαν.

Αναφορές & Άλλα παραδείγματα

  • https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap
  • Ο στόχος είναι να αντικατασταθεί μια παγκόσμια μεταβλητή με μια τιμή μεγαλύτερη από 4869 για να είναι δυνατή η λήψη της σημαίας και το 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 ως παράμετρο.
  • CTF https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html
  • Ένα άλλο παράδειγμα κατάχρησης ενός υπερχείλισης 1B για τη συγχώνευση κομματιών στον μη ταξινομημένο κάδο και τη λήψη μιας διαρροής πληροφοριών της βιβλιοθήκης libc και στη συνέχεια να εκτελέσει μια επίθεση γρήγορου κομματιού για να αντικαταστήσει τον δείκτη malloc με μια διεύθυνση one gadget