hacktricks/binary-exploitation/heap/unsorted-bin-attack.md

12 KiB
Raw Blame History

Unsorted Bin Attack

htARTEHackTricks AWS Red Team Expertを使用して、**ゼロからヒーローまでAWSハッキングを学ぶ**

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

基本情報

アンソートされたビンについての詳細は、このページを参照してください:

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

アンソートリストは、チャンクのbkアドレスにunsorted_chunks (av)へのアドレスを書き込むことができます。したがって、攻撃者がアンソートビン内のチャンクのbkポインタのアドレスを変更できる場合、任意のアドレスにそのアドレスを書き込むことができ、これはlibcアドレスをリークさせたり、いくつかの防御をバイパスするのに役立つ可能性があります。

したがって、基本的にこの攻撃は、任意のアドレスを大きな数値ヒープアドレスまたはlibcアドレスである可能性があるアドレスで上書きできるようにするものです。これにより、リークすることができるスタックアドレスや、グローバル変数**global_max_fast**のような制限をバイパスして、より大きなサイズの高速ビンを作成できるようにすることができます(アンソートビン攻撃から高速ビン攻撃に移行する)。

{% hint style="success" %} https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principleで提供された例を見て、0x400と0x500の代わりに0x4000と0x5000を使用するとtcachesを避けるため現在エラー**malloc(): unsorted double linked list corrupted**がトリガーされることがわかります。

したがって、このアンソートビン攻撃は(他のチェックと共に)ダブルリンクリストを修正できる必要があるため、これがバイパスされるようにする必要があります。victim->bck->fd == victimまたはvictim->fd == avarena。つまり、書き込みたいアドレスのアドレスは、そのfd位置に偽のチャンクのアドレスを持っている必要があり、偽のチャンクのfdがアリーナを指している必要があります。 {% endhint %}

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

この場合、**global_max_fast**を作成することができると、この問題を解決するのに役立つかもしれません。高速ビンが攻撃が完了するまでの他のすべての割り当てを処理できるように信頼しています。 {% endhint %}

guyinatuxedoのコードは非常にわかりやすく説明していますが、mallocを変更して、tcachesに終わらないようにメモリを割り当てると、先に述べたエラーが発生し、このテクニックが防がれることがわかりますmalloc(): unsorted double linked list corrupted

アンソートビン情報リーク攻撃

これは実際には非常に基本的な概念です。アンソートビン内のチャンクには、ビンを作成するためのポインタのダブルポインタがあります。アンソートビン内の最初のチャンクには、FDBKリンクが実際にはメインアリーナlibcの一部を指しています
したがって、アンソートビン内にチャンクを配置し、それを読み取る(使用後に解放)か、少なくとも1つのポインタを上書きせずに再度割り当てしてから読み取ることができると、libc情報リークを得ることができます。

このwriteupで使用された攻撃は、4つのチャンク構造A、B、C、D - Dはトップチャンクとの統合を防ぐためだけを悪用し、Bのヌルバイトオーバーフローを使用してCにBが未使用であることを示すようにしました。また、Bではprev_sizeデータが変更され、サイズがBのサイズではなくA+Bになりました。
その後、Cが解放され、A+Bと統合されましたただし、Bはまだ使用中でした。サイズAの新しいチャンクが割り当てられ、その後、リークしたlibcアドレスがBに書き込まれ、そこからリークされました。

参照およびその他の例

  • https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap
  • グローバル変数を4869より大きい値で上書きしてフラグを取得し、PIEが有効になっていない場合に可能にすることが目標です。
  • 任意のサイズのチャンクを生成することができ、望ましいサイズのヒープオーバーフローがあります。
  • 攻撃は、3つのチャンクを作成して開始しますオーバーフローを悪用するためのchunk0、オーバーフローされるchunk1、前のチャンクを統合しないようにするためのchunk2。
  • 次に、chunk1が解放され、chunk0がchunk1のbkポインタにオーバーフローされ、bk = magic - 0x10となります。
  • 次に、chunk3がchunk1と同じサイズで割り当てられ、アンソートビン攻撃がトリガーされ、グローバル変数の値が変更され、フラグを取得できるようになります。
  • https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html
  • マージ関数は脆弱です。渡された両方のインデックスが同じ場合、それに対してreallocし、それを解放してから、その解放された領域へのポインタを返すことができます。
  • したがって、2つのチャンクが作成されます:chunk0は自分自身とマージされ、トップチャンクと統合されるのを防ぐためのchunk1。その後、マージ関数がchunk0で2回呼び出され、これにより使用後のフリーが発生します。
  • 次に、**view**関数が使用後のフリーチャンクのインデックスで呼び出され、libcアドレスが漏洩します。
  • バイナリは**global_max_fast**よりも大きいサイズのmallocのみを許可する保護を持っているため、fastbinは使用されず、アンソートビン攻撃が使用されて、グローバル変数global_max_fastを上書きします。
  • 次に、使用後のフリーポインタであるインデックス2で編集関数を呼び出し、bkポインタをp64(global_max_fast-0x10)を指すように上書きします。その後、以前に侵害されたフリーアドレス0x20を使用して新しいチャンクを作成すると、アンソートビン攻撃がトリガーされ、global_max_fastが非常に大きな値で上書きされ、今後は高速ビンでチャンクを作成できるようになります。
  • 今度は高速ビン攻撃が実行されます:
  • まず、__free_hookの場所でサイズ200の高速チャンクを操作できることがわかります
  • gef➤  p &__free_hook
    

$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のチャンクが作成され、高速ビンから以前の無効なチャンクを取得し、**__free_hookに高速ビンチャンクを取得し、system**関数のアドレスで上書きします。
  • 最後に、文字列/bin/sh\x00を含むチャンクが削除関数を呼び出して解放され、**__free_hook**関数がトリガーされ、/bin/sh\x00をパラメータとして持つsystemが指すようになります。
  • CTF https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html
  • アンソートビンでチャンクを統合し、libc情報リークを取得し、その後mallocフックをワンガジェットアドレスで上書きするための高速ビン攻撃を実行する1Bオーバーフローを悪用する別の例
Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!

Other ways to support HackTricks: