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

72 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Επίθεση Unsorted Bin
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο Hacking του AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Μάθετε & εξασκηθείτε στο Hacking του GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Υποστηρίξτε το HackTricks</summary>
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε κόλπα χάκερ κάνοντας υποβολή PRs** στα αποθετήρια του [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) στο GitHub.
</details>
{% endhint %}
## Βασικές Πληροφορίες
Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα unsorted bin ελέγξτε αυτήν τη σελίδα:
{% content-ref url="bins-and-memory-allocations.md" %}
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
{% endcontent-ref %}
Οι μη ταξινομημένες λίστες είναι σε θέση να γράψουν τη διεύθυνση στο `unsorted_chunks (av)` στη διεύθυνση `bk` του κομματιού. Επομένως, αν ένας επιτιθέμενος μπορεί να **τροποποιήσει τη διεύθυνση του δείκτη `bk`** σε ένα κομμάτι μέσα στο unsorted bin, θα μπορούσε να **γράψει αυτήν τη διεύθυνση σε μια αυθαίρετη διεύθυνση** που θα μπορούσε να βοηθήσει στη διαρροή μιας διεύθυνσης Glibc ή στην παράκαμψη ορισμένων μέτρων προστασίας.
Έτσι, βασικά, αυτή η επίθεση επιτρέπει να **οριστεί ένα μεγάλο αριθμό σε μια αυθαίρετη διεύθυνση**. Αυτός ο μεγάλος αριθμός είναι μια διεύθυνση, η οποία θα μπορούσε να είναι μια διεύθυνση στο heap ή μια διεύθυνση Glibc. Ένας τυπικός στόχος είναι το **`global_max_fast`** για να επιτραπεί η δημιουργία fast bin bins με μεγαλύτερα μεγέθη (και να περάσει από μια επίθεση unsorted bin σε μια επίθεση fast bin).
{% hint style="success" %}
Κοιτάζοντας το παράδειγμα που παρέχεται στο [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](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` δείχνει στην αρένα.
{% endhint %}
{% hint style="danger" %}
Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (επομένως και τα μικρά και μεγάλα). Έτσι, μπορούμε μόνο **να χρησιμοποιήσουμε εκχωρήσεις από το fast bin τώρα** (ένα πιο πολύπλοκο πρόγραμμα ενδέχεται να κάνει άλλες εκχωρήσεις και να καταρρεύσει), και για να προκαλέσουμε αυτό πρέπει **να εκχωρήσουμε το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.**
Σημειώστε ότι η αντικατάσταση του **`global_max_fast`** μπορεί να βοηθήσει σε αυτήν την περίπτωση εμπιστευόμενοι ότι το fast bin θα είναι σε θέση να φροντίσει όλες τις άλλες εκχωρήσεις μέχρι να ολοκληρωθεί η εκμετάλλευση.
{% endhint %}
Ο κώδικας από τον [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) το εξηγεί πολύ καλά, αν και αν τροποποιήσετε τις κλήσεις malloc για να εκχωρήσετε μνήμη αρκετά μεγάλη ώστε να μην καταλήξετε σε Tcache, μπορείτε να δείτε ότι εμφανίζεται το προαναφερθέν σφάλμα που αποτρέπει αυτήν την τεχνική: **`malloc(): unsorted double linked list corrupted`**
## Επίθεση Unsorted Bin Infoleak
Αυτό είναι πραγματικά ένα πολύ βασικό έννοια. Τα κομμάτια στο unsorted bin θα έχουν δείκτες. Το πρώτο κομμάτι στο unsorted bin θα έχει πραγματικά τους **`fd`** και **`bk`** συνδέσμους **που δείχνουν σε μέρος της κύριας αρένας (Glibc)**.\
Επομένως, αν μπορείτε **να τοποθετήσετε ένα κομμάτι μέσα σε ένα unsorted bin και να το διαβάσετε** (χρήση μετά από απελευθέρωση) ή **να το εκχωρήσετε ξανά χωρίς να αντικαταστήσετε τουλάχιστον 1 από τους δείκτες** για να το **διαβάσετε** μετά, μπορείτε να έχετε μια **διαρροή πληροφοριών Glibc**.
Μια παρόμοια [**επίθεση που χρησιμοποιήθηκε σε αυτήν την ανάλυση**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html), ήταν να καταχραστεί μια δομή 4 κομματιών (Α, Β, Γ και Δ - το Δ είναι μόνο για να αποτρέψει τη συγχώνευση με το κομμάτι κορυφής) έτσι ώστε ένας υπερχείλιση με κενό byte στο Β να κάνει τον Γ να υποδεικνύει ότι το Β δεν χρησιμοποιείται. Επίσης, στο Β τα δεδομένα `prev_size` τροποποιήθηκαν έτσι ώστε το μέγεθος αντί να είναι το μέγεθος του Β να είναι Α+Β.\
Στη συνέχεια απελευθερώθηκε ο Γ και συγχωνεύτηκε με το Α+Β (αλλά το Β ήταν ακόμα σε χρήση). Ένα νέο κομμάτι μεγέθους Α εκχωρήθηκε και στη συνέχεια οι διευθύνσεις που διέρρευσαν από την Glibc γράφτηκαν στο Β από όπου διέρρευσαν.
## Αναφορές & Άλλα παραδείγματα
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap)
* Ο στόχος είναι να αντικατασταθεί μια παγκόσμια μεταβλητή με μια τιμή μεγαλύτερη από 4869 για να είναι δυνατή η λήψη της σημαίας και το PIE δεν είναι ενεργοποιημένο.
* Είναι δυνατό να δημιουργηθούν κομμάτια αυθαίρετου μεγέθους και υπάρχει υπερχείλιση στο heap με το επιθυμητό μέγεθος.
* Η επίθεση ξεκινά δημιουργώντας 3 κομμάτια: το κομμάτι0 για να καταχραστεί την υπερχείλιση, το κομμάτι1 για να υποστεί υπερχείλιση και
</strong>0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6076f &#x3C;list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f &#x3C;_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
</code></pre>
* Εάν καταφέρουμε να αποκτήσουμε ένα γρήγορο κομμάτι μεγέθους 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**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
* Ένα άλλο παράδειγμα κατάχρησης ενός υπερχείλισης 1B για να συγχωνεύσει κομμάτια στον μη ταξινομημένο κάδο και να αποκτήσει μια διαρροή πληροφοριών της libc και στη συνέχεια να εκτελέσει μια επίθεση γρήγορου κομματιού για να αντικαταστήσει τον δείκτη malloc με μια διεύθυνση one gadget
* [**Εργοστάσιο Ρομπότ. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
* Μπορούμε να δεσμεύσουμε μόνο κομμάτια μεγέθους μεγαλύτερου από `0x100`.
* Αντικατάσταση του `global_max_fast` χρησιμοποιώντας μια επίθεση Unsorted Bin (λειτουργεί 1/16 φορές λόγω ASLR, επειδή πρέπει να τροποποιήσουμε 12 bits, αλλά πρέπει να τροποποιήσουμε 16 bits).
* Επίθεση Fast Bin για τροποποίηση ενός παγκόσμιου πίνακα κομματιών. Αυτό παρέχει ένα αυθαίρετο ανάγνωσης/εγγραφής πρωτογενές, το οποίο επιτρέπει την τροποποίηση του GOT και την ρύθμιση κάποιας συνάρτησης να δείχνει στο `system`.