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をサポートする

基本情報

コード

  • この技術はパッチが当てられました (こちら) そしてこのエラーを生成します: malloc(): corrupted top size
  • テストしたい場合は、こちらのコードを試すことができます。

目標

  • この攻撃の目標は、特定のアドレスにチャンクを割り当てることができるようにすることです。

要件

  • トップチャンクヘッダーのサイズを上書きできるオーバーフロー (例: -1)。
  • ヒープ割り当てのサイズを制御できること。

攻撃

攻撃者がアドレスPにチャンクを割り当ててここに値を上書きしたい場合、彼はトップチャンクサイズを -1 で上書きすることから始めます (おそらくオーバーフローを使って)。これにより、mallocはトップチャンクが常に十分なスペースを持つため、どの割り当てもmmapを使用しないことが保証されます。

次に、トップチャンクのアドレスと割り当てるターゲットスペースの間の距離を計算します。これは、そのサイズでmallocが実行され、トップチャンクがその位置に移動されるためです。このようにして、差/サイズを簡単に計算できます:

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)
*/

したがって、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を引数として呼び出すことができました。
  • 別の方法としてこの他の文書で提案されたのは、freeputsで上書きし、その後atoi@gotのアドレスを後で解放されるポインタに追加することで、漏洩させ、この漏洩を使って再びatoi@gotsystemで上書きし、/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をサポートする