mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['binary-exploitation/heap/fast-bin-attack.md', 'binary-explo
This commit is contained in:
parent
1390e03b08
commit
fc33d67cba
3 changed files with 101 additions and 77 deletions
|
@ -6,11 +6,11 @@
|
|||
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricks で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい** 場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* **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**](https://twitter.com/hacktricks\_live)** をフォローする。**
|
||||
* **ハッキングトリックを共有するために** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のGitHubリポジトリにPRを提出する。
|
||||
* [**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**](https://twitter.com/hacktricks\_live)**をフォロー**する
|
||||
* **ハッキングテクニックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **と** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出**してください。
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -22,7 +22,7 @@ HackTricks をサポートする他の方法:
|
|||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
ファストビンはシングルリンクなので、他のビンよりも保護が少なく、解放されたファストビンチャンク内のアドレスを変更するだけで、**後で任意のメモリアドレスにチャンクを割り当てる**ことができます。
|
||||
ファストビンはシングルリンクなので、他のビンよりも保護が少なく、**解放されたファストビンチャンク内のアドレスを変更するだけで**、**後で任意のメモリアドレスにチャンクを割り当てる**ことができます。
|
||||
|
||||
要約すると:
|
||||
|
||||
|
@ -44,7 +44,7 @@ ptr3 = malloc(0x20); // This will get a chunk in the <address> which could be ab
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
非常にわかりやすく説明されたコードの完全な例は、[https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html](https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html) から見つけることができます。
|
||||
詳しいコードの完全な例は、[https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html](https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html) から見つけることができます。
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
@ -140,15 +140,19 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
|
|||
## 例
|
||||
|
||||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html)**:**
|
||||
* チャンクを割り当て、解放し、その内容を読み取り、オーバーフロー脆弱性を利用してそれらを埋めることが可能です。
|
||||
* **情報リークのためのチャンクの統合**: このテクニックは、オーバーフローを悪用して偽の prev\_size を作成し、1つ前のチャンクをより大きなチャンクの中に配置することで、別のチャンクを含むより大きなチャンクを割り当てる際に、そのデータを印刷し、libc のアドレス (main\_arena+88) を漏洩させることが可能です。
|
||||
* **malloc フックの上書き**: これにより、前述の重複状況を悪用することで、同じメモリを指す2つのチャンクを持つことが可能でした。したがって、それらを両方解放し (保護を回避するために間に別のチャンクを解放)、同じチャンクを fast bin に2回持つことが可能でした。その後、再度それを割り当て、次のチャンクのアドレスを malloc\_hook よりも少し前を指すように上書きし (これにより malloc が空きサイズとして考える整数を指す - 別のバイパス)、再度それを割り当て、そして malloc フックにアドレスを受け取る別のチャンクを割り当てることが可能でした。最後に **one gadget** がそこに書き込まれました。
|
||||
* チャンクを割り当て、解放し、その内容を読み取り、溢れた脆弱性を利用してそれらを埋めることが可能です。
|
||||
* **情報リークのためのチャンクの統合**: このテクニックは、オーバーフローを悪用して偽の prev\_size を作成し、1つ前のチャンクをより大きなチャンクの中に配置することで、別のチャンクを含むより大きなチャンクを割り当てると、そのデータを印刷し、libc のアドレス (main\_arena+88) をリークさせることが可能です。
|
||||
* **malloc フックの上書き**: これにより、前述の重複状況を悪用することで、同じメモリを指す2つのチャンクを持つことが可能でした。したがって、それらを両方解放し (保護を回避するために間に別のチャンクを解放)、同じチャンクを fast bin に2回持つことが可能でした。その後、再度それを割り当て、次のチャンクのアドレスを malloc\_hook の直前を指すように上書きし (これにより malloc が空きサイズとして考える整数を指す - 別のバイパス)、再度それを割り当て、そして malloc フックにアドレスを受け取る別のチャンクを割り当てることが可能でした。最後に **one gadget** がそこに書き込まれました。
|
||||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html)**:**
|
||||
* ヒープオーバーフローとユーザーによる解放後のダブルフリーがあります。チャンクが解放されると、そのポインタを再利用して再度解放することが可能です。
|
||||
* ヒープオーバーフローとユーザーによる解放、そしてダブルフリーがあります。チャンクが解放されると、ポインタを再利用して再度解放することが可能です。
|
||||
* **Libc 情報リーク**: いくつかのチャンクを解放すると、メインアリーナの一部の場所を指すポインタが得られます。解放されたポインタを再利用できるため、このアドレスを読み取ることができます。
|
||||
* **Fast bin 攻撃**: 割り当てられたすべてのポインタは配列内に格納されているため、いくつかの fast bin チャンクを解放し、最後のチャンクでアドレスを上書きしてこのポインタ配列の直前を指すようにします。その後、同じサイズのいくつかのチャンクを割り当てると、最初に正規のチャンクが得られ、その後にポインタ配列を含む偽のチャンクが得られます。これにより、この割り当てポインタを `free` の got アドレスを指すように上書きし、その後チャンク 1 `"/bin/sh"` を書き込んでから `free(chunk1)` を実行すると `system("/bin/sh")` が実行されます。
|
||||
* 未整列の bin 攻撃を介して悪用された Fast Bin 攻撃を見つけることができます。
|
||||
* 注記 
|
||||
* **Fast bin 攻撃**: 割り当てられたポインタはすべて配列内に格納されているため、いくつかの fast bin チャンクを解放し、最後のチャンクでアドレスを上書きしてこのポインタ配列の直前を指すようにします。その後、同じサイズのいくつかのチャンクを割り当てると、最初に正規のチャンクが得られ、その後にポインタ配列を含む偽のチャンクが得られます。これにより、この割り当てポインタを `free` の got アドレスを指すように上書きし、その後チャンク 1 `"/bin/sh"` を書き込んで `free(chunk1)` を実行すると `system("/bin/sh")` が実行されます。
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
||||
* 1バイトのオーバーフローを悪用して未整列のビン内のチャンクを統合し、libc 情報リークを取得し、その後 fast bin 攻撃を実行して malloc フックを one gadget アドレスで上書きする例です。
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html)
|
||||
* 未整列のビンを悪用した情報リークと UAF を利用して libc アドレスと PIE アドレスをリークし、この CTF のエクスプロイトでは fast bin 攻撃を使用して制御されたチャンクのポインタが存在する場所にチャンクを割り当て、特定のポインタを上書きして GOT に one gadget を書き込むことが可能でした。
|
||||
* 未整列のビン攻撃を介して悪用された Fast Bin 攻撃を見つけることができます:
|
||||
* Fast Bin 攻撃を実行する前に、必要に応じて libc/ヒープアドレスをリークするために未整列リストを悪用することが一般的であることに注意してください。
|
||||
|
||||
{% content-ref url="unsorted-bin-attack.md" %}
|
||||
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
||||
|
@ -156,14 +160,14 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>**htARTE (HackTricks AWS Red Team Expert)** で AWS ハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>こちら</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>**htARTE (HackTricks AWS Red Team Expert)** で**AWS hacking**をゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>こちら</strong></a><strong>!</strong></summary>
|
||||
|
||||
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**](https://twitter.com/hacktricks\_live) をフォローする
|
||||
* **HackTricks** と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks) の github リポジトリに PR を提出して、あなたのハッキングトリックを共有する
|
||||
* **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 グループ** に参加するか、[**telegram グループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live) をフォローする
|
||||
* **HackTricks** と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の github リポジトリに PR を提出して、あなたのハッキングトリックを共有する
|
||||
|
||||
</details>
|
||||
|
|
|
@ -4,13 +4,13 @@
|
|||
|
||||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks をサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricks で企業を宣伝したい**場合や **HackTricks をPDFでダウンロード**したい場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* **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**](https://twitter.com/hacktricks\_live)**をフォロー**する。
|
||||
* **ハッキングトリックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **および** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出**してください。
|
||||
* [**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**](https://twitter.com/hacktricks\_live)**をフォロー**してください。
|
||||
* **ハッキングトリックを共有するには、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **および** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出してください。**
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -93,34 +93,34 @@ return 0;
|
|||
|
||||
### ゴール
|
||||
|
||||
この攻撃により、**チャンクへのポインタを自身の 3 アドレス前を指すように変更**することが可能です。この新しい場所(ポインタが配置されていた周辺)に興味深い情報がある場合、他の制御可能な割り当てやスタックなどがある場合、それらを読み取ったり上書きしてより大きな被害を引き起こすことが可能です。
|
||||
この攻撃により、**チャンクへのポインタを自身の 3 アドレス前を指すように変更**することが可能です。この新しい場所(ポインタが配置されていた周辺)に興味深い情報が含まれている場合、他の制御可能な割り当てやスタックなどがある場合、それらを読み取ったり上書きしてより大きな被害を引き起こすことが可能です。
|
||||
|
||||
* もしポインタがスタックに配置されていた場合、今は自身の 3 アドレス前を指しているため、ユーザーがそれを読み取り、変更できる可能性があるため、スタックから機密情報を漏洩させたり、リターンアドレスを変更することが可能になります(おそらく)キャナリを触ることなく
|
||||
* CTF の例では、このポインタが他の割り当てへのポインタの配列に配置されているため、3 アドレス前を指すようにし、読み書きできるようにすると、他のポインタを他のアドレスを指すようにすることが可能です。\
|
||||
ユーザーが他の割り当ても読み書きできる可能性があるため、情報を漏洩させたり、任意の場所(GOT など)に新しいアドレスを上書きすることができます。
|
||||
* もしポインタがスタックにあった場合、今は自身の 3 アドレス前を指しているため、ユーザーがそれを読み取り、変更できる可能性があるため、スタックから機密情報を漏洩させるか、リターンアドレスを変更することが可能になります(おそらくキャナリを触ることなく)
|
||||
* CTF の例では、このポインタが他の割り当てへのポインタの配列にあるため、3 アドレス前を指すようにし、他のポインタを他のアドレスを指すようにすることが可能です。\
|
||||
ユーザーが他の割り当ても読み書きできる可能性があるため、情報を漏洩したり、任意の場所(GOT など)に新しいアドレスを上書きすることができます。
|
||||
|
||||
### 必要条件
|
||||
|
||||
* メモリ内(例:スタック)で制御を持って、いくつかの属性に値を与えるためにチャンクを作成する。
|
||||
* メモリ内(例:スタック)でコントロールを持って、いくつかの属性に値を与えるためにチャンクを作成する。
|
||||
* ポインタの偽のチャンクを設定するためのスタックリーク。
|
||||
|
||||
### 攻撃
|
||||
|
||||
* 2 つのチャンクがある(chunk1 と chunk2)
|
||||
* 攻撃者は chunk1 の内容と chunk2 のヘッダーを制御している。
|
||||
* chunk1 に攻撃者は偽のチャンクの構造を作成する:
|
||||
* いくつかのチャンクがある(chunk1 と chunk2)
|
||||
* 攻撃者は chunk1 の内容と chunk2 のヘッダーをコントロールしている。
|
||||
* chunk1 では、攻撃者は偽のチャンクの構造を作成する:
|
||||
* 保護をバイパスするために、`size` フィールドが正しいことを確認して、`corrupted size vs. prev_size while consolidating` エラーを回避する
|
||||
* そして偽のチャンクの `fd` と `bk` フィールドが、chunk1 のポインタが格納されている場所を指すようにする。それぞれ -3 と -2 のオフセットであるため、`fake_chunk->fd->bk` と `fake_chunk->bk->fd` がメモリ内(スタック)の位置を指すようにする:
|
||||
* そして偽のチャンクの `fd` と `bk` フィールドが、chunk1 のポインタが格納されている場所を指すようにする。それぞれ -3 と -2 のオフセットを持たせることで、`fake_chunk->fd->bk` と `fake_chunk->bk->fd` がメモリ内(スタック)の位置を指すようにする:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1245).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||
|
||||
* chunk2 のヘッダーは変更され、前のチャンクが使用されていないことを示し、偽のチャンクが含まれるサイズであることを示すようになっている。
|
||||
* 2 番目のチャンクが解放されると、この偽のチャンクがリンク解除されます:
|
||||
* chunk2 のヘッダーは変更され、前のチャンクが使用されていないことと、偽のチャンクが含まれるサイズであることが示される。
|
||||
* 2 番目のチャンクが解放されると、この偽のチャンクがリンク解除される:
|
||||
* `fake_chunk->fd->bk` = `fake_chunk->bk`
|
||||
* `fake_chunk->bk->fd` = `fake_chunk->fd`
|
||||
* 以前は、`fake_chunk->fd->bk` と `fake_chunk->fd->bk` が同じ場所を指すようにされていました(`chunk1` が格納されていたスタックの場所、つまり有効なリンクリストでした)。**両方が同じ場所を指している**ため、最後の方(`fake_chunk->bk->fd = fake_chunk->fd`)だけが**効果を発揮**します。
|
||||
* これにより、スタック内のチャンク1へのポインタがスタック内の 3 アドレス前に格納されているアドレス(またはバイト)に上書きされます。
|
||||
* したがって、攻撃者が再び chunk1 の内容を制御できる場合、**スタック内に書き込むことができ**、おそらくキャナリをスキップしてリターンアドレスを上書きしたり、ローカル変数の値とポインタを変更したりすることが可能になります。再びスタックに格納されている chunk1 のアドレスを異なる場所に変更することができるため、攻撃者が再び chunk1 の内容を制御できる場合、どこにでも書き込むことが可能になります。
|
||||
* 以前は、`fake_chunk->fd->bk` と `fake_chunk->fd->bk` が同じ場所を指すようにされていた(`chunk1` が格納されていたスタックの場所、つまり有効なリンクリストであった)。**両方が同じ場所を指している**ため、最後のものだけが(`fake_chunk->bk->fd = fake_chunk->fd`)**効果を持つ**。
|
||||
* これにより、スタック内の chunk1 へのポインタがスタック内の 3 アドレス前に格納されているアドレス(またはバイト)に上書きされます。
|
||||
* したがって、攻撃者が再び chunk1 の内容を制御できる場合、スタック内に書き込むことが可能になり、おそらくキャナリをスキップしてリターンアドレスを上書きし、ローカル変数の値とポインタを変更することができます。再びスタックに格納されている chunk1 のアドレスを異なる場所に変更することで、攻撃者が再び chunk1 の内容を制御できる場合、どこにでも書き込むことが可能になります。
|
||||
* この攻撃が可能だったのは、**アドレスがスタックに格納されていた**ためです。リスクと悪用は、**偽のチャンクのアドレスがどこに格納されているか**に依存する可能性があります。
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1246).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||
|
@ -128,8 +128,10 @@ return 0;
|
|||
## 参考文献
|
||||
|
||||
* [https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit](https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit)
|
||||
* CTF で unlink 攻撃を見つけるのは奇妙かもしれませんが、この攻撃が使用されたライトアップがある場合があります:
|
||||
* CTF で unlink 攻撃を見つけるのは奇妙かもしれませんが、この攻撃が使用されたライトアップ例があるので、以下に示します:
|
||||
* CTF の例:[https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html](https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html)
|
||||
* この例では、スタックの代わりに malloc されたアドレスの配列があります。unlink 攻撃は、ここにチャンクを割り当てることができるように行われ、その後、これらのアドレスのチャンクの内容を変更する機能があります。これにより、アドレスを GOT にポイントし、関数アドレスを変更してリークと RCE を取得することが可能になります。
|
||||
* この例では、スタックの代わりに malloc されたアドレスの配列があります。unlink 攻撃は、ここにチャンクを割り当てることができるように行われ、その後、これらのアドレスのチャンクの内容を変更する機能があります。これにより、アドレスを GOT にポイントし、関数アドレスを変更してリークや RCE を取得することが可能になります。
|
||||
* 別の CTF の例:[https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html](https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html)
|
||||
* 前の例と同様に、割り当てのアドレスの配列があります。unlink 攻撃を実行して、最初の割り当てへのアドレスを配列の先頭の数ポジション前を指すようにすることが可能です。そして、この新しい位置に割り当てを上書きすることができます。そのため、他の割り当てのポインタを GOT の atoi にポイントするように上書きし、libc リークを取得するためにそれを印刷し、そして atoi GOT をワンガジェットのアドレスに上書きすることが可能になります。
|
||||
* 前の例と同様に、割り当てのアドレスの配列があります。unlink 攻撃を実行して、最初の割り当てへのアドレスを配列の先頭よりも前のいくつかの位置を指すようにすることが可能です。そして、この割り当てを新しい位置に上書きすることができます。そのため、他の割り当てのポインタを GOT の atoi にポイントするように上書きし、libc リークを取得し、そして atoi の GOT を one gadget のアドレスに上書きすることが可能です。
|
||||
* unlink 攻撃に非常に似た脆弱性を悪用するカスタム malloc と free 関数を持つ CTF の例:[https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html)
|
||||
* カスタム malloc の FD と BK ポインタを制御できるオーバーフローがあり、それらが(カスタム)解放されます。さらに、ヒープに exec ビットがあるため、ヒープアドレスを漏洩させ、GOT からヒープチャンクに関数をポイントしてシェルコードを実行することが可能です。
|
||||
|
|
|
@ -2,16 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong>を使用して、<strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong>!</summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong>を使用して、**ゼロからヒーローまでAWSハッキングを学ぶ**</a><strong>!</strong></summary>
|
||||
|
||||
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を提出して、あなたのハッキングテクニックを共有してください。
|
||||
* **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**および**HackTricks Cloud**のGitHubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -23,46 +22,49 @@ HackTricksをサポートする他の方法:
|
|||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
アンソートリストは、チャンクの`bk`アドレスに`unsorted_chunks (av)`へのアドレスを書き込むことができます。したがって、攻撃者がアンソートビン内のチャンクの`bk`ポインタのアドレスを**変更できる場合**、任意のアドレスにそのアドレスを**書き込むことができる**可能性があり、これはlibcアドレスをリークしたり、いくつかの防御をバイパスするのに役立つかもしれません。
|
||||
アンソートリストは、チャンクの`bk`アドレスに`unsorted_chunks (av)`へのアドレスを書き込むことができます。したがって、攻撃者がアンソートビン内のチャンクの`bk`ポインタのアドレスを**変更できる場合**、任意のアドレスにそのアドレスを書き込むことができ、これはlibcアドレスをリークさせたり、いくつかの防御をバイパスするのに役立つ可能性があります。
|
||||
|
||||
したがって、基本的にこの攻撃は、**任意のアドレスを大きな数値**(ヒープアドレスまたはlibcアドレスである可能性があるアドレス)で上書きできるようにするものです。これにより、リークする可能性のあるスタックアドレスや、グローバル変数**`global_max_fast`**のような制限を回避して、より大きなサイズの高速ビンビンを作成できるようにすることができます(アンソートビン攻撃から高速ビン攻撃に移行する)。
|
||||
したがって、基本的にこの攻撃は、**任意のアドレスを大きな数値**(ヒープアドレスまたは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`**がトリガーされることがわかります。
|
||||
[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`がアリーナを指している必要があります。
|
||||
したがって、このアンソートビン攻撃は(他のチェックと共に)ダブルリンクリストを修正できる必要があるため、これがバイパスされるようにする必要があります。`victim->bck->fd == victim`または`victim->fd == av(arena)`。つまり、書き込みたいアドレスのアドレスは、その`fd`位置に偽のチャンクのアドレスを持っている必要があり、偽のチャンクの`fd`がアリーナを指している必要があります。
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
この攻撃はアンソートビンを破壊します(したがって、小さなビンと大きなビンも)。そのため、**現在は高速ビンからの割り当てのみを使用できます**(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、これをトリガーするには**同じサイズを割り当てる必要があります。**
|
||||
この攻撃はアンソートビンを破壊します(したがって、小さなビンと大きなビンも)。そのため、今後は**高速ビンからの割り当てのみを使用できます**(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、これをトリガーするには**同じサイズを割り当てる必要があります。**
|
||||
|
||||
**`global_max_fast`**を作成することができると、この場合に役立つかもしれません。高速ビンが攻撃が完了するまでの他のすべての割り当てを処理できることを信頼しています。
|
||||
この場合、**`global_max_fast`**を作成することができると、この問題を解決するのに役立つかもしれません。高速ビンが攻撃が完了するまでの他のすべての割り当てを処理できるように信頼しています。
|
||||
{% endhint %}
|
||||
|
||||
[**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html)のコードは非常によく説明していますが、mallocを変更して、tcacheに終わらないようにメモリを割り当てると、先に述べたエラーが発生し、このテクニックが防がれることがわかります:**`malloc(): unsorted double linked list corrupted`**
|
||||
[**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html)のコードは非常にわかりやすく説明していますが、mallocを変更して、tcachesに終わらないようにメモリを割り当てると、先に述べたエラーが発生し、このテクニックが防がれることがわかります:**`malloc(): unsorted double linked list corrupted`**
|
||||
|
||||
## アンソートビン情報リーク攻撃
|
||||
|
||||
これは実際には非常に基本的な概念です。アンソートビン内のチャンクには、ビンを作成するためのダブルポインタがあります。アンソートビン内の最初のチャンクには、**FD**と**BK**リンクが実際に**メインアリーナ(libc)の一部を指す**ようになります。\
|
||||
したがって、アンソートビン内にチャンクを配置し、それを読み取る(解放後に使用)か、**少なくとも1つのポインタを上書きせずに再度割り当て**してから**読み取る**ことができると、**libc情報リーク**を得ることができます。
|
||||
これは実際には非常に基本的な概念です。アンソートビン内のチャンクには、ビンを作成するためのポインタのダブルポインタがあります。アンソートビン内の最初のチャンクには、**FD**と**BK**リンクが実際には**メインアリーナ(libc)の一部を指しています**。\
|
||||
したがって、アンソートビン内にチャンクを配置し、それを読み取る(使用後に解放)か、**少なくとも1つのポインタを上書きせずに再度割り当て**してから**読み取る**ことができると、**libc情報リーク**を得ることができます。
|
||||
|
||||
## 参照および他の例
|
||||
この[**writeupで使用された攻撃**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html)は、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**](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の高速**チャンクを操作できる**ことがわかります:
|
||||
- <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
||||
## 参照およびその他の例
|
||||
|
||||
* [**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。その後、**マージ関数が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の高速**チャンクを操作できることがわかります**:
|
||||
* <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
|
||||
|
@ -70,8 +72,24 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
|||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
</code></pre>
|
||||
* この場所にサイズ0x200の高速チャンクを取得できれば、実行される関数ポインタを上書きすることが可能になります。
|
||||
* そのために、サイズが`0xfc`の新しいチャンクが作成され、そのポインタでマージされた関数が2回呼び出され、これによりサイズ`0xfc*2 = 0x1f8`の解放されたチャンクへのポインタが高速ビンに得られます。
|
||||
* この場所にサイズ0x200の高速チャンクを取得できれば、実行される関数ポインタを上書きすることが可能になります
|
||||
* そのために、サイズが`0xfc`の新しいチャンクが作成され、そのポインタでマージされた関数が2回呼び出され、これによりサイズ`0xfc*2 = 0x1f8`の解放されたチャンクへのポインタが高速ビンに取得されます。
|
||||
* 次に、このチャンクで編集関数が呼び出され、この高速ビンの**`fd`**アドレスを以前の**`__free_hook`**関数を指すように変更します。
|
||||
* その後、サイズが`0x1f8`のチャンクが作成され、高速ビンから以前の無効なチャンクを取得するために、サイズが`0x1f8`の別のチャンクが作成され、**`__free_hook`**内の高速ビンチャンクを取得し、**`system`**関数のアドレスで上書きされます。
|
||||
* 最後に、文字列`/bin/sh\x00`を含むチャンクが削除関数を呼び出して解放され、**`__free_hook`**関数がトリガーされ、`/bin/sh\x00`をパラメータとして持つsystemを指すようになります。
|
||||
* 次に、サイズが`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**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
||||
* アンソートビンでチャンクを統合し、libc情報リークを取得し、その後mallocフックをワンガジェットアドレスで上書きするための高速ビン攻撃を実行する1Bオーバーフローを悪用する別の例
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Other ways to support HackTricks:
|
||||
|
||||
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue