# Unsorted Bin Attack
htARTE(HackTricks AWS Red Team Expert)を使用して、ゼロからヒーローまでAWSハッキングを学ぶ HackTricksをサポートする他の方法: - **HackTricksで企業を宣伝**したい場合や**HackTricksをPDFでダウンロード**したい場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください! - [**公式PEASS&HackTricksスウェグ**](https://peass.creator-spring.com)を入手する - [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける - **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter**で**@hacktricks\_live**をフォローする - [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出して、あなたのハッキングテクニックを共有してください。
## 基本情報 アンソートされたビンについての詳細は、このページを参照してください: {% content-ref url="bins-and-memory-allocations.md" %} [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](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 == av(arena)`。つまり、書き込みたいアドレスは、その`fd`位置に偽のチャンクのアドレスを持ち、偽のチャンクの`fd`がアリーナを指している必要があります。 {% endhint %} {% hint style="danger" %} この攻撃はアンソートビンを破壊します(したがって、小さなビンと大きなビンも)。そのため、**現在は高速ビンからの割り当てのみを使用できます**(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、これをトリガーするには**同じサイズを割り当てる必要があります。** **`global_max_fast`**を作成することができると、この場合に役立つかもしれません。高速ビンが攻撃が完了するまでの他のすべての割り当てを処理できることを信頼しています。 {% endhint %} [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html)のコードは非常によく説明していますが、mallocを変更して、tcacheに終わらないようにメモリを割り当てると、先に述べたエラーが発生し、このテクニックが防がれることがわかります:**`malloc(): unsorted double linked list corrupted`** ## アンソートビン情報リーク攻撃 これは実際には非常に基本的な概念です。アンソートビン内のチャンクには、ビンを作成するためのダブルポインタがあります。アンソートビン内の最初のチャンクには、**FD**と**BK**リンクが実際に**メインアリーナ(libc)の一部を指す**ようになります。\ したがって、アンソートビン内にチャンクを配置し、それを読み取る(解放後に使用)か、**少なくとも1つのポインタを上書きせずに再度割り当て**してから**読み取る**ことができると、**libc情報リーク**を得ることができます。 ## 参照および他の例 - [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](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**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html) - マージ関数は脆弱であり、渡された両方のインデックスが同じ場合、それに対してreallocし、それを解放してからその解放された領域へのポインタを返すことができます。 - したがって、**2つのチャンクが作成**されます:自分自身とマージされるchunk0、トップチャンクと統合されるのを防ぐためのchunk1。次に、マージ関数が2回chunk0を呼び出すと、使用後に解放されることになります。 - 次に、`view`関数が使用後に解放されたチャンクのインデックス2(libcアドレスがリークするインデックス)で呼び出され、**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`のチャンクが作成され、高速ビンから以前の無効なチャンクを取得するために、サイズが`0x1f8`の別のチャンクが作成され、**`__free_hook`**内の高速ビンチャンクを取得し、**`system`**関数のアドレスで上書きされます。 * 最後に、文字列`/bin/sh\x00`を含むチャンクが削除関数を呼び出して解放され、**`__free_hook`**関数がトリガーされ、`/bin/sh\x00`をパラメータとして持つsystemを指すようになります。