House of Force
Reading time: 8 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
基本情報
コード
目標
- この攻撃の目標は、特定のアドレスにチャンクを割り当てることができるようにすることです。
要件
- トップチャンクヘッダーのサイズを上書きできるオーバーフロー (例: -1)。
- ヒープ割り当てのサイズを制御できること。
攻撃
攻撃者がアドレスPにチャンクを割り当ててここに値を上書きしたい場合、彼はトップチャンクサイズを -1
で上書きすることから始めます (おそらくオーバーフローを使って)。これにより、mallocはトップチャンクが常に十分なスペースを持つため、どの割り当てもmmapを使用しないことが保証されます。
次に、トップチャンクのアドレスと割り当てるターゲットスペースの間の距離を計算します。これは、そのサイズでmallocが実行され、トップチャンクがその位置に移動されるためです。このようにして、差/サイズを簡単に計算できます:
// 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)
*/
したがって、target - old_top - 4*sizeof(long)
のサイズを割り当てることで(4つのlongは、トップチャンクと新しく割り当てられたチャンクのメタデータのためです)、トップチャンクを上書きしたいアドレスに移動させます。
次に、ターゲットアドレスでチャンクを取得するためにもう一度mallocを行います。
参考文献と他の例
- https://github.com/shellphish/how2heap/tree/master
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/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://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
- このシナリオの目標はret2winであり、ret2win関数のアドレスによって呼び出される関数のアドレスを変更する必要があります。
- バイナリには、トップチャンクのサイズを変更するために悪用できるオーバーフローがあります。これは-1またはp64(0xffffffffffffffff)に変更されます。
- 次に、上書きするポインタが存在する場所へのアドレスが計算され、現在のトップチャンクの位置からそこまでの差分が
malloc
で割り当てられます。 - 最後に、この望ましいターゲットを含む新しいチャンクが割り当てられ、これはret2win関数によって上書きされます。
- 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:
には、ヒープからアドレスを漏洩させる初期の脆弱性があります。- 次に、
Org:
およびHost:
機能では、org nameを求められたときにs
ポインタの64Bを埋めることが可能です。これはスタック上でv2のアドレスの後に続き、次に指定されたhost nameが続きます。その後、strcpyがsの内容を64Bのチャンクにコピーするため、host nameに入れたデータでトップチャンクのサイズを上書きすることが可能です。 - 任意の書き込みが可能になった今、
atoi
のGOTはprintfのアドレスに上書きされました。その後、IO_2_1_stderr
のアドレスを%24$p
で漏洩させることができました。このlibcの漏洩により、再びatoi
のGOTをsystem
のアドレスで上書きし、/bin/sh
を引数として呼び出すことができました。 - 別の方法としてこの他の文書で提案されたのは、
free
をputs
で上書きし、その後atoi@got
のアドレスを後で解放されるポインタに追加することで、漏洩させ、この漏洩を使って再びatoi@got
をsystem
で上書きし、/bin/sh
で呼び出すことです。 - https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html
- ポインタをクリアせずに解放されたチャンクを再利用できるUAFがあります。いくつかの読み取りメソッドがあるため、ここでGOTにfree関数へのポインタを書き込むことでlibcアドレスを漏洩させ、その後読み取り関数を呼び出すことが可能です。
- 次に、House of forceが使用され(UAFを悪用して)、左側のスペースのサイズを-1で上書きし、free hookに到達するのに十分な大きさのチャンクを割り当て、次にfree hookを含む別のチャンクを割り当てます。その後、フックに
system
のアドレスを書き込み、チャンクに"/bin/sh"
を書き込み、最後にその文字列内容を持つチャンクを解放します。
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。