Unsorted Bin Attack
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
アンソートビンとは何かについての詳細は、このページを確認してください:
Bins & Memory Allocationsアンソートリストは、チャンクのbk
アドレスにunsorted_chunks (av)
のアドレスを書き込むことができます。したがって、攻撃者がアンソートビン内のチャンクのbk
ポインタのアドレスを変更できる場合、彼はそのアドレスを任意のアドレスに書き込むことができ、これはGlibcアドレスを漏洩させたり、いくつかの防御を回避するのに役立ちます。
基本的に、この攻撃は任意のアドレスに大きな数を設定することを可能にします。この大きな数はアドレスであり、ヒープアドレスまたはGlibcアドレスである可能性があります。典型的なターゲットは**global_max_fast
**であり、これによりより大きなサイズのファストビンを作成できるようになります(アンソートビン攻撃からファストビン攻撃に移行することができます)。
https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principleで提供されている例を見て、チャンクサイズとして0x400と0x500の代わりに0x4000と0x5000を使用すると(Tcacheを避けるため)、現在エラー**malloc(): unsorted double linked list corrupted
**がトリガーされることがわかります。
したがって、このアンソートビン攻撃は、現在(他のチェックの中で)ダブルリンクリストを修正できる必要があり、victim->bk->fd == victim
またはvictim->fd == av (arena)
を回避する必要があります。これは、書き込みたいアドレスがそのfd
位置にフェイクチャンクのアドレスを持ち、フェイクチャンクのfd
がアリーナを指している必要があることを意味します。
この攻撃はアンソートビンを破損させることに注意してください(したがって小さなビンと大きなビンも)。したがって、現在はファストビンからの割り当てのみを使用できます(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、これをトリガーするには、同じサイズを割り当てる必要があります。さもなければプログラムはクラッシュします。
global_max_fast
を上書きすることは、この場合に役立つかもしれません。ファストビンが他のすべての割り当てを処理できると信頼して、エクスプロイトが完了するまで。
guyinatuxedoのコードは非常によく説明していますが、mallocを変更してTcacheに終わらないように十分な大きさのメモリを割り当てると、前述のエラーが表示され、この技術を防ぐことができます:malloc(): unsorted double linked list corrupted
これは実際には非常に基本的な概念です。アンソートビン内のチャンクはポインタを持つことになります。アンソートビンの最初のチャンクは、実際には**fd
とbk
リンクがメインアリーナ(Glibc)の一部を指しています**。
したがって、チャンクをアンソートビンに入れて読み取る(use after free)か、ポインタの少なくとも1つを上書きせずに再度割り当ててからそれを読み取ることができれば、Glibc情報漏洩を得ることができます。
この書き込みで使用された攻撃は、4つのチャンク構造(A、B、C、D - Dはトップチャンクとの統合を防ぐためだけに存在)を悪用するもので、Bでのヌルバイトオーバーフローを使用してCがBが未使用であることを示すようにしました。また、Bではprev_size
データが変更され、サイズがBのサイズではなくA+Bになりました。
その後、Cが解放され、A+Bと統合されました(ただしBはまだ使用中でした)。サイズAの新しいチャンクが割り当てられ、その後、漏洩したlibcアドレスがBに書き込まれました。
目標は、4869より大きな値でグローバル変数を上書きすることです。これにより、フラグを取得でき、PIEは有効になっていません。
任意のサイズのチャンクを生成することができ、希望するサイズのヒープオーバーフローがあります。
攻撃は3つのチャンクを作成することから始まります:チャンク0はオーバーフローを悪用し、チャンク1はオーバーフローされ、チャンク2はトップチャンクが前のものと統合しないようにします。
次に、チャンク1が解放され、チャンク0がチャンク1のbk
ポインタを指すようにオーバーフローします:bk = magic - 0x10
次に、チャンク1と同じサイズのチャンク3が割り当てられ、これによりアンソートビン攻撃がトリガーされ、グローバル変数の値が変更され、フラグを取得できるようになります。
マージ関数は脆弱であり、渡された両方のインデックスが同じであれば、それを再割り当てし、その後解放しますが、解放された領域へのポインタを返します。
したがって、2つのチャンクが作成されます:チャンク0は自分自身とマージされ、チャンク1はトップチャンクとの統合を防ぎます。次に、チャンク0でマージ関数が2回呼び出され、これによりuse after freeが発生します。
次に、**view
**関数がインデックス2(use after freeチャンクのインデックス)で呼び出され、libcアドレスが漏洩します。
バイナリには**global_max_fast
**より大きなサイズのみをmallocする保護があるため、ファストビンは使用されず、アンソートビン攻撃が使用されてグローバル変数global_max_fast
を上書きします。
次に、インデックス2(use after freeポインタ)で編集関数を呼び出し、bk
ポインタをp64(global_max_fast-0x10)
を指すように上書きします。次に、新しいチャンクを作成すると、以前に妥協された解放アドレス(0x20)が使用され、アンソートビン攻撃がトリガーされ、global_max_fast
が非常に大きな値で上書きされ、ファストビンでチャンクを作成できるようになります。
ここでファストビン攻撃が実行されます:
まず、**__free_hook
**の場所でサイズ200のファストチャンクを操作できることがわかります:
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
この場所でサイズ0x200のファストチャンクを取得できれば、実行される関数ポインタを上書きすることが可能になります。
そのために、サイズ0xfc
の新しいチャンクを作成し、そのポインタでマージ関数を2回呼び出すことで、ファストビン内のサイズ0xfc*2 = 0x1f8
の解放されたチャンクへのポインタを取得します。
次に、このチャンクの編集関数を呼び出して、このファストビンの**fd
アドレスを前の__free_hook
**関数を指すように変更します。
次に、サイズ0x1f8
のチャンクを作成して、ファストビンから以前の無駄なチャンクを取得し、さらにサイズ0x1f8
のチャンクを作成して**__free_hook
内のファストビンチャンクを取得し、これをsystem
**関数のアドレスで上書きします。
最後に、文字列/bin/sh\x00
を含むチャンクを解放し、削除関数を呼び出して**__free_hook
**関数をトリガーし、/bin/sh\x00
をパラメータとしてsystemを指します。
アンソートビン内のチャンクを統合するために1Bオーバーフローを悪用し、libc情報漏洩を取得し、その後mallocフックを1つのガジェットアドレスで上書きするためのファストビン攻撃の別の例。
サイズ0x100
より大きなチャンクのみを割り当てることができます。
アンソートビン攻撃を使用してglobal_max_fast
を上書きします(ASLRのために1/16回機能します。12ビットを変更する必要がありますが、16ビットを変更する必要があります)。
グローバルチャンク配列を変更するためのファストビン攻撃。これにより、任意の読み取り/書き込みプリミティブが得られ、GOTを変更していくつかの関数をsystem
を指すように設定できます。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)