House of Roman

AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)

HackTricksのサポート

基本情報

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

コード

ゴール

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

必要条件

  • fastbinとunsorted binのポインタを編集する

  • 12ビットのランダム性をブルートフォースする必要がある(0.02%の確率で動作)

攻撃手順

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

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

  • fastbin_victim(0x60、オフセット0):後でヒープポインタを編集してLibCの値を指すようにするUAFチャンク

  • chunk2(0x80、オフセット0x70):適切なアライメントのため

  • main_arena_use(0x80、オフセット0x100)

  • relative_offset_heap(0x60、オフセット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

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

Unsorted Bin Attack

基本的には、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のアドレスにポイントするようにします(以前にこれをブルートフォースしました)。

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

したがって、__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をトリガーします。

参考文献

AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習と練習:HackTricks Training GCP Red Team Expert (GRTE)

HackTricksのサポート

Last updated