House of Roman
Reading time: 6 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Basic Information
Αυτή ήταν μια πολύ ενδιαφέρουσα τεχνική που επέτρεπε RCE χωρίς leaks μέσω ψεύτικων fastbins, της επίθεσης unsorted_bin και σχετικών υπεργραφών. Ωστόσο, έχει διορθωθεί.
Code
- You can find an example in https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
Goal
- RCE by abusing relative pointers
Requirements
- Edit fastbin and unsorted bin pointers
- 12 bits of randomness must be brute forced (0.02% chance) of working
Attack Steps
Part 1: Fastbin Chunk points to __malloc_hook
Create several chunks:
fastbin_victim
(0x60, offset 0): UAF chunk later to edit the heap pointer later to point to the LibC value.chunk2
(0x80, offset 0x70): For good alignmentmain_arena_use
(0x80, offset 0x100)relative_offset_heap
(0x60, offset 0x190): relative offset on the 'main_arena_use' chunk
Then free(main_arena_use)
which will place this chunk in the unsorted list and will get a pointer to main_arena + 0x68
in both the fd
and bk
pointers.
Now it's allocated a new chunk fake_libc_chunk(0x60)
because it'll contain the pointers to main_arena + 0x68
in fd
and bk
.
Then relative_offset_heap
and fastbin_victim
are freed.
/*
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
*/
fastbin_victim
έχει έναfd
που δείχνει στοrelative_offset_heap
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
και μηδενικά πριν από αυτό, οπότε είναι δυνατόν να το πλαστογραφήσουμε ως μια τιμή στο γρήγορο bin 0x70
. Επειδή τα τελευταία 4 bits της διεύθυνσης είναι τυχαία, υπάρχουν 2^4=16
πιθανότητες για την τιμή να καταλήξει εκεί που μας ενδιαφέρει. Έτσι, εκτελείται μια επίθεση BF εδώ ώστε το chunk να καταλήξει ως: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)
.
(Για περισσότερες πληροφορίες σχετικά με τα υπόλοιπα bytes, ελέγξτε την εξήγηση στο how2heap παράδειγμα). Αν η BF δεν λειτουργήσει, το πρόγραμμα απλώς θα καταρρεύσει (οπότε ξεκινήστε ξανά μέχρι να λειτουργήσει).
Στη συνέχεια, εκτελούνται 2 mallocs για να αφαιρεθούν τα 2 αρχικά fast bin chunks και ένα τρίτο alloced για να αποκτήσουμε ένα chunk στο __malloc_hook:
malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);
Μέρος 2: Επίθεση Unsorted_bin
Για περισσότερες πληροφορίες μπορείτε να ελέγξετε:
Αλλά βασικά επιτρέπει να γράψουμε main_arena + 0x68
σε οποιαδήποτε τοποθεσία που καθορίζεται στο chunk->bk
. Και για την επίθεση επιλέγουμε __malloc_hook
. Στη συνέχεια, αφού το παρακάμψουμε, θα χρησιμοποιήσουμε μια σχετική παρακάμψη για να δείξουμε σε ένα one_gadget
.
Για αυτό ξεκινάμε να αποκτούμε ένα chunk και να το τοποθετούμε στο unsorted bin:
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 προηγουμένως).
caution
Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (άρα και το small και το large). Έτσι, μπορούμε μόνο να χρησιμοποιήσουμε κατανομές από το fast bin τώρα (ένα πιο περίπλοκο πρόγραμμα μπορεί να κάνει άλλες κατανομές και να καταρρεύσει), και για να το ενεργοποιήσουμε πρέπει να κατανεμηθεί το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.
Έτσι, για να ενεργοποιήσουμε την εγγραφή του main_arena + 0x68
στο __malloc_hook
, εκτελούμε μετά την ρύθμιση του __malloc_hook
στο unsorted_bin_ptr->bk
απλώς χρειάζεται να κάνουμε: malloc(0x80)
Βήμα 3: Ρύθμιση του __malloc_hook σε system
Στο πρώτο βήμα ελέγξαμε ένα κομμάτι που περιέχει το __malloc_hook
(στη μεταβλητή malloc_hook_chunk
) και στο δεύτερο βήμα καταφέραμε να γράψουμε το main_arena + 0x68
εδώ.
Τώρα, εκμεταλλευόμαστε μια μερική υπεργραφή στο malloc_hook_chunk
για να χρησιμοποιήσουμε τη διεύθυνση libc που γράψαμε εκεί (main_arena + 0x68
) για να δείξουμε σε μια διεύθυνση one_gadget
.
Εδώ είναι που χρειάζεται να bruteforce 12 bits τυχαίας πληροφορίας (περισσότερες πληροφορίες στο how2heap παράδειγμα).
Τελικά, μόλις η σωστή διεύθυνση υπεργραφεί, καλέστε το malloc
και ενεργοποιήστε το one_gadget
.
Αναφορές
- https://github.com/shellphish/how2heap
- 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/
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.