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

11 KiB
Raw Blame History

House of Orange

htARTEHackTricks AWS Red Team Expertを使用して、ゼロからヒーローまでAWSハッキングを学ぶ

HackTricks をサポートする他の方法:

基本情報

コード

ゴール

  • 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つの目的があります:

  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 構造体を注意深く作成し、適切な位置に配置することで、通常のメモリ割り当て操作中に制御フローを乗っ取ることができます。これにより、任意のコードが実行され、通常はシェルが生成されるか、他の悪意のある活動が実行される可能性があります。

参考

htARTEHackTricks AWS Red Team Expert を使用して、ゼロからヒーローまでAWSハッキングを学びましょう

HackTricks をサポートする他の方法: