2024-06-16 09:04:22 +00:00
# ハウス・オブ・フォース
< details >
< summary > < strong > htARTE( HackTricks AWS Red Team Expert) < / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > でAWSハッキングをゼロからヒーローまで学ぶ< / strong > < / a > < strong > ! < / strong > < / summary >
HackTricksをサポートする他の方法:
2024-07-17 18:08:29 +00:00
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
2024-06-16 09:04:22 +00:00
- [**公式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)のコレクションを見つける
2024-07-17 18:08:29 +00:00
- **💬 [Discordグループ ](https://discord.gg/hRep4RUj7f )**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@hacktricks\_live** ](https://twitter.com/hacktricks\_live )で**フォロー**する
- **HackTricks**および**HackTricks Cloud**のgithubリポジトリにPRを提出して、**あなたのハッキングテクニックを共有**する
2024-06-16 09:04:22 +00:00
< / details >
## 基本情報
### コード
- このテクニックは修正されました([**こちら**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c))し、このエラーが発生します:`malloc(): corrupted top size`
- テストしたい場合は、[**こちらからコードを取得**](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html)できます。
### ゴール
- この攻撃の目標は、特定のアドレスにチャンクを割り当てることです。
### 必要条件
- ヘッダーのトップチャンクサイズを上書きできるオーバーフロー(例:-1) が許可されるオーバーフロー
- ヒープ割り当てのサイズを制御できること
### 攻撃
2024-07-17 18:08:29 +00:00
攻撃者がアドレスPにチャンクを割り当てて値を上書きしたい場合、まずトップチャンクサイズを`-1`で上書きします( おそらくオーバーフローを使用) 。これにより、mallocは常に十分なスペースを持つトップチャンクを使用しないため、任意の割り当てにmmapを使用しなくなります。
2024-06-16 09:04:22 +00:00
2024-07-17 18:08:29 +00:00
次に、トップチャンクのアドレスとターゲットスペースを割り当てる距離を計算します。このサイズでmallocが実行されると、トップチャンクがその位置に移動するため、差分/サイズを簡単に計算できます。
2024-06-16 09:04:22 +00:00
```c
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/
```
2024-07-17 18:08:29 +00:00
したがって、`target - old_top - 4*sizeof(long)`のサイズを割り当てること( 4つのlongは、トップチャンクと新しいチャンクのメタデータのためです) により、トップチャンクを上書きしたいアドレスに移動させることができます。\
その後、ターゲットアドレスで別のmallocを行います。
2024-06-16 09:04:22 +00:00
### 参考文献と他の例
* [https://github.com/shellphish/how2heap/tree/master ](https://github.com/shellphish/how2heap/tree/master?tab=readme-ov-file )
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/ ](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/ )
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_force ](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_force )
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c ](https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c )
* [https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html ](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html )
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11 ](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11 )
2024-07-17 18:08:29 +00:00
* このシナリオの目標は、ret2winであり、呼び出される関数のアドレスをret2win関数のアドレスに変更する必要があります
* バイナリには、トップチャンクのサイズを変更できるオーバーフローがあり、これを-1またはp64(0xffffffffffffffff)に変更できます
* 次に、上書きするポインタが存在する場所へのアドレスが計算され、現在のトップチャンクの位置からそこまでの差が`malloc`で割り当てられます
* 最後に、ret2win関数によって上書きされる望ましいターゲットを含む新しいチャンクが割り当てられます
2024-06-16 09:04:22 +00:00
* [https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp ](https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp )
* `Input your name:` には、ヒープからアドレスをリークさせることができる初期の脆弱性があります
2024-07-17 18:08:29 +00:00
* 次に、`Org:`および`Host:`機能では、**org name**を求められたときに`s`ポインタの64Bを埋めることができ、スタック上では`v2`のアドレスが続き、その後に指定された**host name**が続きます。その後、strcpyがsの内容をサイズ64Bのチャンクにコピーしようとするため、**host name**に入れたデータでトップチャンクのサイズを**上書き**することができます。
* 今、任意の書き込みが可能になったので、`atoi`のGOTをprintfのアドレスに上書きしました。その後、`%24$p`で`IO_2_1_stderr`のアドレスをリークさせることができました。このlibcリークを使用して、`atoi`のGOTを再度`system`のアドレスに上書きし、`/bin/sh`をパラメータとして渡して呼び出すことができました。
* [この他の解説で提案されている代替方法 ](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#2016-bctf-bcloud )は、`free`を`puts`で上書きし、後で解放されるポインタに`atoi@got`のアドレスを追加し、それをリークさせ、このリークを使用して再度`atoi@got`を`system`で上書きし、`/bin/sh`でそれを呼び出すことができます。
2024-06-16 09:04:22 +00:00
* [https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html ](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html )
* ポインタをクリアせずに解放されたチャンクを再利用できるUAFがあります。いくつかの読み取りメソッドがあるため、ここでGOTにfree関数へのポインタを書き込み、その後read関数を呼び出すことでlibcアドレスをリークさせることができます。
2024-07-17 18:08:29 +00:00
* 次に、UAFを悪用して、左側のスペースのサイズを-1で上書きし、freeフックに到達する十分な大きさのチャンクを割り当て、その後、freeフックを含む別のチャンクを割り当てます。その後、フックに`system`のアドレスを書き込み、チャンクに`"/bin/sh"`を書き込み、最後にその文字列内容でチャンクを解放します。