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)

Support HackTricks

Basic Information

Αυτή ήταν μια πολύ ενδιαφέρουσα τεχνική που επέτρεπε RCE χωρίς leaks μέσω ψεύτικων fastbins, της επίθεσης unsorted_bin και σχετικών υπεργραφών. Ωστόσο, έχει διορθωθεί.

Code

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 απελευθερώνονται.

/*
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 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:

malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);

Part 2: Unsorted_bin attack

Για περισσότερες πληροφορίες μπορείτε να ελέγξετε:

Unsorted Bin Attack

Αλλά βασικά επιτρέπει να γράψουμε 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 σε αυτό το 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)

Υποστήριξη HackTricks

Last updated