hacktricks/binary-exploitation/heap/house-of-force.md

11 KiB
Raw Blame History

House of Force

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Red Team του HackTricks AWS)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Βασικές Πληροφορίες

Κώδικας

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

Στόχος

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

Απαιτήσεις

  • Ένας υπερχείλιση που επιτρέπει την αντικατάσταση του μεγέθους του κεφαλαίου του κορυφαίου κομματιοϋ (π.χ. -1).
  • Να είναι δυνατόν να ελέγχεται το μέγεθος της δέσμευσης της στοίβας

Επίθεση

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

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

// 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: υπάρχει μια αρχική ευπάθεια που επιτρέπει τη διαρροή μιας διεύθυνσης από τη στοίβα
  • Στη συνέχεια, στις λειτουργίες 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.
  • https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html
  • Υπάρχει ένα UAF που επιτρέπει την επαναχρησιμοποίηση ενός κομματιού που απελευθερώθηκε χωρίς να καθαριστεί ο δείκτης. Επειδή υπάρχουν μερικές μέθοδοι ανάγνωσης, είναι δυνατό να διαρρεύσει μια διεύθυνση libc γράφοντας ένα δείκτη στη συνάρτηση free στο GOT εδώ και στη συνέχεια καλώντας τη συνάρτηση read.
  • Στη συνέχεια, χρησιμοποιήθηκε το House of force (καταχρηστεύοντας το UAF) για να αντικατασταθεί το μέγεθος του αριστερού χώρου με -1, να δεσμευτεί ένα κομμάτι αρκετά μεγάλο για να φτάσει στο free hook, και στη συνέχεια να δεσμευτεί ένα άλλο κομμάτι που θα περιέχει το free hook. Στη συνέχεια, γράψτε στο hook τη διεύθυνση του system, γράψτε σε ένα κομμάτι "/bin/sh" και τέλος ελευθερώστε το κομμάτι με αυτό το περιεχόμενο συμβολοσειράς.