House of Roman
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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
Δημιουργήστε αρκετά chunks:
fastbin_victim
(0x60, offset 0): UAF chunk που θα επεξεργαστεί αργότερα τον δείκτη heap ώστε να δείχνει στην τιμή LibC.chunk2
(0x80, offset 0x70): Για καλή ευθυγράμμισηmain_arena_use
(0x80, offset 0x100)relative_offset_heap
(0x60, offset 0x190): σχετική απόσταση στο chunk 'main_arena_use'
Στη συνέχεια, free(main_arena_use)
που θα τοποθετήσει αυτό το chunk στη λίστα unsorted και θα αποκτήσει έναν δείκτη στο main_arena + 0x68
και στους δείκτες fd
και bk
.
Τώρα έχει εκχωρηθεί ένα νέο chunk fake_libc_chunk(0x60)
γιατί θα περιέχει τους δείκτες στο main_arena + 0x68
στους fd
και bk
.
Στη συνέχεια, relative_offset_heap
και fastbin_victim
απελευθερώνονται.
fastbin_victim
έχει έναfd
που δείχνει στοrelative_offset_heap
relative_offset_heap
είναι μια απόσταση από τοfake_libc_chunk
, το οποίο περιέχει έναν δείκτη προςmain_arena + 0x68
Αλλάζοντας απλώς το τελευταίο byte του
fastbin_victim.fd
, είναι δυνατόν να γίνει τοfastbin_victim points
να δείχνει στο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 και ένας τρίτος εκχωρείται για να αποκτήσει ένα chunk στο __malloc_hook:
Part 2: Unsorted_bin attack
Για περισσότερες πληροφορίες μπορείτε να ελέγξετε:
Unsorted Bin AttackΑλλά βασικά επιτρέπει να γράψουμε main_arena + 0x68
σε οποιαδήποτε τοποθεσία που καθορίζεται στο chunk->bk
. Και για την επίθεση επιλέγουμε __malloc_hook
. Στη συνέχεια, αφού το παρακάμψουμε, θα χρησιμοποιήσουμε μια σχετική παρακάμψη για να δείξουμε σε ένα one_gadget
.
Για αυτό ξεκινάμε να αποκτούμε ένα chunk και να το τοποθετούμε στο unsorted bin:
Χρησιμοποιήστε ένα UAF σε αυτό το chunk για να δείξετε το unsorted_bin_ptr->bk
στη διεύθυνση του __malloc_hook
(το έχουμε brute forced προηγουμένως).
Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (άρα και το small και το large). Έτσι, μπορούμε μόνο να χρησιμοποιήσουμε allocations από το fast bin τώρα (ένα πιο περίπλοκο πρόγραμμα μπορεί να κάνει άλλες allocations και να καταρρεύσει), και για να το ενεργοποιήσουμε πρέπει να κάνουμε alloc το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.
Έτσι, για να ενεργοποιήσουμε την εγγραφή του main_arena + 0x68
στο __malloc_hook
, εκτελούμε μετά την ρύθμιση του __malloc_hook
στο unsorted_bin_ptr->bk
, απλά πρέπει να κάνουμε: malloc(0x80)
Βήμα 3: Ρύθμιση του __malloc_hook στο system
Στο πρώτο βήμα ελέγχαμε ένα chunk που περιέχει το __malloc_hook
(στη μεταβλητή malloc_hook_chunk
) και στο δεύτερο βήμα καταφέραμε να γράψουμε το main_arena + 0x68
εδώ.
Τώρα, εκμεταλλευόμαστε μια μερική υπεργραφή στο malloc_hook_chunk
για να χρησιμοποιήσουμε τη διεύθυνση libc που γράψαμε εκεί (main_arena + 0x68
) για να δείξουμε σε μια διεύθυνση one_gadget
.
Εδώ είναι που χρειάζεται να bruteforce 12 bits τυχαίας πληροφορίας (περισσότερες πληροφορίες στο how2heap παράδειγμα).
Τέλος, μόλις η σωστή διεύθυνση υπεργραφεί, καλέστε το malloc
και ενεργοποιήστε το one_gadget
.
Αναφορές
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Last updated