House of Orange
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
このパッチで脆弱性が修正されたため、これはもはや機能しません(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_list_all
に書き込むための偽の_IO_FILE
構造体を作成し、malloc_printerr
を実行させます。
その後、_IO_FILE
構造体のジャンプテーブルに格納された任意のアドレスを実行し、コード実行を得ることができます。
攻撃は、未ソートビン内のトップチャンクを取得することから始まります。これは、現在のトップチャンクサイズより大きいが、mmp_.mmap_threshold
(デフォルトは128K)より小さいサイズでmalloc
を呼び出すことで達成されます。そうしないと、mmap
割り当てがトリガーされます。トップチャンクサイズが変更されるときは、トップチャンク + サイズがページアラインされていること、そしてトップチャンクのprev_inuseビットが常に設定されていることを確認することが重要です。
未ソートビン内のトップチャンクを取得するには、トップチャンクを作成するためにチャンクを割り当て、トップチャンクサイズを変更(割り当てられたチャンク内のオーバーフローを使用)して、トップチャンク + サイズがページアラインされ、prev_inuseビットが設定されるようにします。その後、新しいトップチャンクサイズより大きいチャンクを割り当てます。free
は未ソートビンにトップチャンクを取得するために決して呼び出されないことに注意してください。
古いトップチャンクは現在未ソートビンにあります。内部のデータを読み取ることができると仮定すると(おそらくオーバーフローを引き起こした脆弱性のため)、そこからlibcアドレスをリークし、_IO_list_allのアドレスを取得することが可能です。
未ソートビン攻撃は、オーバーフローを悪用してtopChunk->bk->fwd = _IO_list_all - 0x10
を書き込むことによって実行されます。新しいチャンクが割り当てられると、古いトップチャンクが分割され、未ソートビンへのポインタが**_IO_list_all
**に書き込まれます。
次のステップは、古いトップチャンクのサイズを小さなビンに収まるように縮小し、サイズを0x61に設定することです。これには二つの目的があります:
小さなビン4への挿入:malloc
が未ソートビンをスキャンし、このチャンクを見つけると、その小さなサイズのために小さなビン4に挿入しようとします。これにより、チャンクの**_IO_list_all
**のFDポインタの位置にチャンクが小さなビン4リストの先頭に配置されます。
mallocチェックのトリガー:このチャンクサイズの操作により、malloc
が内部チェックを実行します。偽のフォワードチャンクのサイズがゼロであるとき、エラーがトリガーされ、malloc_printerr
が呼び出されます。
小さなビンの操作により、チャンクのフォワードポインタを制御できるようになります。_IO_list_allとのオーバーラップを使用して、偽の**_IO_FILE**構造体を作成します。この構造体は、libcの内部チェックを通過するように設定された_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**構造体を通じてコードの実行をトリガーすることで culminates します。これにより、任意のコード実行が可能になり、通常はシェルが生成されるか、他の悪意のあるペイロードが実行されます。
攻撃の要約:
トップチャンクを設定:チャンクを割り当て、トップチャンクサイズを変更します。
トップチャンクを未ソートビンに強制的に入れる:より大きなチャンクを割り当てます。
libcアドレスをリーク:脆弱性を使用して未ソートビンから読み取ります。
未ソートビン攻撃を実行:オーバーフローを使用して**_IO_list_all**に書き込みます。
古いトップチャンクを縮小:小さなビンに収まるようにサイズを調整します。
偽の_IO_FILE構造体を設定:制御フローをハイジャックするために偽のファイル構造体を作成します。
コード実行をトリガー:攻撃を実行し、任意のコードを実行するためにチャンクを割り当てます。
このアプローチは、ヒープ管理メカニズム、libc情報リーク、およびヒープオーバーフローを利用して、free
を直接呼び出すことなくコード実行を達成します。偽の**_IO_FILE**構造体を慎重に作成し、適切な位置に配置することで、攻撃は標準のメモリ割り当て操作中に制御フローをハイジャックできます。これにより、任意のコードの実行が可能になり、シェルや他の悪意のある活動が発生する可能性があります。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)