WWW2Exec - __malloc_hook & __free_hook

Reading time: 5 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

Malloc Hook

Όπως μπορείτε να δείτε στον Επίσημο ιστότοπο GNU, η μεταβλητή __malloc_hook είναι ένας δείκτης που δείχνει στη διεύθυνση μιας συνάρτησης που θα καλείται όποτε καλείται το malloc() αποθηκευμένη στην ενότητα δεδομένων της βιβλιοθήκης libc. Επομένως, αν αυτή η διεύθυνση αντικατασταθεί με ένα One Gadget για παράδειγμα και κληθεί το malloc, το One Gadget θα κληθεί.

Για να καλέσετε το malloc, είναι δυνατόν να περιμένετε να το καλέσει το πρόγραμμα ή με **καλώντας printf("%10000$c")** που δεσμεύει πάρα πολλά bytes κάνοντάς το libc` να καλέσει το malloc για να τα δεσμεύσει στο heap.

Περισσότερες πληροφορίες σχετικά με το One Gadget στο:

One Gadget

warning

Σημειώστε ότι οι hooks είναι απενεργοποιημένες για GLIBC >= 2.34. Υπάρχουν άλλες τεχνικές που μπορούν να χρησιμοποιηθούν σε σύγχρονες εκδόσεις GLIBC. Δείτε: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.

Free Hook

Αυτό εκμεταλλεύτηκε σε ένα από τα παραδείγματα της σελίδας εκμεταλλευόμενος μια επίθεση γρήγορης bin μετά από την εκμετάλλευση μιας επίθεσης unsorted bin:

Unsorted Bin Attack

Είναι δυνατόν να βρείτε τη διεύθυνση του __free_hook αν το δυαδικό αρχείο έχει σύμβολα με την ακόλουθη εντολή:

bash
gef➤  p &__free_hook

Στην ανάρτηση μπορείτε να βρείτε έναν οδηγό βήμα προς βήμα για το πώς να εντοπίσετε τη διεύθυνση του free hook χωρίς σύμβολα. Ως σύνοψη, στη συνάρτηση free:

gef➤  x/20i free
0xf75dedc0 : push   ebx
0xf75dedc1 : call   0xf768f625
0xf75dedc6 : add    ebx,0x14323a
0xf75dedcc :  sub    esp,0x8
0xf75dedcf :  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 :  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 :  mov    eax,DWORD PTR [eax]--- BREAK HERE
0xf75deddb :  test   eax,eax ;<
0xf75deddd :  jne    0xf75dee50 

Στο αναφερόμενο σημείο διακοπής στον προηγούμενο κώδικα, στο $eax θα βρίσκεται η διεύθυνση του free hook.

Τώρα εκτελείται μια fast bin attack:

  • Πρώτα απ' όλα, ανακαλύπτεται ότι είναι δυνατό να εργαστούμε με γρήγορες chunks μεγέθους 200 στην τοποθεσία __free_hook:
  • gef➤  p &__free_hook
    

$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000

  • Εάν καταφέρουμε να αποκτήσουμε μια γρήγορη chunk μεγέθους 0x200 σε αυτή την τοποθεσία, θα είναι δυνατό να αντικαταστήσουμε έναν δείκτη συνάρτησης που θα εκτελείται
  • Για αυτό, δημιουργείται μια νέα chunk μεγέθους 0xfc και καλείται η συγχωνευμένη συνάρτηση με αυτόν τον δείκτη δύο φορές, με αυτόν τον τρόπο αποκτούμε έναν δείκτη σε μια ελεύθερη chunk μεγέθους 0xfc*2 = 0x1f8 στο fast bin.
  • Στη συνέχεια, καλείται η συνάρτηση edit σε αυτή την chunk για να τροποποιήσει τη διεύθυνση fd αυτού του fast bin ώστε να δείχνει στην προηγούμενη συνάρτηση __free_hook.
  • Στη συνέχεια, δημιουργείται μια chunk με μέγεθος 0x1f8 για να ανακτηθεί από το fast bin η προηγούμενη άχρηστη chunk, ώστε να δημιουργηθεί άλλη μια chunk μεγέθους 0x1f8 για να αποκτήσουμε μια γρήγορη chunk στο __free_hook που αντικαθίσταται με τη διεύθυνση της συνάρτησης system.
  • Και τελικά, μια chunk που περιέχει τη συμβολοσειρά /bin/sh\x00 απελευθερώνεται καλώντας τη συνάρτηση διαγραφής, ενεργοποιώντας τη συνάρτηση __free_hook που δείχνει στη system με /bin/sh\x00 ως παράμετρο.

Αναφορές

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