hacktricks/binary-exploitation/heap/house-of-orange.md

99 lines
11 KiB
Markdown
Raw Permalink Normal View History

# House of Orange
<details>
<summary><strong>htARTEHackTricks AWS Red Team Expert</strong>を使用して、<strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong></summary>
HackTricks をサポートする他の方法:
* **HackTricks で企業を宣伝**したい場合や **HackTricks をPDFでダウンロード**したい場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
* [**公式PEASSHackTricksスウォッグ**](https://peass.creator-spring.com)を入手する
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)をフォローする
* **ハッキングトリックを共有**するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出する
</details>
## 基本情報
### コード
* 例は[https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c)にあります
* この[パッチ](https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=stdlib/abort.c;h=117a507ff88d862445551f2c07abb6e45a716b75;hp=19882f3e3dc1ab830431506329c94dcf1d7cc252;hb=91e7cf982d0104f0e71770f5ae8e3faf352dea9f;hpb=0c25125780083cbba22ed627756548efe282d1a0)でこの悪用技術が修正されました2.26より前で動作)
* より多くのコメントがついた同じ例は[https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)にあります
### ゴール
* `malloc_printerr` 関数を悪用する
### 必要条件
* トップチャンクのサイズを上書きする
* Libc およびヒープのリーク
### 背景
[**この例**](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)のコメントから必要な背景情報**:**
古いバージョンのlibcでは、`malloc_printerr` 関数が呼び出されると、`_IO_list_all` に格納されている `_IO_FILE` 構造体のリストを**反復処理**し、実際にその構造体内の命令ポインタを**実行**していました。\
この攻撃では、**偽の `_IO_FILE` 構造体**を作成し、それを **`_IO_list_all`** に書き込んで `malloc_printerr` を実行させます。\
その後、**`_IO_FILE`** 構造体のジャンプテーブルに格納されているアドレスを実行し、コード実行を行います
### 攻撃
攻撃は、**アンソートされたビン**内の**トップチャンク**を取得することから始まります。これは、`malloc` を呼び出して、現在のトップチャンクのサイズよりも大きく、**`mmp_.mmap_threshold`**デフォルトは128Kより小さいサイズで呼び出すことで達成されます。トップチャンクのサイズが変更されるときは、**トップチャンク + サイズ**がページアラインされており、トップチャンクの **prev\_inuse** ビットが常に設定されていることが重要です。
アンソートされたビン内にトップチャンクを取得するには、チャンクを割り当ててトップチャンクを作成し、トップチャンクのサイズを変更します(割り当てられたチャンク内でオーバーフローが発生します)。その結果、**トップチャンク + サイズ** がページアラインされ、**prev\_inuse** ビットが設定されます。その後、新しいトップチャンクサイズよりも大きなチャンクを割り当てます。トップチャンクをアンソートされたビンに入れるために `free` は呼び出されません。
古いトップチャンクは今やアンソートされたビンにあります。それを読み取ることができる場合オーバーフローを引き起こす脆弱性による可能性があります、そこからlibcアドレスをリークし、**\_IO\_list\_all** のアドレスを取得できます。
アンソートされたビン攻撃は、オーバーフローを悪用して `topChunk->bk->fwd = _IO_list_all - 0x10` と書き込むことで行われます。新しいチャンクが割り当てられると、古いトップチャンクが分割され、アンソートされたビンへのポインタが **`_IO_list_all`** に書き込まれます。
次のステップは、古いトップチャンクのサイズを小さなビンに収まるように縮小することです。具体的には、そのサイズを **0x61** に設定します。これには2つの目的があります:
1. **Small Bin 4 への挿入**: `malloc` がアンソートされたビンをスキャンし、このチャンクを見つけると、その小さなサイズのために Small Bin 4 に挿入しようとします。これにより、チャンクは Small Bin 4 リストの先頭に配置され、これは **`_IO_list_all`** のチャンクのFDポインタの場所です。アンソートされたビン攻撃を通じて **`_IO_list_all`** に近いアドレスを **`_IO_list_all`** に書き込んだためです。
2. **Malloc チェックのトリガー**: このチャンクサイズの操作により、`malloc` が内部チェックを実行します。偽のフォワードチャンクのサイズがゼロであるため、チェックがトリガーされ、`malloc_printerr` が呼び出されます。
Small Bin の操作により、チャンクのフォワードポインタを制御できます。 **\_IO\_list\_all** との重複を使用して、偽の **\_IO\_FILE** 構造体を作成します。この構造体は、内部チェックをパスする値に設定された **\_IO_write_base** および **\_IO_write_ptr** のような重要なフィールドを含むように注意深く作成されています。さらに、偽の構造体内にジャンプテーブルが作成され、命令ポインタが任意のコード(たとえば `system` 関数)が実行されるアドレスに設定されます。
技術の残りの部分を要約すると:
* **古いトップチャンクを縮小**: 古いトップチャンクのサイズを **0x61** に調整して、小さなビンに収めます。
* **偽の `_IO_FILE` 構造体を設定**: 古いトップチャンクと重なるように偽の **\_IO\_FILE** 構造体を設定し、適切にフィールドを設定して制御フローを乗っ取ります。
次のステップは、現在アンソートされたビン内にある古いトップチャンクと重なる偽の **\_IO\_FILE** 構造体を作成することです。この構造体の最初のバイトは、実行されるコマンド(たとえば "/bin/sh")へのポインタを慎重に作成されています。
偽の **\_IO\_FILE** 構造体内の重要なフィールド、例えば `_IO_write_base` および `_IO_write_ptr` は、libc内部のチェックをパスする値に設定されています。さらに、偽の構造体内にジャンプテーブルが作成され、命令ポインタが任意のコードが実行されるアドレスに設定されます。通常、これは `system` 関数のアドレスまたはシェルコマンドを実行できる他の関数のアドレスになります。
攻撃は、`malloc` の呼び出しが偽の **\_IO\_FILE** 構造体を介してコードの実行をトリガーするときに頂点に達します。これにより、任意のコードが実行され、通常はシェルが生成されるか、他の悪意のあるペイロードが実行されます。
**攻撃の要約:**
1. **トップチャンクを設定**: チャンクを割り当ててトップチャンクのサイズを変更します。
2. **トップチャンクをアンソートされたビンに強制**: より大きなチャンクを割り当てます。
3. **Libc アドレスをリーク**: アンソートされたビンから読み取るために脆弱性を使用します。
4. **アンソートされたビン攻撃を実行**: オーバーフローを使用して **\_IO\_list\_all** に書き込みます。
5. **古いトップチャンクを縮小**: 小さなビンに収まるようにサイズを調整します。
6. **偽の \_IO\_FILE 構造体を設定**: 制御フローを乗っ取るために偽のファイル構造体を作成します。
7. **コードの実行をトリガー**: 攻撃を実行して任意のコードを実行します。
この手法は、`free` を直接呼び出すことなく、ヒープ管理メカニズム、libc情報のリーク、およびヒープオーバーフローを悪用してコードの実行を達成します。偽の **\_IO\_FILE** 構造体を注意深く作成し、適切な位置に配置することで、通常のメモリ割り当て操作中に制御フローを乗っ取ることができます。これにより、任意のコードが実行され、通常はシェルが生成されるか、他の悪意のある活動が実行される可能性があります。
## 参考
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/)
* [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
<details>
<summary><strong>htARTEHackTricks AWS Red Team Expert</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>を使用して、ゼロからヒーローまでAWSハッキングを学びましょう</strong></a><strong></strong></summary>
HackTricks をサポートする他の方法:
* **HackTricks で企業を宣伝したい**、または **HackTricks を PDF でダウンロードしたい** 場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
* [**公式 PEASS & HackTricks スワッグ**](https://peass.creator-spring.com) を入手する
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つける
* **💬 [**Discord グループ**](https://discord.gg/hRep4RUj7f) に参加するか、[**telegram グループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live) をフォローする**
* **ハッキングトリックを共有するために、** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の GitHub リポジトリに PR を提出する
</details>