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

9.2 KiB
Raw Blame History

ハウス・オブ・ローマン

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

HackTricksのサポート
{% endhint %}

基本情報

これは、フェイクなfastbins、unsorted_bin攻撃、および相対的な上書きを介してリークなしでRCEを可能にする非常に興味深いテクニックでした。ただし、これはパッチされています。

コード

ゴール

  • 相対ポインタを悪用してRCEを達成する

必要条件

  • fastbinとunsorted binのポインタを編集する
  • 12ビットのランダム性をブルートフォースする必要がある0.02%の確率で動作)

攻撃手順

パート1: Fastbinチャンクが__malloc_hookを指す

複数のチャンクを作成します:

  • fastbin_victim0x60、オフセット0後でヒープポインタを編集してLibCの値を指すようにするUAFチャンク
  • chunk20x80、オフセット0x70適切なアライメントのため
  • main_arena_use0x80、オフセット0x100
  • relative_offset_heap0x60、オフセット0x190'main_arena_use'チャンク上の相対オフセット

次に、free(main_arena_use)を実行して、このチャンクをunsortedリストに配置し、fdbkポインタの両方でmain_arena + 0x68へのポインタを取得します。

次に、fdbkmain_arena + 0x68へのポインタを含む新しいチャンクfake_libc_chunk(0x60)が割り当てられます。

その後、relative_offset_heapfastbin_victimを解放します。

/*
Current heap layout:
0x0:   fastbin_victim       - size 0x70
0x70:  alignment_filler     - size 0x90
0x100: fake_libc_chunk      - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main        - size 0x20
0x190: relative_offset_heap - size 0x70

bin layout:
fastbin:  fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
  • fastbin_victimrelative_offset_heapを指すfdを持っています。
  • relative_offset_heapfake_libc_chunkからの距離オフセットであり、main_arena + 0x68を指すポインタを含んでいます。
  • fastbin_victim.fdの最後のバイトを変更するだけで、fastbin_victimmain_arena + 0x68を指すようにすることが可能です。

前述のアクションを行うためには、攻撃者はfastbin_victimfdポインタを変更できる必要があります。

その後、main_arena + 0x68はあまり興味深くないので、ポインタが**__malloc_hook**を指すように変更します。

__memalign_hookは通常0x7fで始まり、その前にゼロが続くため、0x70ファストビンの値として偽装することが可能です。アドレスの最後の4ビットはランダムであるため、興味のある場所を指す値として終わる可能性が2^4=16あります。したがって、ここではBF攻撃が実行され、チャンクが次のように終了するようにします0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)

(残りのバイトに関する詳細は、how2heapの説明を参照してください。BFが機能しない場合、プログラムはクラッシュします機能するまで再試行してください

その後、最初の2つのファストビンチャンクを削除するために2つのmallocが実行され、3番目のmallocが実行されて、**__malloc_hook:**内のチャンクを取得します。

malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);

パート2: Unsorted_bin attack

詳細については、以下をチェックしてください:

{% content-ref url="unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}

基本的には、chunk->bk で指定された場所に main_arena + 0x68 を書き込むことができます。そして、攻撃では __malloc_hook を選択します。その後、それを上書きして one_gadget を指す相対的な上書きを使用します。

これには、チャンクを取得してそれを unsorted bin に入れることから始めます:

uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate

puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);

UAFを使用して、unsorted_bin_ptr->bk__malloc_hookのアドレスにポイントするようにします(以前にこれをブルートフォースしました)。

{% hint style="danger" %} この攻撃はunsorted binを破壊しますしたがってsmallとlargeも。そのため、今後はfast binからの割り当てのみを使用できます(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、そしてこれをトリガーするには同じサイズを割り当てる必要があります。さもないとプログラムはクラッシュします。 {% endhint %}

したがって、__malloc_hookmain_arena + 0x68を書き込むトリガーとして、単に**malloc(0x80)**を実行する必要があります。

ステップ3: __malloc_hookをsystemに設定する

ステップ1では、__malloc_hookを含むチャンクを制御することができました(変数malloc_hook_chunk。ステップ2では、ここにmain_arena + 0x68を書き込むことに成功しました。

今、malloc_hook_chunkでの部分的な上書きを悪用して、そこに書き込んだlibcアドレスmain_arena + 0x68)を使用して**one_gadgetアドレスを指す**ことができます。

ここで、12ビットのランダム性をブルートフォースする必要があります(詳細はhow2heapにあります)。

最後に、正しいアドレスが上書きされたら、mallocを呼び出してone_gadgetをトリガーします。

参考文献

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

HackTricksのサポート
{% endhint %}