House of Roman
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
これは、フェイクファストビン、アンソートビン攻撃、相対的オーバーライトを介してリークなしでRCEを可能にする非常に興味深い技術でした。しかし、これはパッチが当てられました。
相対ポインタを悪用してRCEを実現すること
ファストビンとアンソートビンポインタを編集すること
12ビットのランダム性をブルートフォースする必要があります(成功する確率は0.02%)
いくつかのチャンクを作成します:
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)
を実行すると、このチャンクがアンソートリストに配置され、fd
とbk
ポインタの両方にmain_arena + 0x68
へのポインタが得られます。
今、新しいチャンクfake_libc_chunk(0x60)
が割り当てられます。これは、fd
とbk
にmain_arena + 0x68
へのポインタを含むためです。
その後、relative_offset_heap
とfastbin_victim
が解放されます。
fastbin_victim
は relative_offset_heap
を指す fd
を持っています
relative_offset_heap
は fake_libc_chunk
からの距離のオフセットで、main_arena + 0x68
へのポインタを含んでいます
fastbin_victim.fd
の最後のバイトを変更することで、fastbin_victim
が main_arena + 0x68
を指すようにすることが可能です
前述のアクションを行うためには、攻撃者は fastbin_victim
の fd ポインタを変更できる必要があります。
次に、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つの malloc が実行され、最初の2つのファストビンチャンクが削除され、3つ目が割り当てられて __malloc_hook:
にチャンクを取得します。
詳細については、以下を確認できます:
Unsorted Bin Attack基本的には、chunk->bk
で指定された任意の場所にmain_arena + 0x68
を書き込むことを可能にします。そして、攻撃のために__malloc_hook
を選択します。その後、上書きした後に相対的な上書きを使用してone_gadget
を指すようにします。
これを行うために、チャンクを取得し、unsorted binに入れ始めます:
このチャンクでUAFを使用して、unsorted_bin_ptr->bk
を__malloc_hook
のアドレスにポイントさせます(これは以前にブルートフォースしました)。
この攻撃は未整理ビンを破損させることに注意してください(したがって小と大も)。したがって、今はファストビンからの割り当てのみを使用できます(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、これをトリガーするには、同じサイズを割り当てる必要があります。さもなければプログラムはクラッシュします。
したがって、__malloc_hook
にmain_arena + 0x68
の書き込みをトリガーするために、unsorted_bin_ptr->bk
に__malloc_hook
を設定した後に行う必要があるのは、**malloc(0x80)
**です。
ステップ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)