House of Orange
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
The exploitation technique was fixed in this patch so this is no longer working (working in earlier than 2.26)
Same example with more comments in https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Abuse malloc_printerr
function
Overwrite the top chunk size
Libc and heap leaks
Some needed background from the comments from this example:
Το θέμα είναι ότι, σε παλαιότερες εκδόσεις της libc, όταν καλούνταν η συνάρτηση malloc_printerr
, θα επικοινωνούσε μέσω μιας λίστας των δομών _IO_FILE
που αποθηκεύονται στο _IO_list_all
, και στην πραγματικότητα θα εκτελούσε έναν δείκτη εντολής σε αυτή τη δομή.
Αυτή η επίθεση θα κατασκευάσει μια ψεύτικη δομή _IO_FILE
που θα γράψουμε στο _IO_list_all
, και θα προκαλέσει την εκτέλεση της malloc_printerr
.
Στη συνέχεια, θα εκτελέσει οποιαδήποτε διεύθυνση έχουμε αποθηκεύσει στον πίνακα άλματος των δομών _IO_FILE
, και θα αποκτήσουμε εκτέλεση κώδικα.
Η επίθεση ξεκινάει με την επιτυχία να αποκτήσουμε το top chunk μέσα στο unsorted bin. Αυτό επιτυγχάνεται καλώντας τη malloc
με μέγεθος μεγαλύτερο από το τρέχον μέγεθος του top chunk αλλά μικρότερο από το mmp_.mmap_threshold
(προεπιλογή είναι 128K), το οποίο διαφορετικά θα ενεργοποιούσε την κατανομή mmap
. Όποτε το μέγεθος του top chunk τροποποιείται, είναι σημαντικό να διασφαλίσουμε ότι το top chunk + το μέγεθός του είναι ευθυγραμμισμένο με σελίδα και ότι το prev_inuse bit του top chunk είναι πάντα ρυθμισμένο.
Για να αποκτήσουμε το top chunk μέσα στο unsorted bin, καταχωρούμε ένα chunk για να δημιουργήσουμε το top chunk, αλλάζουμε το μέγεθος του top chunk (με μια υπερχείλιση στο κατανεμημένο chunk) έτσι ώστε το top chunk + μέγεθος να είναι ευθυγραμμισμένο με σελίδα με το prev_inuse bit ρυθμισμένο. Στη συνέχεια, καταχωρούμε ένα chunk μεγαλύτερο από το νέο μέγεθος του top chunk. Σημειώστε ότι η free
δεν καλείται ποτέ για να αποκτήσει το top chunk στο unsorted bin.
Το παλιό top chunk είναι τώρα στο unsorted bin. Υποθέτοντας ότι μπορούμε να διαβάσουμε δεδομένα μέσα σε αυτό (πιθανώς λόγω μιας ευπάθειας που προκάλεσε επίσης την υπερχείλιση), είναι δυνατό να διαρρεύσουμε διευθύνσεις libc από αυτό και να αποκτήσουμε τη διεύθυνση του _IO_list_all.
Μια επίθεση unsorted bin εκτελείται εκμεταλλευόμενη την υπερχείλιση για να γράψει topChunk->bk->fwd = _IO_list_all - 0x10
. Όταν καταχωρείται ένα νέο chunk, το παλιό top chunk θα χωριστεί, και ένας δείκτης στο unsorted bin θα γραφτεί στο _IO_list_all
.
Το επόμενο βήμα περιλαμβάνει τη μείωση του μεγέθους του παλιού top chunk για να χωρέσει σε ένα μικρό bin, ρυθμίζοντας συγκεκριμένα το μέγεθός του σε 0x61. Αυτό εξυπηρετεί δύο σκοπούς:
Εισαγωγή στο Small Bin 4: Όταν η malloc
σκανάρει το unsorted bin και δει αυτό το chunk, θα προσπαθήσει να το εισαγάγει στο small bin 4 λόγω του μικρού του μεγέθους. Αυτό καθιστά το chunk να καταλήξει στην κορυφή της λίστας small bin 4, η οποία είναι η τοποθεσία του δείκτη FD του chunk του _IO_list_all
καθώς γράψαμε μια κοντινή διεύθυνση στο _IO_list_all
μέσω της επίθεσης unsorted bin.
Προκαλώντας έναν Έλεγχο Malloc: Αυτή η χειραγώγηση μεγέθους chunk θα προκαλέσει την malloc
να εκτελέσει εσωτερικούς ελέγχους. Όταν ελέγχει το μέγεθος του ψευδούς forward chunk, το οποίο θα είναι μηδέν, προκαλεί ένα σφάλμα και καλεί την malloc_printerr
.
Η χειραγώγηση του μικρού bin θα σας επιτρέψει να ελέγξετε τον δείκτη forward του chunk. Η επικάλυψη με _IO_list_all χρησιμοποιείται για να κατασκευάσει μια ψεύτικη δομή _IO_FILE. Η δομή είναι προσεκτικά κατασκευασμένη για να περιλαμβάνει βασικά πεδία όπως το _IO_write_base
και το _IO_write_ptr
ρυθμισμένα σε τιμές που περνούν τους εσωτερικούς ελέγχους στη libc. Επιπλέον, δημιουργείται ένας πίνακας άλματος μέσα στη ψεύτικη δομή, όπου ένας δείκτης εντολής ρυθμίζεται στη διεύθυνση όπου μπορεί να εκτελεστεί αυθαίρετος κώδικας (π.χ., η συνάρτηση system
).
Για να συνοψίσουμε το υπόλοιπο της τεχνικής:
Μειώστε το Παλιό Top Chunk: Ρυθμίστε το μέγεθος του παλιού top chunk σε 0x61 για να χωρέσει σε ένα μικρό bin.
Ρυθμίστε τη Ψεύτικη Δομή _IO_FILE
: Επικαλύψτε το παλιό top chunk με τη ψεύτικη δομή _IO_FILE και ρυθμίστε τα πεδία κατάλληλα για να αναλάβετε τη ροή εκτέλεσης.
Το επόμενο βήμα περιλαμβάνει την κατασκευή μιας ψεύτικης δομής _IO_FILE που επικαλύπτεται με το παλιό top chunk που βρίσκεται αυτή τη στιγμή στο unsorted bin. Τα πρώτα bytes αυτής της δομής είναι προσεκτικά κατασκευασμένα για να περιλαμβάνουν έναν δείκτη σε μια εντολή (π.χ., "/bin/sh") που θα εκτελείται.
Βασικά πεδία στη ψεύτικη δομή _IO_FILE, όπως το _IO_write_base
και το _IO_write_ptr
, ρυθμίζονται σε τιμές που περνούν τους εσωτερικούς ελέγχους στη libc. Επιπλέον, δημιουργείται ένας πίνακας άλματος μέσα στη ψεύτικη δομή, όπου ένας δείκτης εντολής ρυθμίζεται στη διεύθυνση όπου μπορεί να εκτελεστεί αυθαίρετος κώδικας. Συνήθως, αυτή θα είναι η διεύθυνση της συνάρτησης system
ή κάποιας άλλης συνάρτησης που μπορεί να εκτελέσει εντολές shell.
Η επίθεση κορυφώνεται όταν μια κλήση στη malloc
προκαλεί την εκτέλεση του κώδικα μέσω της χειραγωγημένης δομής _IO_FILE. Αυτό επιτρέπει αποτελεσματικά την εκτέλεση αυθαίρετου κώδικα, συνήθως με αποτέλεσμα την εκκίνηση ενός shell ή την εκτέλεση άλλου κακόβουλου payload.
Σύνοψη της Επίθεσης:
Ρυθμίστε το top chunk: Καταχωρήστε ένα chunk και τροποποιήστε το μέγεθος του top chunk.
Αναγκάστε το top chunk στο unsorted bin: Καταχωρήστε ένα μεγαλύτερο chunk.
Διαρρεύστε διευθύνσεις libc: Χρησιμοποιήστε την ευπάθεια για να διαβάσετε από το unsorted bin.
Εκτελέστε την επίθεση unsorted bin: Γράψτε στο _IO_list_all χρησιμοποιώντας μια υπερχείλιση.
Μειώστε το παλιό top chunk: Ρυθμίστε το μέγεθός του για να χωρέσει σε ένα μικρό bin.
Ρυθμίστε μια ψεύτικη δομή _IO_FILE: Κατασκευάστε μια ψεύτικη δομή αρχείου για να αναλάβετε τη ροή ελέγχου.
Προκαλέστε εκτέλεση κώδικα: Καταχωρήστε ένα chunk για να εκτελέσετε την επίθεση και να τρέξετε αυθαίρετο κώδικα.
Αυτή η προσέγγιση εκμεταλλεύεται μηχανισμούς διαχείρισης heap, διαρροές πληροφοριών libc και υπερχείλιση heap για να επιτύχει εκτέλεση κώδικα χωρίς να καλεί άμεσα την free
. Με την προσεκτική κατασκευή της ψεύτικης δομής _IO_FILE και την τοποθέτησή της στη σωστή θέση, η επίθεση μπορεί να αναλάβει τη ροή ελέγχου κατά τη διάρκεια των τυπικών λειτουργιών κατανομής μνήμης. Αυτό επιτρέπει την εκτέλεση αυθαίρετου κώδικα, πιθανώς με αποτέλεσμα ένα shell ή άλλες κακόβουλες δραστηριότητες.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)