mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 21:53:54 +00:00
Translated ['binary-exploitation/heap/fast-bin-attack.md', 'binary-explo
This commit is contained in:
parent
35bbd6e183
commit
b3efcc92f7
3 changed files with 52 additions and 58 deletions
|
@ -9,7 +9,7 @@
|
|||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα 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>
|
||||
|
@ -22,7 +22,7 @@
|
|||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Επειδή το γρήγορο bin είναι μονόδεσμο, υπάρχουν πολύ λιγότερες προστασίες από ό,τι σε άλλα bins και απλά **η τροποποίηση μιας διεύθυνσης σε ένα ελεύθερο fast bin** chunk είναι αρκετή για να **διατεθεί αργότερα ένα κομμάτι σε οποιαδήποτε διεύθυνση μνήμης**.
|
||||
Επειδή το γρήγορο bin είναι μονόδεσμο, υπάρχουν πολύ λιγότερες προστασίες σε σχέση με άλλα bins και απλά **η τροποποίηση μιας διεύθυνσης σε ένα ελεύθερο fast bin** τμήμα είναι αρκετή για να **διατεθεί αργότερα ένα τμήμα σε οποιαδήποτε διεύθυνση μνήμης**.
|
||||
|
||||
Ως περίληψη:
|
||||
|
||||
|
@ -134,22 +134,26 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
|
|||
}
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Εάν είναι δυνατόν να αντικατασταθεί η τιμή της καθολικής μεταβλητής **`global_max_fast`** με ένα μεγάλο αριθμό, αυτό επιτρέπει τη δημιουργία γρήγορων bins με μεγαλύτερα μεγέθη, ενδεχομένως επιτρέποντας την εκτέλεση επιθέσεων fast bin σε σενάρια όπου δεν ήταν δυνατόν προηγουμένως.
|
||||
Εάν είναι δυνατόν να αντικατασταθεί η τιμή της παγκόσμιας μεταβλητής **`global_max_fast`** με ένα μεγάλο αριθμό, αυτό επιτρέπει τη δημιουργία γρήγορων bins με μεγαλύτερα μεγέθη, πιθανώς επιτρέποντας την εκτέλεση επιθέσεων fast bin σε σενάρια όπου δεν ήταν δυνατόν προηγουμένως.
|
||||
{% endhint %}
|
||||
|
||||
## Παραδείγματα
|
||||
|
||||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html)**:**
|
||||
* Είναι δυνατόν να δεσμεύσετε τμήματα, να τα απελευθερώσετε, να διαβάσετε το περιεχόμενό τους και να τα γεμίσετε (με μια ευπάθεια υπερχείλισης).
|
||||
* **Συγχώνευση τμήματος για διαρροή πληροφοριών**: Η τεχνική βασικά είναι να καταχραστείτε την υπερχείλιση για να δημιουργήσετε ένα ψεύτικο prev\_size ώστε ένα προηγούμενο τμήμα να τοποθετηθεί μέσα σε ένα μεγαλύτερο, έτσι όταν διατίθεται το μεγαλύτερο που περιέχει ένα άλλο τμήμα, είναι δυνατόν να εκτυπωθούν τα δεδομένα του και να διαρρεύσει μια διεύθυνση στο libc (main\_arena+88).
|
||||
* **Αντικατάσταση του malloc hook**: Για αυτό, και καταχρηστικά της προηγούμενης κατάστασης επικάλυψης, ήταν δυνατόν να υπάρχουν 2 τμήματα που έδειχναν στην ίδια μνήμη. Συνεπώς, απελευθερώνοντάς τα και τα δύο (απελευθερώνοντας ένα άλλο τμήμα ανάμεσά τους για να αποφευχθούν προστασίες), ήταν δυνατόν να υπάρχει το ίδιο τμήμα στο fast bin 2 φορές. Στη συνέχεια, ήταν δυνατόν να το διατεθεί ξανά, να αντικατασταθεί η διεύθυνση του επόμενου τμήματος για να δείχνει λίγο πριν από το malloc\_hook (έτσι ώστε να δείχνει σε έναν ακέραιο που το malloc νομίζει ότι είναι μέγεθος ελεύθερο - άλλη παράκαμψη), να το διατεθεί ξανά και στη συνέχεια να διατεθεί ένα άλλο τμήμα που θα λάβει μια διεύθυνση στους malloc hooks.\
|
||||
* **Συγχώνευση τμήματος για διαρροή πληροφοριών**: Η τεχνική βασικά είναι να καταχραστείτε την υπερχείλιση για να δημιουργήσετε ένα ψεύτικο prev\_size ώστε ένα προηγούμενο τμήμα να τοποθετηθεί μέσα σε ένα μεγαλύτερο, έτσι ώστε όταν διατίθεται το μεγαλύτερο που περιέχει ένα άλλο τμήμα, είναι δυνατόν να εκτυπωθούν τα δεδομένα του και να διαρρεύσει μια διεύθυνση στο libc (main\_arena+88).
|
||||
* **Αντικατάσταση του malloc hook**: Για αυτό, και καταχρηστικά της προηγούμενης κατάστασης επικάλυψης, ήταν δυνατόν να υπάρχουν 2 τμήματα που έδειχναν στην ίδια μνήμη. Συνεπώς, απελευθερώνοντάς τα και τα δύο (απελευθερώνοντας ένα άλλο τμήμα ανάμεσά τους για να αποφευχθούν προστασίες), ήταν δυνατόν να υπάρχει το ίδιο τμήμα στο fast bin 2 φορές. Στη συνέχεια, ήταν δυνατόν να το διατεθεί ξανά, να αντικατασταθεί η διεύθυνση προς το επόμενο τμήμα ώστε να δείχνει λίγο πριν το malloc\_hook (έτσι ώστε να δείχνει σε έναν ακέραιο που το malloc νομίζει ότι είναι μέγεθος ελεύθερο - άλλη παράκαμψη), να το διατεθεί ξανά και στη συνέχεια να διατεθεί ένα άλλο τμήμα που θα λάβει μια διεύθυνση στα malloc hooks.\
|
||||
Τελικά ένα **one gadget** γράφτηκε εκεί.
|
||||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html)**:**
|
||||
* Υπάρχει μια υπερχείλιση στη στοίβα και χρήστης μετά την απελευθέρωση και διπλή απελευθέρωση επειδή όταν ένα τμήμα απελευθερώνεται είναι δυνατόν να επαναχρησιμοποιηθούν και να απελευθερωθούν ξανά οι δείκτες
|
||||
* **Διαρροή πληροφοριών Libc**: Απλώς απελευθερώστε μερικά τμήματα και θα λάβουν ένα δείκτη σε ένα τμήμα της κύριας αρένας. Δεδομένου ότι μπορείτε να επαναχρησιμοποιήσετε απελευθερωμένους δείκτες, απλώς διαβάστε αυτήν τη διεύθυνση.
|
||||
* **Επίθεση Fast bin**: Όλοι οι δείκτες στις δεσμεύσεις αποθηκεύονται μέσα σε έναν πίνακα, οπότε μπορούμε να απελευθερώσουμε μερικά τμήματα fast bin και στο τελευταίο να αντικαταστήσουμε τη διεύθυνση για να δείχνει λίγο πριν από αυτόν τον πίνακα δεικτών. Στη συνέχεια, να δεσμεύσουμε μερικά τμήματα με τον ίδιο μέγεθος και θα λάβουμε πρώτα το γνήσιο και στη συνέχεια το ψεύτικο που περιέχει τον πίνακα δεικτών. Τώρα μπορούμε να αντικαταστήσουμε αυτούς τους δείκτες δέσμευσης για να δείχνουν στη διεύθυνση got του `free` για να δείχνει στο σύστημα και στη συνέχεια να γράψουμε το τμήμα 1 `"/bin/sh"` για να `free(chunk1)` το οποίο θα εκτελέσει το `system("/bin/sh")`.
|
||||
* Μπορείτε να βρείτε μια επίθεση Fast Bin που καταχρηστεύεται μέσω μιας επίθεσης unsorted bin.
|
||||
* Σημείωση 
|
||||
* **Επίθεση Fast bin**: Όλοι οι δείκτες στις δεσμεύσεις αποθηκεύονται μέσα σε έναν πίνακα, οπότε μπορούμε να απελευθερώσουμε μερικά τμήματα fast bin και στο τελευταίο να αντικαταστήσουμε τη διεύθυνση ώστε να δείχνει λίγο πριν από αυτόν τον πίνακα δεικτών. Στη συνέχεια, να διατεθούν μερικά τμήματα με τον ίδιο μέγεθος και θα λάβουμε πρώτα το γνήσιο και στη συνέχεια το ψεύτικο που περιέχει τον πίνακα δεικτών. Τώρα μπορούμε να αντικαταστήσουμε αυτούς τους δείκτες δεσμεύσεων για να δείχνουν στη διεύθυνση got του `free` για να δείχνει στο σύστημα και στη συνέχεια να γράψουμε το τμήμα 1 `"/bin/sh"` για να `free(chunk1)` το οποίο θα εκτελέσει το `system("/bin/sh")`.
|
||||
* **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 και στη συνέχεια την εκτέλεση μιας επίθεσης fast bin για την αντικατάσταση του malloc hook με μια διεύθυνση one gadget
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html)
|
||||
* Μετά από μια διαρροή πληροφοριών κατάχρησης του τακτοποιημένου κάδου με ένα UAF για να διαρρεύσει μια διεύθυνση Libc και μια διεύθυνση PIE, η εκμετάλλευση αυτού του CTF χρησιμοποίησε μια επίθεση fast bin για να διατεθεί ένα τμήμα σε ένα μέρος όπου βρίσκονταν οι δείκτες σε ελεγχόμενα τμήματα, έτσι ήταν δυνατόν να αντικατασταθούν ορισμένοι δείκτες για να γραφτεί ένα one gadget στο GOT
|
||||
* Μπορείτε να βρείτε μια Fast Bin επίθεση που καταχράζεται μέσω μιας επίθεσης στον τακτοποιημένο κάδο:
|
||||
* Σημειώστε ότι είναι συνηθισμένο πριν εκτελέσετε επιθέσεις fast bin να καταχράστείτε τη λίστα των ανεπιθύμητων για να διαρρεύσετε διευθύνσεις libc/heap (όταν απαιτείται).
|
||||
|
||||
{% content-ref url="unsorted-bin-attack.md" %}
|
||||
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
||||
|
@ -161,10 +165,10 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
|
|||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Εάν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Εάν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγράφου**](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>
|
||||
|
|
|
@ -2,21 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Ερυθρού Συνεργείου HackTricks AWS)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
Άλλοι τρόποι υποστήριξης των HackTricks:
|
||||
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στα HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](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.
|
||||
* Ανακαλύψτε την [**Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](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>
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Όταν ανακαλύφθηκε αυτή η επίθεση, κυρίως επέτρεπε ένα WWW (Write What Where), ωστόσο, κάποιοι **έλεγχοι προστέθηκαν** καθιστώντας τη νέα έκδοση της επίθεσης πιο ενδιαφέρουσα και πιο πολύπλοκη και **άχρηστη**.
|
||||
Όταν ανακαλύφθηκε αυτή η επίθεση, κυρίως επέτρεπε ένα WWW (Write What Where), ωστόσο, προστέθηκαν **ελέγχοι** κάνοντας τη νέα έκδοση της επίθεσης πιο ενδιαφέρουσα και πιο πολύπλοκη και **άχρηστη**.
|
||||
|
||||
### Παράδειγμα Κώδικα:
|
||||
|
||||
|
@ -89,7 +89,7 @@ return 0;
|
|||
```
|
||||
</details>
|
||||
|
||||
* Η επίθεση δεν λειτουργεί εάν χρησιμοποιούνται τα tcaches (μετά την έκδοση 2.26)
|
||||
* Η επίθεση δεν λειτουργεί εάν χρησιμοποιούνται τcache (μετά την έκδοση 2.26)
|
||||
|
||||
### Στόχος
|
||||
|
||||
|
@ -106,7 +106,7 @@ return 0;
|
|||
|
||||
### Επίθεση
|
||||
|
||||
* Υπάρχουν δύο κομμάτια (chunk1 και chunk2)
|
||||
* Υπάρχουν μερικά κομμάτια (chunk1 και chunk2)
|
||||
* Ο επιτιθέμενος ελέγχει το περιεχόμενο του chunk1 και τους κεφαλίδες του chunk2.
|
||||
* Στο chunk1 ο επιτιθέμενος δημιουργεί τη δομή ενός ψεύτικου κομματιού:
|
||||
* Για να παρακάμψει τις προστασίες, βεβαιώνεται ότι το πεδίο `size` είναι σωστό για να αποφευχθεί το σφάλμα: `corrupted size vs. prev_size while consolidating`
|
||||
|
@ -115,13 +115,13 @@ return 0;
|
|||
<figure><img src="../../.gitbook/assets/image (1245).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||
|
||||
* Οι κεφαλίδες του chunk2 τροποποιούνται για να υποδεικνύουν ότι το προηγούμενο κομμάτι δεν χρησιμοποιείται και ότι το μέγεθος είναι το μέγεθος του ψεύτικου κομματιού που περιέχεται.
|
||||
* Όταν απελευθερώνεται το δεύτερο κομμάτι τότε αυτό το ψεύτικο κομμάτι αποσυνδέεται:
|
||||
* Όταν απελευθερώνεται το δεύτερο κομμάτι τότε συμβαίνει αυτή η αποσύνδεση του ψεύτικου κομματιού:
|
||||
* `fake_chunk->fd->bk` = `fake_chunk->bk`
|
||||
* `fake_chunk->bk->fd` = `fake_chunk->fd`
|
||||
* Προηγουμένως έγινε ώστε το `fake_chunk->fd->bk` και το `fake_chunk->fd->bk` να δείχνουν στον ίδιο τόπο (τη θέση στη στοίβα όπου αποθηκευόταν το `chunk1`, έτσι ήταν μια έγκυρη συνδεδεμένη λίστα). Καθώς **και τα δύο δείχνουν στην ίδια τοποθεσία**, μόνο το τελευταίο (`fake_chunk->bk->fd = fake_chunk->fd`) θα έχει **επίδραση**.
|
||||
* Προηγουμένως έγινε ώστε `fake_chunk->fd->bk` και `fake_chunk->fd->bk` να δείχνουν στον ίδιο τόπο (τη θέση στη στοίβα όπου αποθηκεύτηκε το `chunk1`, έτσι ήταν μια έγκυρη συνδεδεμένη λίστα). Καθώς **και τα δύο δείχνουν στην ίδια τοποθεσία**, μόνο το τελευταίο (`fake_chunk->bk->fd = fake_chunk->fd`) θα έχει **επίδραση**.
|
||||
* Αυτό θα **αντικαταστήσει τον δείκτη στο chunk1 στη στοίβα με τη διεύθυνση (ή bytes) που αποθηκεύεται 3 διευθύνσεις πριν στη στοίβα**.
|
||||
* Επομένως, εάν ένας επιτιθέμενος μπορούσε να ελέγξει ξανά το περιεχόμενο του chunk1, θα μπορούσε να **γράψει μέσα στη στοίβα** είναι δυνατόν να αντικαταστήσει τη διεύθυνση επιστροφής παρακάμπτοντας το canary και να τροποποιήσει τις τιμές και τους δείκτες των τοπικών μεταβλητών. Ακόμη, τροποποιώντας ξανά τη διεύθυνση του chunk1 που αποθηκεύεται στη στοίβα σε μια διαφορετική τοποθεσία όπου εάν ο επιτιθέμενος μπορούσε να ελέγξει ξανά το περιεχόμενο του chunk1 θα μπορούσε να γράψει οπουδήποτε.
|
||||
* Να σημειωθεί ότι αυτό ήταν δυνατό επειδή οι **διευθύνσεις αποθηκεύονταν στη στοίβα**. Ο κίνδυνος και η εκμετάλλευση ενδέχεται να εξαρτώνται από το **πού αποθηκεύονται οι διευθύνσεις προς το ψεύτικο κομμάτι**.
|
||||
* Επομένως, εάν ένας επιτιθέμενος μπορούσε να ελέγχει ξανά το περιεχόμενο του chunk1, θα μπορούσε να **γράψει μέσα στη στοίβα** μπορώντας πιθανόν να αντικαταστήσει τη διεύθυνση επιστροφής παρακάμπτοντας το canary και να τροποποιήσει τις τιμές και τους δείκτες των τοπικών μεταβλητών. Ακόμη, τροποποιώντας ξανά τη διεύθυνση του chunk1 που αποθηκεύεται στη στοίβα σε μια διαφορετική τοποθεσία όπου εάν ο επιτιθέμενος μπορούσε να ελέγχει ξανά το περιεχόμενο του chunk1 θα μπορούσε να γράψει οπουδήποτε.
|
||||
* Να σημειωθεί ότι αυτό ήταν δυνατό επειδή οι **διευθύνσεις αποθηκεύονταν στη στοίβα**. Ο κίνδυνος και η εκμετάλλευση μπορεί να εξαρτώνται από το **πού αποθηκεύονται οι διευθύνσεις προς το ψεύτικο κομμάτι**.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1246).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||
|
||||
|
@ -130,6 +130,6 @@ return 0;
|
|||
* [https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit](https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit)
|
||||
* Αν και θα ήταν περίεργο να βρείτε μια επίθεση unlink ακόμη και σε ένα CTF, εδώ έχετε μερικά writeups όπου χρησιμοποιήθηκε αυτή η επίθεση:
|
||||
* Παράδειγμα CTF: [https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html](https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html)
|
||||
* Σε αυτό το παράδειγμα, αντί για τη στοίβα υπάρχει ένας πίνακας από διευθύνσεις που έχουν δεσμευτεί με τη μέθοδο malloc. Η επίθεση unlink πραγματοποιείται για να είναι δυνατή η δέσμευση ενός κομματιού εδώ, επομένως να είναι δυνατόν να ελέγχει τους δείκτες του πίνακα από τις διευθύνσεις που έχουν δεσμευτεί με τη μέθοδο malloc. Στη συνέχεια, υπάρχει μια άλλη λειτουργικότητα που επιτρέπει την τροποποίηση του περιεχομένου των κομματιών σε αυτές τις διευθύνσεις, η οποία επιτρέπει να δείχνουν οι διευθύνσεις στο GOT, να τροποποιούνται οι διευθύνσεις συναρτήσεων για να λάβουν διαρροές και RCE.
|
||||
* Σε αυτό το παράδειγμα, αντί για τη στοίβα υπάρχει ένας πίνακας από διευθύνσεις που έχουν δεσμευτεί με τη μέθοδο malloc. Η επίθεση unlink πραγματοποιείται για να είναι δυνατή η δέσμευση ενός κομματιού εδώ, επομένως είναι δυνατόν να ελέγχει τους δείκτες του πίνακα των διευθύνσεων που έχουν δεσμευτεί με τη μέθοδο malloc. Στη συνέχεια, υπάρχει μια άλλη λειτουργικότητα που επιτρέπει την τροποποίηση του περιεχομένου των κομματιών σε αυτές τις διευθύνσεις, η οποία επιτρέπει να δείχνουν οι διευθύνσεις στο GOT, να τροποποιούνται οι διευθύνσεις συναρτήσεων για να λάβουν διαρροές libc και RCE.
|
||||
* Άλλο παράδειγμα CTF: [https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html](https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html)
|
||||
* Όπως και στο προηγούμενο παράδειγμα, υπάρχει ένας πίνακας διευθύνσεων δεσμεύσεων. Είναι δυνατόν να πραγματοποιηθεί μια επίθεση unlink για να κάνει η διεύθυνση της πρώτης δέσμευσης να δείχνει λίγες θέσεις πριν από την έναρξη του πίνακα και να αντικαταστήσει αυτή τη δέσμευση στ
|
||||
* Όπως και στο προηγούμενο παράδειγμα, υπάρχει ένας πίνακας διευθύνσεων δεσμεύσεων. Είναι δυνατόν να πραγματοποιηθεί μια επίθεση unlink για να κάνει η διεύθυνση της πρώτης δέσμευσης να δείχνει λίγες θέσεις πριν από την έναρξη του πίνακα και να αντικαταστήσει αυτή τη δ
|
||||
|
|
|
@ -22,54 +22,44 @@
|
|||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Οι μη ταξινομημένες λίστες είναι σε θέση να γράψουν τη διεύθυνση στο `unsorted_chunks (av)` στη διεύθυνση `bk` του κομματιού. Επομένως, αν ένας επιτιθέμενος μπορεί να **τροποποιήσει τη διεύθυνση του δείκτη bk** σε ένα κομμάτι μέσα στο unsorted bin, θα μπορούσε να **γράψει αυτήν τη διεύθυνση σε μια τυχαία διεύθυνση** που θα μπορούσε να βοηθήσει στη διαρροή μιας διεύθυνσης της libc ή στην παράκαμψη κάποιας άμυνας.
|
||||
Οι μη ταξινομημένες λίστες είναι σε θέση να γράψουν τη διεύθυνση στο `unsorted_chunks (av)` στη διεύθυνση `bk` του κομματιού. Επομένως, αν ένας επιτιθέμενος μπορεί **να τροποποιήσει τη διεύθυνση του δείκτη bk** σε ένα κομμάτι μέσα στο unsorted bin, θα μπορούσε **να γράψει αυτήν τη διεύθυνση σε μια αυθαίρετη διεύθυνση** που θα μπορούσε να βοηθήσει στη διαρροή μιας διεύθυνσης libc ή στην παράκαμψη κάποιας άμυνας.
|
||||
|
||||
Έτσι, βασικά, αυτή η επίθεση επέτρεπε να **αντικαταστήσει κάποια τυχαία διεύθυνση με ένα μεγάλο αριθμό** (μια διεύθυνση που θα μπορούσε να είναι μια διεύθυνση στο heap ή μια διεύθυνση της libc) όπως μια διεύθυνση του stack που θα μπορούσε να διαρρεύσει ή κάποιον περιορισμό όπως η γενική μεταβλητή **`global_max_fast`** για να επιτρέψει τη δημιουργία γρήγορων bins με μεγαλύτερα μεγέθη (και να περάσει από μια επίθεση unsorted bin σε μια επίθεση fast bin).
|
||||
Έτσι, βασικά, αυτή η επίθεση επέτρεπε να **αντικατασταθεί μια αυθαίρετη διεύθυνση με ένα μεγάλο αριθμό** (μια διεύθυνση που θα μπορούσε να είναι μια διεύθυνση στη στοίβα ή μια διεύθυνση libc) όπως μια διεύθυνση στη στοίβα που θα μπορούσε να διαρρεύσει ή μια περιορισμένη όπως η γενική μεταβλητή **`global_max_fast`** για να επιτρέψει τη δημιουργία γρήγορων κάδων με μεγαλύτερα μεγέθη (και να περάσει από μια επίθεση 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 ως μεγέθη κομματιών (για να αποφευχθούν οι tcaches) είναι δυνατό να δούμε ότι **σήμερα** ενεργοποιείται το σφάλμα **`malloc(): unsorted double linked list corrupted`**.
|
||||
|
||||
Επομένως, αυτή η επίθεση unsorted bin τώρα (μεταξύ άλλων ελέγχων) απαιτεί επίσης να είναι δυνατό να επισκευάσει τη διπλή συνδεδεμένη λίστα ώστε να παρακαμφθεί `victim->bck->fd == victim` ή όχι `victim->fd == av (arena)`. Που σημαίνει ότι η διεύθυνση όπου θέλουμε να γράψουμε πρέπει να έχει τη διεύθυνση του ψεύτικου κομματιού στη θέση του `fd` και ότι το ψεύτικο κομμάτι `fd` δείχνει στην αρένα.
|
||||
Επομένως, αυτή η επίθεση unsorted bin τώρα (μεταξύ άλλων ελέγχων) απαιτεί επίσης να είναι δυνατό να επισκευάσει τη διπλή συνδεδεμένη λίστα έτσι ώστε να παρακαμφθεί το `victim->bck->fd == victim` ή όχι `victim->fd == av (arena)`. Που σημαίνει ότι η διεύθυνση όπου θέλουμε να γράψουμε πρέπει να έχει τη διεύθυνση του ψεύτικου κομματιού στη θέση του `fd` και ότι το ψεύτικο κομμάτι `fd` δείχνει στην αρένα.
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (επομένως και τα μικρά και τα μεγάλα). Έτσι, μπορούμε τώρα **να χρησιμοποιήσουμε εκχωρήσεις από το fast bin** (ένα πιο πολύπλοκο πρόγραμμα μπορεί να κάνει άλλες εκχωρήσεις και να καταρρεύσει), και για να ενεργοποιήσουμε αυτό πρέπει **να εκχωρήσουμε το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.**
|
||||
Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (επομένως και τους μικρούς και μεγάλους). Έτσι, μπορούμε τώρα **να χρησιμοποιήσουμε εκχωρήσεις από τους γρήγορους κάδους** (ένα πιο πολύπλοκο πρόγραμμα μπορεί να κάνει άλλες εκχωρήσεις και να καταρρεύσει), και για να ενεργοποιήσουμε αυτό πρέπει **να εκχωρήσουμε το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.**
|
||||
|
||||
Σημειώστε ότι η καθορισμός του **`global_max_fast`** μπορεί να βοηθήσει σε αυτήν την περίπτωση εμπιστευόμενος ότι το fast bin θα είναι σε θέση να φροντίσει όλες τις άλλες εκχωρήσεις μέχρι να ολοκληρωθεί η εκμετάλλευση.
|
||||
Σημειώστε ότι η καθορισμός του **`global_max_fast`** μπορεί να βοηθήσει σε αυτήν την περίπτωση εμπιστευόμενος ότι ο γρήγορος κάδος θα είναι σε θέση να φροντίσει όλες τις άλλες εκχωρήσεις μέχρι να ολοκληρωθεί η εκμετάλλευση.
|
||||
{% endhint %}
|
||||
|
||||
Ο κώδικας από τον [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) το εξηγεί πολύ καλά, αν και αν τροποποιήσετε τα mallocs για να εκχωρήσετε μνήμη αρκετά μεγάλη ώστε να μην καταλήξει σε tcache, μπορείτε να δείτε ότι εμφανίζεται το προαναφερθέν σφάλμα που αποτρέπει αυτήν την τεχνική: **`malloc(): unsorted double linked list corrupted`**
|
||||
Ο κώδικας από τον [**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 θα έχουν διπλούς δείκτες για να δημιουργήσουν το bin. Το πρώτο κομμάτι στο unsorted bin θα έχει πραγματικά τους **FD** και **BK** συνδέσμους **που δείχνουν σε ένα μέρος της κύριας αρένας (libc)**.\
|
||||
Επομένως, αν μπορείτε **να βάλετε ένα κομμάτι μέσα σε ένα unsorted bin και να το διαβάσετε** (χρήση μετά από απελευθέρωση) ή **να το εκχωρήσετε ξανά χωρίς να αντικαταστήσετε τουλάχιστον 1 από τους δείκτες** για να **το διαβάσετε**, μπορείτε να έχετε μια **διαρροή πληροφοριών της libc**.
|
||||
Αυτό είναι πραγματικά ένα πολύ βασικό έννοια. Τα κομμάτια στο unsorted bin θα έχουν διπλούς δείκτες για να δημιουργήσουν τον κάδο. Το πρώτο κομμάτι στο unsorted bin θα έχει πραγματικά τους **FD** και **BK** δείκτες **που δείχνουν σε ένα μέρος της κύριας αρένας (libc)**.\
|
||||
Επομένως, αν μπορείτε **να τοποθετήσετε ένα κομμάτι μέσα σε ένα unsorted bin και να το διαβάσετε** (χρήση μετά από απελευθέρωση) ή **να το εκχωρήσετε ξανά χωρίς να αντικαταστήσετε τουλάχιστον 1 από τους δείκτες** για να **το διαβάσετε**, μπορείτε να έχετε μια **διαρροή πληροφοριών της libc**.
|
||||
|
||||
Μια παρόμοια [**επίθεση που χρησιμοποιήθηκε σε αυτήν την ανάλυση**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html), ήταν να καταχραστεί μια δομή 4 κομματιών (Α, Β, Γ και Δ - το Δ είναι μόνο για να αποτρέψει τη συγχώνευση με το κομμάτι κορυφής) έτσι ώστε μια υπερχείλιση με μηδενικό byte στο Β να χρησιμοποιηθεί για να κάνει το Γ να υποδεικνύει ότι το Β δεν χρησιμοποιείται. Επίσης, στο Β τα δεδομένα `prev_size` τροποποιήθηκαν έτσι ώστε το μέγεθος αντί να είναι το μέγεθος του Β να είναι Α+Β.\
|
||||
Στη συνέχεια απελευθερώθηκε το Γ και συγχωνεύτηκε με το Α+Β (αλλά το Β ήταν ακόμα σε χρήση). Ένα νέο κομμάτι μεγέθους Α εκχωρήθηκε και στη συνέχεια οι διευθύνσεις της libc που διέρρευσαν γράφτηκαν στο Β από όπου διέρρευσαν.
|
||||
|
||||
## Αναφορές & Άλλα παραδείγματα
|
||||
|
||||
* [**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 για να υπερχειλιστεί και το κομμάτι2 ώστε το κομμάτι κορυφής να μην συγχωνεύσει τα προηγούμενα.
|
||||
* Στη συνέχεια, το κομμάτι1 απελευθερώνεται και το κομμάτι0 υπερχειλίζεται ώστε ο δείκτης `bk` του κομματιού1 να δείχνει: `bk = magic - 0x10`
|
||||
* Στη συνέχεια, εκχωρείται το κομμάτι3 με το ίδιο μέγεθος με το κομμάτι1, το οποίο θα ενεργοποιήσει την επίθεση unsorted bin και θα τροποποιήσει την τιμή της παγκόσμιας μεταβλητής, καθιστώντας δυνατή τη λήψη της σημαίας.
|
||||
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack
|
||||
* Εάν καταφέρουμε να αποκτήσουμε ένα γρήγορο κομμάτι μεγέθους 0x200 σε αυτή τη θέση, θα είναι δυνατό να αντικαταστήσουμε ένα δείκτη συνάρτησης που θα εκτελεστεί.
|
||||
* Για αυτό, δημιουργείται ένα νέο κομμάτι μεγέθους `0xfc` και καλείται η συνάρτηση συγχώνευσης με αυτόν τον δείκτη δύο φορές, με αυτόν τον τρόπο αποκτούμε ένα δείκτη προς ένα ελεύθερο κομμάτι μεγέθους `0xfc*2 = 0x1f8` στο γρήγορο κάδο.
|
||||
* Στη συνέχεια, καλείται η συνάρτηση επεξεργασίας σε αυτό το κομμάτι για να τροποποιήσει τη διεύθυνση **`fd`** αυτού του γρήγορου κάδου ώστε να δείχνει στην προηγούμενη συνάρτηση **`__free_hook`**.
|
||||
* Στη συνέχεια, δημιουργείται ένα κομμάτι μεγέθους `0x1f8` για να ανακτήσει από τον γρήγορο κάδο το προηγούμενο άχρηστο κομμάτι, έτσι δημιουργείται άλλο ένα κομμάτι μεγέθους `0x1f8` για να λάβει ένα κομμάτι γρήγορου κάδου στο **`__free_hook`** το οποίο αντικαθίσταται με τη διεύθυνση της συνάρτησης **`system`**.
|
||||
* Και τελικά ένα κομμάτι που περιέχει τη συμβολοσειρά `/bin/sh\x00` απελευθερώνεται καλώντας τη συνάρτηση διαγραφής, ενεργοποιώντας τη συνάρτηση **`__free_hook`** που δείχνει στο σύστημα με το `/bin/sh\x00` ως παράμετρο.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Εάν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγραφήματος**](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>
|
||||
* Ο στόχος είναι να αντικατασταθεί μια παγκόσμια μεταβλητή με μια τιμή μεγαλύτερη από 4869 για να είναι δυνατή η λήψη της σημαίας και το
|
||||
</strong>0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6077f <_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
|
||||
|
|
Loading…
Reference in a new issue