House of Force
Reading time: 6 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.
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 είναι λόγω των μεταδεδομένων του κορυφαίου κομματιού και του νέου κομματιού όταν κατανεμηθεί) θα μετακινήσει το κορυφαίο κομμάτι στη διεύθυνση που θέλουμε να αντικαταστήσουμε.
Στη συνέχεια, κάντε άλλη μια malloc για να αποκτήσετε ένα κομμάτι στη διεύθυνση στόχο.
Αναφορές & Άλλα Παραδείγματα
- https://github.com/shellphish/how2heap/tree/master
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/
- https://heap-exploitation.dhavalkapil.com/attacks/house_of_force
- https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c
- https://guyinatuxedo.github.io/41-house_of_force/house_force_exp/index.html
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/#hitcon-training-lab-11
- Ο στόχος αυτού του σεναρίου είναι ένα ret2win όπου πρέπει να τροποποιήσουμε τη διεύθυνση μιας συνάρτησης που θα κληθεί από τη διεύθυνση της συνάρτησης ret2win
- Το δυαδικό έχει μια υπερχείλιση που μπορεί να εκμεταλλευτεί για να τροποποιήσει το μέγεθος του κορυφαίου κομματιού, το οποίο τροποποιείται σε -1 ή p64(0xffffffffffffffff)
- Στη συνέχεια, υπολογίζεται η διεύθυνση στο σημείο όπου υπάρχει ο δείκτης προς αντικατάσταση, και η διαφορά από τη τρέχουσα θέση του κορυφαίου κομματιού εκεί είναι κατανεμημένη με
malloc
- Τέλος, ένα νέο κομμάτι κατανεμήθηκε το οποίο θα περιέχει αυτόν τον επιθυμητό στόχο μέσα στον οποίο αντικαθίσταται από τη συνάρτηση ret2win
- https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp
- Στο
Input your name:
υπάρχει μια αρχική ευπάθεια που επιτρέπει την αποκάλυψη μιας διεύθυνσης από τη heap - Στη συνέχεια, στη λειτουργία
Org:
καιHost:
είναι δυνατόν να συμπληρωθούν τα 64B του δείκτηs
όταν ζητηθεί το org name, το οποίο στη στοίβα ακολουθείται από τη διεύθυνση του v2, η οποία ακολουθείται στη συνέχεια από το υποδεικνυόμενο host name. Καθώς τότε, η strcpy θα αντιγράφει τα περιεχόμενα του s σε ένα κομμάτι μεγέθους 64B, είναι δυνατόν να αντικατασταθεί το μέγεθος του κορυφαίου κομματιού με τα δεδομένα που τοποθετήθηκαν μέσα στο host name. - Τώρα που είναι δυνατή η αυθαίρετη εγγραφή, το GOT του
atoi
αντικαταστάθηκε με τη διεύθυνση του printf. ήταν δυνατό να αποκαλυφθεί η διεύθυνση τουIO_2_1_stderr
με%24$p
. Και με αυτήν την αποκάλυψη libc ήταν δυνατό να αντικατασταθεί ξανά το GOT τουatoi
με τη διεύθυνση τουsystem
και να κληθεί περνώντας ως παράμετρο/bin/sh
- Μια εναλλακτική μέθοδος προτάθηκε σε αυτήν την άλλη αναφορά, είναι να αντικατασταθεί το
free
με τοputs
, και στη συνέχεια να προστεθεί η διεύθυνση τουatoi@got
, στον δείκτη που θα απελευθερωθεί αργότερα ώστε να αποκαλυφθεί και με αυτήν την αποκάλυψη να αντικατασταθεί ξανά τοatoi@got
με τοsystem
και να κληθεί με/bin/sh
. - https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html
- Υπάρχει μια UAF που επιτρέπει την επαναχρησιμοποίηση ενός κομματιού που έχει απελευθερωθεί χωρίς να καθαριστεί ο δείκτης. Επειδή υπάρχουν ορισμένες μέθοδοι ανάγνωσης, είναι δυνατόν να αποκαλυφθεί μια διεύθυνση libc γράφοντας έναν δείκτη στη συνάρτηση free στο GOT εδώ και στη συνέχεια καλώντας τη συνάρτηση ανάγνωσης.
- Στη συνέχεια, χρησιμοποιήθηκε το House of force (εκμεταλλευόμενο την UAF) για να αντικατασταθεί το μέγεθος του αριστερού χώρου με -1, να κατανεμηθεί ένα κομμάτι αρκετά μεγάλο για να φτάσει στο free hook, και στη συνέχεια να κατανεμηθεί ένα άλλο κομμάτι το οποίο θα περιέχει το free hook. Στη συνέχεια, γράψτε στο hook τη διεύθυνση του
system
, γράψτε σε ένα κομμάτι"/bin/sh"
και τελικά απελευθερώστε το κομμάτι με το περιεχόμενο αυτής της συμβολοσειράς.
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.