House of Force

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Basic Information

Code

  • Αυτή η τεχνική έχει διορθωθεί (εδώ) και παράγει αυτό το σφάλμα: malloc(): corrupted top size

  • Μπορείτε να δοκιμάσετε τον κώδικα από εδώ αν θέλετε.

Goal

  • Ο στόχος αυτής της επίθεσης είναι να μπορέσετε να εκχωρήσετε ένα κομμάτι σε μια συγκεκριμένη διεύθυνση.

Requirements

  • Μια υπερχείλιση που επιτρέπει την επαναγραφή του μεγέθους του κεφαλίδας του κορυφαίου κομματιού (π.χ. -1).

  • Να μπορείτε να ελέγξετε το μέγεθος της εκχώρησης σωρού.

Attack

Αν ένας επιτιθέμενος θέλει να εκχωρήσει ένα κομμάτι στη διεύθυνση P για να επαναγράψει μια τιμή εδώ. Ξεκινάει επαναγράφοντας το μέγεθος του κορυφαίου κομματιού με -1 (ίσως με μια υπερχείλιση). Αυτό διασφαλίζει ότι το malloc δεν θα χρησιμοποιεί mmap για καμία εκχώρηση καθώς το κορυφαίο κομμάτι θα έχει πάντα αρκετό χώρο.

Στη συνέχεια, υπολογίστε την απόσταση μεταξύ της διεύθυνσης του κορυφαίου κομματιού και του στοχευμένου χώρου για εκχώρηση. Αυτό συμβαίνει επειδή μια malloc με αυτό το μέγεθος θα εκτελείται προκειμένου να μετακινήσει το κορυφαίο κομμάτι σε αυτή τη θέση. Έτσι υπολογίζεται εύκολα η διαφορά/μέγεθος:

// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/

Λοιπόν, η κατανομή ενός μεγέθους target - old_top - 4*sizeof(long) (τα 4 longs είναι λόγω των μεταδεδομένων του top chunk και του νέου chunk όταν κατανεμηθεί) θα μετακινήσει το top chunk στη διεύθυνση που θέλουμε να επαναγράψουμε. Στη συνέχεια, κάντε άλλη μια malloc για να αποκτήσετε ένα chunk στη διεύθυνση στόχο.

Αναφορές & Άλλα Παραδείγματα

  • Ο στόχος αυτού του σεναρίου είναι ένα ret2win όπου πρέπει να τροποποιήσουμε τη διεύθυνση μιας συνάρτησης που πρόκειται να κληθεί από τη διεύθυνση της συνάρτησης ret2win

  • Το δυαδικό έχει μια υπερχείλιση που μπορεί να εκμεταλλευτεί για να τροποποιήσει το μέγεθος του top chunk, το οποίο τροποποιείται σε -1 ή p64(0xffffffffffffffff)

  • Στη συνέχεια, υπολογίζεται η διεύθυνση στο σημείο όπου υπάρχει ο δείκτης προς επαναγραφή, και η διαφορά από τη τρέχουσα θέση του top chunk εκεί είναι κατανεμημένη με malloc

  • Τέλος, ένα νέο chunk κατανεμήθηκε το οποίο θα περιέχει αυτόν τον επιθυμητό στόχο μέσα στον οποίο επαναγράφεται από τη συνάρτηση ret2win

  • Στο Input your name: υπάρχει μια αρχική ευπάθεια που επιτρέπει να διαρρεύσει μια διεύθυνση από τη heap

  • Στη συνέχεια, στη λειτουργία Org: και Host: είναι δυνατόν να συμπληρωθούν τα 64B του δείκτη s όταν ζητηθεί το όνομα οργανισμού, το οποίο στη στοίβα ακολουθείται από τη διεύθυνση του v2, η οποία ακολουθείται από το υποδεικνυόμενο όνομα κεντρικού υπολογιστή. Καθώς τότε, η strcpy θα αντιγράφει τα περιεχόμενα του s σε ένα chunk μεγέθους 64B, είναι δυνατόν να επανεγγραφεί το μέγεθος του top chunk με τα δεδομένα που τοποθετήθηκαν μέσα στο όνομα κεντρικού υπολογιστή.

  • Τώρα που είναι δυνατή η αυθαίρετη εγγραφή, το 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 που επιτρέπει την επαναχρησιμοποίηση ενός chunk που είχε απελευθερωθεί χωρίς να καθαριστεί ο δείκτης. Επειδή υπάρχουν ορισμένες μέθοδοι ανάγνωσης, είναι δυνατόν να διαρρεύσει μια διεύθυνση libc γράφοντας έναν δείκτη στη συνάρτηση free στο GOT εδώ και στη συνέχεια καλώντας τη συνάρτηση ανάγνωσης.

  • Στη συνέχεια, χρησιμοποιήθηκε το House of force (καταχρώντας την UAF) για να επαναγράψει το μέγεθος του αριστερού χώρου με -1, να κατανεμηθεί ένα chunk αρκετά μεγάλο για να φτάσει στο free hook, και στη συνέχεια να κατανεμηθεί άλλο ένα chunk το οποίο θα περιέχει το free hook. Στη συνέχεια, γράψτε στο hook τη διεύθυνση του system, γράψτε σε ένα chunk "/bin/sh" και τελικά απελευθερώστε το chunk με το περιεχόμενο αυτής της συμβολοσειράς.

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated