House of Force
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
この攻撃の目標は、特定のアドレスにチャンクを割り当てることができるようにすることです。
トップチャンクヘッダーのサイズを上書きできるオーバーフロー (例: -1)。
ヒープ割り当てのサイズを制御できること。
攻撃者がアドレスPにチャンクを割り当ててここに値を上書きしたい場合、彼はトップチャンクサイズを -1
で上書きすることから始めます (おそらくオーバーフローを使って)。これにより、トップチャンクは常に十分なスペースを持つため、mallocはどの割り当てもmmapを使用しないことが保証されます。
次に、トップチャンクのアドレスと割り当てるターゲットスペースの間の距離を計算します。これは、そのサイズのmallocが実行され、トップチャンクがその位置に移動されるためです。これが、差分/サイズを簡単に計算できる方法です:
したがって、target - old_top - 4*sizeof(long)
のサイズを割り当てることで(4つのlongは、トップチャンクと新しく割り当てられたチャンクのメタデータのため)、トップチャンクを上書きしたいアドレスに移動させます。
次に、ターゲットアドレスでチャンクを取得するためにもう一度mallocを行います。
このシナリオの目的は、ret2winのために、ret2win関数のアドレスによって呼び出される関数のアドレスを変更することです。
バイナリには、トップチャンクのサイズを変更するために悪用できるオーバーフローがあります。これは-1またはp64(0xffffffffffffffff)に変更されます。
次に、上書きするポインタが存在する場所へのアドレスが計算され、そこへのトップチャンクの現在の位置からの差分がmalloc
で割り当てられます。
最後に、この望ましいターゲットを含む新しいチャンクが割り当てられ、これはret2win関数によって上書きされます。
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
で呼び出します。
ポインタをクリアせずに解放されたチャンクを再利用できるUAFがあります。いくつかの読み取りメソッドがあるため、ここでfree関数のポインタをGOTに書き込むことでlibcアドレスを漏洩させ、その後読み取り関数を呼び出すことが可能です。
次に、House of forceが使用され(UAFを悪用して)、左側のスペースのサイズを-1で上書きし、free hookに到達するのに十分な大きさのチャンクを割り当て、次にfree hookを含む別のチャンクを割り当てます。次に、フックにsystem
のアドレスを書き込み、チャンクに"/bin/sh"
を書き込み、最後にその文字列内容を持つチャンクを解放します。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)