hacktricks/binary-exploitation/libc-heap/house-of-roman.md

124 lines
10 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.

# Οίκος του Roman
{% 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).
</details>
{% endhint %}
## Βασικές Πληροφορίες
Αυτή ήταν μια πολύ ενδιαφέρουσα τεχνική που επέτρεπε την RCE χωρίς διαρροές μέσω ψεύτικων fastbins, επίθεση στο unsorted\_bin και σχετικές αντικαταστάσεις. Ωστόσο, έχει [**διορθωθεί**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c).
### Κώδικας
* Μπορείτε να βρείτε ένα παράδειγμα στο [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)
### Στόχος
* RCE με κατάχρηση σχετικών δεικτών
### Απαιτήσεις
* Επεξεργασία δεικτών fastbin και unsorted bin
* Πρέπει να υπάρχουν 12 bits τυχαιότητας που πρέπει να αναγκαστούν (πιθανότητα 0,02%) να λειτουργήσουν
## Βήματα Επίθεσης
### Μέρος 1: Το Fastbin Chunk δείχνει στο \_\_malloc\_hook
Δημιουργήστε αρκετά κομμάτια:
* `fastbin_victim` (0x60, μετατόπιση 0): UAF κομμάτι αργότερα για να επεξεργαστείτε το δείκτη του σωρού αργότερα ώστε να δείχνει στην τιμή της LibC.
* `chunk2` (0x80, μετατόπιση 0x70): Για καλή ευθυγράμμιση
* `main_arena_use` (0x80, μετατόπιση 0x100)
* `relative_offset_heap` (0x60, μετατόπιση 0x190): σχετική μετατόπιση στο κομμάτι 'main\_arena\_use'
Στη συνέχεια, ελευθερώστε το `main_arena_use`, το οποίο θα τοποθετήσει αυτό το κομμάτι στη λίστα unsorted και θα λάβει ένα δείκτη στο `main_arena + 0x68` τόσο στους δείκτες `fd` όσο και `bk`.
Τώρα δεσμεύεται ένα νέο κομμάτι `fake_libc_chunk(0x60)` επειδή θα περιέχει τους δείκτες στο `main_arena + 0x68` στους `fd` και `bk`.
Στη συνέχεια, ελευθερώνονται τα `relative_offset_heap` και `fastbin_victim`.
```c
/*
Current heap layout:
0x0: fastbin_victim - size 0x70
0x70: alignment_filler - size 0x90
0x100: fake_libc_chunk - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main - size 0x20
0x190: relative_offset_heap - size 0x70
bin layout:
fastbin: fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
```
* &#x20;`fastbin_victim` έχει ένα `fd` που δείχνει στο `relative_offset_heap`
* &#x20;`relative_offset_heap` είναι μια μετατόπιση απόστασης από το `fake_libc_chunk`, το οποίο περιέχει ένα δείκτη προς το `main_arena + 0x68`
* Αλλάζοντας απλά το τελευταίο byte του `fastbin_victim.fd` είναι δυνατό να κάνουμε το `fastbin_victim` να δείχνει στο `main_arena + 0x68`
Για τις προηγούμενες ενέργειες, ο επιτιθέμενος πρέπει να είναι ικανός να τροποποιήσει τον δείκτη fd του `fastbin_victim`.
Στη συνέχεια, το `main_arena + 0x68` δεν είναι τόσο ενδιαφέρον, οπότε ας το τροποποιήσουμε ώστε ο δείκτης να δείχνει στο **`__malloc_hook`**.
Σημειώστε ότι το `__memalign_hook` συνήθως ξεκινά με `0x7f` και μηδενικά πριν από αυτό, οπότε είναι δυνατό να το πλασάρουμε ως τιμή στο fast bin `0x70`. Επειδή τα τελευταία 4 bits της διεύθυνσης είναι **τυχαία**, υπάρχουν `2^4=16` πιθανότητες για την τιμή να καταλήξει εκεί που μας ενδιαφέρει. Έτσι εδώ πραγματοποιείται μια επίθεση BF ώστε το κομμάτι να καταλήξει ως εξής: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.**
(Για περισσότερες πληροφορίες σχετικά με τα υπόλοιπα bytes ελέγξτε την εξήγηση στο [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)[ παράδειγμα](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)). Αν η BF δεν λειτουργήσει, το πρόγραμμα απλώς καταρρέει (οπότε ξεκινήστε ξανά μέχρι να λειτουργήσει).
Στη συνέχεια, πραγματοποιούνται 2 mallocs για να αφαιρεθούν τα 2 αρχικά fast bin chunks και στη συνέχεια γίνεται μια τρίτη κλήση για να ληφθεί ένα κομμάτι στο **`__malloc_hook:`**
```c
malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);
```
### Μέρος 2: Επίθεση unsorted\_bin
Για περισσότερες πληροφορίες μπορείτε να ελέγξετε:
{% content-ref url="unsorted-bin-attack.md" %}
[unsorted-bin-attack.md](unsorted-bin-attack.md)
{% endcontent-ref %}
Βασικά, επιτρέπει την εγγραφή της τιμής `main_arena + 0x68` σε οποιαδήποτε τοποθεσία που καθορίζεται στο `chunk->bk`. Και για την επίθεση επιλέγουμε το `__malloc_hook`. Στη συνέχεια, μετά την αντικατάστασή του, θα χρησιμοποιήσουμε μια σχετική αντικατάσταση για να δείχνει σε ένα `one_gadget`.
Για αυτό ξεκινάμε παίρνοντας ένα κομμάτι και το τοποθετούμε στο **unsorted bin**:
```c
uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate
puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
```
Χρησιμοποιήστε ένα UAF σε αυτό το κομμάτι για να δείξετε το `unsorted_bin_ptr->bk` στη διεύθυνση του `__malloc_hook` (το οποίο το είχαμε υπολογίσει με brute force προηγουμένως).
{% hint style="danger" %}
Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (και τα small και large επίσης). Έτσι μπορούμε μόνο **να χρησιμοποιήσουμε εκχωρήσεις από το fast bin τώρα** (ένα πιο πολύπλοκο πρόγραμμα ενδέχεται να κάνει άλλες εκχωρήσεις και να καταρρεύσει), και για να ενεργοποιήσουμε αυτό πρέπει **να εκχωρήσουμε τον ίδιο μέγεθος αλλιώς το πρόγραμμα θα καταρρεύσει.**
{% endhint %}
Έτσι, για να ενεργοποιήσουμε την εγγραφή του `main_arena + 0x68` στο `__malloc_hook` εκτελούμε μετά την ρύθμιση του `__malloc_hook` στο `unsorted_bin_ptr->bk` απλώς πρέπει να κάνουμε: **`malloc(0x80)`**
### Βήμα 3: Ρύθμιση του \_\_malloc\_hook σε σύστημα
Στο πρώτο βήμα καταλήξαμε να ελέγχουμε ένα κομμάτι που περιέχει το `__malloc_hook` (στη μεταβλητή `malloc_hook_chunk`) και στο δεύτερο βήμα καταφέραμε να γράψουμε το `main_arena + 0x68` εδώ.
Τώρα, εκμεταλλευόμαστε μια μερική επικάλυψη στο `malloc_hook_chunk` για να χρησιμοποιήσουμε τη διεύθυνση libc που γράψαμε εκεί (`main_arena + 0x68`) για **να δείξουμε μια διεύθυνση `one_gadget`**.
Εδώ είναι όπου απαιτείται να **υπολογίσουμε με brute force 12 bits τυχαιότητας** (περισσότερες πληροφορίες στο [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)[ παράδειγμα](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)).
Τέλος, αφού αντικατασταθεί η σωστή διεύθυνση, **καλέστε το `malloc` και ενεργοποιήστε το `one_gadget`**.
## Αναφορές
* [https://github.com/shellphish/how2heap](https://github.com/shellphish/how2heap)
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_roman/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_roman/)