mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
Translated ['binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc
This commit is contained in:
parent
d3a48a3107
commit
886b119a96
6 changed files with 217 additions and 20 deletions
|
@ -736,6 +736,7 @@
|
|||
* [Fast Bin Attack](binary-exploitation/heap/fast-bin-attack.md)
|
||||
* [Unsorted Bin Attack](binary-exploitation/heap/unsorted-bin-attack.md)
|
||||
* [Large Bin Attack](binary-exploitation/heap/large-bin-attack.md)
|
||||
* [Tcache Bin Attack](binary-exploitation/heap/tcache-bin-attack.md)
|
||||
* [Off by one overflow](binary-exploitation/heap/off-by-one-overflow.md)
|
||||
* [House of Spirit](binary-exploitation/heap/house-of-spirit.md)
|
||||
* [House of Lore](binary-exploitation/heap/house-of-lore.md)
|
||||
|
@ -762,7 +763,7 @@
|
|||
* [WWW2Exec - atexit()](binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md)
|
||||
* [WWW2Exec - .dtors & .fini\_array](binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md)
|
||||
* [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||
* [WWW2Exec - \_\_malloc\_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-\_\_malloc\_hook.md)
|
||||
* [WWW2Exec - \_\_malloc\_hook & \_\_free\_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-\_\_malloc\_hook.md)
|
||||
* [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
|
||||
* [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# WWW2Exec - \_\_malloc\_hook
|
||||
# WWW2Exec - \_\_malloc\_hook & \_\_free\_hook
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -16,11 +16,11 @@
|
|||
|
||||
## **Malloc Hook**
|
||||
|
||||
Όπως μπορείτε να δείτε στην [επίσημη σελίδα του GNU](https://www.gnu.org/software/libc/manual/html\_node/Hooks-for-Malloc.html), η μεταβλητή **`__malloc_hook`** είναι ένας δείκτης που δείχνει στη **διεύθυνση μιας συνάρτησης που θα κληθεί** κάθε φορά που καλείται η `malloc()` **αποθηκευμένη στην ενότητα δεδομένων της βιβλιοθήκης libc**. Επομένως, αν αυτή η διεύθυνση αντικατασταθεί με ένα **One Gadget** για παράδειγμα και κληθεί η `malloc`, το **One Gadget θα κληθεί**.
|
||||
Όπως μπορείτε να δείτε στην [επίσημη ιστοσελίδα του GNU](https://www.gnu.org/software/libc/manual/html\_node/Hooks-for-Malloc.html), η μεταβλητή **`__malloc_hook`** είναι ένας δείκτης που δείχνει στη **διεύθυνση μιας συνάρτησης που θα κληθεί** κάθε φορά που καλείται η `malloc()` **αποθηκευμένη στην ενότητα δεδομένων της βιβλιοθήκης libc**. Επομένως, αν αυτή η διεύθυνση αντικατασταθεί με ένα **One Gadget** για παράδειγμα και κληθεί η `malloc`, το **One Gadget θα κληθεί**.
|
||||
|
||||
Για να κληθεί η malloc είναι δυνατόν να περιμένετε το πρόγραμμα να την καλέσει ή με το **να καλέσετε `printf("%10000$c")`** το οποίο δεσμεύει πολλά bytes κάνοντας την `libc` να καλέσει την malloc για να τα δεσμεύσει στη στοίβα.
|
||||
Για να κληθεί η malloc είναι δυνατόν να περιμένουμε το πρόγραμμα να την καλέσει ή με το **να καλέσουμε `printf("%10000$c")`** το οποίο δεσμεύει πολλά bytes και καλεί την `malloc` να τα δεσμεύσει στη στοίβα.
|
||||
|
||||
Περισσότερες πληροφορίες σχετικά με το One Gadget:
|
||||
Περισσότερες πληροφορίες για το One Gadget στο:
|
||||
|
||||
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %}
|
||||
[one-gadget.md](../rop-return-oriented-programing/ret2lib/one-gadget.md)
|
||||
|
@ -30,6 +30,31 @@
|
|||
Σημειώστε ότι οι hooks είναι **απενεργοποιημένοι για GLIBC >= 2.34**. Υπάρχουν άλλες τεχνικές που μπορούν να χρησιμοποιηθούν σε μοντέρνες εκδόσεις του GLIBC. Δείτε: [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
|
||||
{% endhint %}
|
||||
|
||||
## Free Hook
|
||||
|
||||
Αυτό καταχράστηκε σε ένα από τα παραδείγματα από τη σελίδα κατάχρησης ενός γρήγορου bin μετά από την κατάχρηση ενός μη ταξινομημένου bin:
|
||||
|
||||
{% content-ref url="../heap/unsorted-bin-attack.md" %}
|
||||
[unsorted-bin-attack.md](../heap/unsorted-bin-attack.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Τώρα πραγματοποιείται μια **επίθεση γρήγορου bin**:
|
||||
|
||||
* Καταρχάς ανακαλύπτεται ότι είναι δυνατόν να δουλέψουμε με γρήγορα **κομμάτια μεγέθους 200** στη θέση του **`__free_hook`**:
|
||||
* <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
|
||||
</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` στον γρήγορο bin.
|
||||
* Στη συνέχεια, καλείται η συνάρτηση επεξεργασίας σε αυτό το κομμάτι για να τροποποιήσει τη διεύθυνση **`fd`** αυτού του γρήγορου bin ώστε να δείχνει στην προηγούμενη συνάρτηση **`__free_hook`**.
|
||||
* Στη συνέχεια, δημιουργείται ένα κομμάτι μεγέθους `0x1f8` για να ανακτήσει από τον γρήγορο bin το προηγούμενο άχρηστο κομμάτι, έτσι δημιουργείται ένα άλλο κομμάτι μεγέθους `0x1f8` για να αποκτήσει ένα κομμάτι γρήγορου bin στο **`__free_hook`** το οποίο αντικαθίσταται με τη διεύθυνση της συνάρτησης **`system`**.
|
||||
* Και τέλος ένα κομμάτι που περιέχει τη συμβολοσειρά `/bin/sh\x00` απελευθερώνεται καλώντας τη συνάρτηση διαγραφής, ενεργοποιώντας τη συνάρτηση **`__free_hook`** που δείχνει στη συνάρτηση system με το `/bin/sh\x00` ως παράμετρο.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
|
||||
|
|
|
@ -2,21 +2,27 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Red Team του HackTricks AWS)</strong></a><strong>!</strong></summary>
|
||||
<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.
|
||||
* Ανακαλύψτε [**την Οικογένεια 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)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια στο GitHub.
|
||||
|
||||
</details>
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Επειδή ο γρήγορος κάδος είναι μονόδεσμος, υπάρχουν πολύ λιγότερες προστασίες από άλλους κάδους και απλά **η τροποποίηση μιας διεύθυνσης σε ένα κομμάτι γρήγορου κάδου που έχει απελευθερωθεί** είναι αρκετή για να **μπορέσετε να διαθέσετε αργότερα ένα κομμάτι σε οποιαδήποτε διεύθυνση μνήμης**.
|
||||
Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα γρήγορο bin ελέγξτε αυτήν τη σελίδα:
|
||||
|
||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Επειδή το γρήγορο bin είναι μονόδεσμο, υπάρχουν πολύ λιγότερες προστασίες από ό,τι σε άλλα bins και απλά **η τροποποίηση μιας διεύθυνσης σε ένα ελεύθερο fast bin** chunk είναι αρκετή για να **διατεθεί αργότερα ένα κομμάτι σε οποιαδήποτε διεύθυνση μνήμης**.
|
||||
|
||||
Ως περίληψη:
|
||||
|
||||
|
@ -126,21 +132,24 @@ printf("Chunk 5: %p\t Contains: 0x%x\n", ptr5, (int)*ptr5);
|
|||
|
||||
printf("\n\nJust like that, we executed a fastbin attack to allocate an address to a stack variable using malloc!\n");
|
||||
}
|
||||
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Εάν είναι δυνατόν να αντικατασταθεί η τιμή της καθολικής μεταβλητής **`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 στα παραδείγματα από:
|
||||
* **Διαρροή πληροφοριών Libc**: Απλώς απελευθερώστε μερικά τμήματα και θα λάβουν ένα δείκτη σε ένα τμήμα της κύριας αρένας. Δεδομένου ότι μπορείτε να επαναχρησιμοποιήσετε απελευθερωμένους δείκτες, απλώς διαβάστε αυτήν τη διεύθυνση.
|
||||
* **Επίθεση Fast bin**: Όλοι οι δείκτες στις δεσμεύσεις αποθηκεύονται μέσα σε έναν πίνακα, οπότε μπορούμε να απελευθερώσουμε μερικά τμήματα fast bin και στο τελευταίο να αντικαταστήσουμε τη διεύθυνση για να δείχνει λίγο πριν από αυτόν τον πίνακα δεικτών. Στη συνέχεια, να δεσμεύσουμε μερικά τμήματα με τον ίδιο μέγεθος και θα λάβουμε πρώτα το γνήσιο και στη συνέχεια το ψεύτικο που περιέχει τον πίνακα δεικτών. Τώρα μπορούμε να αντικαταστήσουμε αυτούς τους δείκτες δέσμευσης για να δείχνουν στη διεύθυνση got του `free` για να δείχνει στο σύστημα και στη συνέχεια να γράψουμε το τμήμα 1 `"/bin/sh"` για να `free(chunk1)` το οποίο θα εκτελέσει το `system("/bin/sh")`.
|
||||
* Μπορείτε να βρείτε μια επίθεση Fast Bin που καταχρηστεύεται μέσω μιας επίθεσης unsorted bin.
|
||||
* Σημείωση 
|
||||
|
||||
{% content-ref url="unsorted-bin-attack.md" %}
|
||||
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
||||
|
@ -152,9 +161,9 @@ 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)
|
||||
* Ανακαλύψτε [**την Οικογένεια 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.
|
||||
|
||||
|
|
64
binary-exploitation/heap/large-bin-attack.md
Normal file
64
binary-exploitation/heap/large-bin-attack.md
Normal file
|
@ -0,0 +1,64 @@
|
|||
# Επίθεση Large Bin
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Red Team του HackTricks AWS)</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>
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα μεγάλο bin ελέγξτε αυτήν τη σελίδα:
|
||||
|
||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Είναι δυνατό να βρείτε ένα εξαιρετικό παράδειγμα στο [**how2heap - επίθεση μεγάλου bin**](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/large\_bin\_attack.c).
|
||||
|
||||
Βασικά εδώ μπορείτε να δείτε πώς, στην τελευταία "τρέχουσα" έκδοση του glibc (2.35), δεν ελέγχεται: **`P->bk_nextsize`** επιτρέποντας την τροποποίηση μιας αυθαίρετης διεύθυνσης με την τιμή ενός κομματιού μεγάλου bin αν πληρούνται συγκεκριμένες συνθήκες.
|
||||
|
||||
Σε εκείνο το παράδειγμα μπορείτε να βρείτε τις ακόλουθες συνθήκες:
|
||||
|
||||
* Ένα μεγάλο κομμάτι είναι εκχωρημένο
|
||||
* Ένα μεγάλο κομμάτι μικρότερο από το πρώτο αλλά στον ίδιο δείκτη εκχωρείται
|
||||
* Πρέπει να είναι μικρότερο ώστε στο bin να πάει πρώτο
|
||||
* (Δημιουργείται ένα κομμάτι για να αποτρέψει τη συγχώνευση με το κομμάτι κορυφής)
|
||||
* Στη συνέχεια, το πρώτο μεγάλο κομμάτι απελευθερώνεται και εκχωρείται ένα νέο κομμάτι μεγαλύτερο από αυτό -> Το Κομμάτι1 πηγαίνει στο μεγάλο bin
|
||||
* Στη συνέχεια, το δεύτερο μεγάλο κομμάτι απελευθερώνεται
|
||||
* Τώρα, η ευπάθεια: Ο επιτιθέμενος μπορεί να τροποποιήσει το `chunk1->bk_nextsize` σε `[target-0x20]`
|
||||
* Στη συνέχεια, εκχωρείται ένα μεγαλύτερο κομμάτι από το κομμάτι 2, έτσι το κομμάτι2 εισάγεται στο μεγάλο bin αντικαθιστώντας τη διεύθυνση `chunk1->bk_nextsize->fd_nextsize` με τη διεύθυνση του κομματιού 2
|
||||
|
||||
{% hint style="success" %}
|
||||
Υπάρχουν και άλλα πιθανά σενάρια, το θέμα είναι να προστεθεί στο μεγάλο bin ένα κομμάτι που είναι **μικρότερο** από ένα τρέχον κομμάτι X στο bin, έτσι ώστε να εισαχθεί ακριβώς πριν από αυτό στο bin, και πρέπει να μπορούμε να τροποποιήσουμε το **`bk_nextsize`** του X καθώς εκεί θα γραφτεί η διεύθυνση του μικρότερου κομματιού.
|
||||
{% endhint %}
|
||||
|
||||
Αυτός είναι ο σχετικός κώδικας από το malloc. Έχουν προστεθεί σχόλια για καλύτερη κατανόηση του πώς έγινε η αντικατάσταση της διεύθυνσης:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```c
|
||||
/* if smaller than smallest, bypass loop below */
|
||||
assert (chunk_main_arena (bck->bk));
|
||||
if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk))
|
||||
{
|
||||
fwd = bck; // fwd = p1
|
||||
bck = bck->bk; // bck = p1->bk
|
||||
|
||||
victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk)
|
||||
victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize
|
||||
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Αυτό θα μπορούσε να χρησιμοποιηθεί για **να αντικαταστήσετε την παγκόσμια μεταβλητή `global_max_fast`** της libc για να εκμεταλλευτείτε έπειτα μια επίθεση fast bin με μεγαλύτερα κομμάτια.
|
||||
|
||||
Μπορείτε να βρείτε μια άλλη εξαιρετική εξήγηση αυτής της επίθεσης στο [**guyinatuxedo**](https://guyinatuxedo.github.io/32-largebin\_attack/largebin\_explanation0/index.html).
|
43
binary-exploitation/heap/tcache-bin-attack.md
Normal file
43
binary-exploitation/heap/tcache-bin-attack.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
# Tcache Bin Attack
|
||||
|
||||
<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) ή στην [**ομάδα 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).
|
||||
|
||||
</details>
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα tcache bin ελέγξτε αυτήν τη σελίδα:
|
||||
|
||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Καταρχάς, σημειώστε ότι το Tcache εισήχθη στην έκδοση glibc 2.26.
|
||||
|
||||
Η επίθεση **Tcache** που προτάθηκε στη [**σελίδα guyinatuxido**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) είναι πολύ παρόμοια με την επίθεση fast bin όπου ο στόχος είναι να αντικατασταθεί ο δείκτης προς το επόμενο τμήμα στο bin μέσα σε ένα ελεύθερο τμήμα με μια τυχαία διεύθυνση, ώστε αργότερα να είναι δυνατή η **εκχώρηση αυτής της συγκεκριμένης διεύθυνσης και ενδεχομένως η αντικατάσταση δεικτών**.
|
||||
|
||||
Ωστόσο, σήμερα, αν εκτελέσετε το αναφερόμενο κώδικα, θα λάβετε το σφάλμα: **`malloc(): unaligned tcache chunk detected`**. Έτσι, είναι απαραίτητο να γράψετε ως διεύθυνση στον νέο δείκτη μια ευθυγραμμισμένη διεύθυνση (ή να εκτελέσετε αρκετές φορές το δυαδικό αρχείο ώστε η γραμμένη διεύθυνση να είναι πράγματι ευθυγραμμισμένη).
|
||||
|
||||
<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) ή στην [**ομάδα 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).
|
||||
|
||||
</details>
|
55
binary-exploitation/heap/unsorted-bin-attack.md
Normal file
55
binary-exploitation/heap/unsorted-bin-attack.md
Normal file
|
@ -0,0 +1,55 @@
|
|||
# Επίθεση Unsorted Bin
|
||||
|
||||
<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>
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Για περισσότερες πληροφορίες σχετικά με το τι είναι μια 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, θα μπορούσε να **γράψει αυτήν τη διεύθυνση σε μια τυχαία διεύθυνση** που θα μπορούσε να βοηθήσει στη διαρροή μιας διεύθυνσης της 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](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**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) το εξηγεί πολύ καλά, αν και αν τροποποιήσετε τις κλήσεις malloc για να εκχωρήσετε μνήμη αρκετά μεγάλη ώστε να μην καταλήξετε σε tcache, μπορείτε να δείτε ότι εμφανίζεται το προαναφερθέν σφάλμα που αποτρέπει αυτήν την τεχνική: **`malloc(): unsorted double linked list corrupted`**
|
||||
|
||||
## Αναφορές & Άλλα παραδείγματα
|
||||
|
||||
* [**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 δεν είναι ενεργοποιημένη.
|
||||
* Είναι δυνατό να δημιουργηθούν κομμάτια αυθαίρετων μεγεθών και υπάρχει υπερχείλιση στη στοίβα με το επιθυμητό μέγεθος.
|
||||
* Η επίθεση ξεκινά δημιουργώντας 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/0ctf16\_zerostorage/index.html)
|
||||
* Η συνάρτηση συγχώνευσης είναι ευάλωτη επειδή αν τα δύο δείκτες που περνούν είναι ίδιοι, θα γίνει επαναδιάταξη σε αυτό και στη συνέχεια θα απελευθερωθεί αλλά θα επιστρέψει ένα δείκτη σε αυτήν την απελευθερωμένη περιοχή που μπορεί να χρησιμοποιηθεί.
|
||||
* Επομένως, **δημιουργούνται 2 κομμάτια**: το **κομμάτι 0** που θα συγχωνευτεί με τον εαυτό του και το κομμάτι 1 για να αποτρέψει τη συγχώνευση με το κορυφαίο κομμάτι. Στη συνέχεια, καλείται η συνάρτηση σ
|
||||
* Στη συνέχεια, δημιουργείται ένα τμήμα με μέγεθος `0x1f8` για να ανακτηθεί από το γρήγορο bin το προηγούμενο άχρηστο τμήμα, έτσι δημιουργείται άλλο τμήμα μεγέθους `0x1f8` για να ληφθεί ένα τμήμα γρήγορου bin στο **`__free_hook`** το οποίο αντικαθίσταται με τη διεύθυνση της συνάρτησης **`system`**.
|
||||
* Και τελικά ένα τμήμα που περιέχει τη συμβολοσειρά `/bin/sh\x00` απελευθερώνεται καλώντας τη λειτουργία διαγραφής, ενεργοποιώντας τη λειτουργία **`__free_hook`** που δείχνει στο σύστημα με το `/bin/sh\x00` ως παράμετρο.
|
Loading…
Reference in a new issue