House of Roman

AWSハッキングをゼロからヒーローまで学ぶ htARTE(HackTricks AWS Red Team Expert)

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

基本情報

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

コード

ゴール

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

必要条件

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

  • 作業するために12ビットのランダム性をブルートフォースする必要があります(0.02%の確率)

攻撃手順

パート1: Fastbin Chunkが__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リストに配置され、fdおよびbkポインタの両方でmain_arena + 0x68へのポインタが取得されます。

次に、fdおよびbkmain_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のfast binの値として偽装することが可能です。アドレスの最後の4ビットはランダムなので、アドレスの値が興味のある場所を指すようにするためには2^4=16の可能性があります。そのため、ここではBF攻撃が実行され、チャンクが次のようになるようにします:0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)

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

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

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

パート2: Unsorted_bin attack

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

pageUnsorted 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_hookunsorted_bin_ptr->bkに設定した後、main_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をトリガーします。

参考文献

htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ htARTE(HackTricks AWS Red Team Expert)

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

Last updated