House of Force
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking: Εκπαίδευση HackTricks AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)
Αυτή η τεχνική επιδιορθώθηκε (εδώ) και παράγει το σφάλμα: malloc(): corrupted top size
Μπορείτε να δοκιμάσετε τον κώδικα από εδώ για να τον δοκιμάσετε αν θέλετε.
Ο στόχος αυτής της επίθεσης είναι να είναι δυνατή η δέσμευση ενός κομματιού σε μια συγκεκριμένη διεύθυνση.
Ένα υπερχείλιση που επιτρέπει την αντικατάσταση του μεγέθους του κεφαλαίου του κορυφαίου κομματιού (π.χ. -1).
Να είναι δυνατόν να ελέγχεται το μέγεθος της δέσμευσης της στοίβας.
Αν ένας επιτιθέμενος θέλει να δεσμεύσει ένα κομμάτι στη διεύθυνση P για να αντικαταστήσει μια τιμή εδώ. Ξεκινάει αντικαθιστώντας το μέγεθος του κορυφαίου κομματιού με -1
(ίσως με ένα υπερχείλιση). Αυτό εξασφαλίζει ότι το malloc δεν θα χρησιμοποιεί το mmap για κάθε δέσμευση καθώς το Top chunk θα έχει πάντα αρκετό χώρο.
Στη συνέχεια, υπολογίζεται η απόσταση μεταξύ της διεύθυνσης του κορυφαίου κομματιού και του χώρου στόχου για να γίνει η δέσμευση. Αυτό γίνεται επειδή μια δέσμευση με αυτό το μέγεθος θα πραγματοποιηθεί για να μετακινηθεί το κορυφαίο κομμάτι σε αυτή τη θέση. Έτσι η διαφορά/μέγεθος μπορεί να υπολογιστεί εύκολα:
Συνεπώς, η δέσμευση μεγέθους target - old_top - 4*sizeof(long)
(τα 4 longs είναι λόγω των μεταδεδομένων του κορυφαίου τμήματος και του νέου τμήματος όταν δεσμεύεται) θα μετακινήσει το κορυφαίο τμήμα στη διεύθυνση που θέλουμε να αντικαταστήσουμε.
Στη συνέχεια, κάντε ένα ακόμη malloc για να λάβετε ένα τμήμα στη διεύθυνση στόχου.
Ο στόχος αυτού του σεναρίου είναι ένα ret2win όπου πρέπει να τροποποιήσουμε τη διεύθυνση μιας συνάρτησης που θα κληθεί από τη διεύθυνση της συνάρτησης ret2win
Το δυαδικό έχει ένα υπερχείλιση που μπορεί να εκμεταλλευτεί για να τροποποιήσει το μέγεθος του κορυφαίου τμήματος, το οποίο τροποποιείται σε -1 ή p64(0xffffffffffffffff)
Στη συνέχεια, υπολογίζεται η διεύθυνση στο σημείο όπου υπάρχει ο δείκτης που θα αντικατασταθεί, και η διαφορά από την τρέχουσα θέση του κορυφαίου τμήματος εκεί δεσμεύεται με malloc
Τέλος, δεσμεύεται ένα νέο τμήμα που θα περιέχει αυτόν τον επιθυμητό στόχο μέσα στον οποίο αντικαθίσταται από τη συνάρτηση ret2win
Στο Input your name:
υπάρχει μια αρχική ευπάθεια που επιτρέπει τη διαρροή μιας διεύθυνσης από τη στοίβα
Στη συνέχεια, στις λειτουργίες Org:
και Host:
, είναι δυνατό να γεμίσετε τα 64B του δείκτη s
όταν ζητείται το όνομα org, το οποίο στη στοίβα ακολουθείται από τη διεύθυνση του v2, η οποία ακολουθείται στη συνέχεια από το όνομα host που υποδεικνύεται. Καθώς στη συνέχεια το strcpy θα αντιγράφει τα περιεχόμενα του s σε ένα τμήμα μεγέθους 64B, είναι δυνατό να αντικατασταθεί το μέγεθος του κορυφαίου τμήματος με τα δεδομένα που τοποθετούνται μέσα στο όνομα host.
Τώρα που είναι δυνατή η αυθαίρετη εγγραφή, το GOT του atoi
τροποποιήθηκε στη διεύθυνση του printf. Στη συνέχεια, ήταν δυνατό να διαρρεύσει η διεύθυνση του IO_2_1_stderr
με %24$p
. Και με αυτή τη διαρροή της libc ήταν δυνατό να τροποποιηθεί ξανά το GOT του atoi
με τη διεύθυνση του system
και να κληθεί με παράμετρο /bin/sh
Μια εναλλακτική μέθοδος που προτάθηκε σε αυτήν την άλλη ανάλυση, είναι να αντικατασταθεί το free
με το puts
, και στη συνέχεια να προστεθεί η διεύθυνση του atoi@got
, στον δείκτη που αργότερα θα ελευθερωθεί ώστε να διαρρεύσει και με αυτή τη διαρροή να αντικατασταθεί ξανά το atoi@got
με το system
και να κληθεί με /bin/sh
.
Υπάρχει μια UAF που επιτρέπει την επαναχρησιμοποίηση ενός τμήματος που απελευθερώθηκε χωρίς να καθαριστεί ο δείκτης. Επειδή υπάρχουν μερικές μέθοδοι ανάγνωσης, είναι δυνατό να διαρρεύσει μια διεύθυνση libc γράφοντας ένα δείκτη στη λειτουργία free στο GOT εδώ και στη συνέχεια καλώντας τη λειτουργία ανάγνωσης.
Στη συνέχεια, χρησιμοποιήθηκε το House of force (καταχρηστικά το UAF) για να αντικατασταθεί το μέγεθος του αριστερού χώρου με ένα -1, να δεσμευτεί ένα τμήμα αρκετά μεγάλο για να φτάσει στο free hook, και στη συνέχεια να δεσμευτεί ένα άλλο τμήμα που θα περιέχει το free hook. Στη συνέχεια, γράψτε στο hook τη διεύθυνση του system
, γράψτε σε ένα τμήμα "/bin/sh"
και τέλος ελευθερώστε το τμήμα με αυτό το περιεχόμενο συμβολοσειράς.