11 KiB
House of Orange
htARTE(HackTricks AWS Red Team Expert)を使用して、ゼロからヒーローまでAWSハッキングを学ぶ!
HackTricks をサポートする他の方法:
- HackTricks で企業を宣伝したい場合や HackTricks をPDFでダウンロードしたい場合は、SUBSCRIPTION PLANS をチェックしてください!
- 公式PEASS&HackTricksスウォッグを入手する
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つける
- **💬 Discordグループ**に参加するか、telegramグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローする
- ハッキングトリックを共有するには、HackTricksとHackTricks CloudのGitHubリポジトリにPRを提出する
基本情報
コード
- 例はhttps://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_orange.cにあります
- このパッチでこの悪用技術が修正されました(2.26より前で動作)
- より多くのコメントがついた同じ例はhttps://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.htmlにあります
ゴール
malloc_printerr
関数を悪用する
必要条件
- トップチャンクのサイズを上書きする
- Libc およびヒープのリーク
背景
この例のコメントから必要な背景情報**:**
古いバージョンの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つの目的があります:
- Small Bin 4 への挿入:
malloc
がアンソートされたビンをスキャンし、このチャンクを見つけると、その小さなサイズのために Small Bin 4 に挿入しようとします。これにより、チャンクは Small Bin 4 リストの先頭に配置され、これは_IO_list_all
のチャンクのFDポインタの場所です。アンソートされたビン攻撃を通じて_IO_list_all
に近いアドレスを_IO_list_all
に書き込んだためです。 - 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 構造体を介してコードの実行をトリガーするときに頂点に達します。これにより、任意のコードが実行され、通常はシェルが生成されるか、他の悪意のあるペイロードが実行されます。
攻撃の要約:
- トップチャンクを設定: チャンクを割り当ててトップチャンクのサイズを変更します。
- トップチャンクをアンソートされたビンに強制: より大きなチャンクを割り当てます。
- Libc アドレスをリーク: アンソートされたビンから読み取るために脆弱性を使用します。
- アンソートされたビン攻撃を実行: オーバーフローを使用して _IO_list_all に書き込みます。
- 古いトップチャンクを縮小: 小さなビンに収まるようにサイズを調整します。
- 偽の _IO_FILE 構造体を設定: 制御フローを乗っ取るために偽のファイル構造体を作成します。
- コードの実行をトリガー: 攻撃を実行して任意のコードを実行します。
この手法は、free
を直接呼び出すことなく、ヒープ管理メカニズム、libc情報のリーク、およびヒープオーバーフローを悪用してコードの実行を達成します。偽の _IO_FILE 構造体を注意深く作成し、適切な位置に配置することで、通常のメモリ割り当て操作中に制御フローを乗っ取ることができます。これにより、任意のコードが実行され、通常はシェルが生成されるか、他の悪意のある活動が実行される可能性があります。
参考
- 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
htARTE(HackTricks AWS Red Team Expert) を使用して、ゼロからヒーローまでAWSハッキングを学びましょう!
HackTricks をサポートする他の方法:
- HackTricks で企業を宣伝したい、または HackTricks を PDF でダウンロードしたい 場合は SUBSCRIPTION PLANS をチェックしてください!
- 公式 PEASS & HackTricks スワッグ を入手する
- The PEASS Family を発見し、独占的な NFTs のコレクションを見つける
- 💬 Discord グループ に参加するか、telegram グループ に参加するか、Twitter 🐦 @hacktricks_live をフォローする
- ハッキングトリックを共有するために、 HackTricks と HackTricks Cloud の GitHub リポジトリに PR を提出する