hacktricks/binary-exploitation/libc-heap/tcache-bin-attack.md

9.4 KiB
Raw Blame History

Tcache Bin Attack

{% hint style="success" %} AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)

HackTricksのサポート
{% endhint %}

基本情報

Tcache binとは何かについての詳細は、次のページを参照してください

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

まず最初に、TcacheはGlibcバージョン2.26で導入されました。

Tcache攻撃(またはTcacheポイズニング)は、guyinatuxidoページで提案されており、目標は解放されたチャンク内のビン内の次のチャンクへのポインタを任意のアドレスに上書きして、後でその特定のアドレスを割り当ててポインタを上書きする可能性があるという点で、ファストビン攻撃と非常に似ています。

ただし、現在では、上記のコードを実行するとエラーが発生します:malloc(): unaligned tcache chunk detected。そのため、新しいポインタにアラインされたアドレスを書き込む必要があります(または、実際にアラインされたアドレスに書き込むためにバイナリを十分な回数実行する必要があります)。

Tcacheインデックス攻撃

通常、ヒープの先頭には、Tcache内の各インデックスごとのチャンクの数を含むチャンクと、各Tcacheインデックスのヘッドチャンクへのアドレスが含まれています。何らかの理由でこの情報を変更できる場合、特定のアドレス(たとえば__malloc_hook)を指すようにいくつかのインデックスのヘッドチャンクを変更することが可能になります。その後、そのインデックスのサイズのチャンクを割り当て、この場合は__malloc_hookの内容を上書きすることが可能になります。

  • CTF https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html
  • Libc情報リーク: Tcacheを埋め、チャンクをアンソートリストに追加し、Tcacheを空にし、アンソートビンからチャンクを再割り当てして、最初の8Bだけを上書きし、チャンクの2番目のアドレスをそのままにして読み取ることが可能です。
  • Tcache攻撃: バイナリには1Bのヒープオーバーフローの脆弱性があります。これを悪用して、割り当てられたチャンクのサイズヘッダーを大きく変更します。その後、このチャンクを解放し、偽のサイズのチャンクのTcacheに追加します。その後、偽のサイズでチャンクを割り当て、前のチャンクが実際にはより小さいことを知っているため、これを上書きしてメモリ内の次のチャンクを可能にします。
    これを悪用して、次のチャンクのFDポインタを**malloc_hookを指すように上書き**し、その後、2つのポインタを割り当てることができますまず、変更した正規のポインタ、そして次に2番目の割り当ては、malloc_hookにあるチャンクを返します。これを悪用して、ワンガジェットを書き込むために悪用できます。
  • CTF https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html
  • Libc情報リーク: ユーザーアフターフリーとダブルフリーがあります。この解説では、著者が小さなビンに配置されたチャンクのアドレスを読み取ることで、libcのアドレスをリークしましたアンソートビンからではなく、小さなビンからリークしました
  • Tcache攻撃: ダブルフリーを介してTcacheが実行されます。同じチャンクが2回解放されるため、Tcache内ではチャンクが自分自身を指すようになります。その後、割り当てられ、そのFDポインタがfree hookを指すように変更され、再度割り当てられるため、リスト内の次のチャンクはfree hookになります。その後、これも割り当てられ、systemのアドレスをここに書き込むことができるため、"/bin/sh"を含むmallocが解放されるとシェルを取得できます。
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html
  • ここでの主な脆弱性は、オフセットを指定してヒープ内の任意のアドレスをfreeできることです。
  • Tcacheインデックス攻撃: TcacheチャンクTcacheビンの情報を含むチャンクに格納されるサイズのチャンクを割り当てて解放すると、値が0x100のアドレスが生成されます。これは、Tcacheが各ビンのチャンク数を異なるバイトで格納するためです。したがって、特定のインデックスの1つのチャンクが値0x100を生成します。
  • その後、この値はサイズ0x100のチャンクがあるかのように見えます。このアドレスをfreeすることで、そのアドレスがTcache内のサイズ0x100のチャンクのインデックスに追加されます。
  • その後、サイズが0x100のチャンクを割り当てすると、前のアドレスがチャンクとして返され、他のTcacheインデックスを上書きすることが可能になります。
    たとえば、その中のmallocフックのアドレスを配置し、そのインデックスのサイズのチャンクを割り当てると、callocフックにチャンクが付与され、ワンガジェットを書き込むことが可能になります。
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html
  • 以前と同じ脆弱性がありますが、1つの追加制限があります。
  • Tcacheインデックス攻撃: 前の攻撃と似た攻撃ですが、Tcache情報を含むチャンクを解放して、そのアドレスがそのサイズのTcacheインデックスに追加されるため、そのサイズを割り当ててTcacheチャンク情報を取得し、その情報を使用してfree hookを1つのインデックスのアドレスとして追加し、それを割り当ててワンガジェットを書き込むことが可能です。
  • Math Door. HTB Cyber Apocalypse CTF 2023
  • fdポインタに数値を追加するためのWrite After Free
  • このチャレンジでは、多くのヒープファングシュイが必要です。解説では、Tcacheのフリーリストのヘッドを制御することが非常に便利であることを示しています。
  • stdoutFSOPを介したGlibcリーク
  • Tcacheポイズニングを使用して任意の書き込みプリミティブを取得します。

{% hint style="success" %} AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)

HackTricksのサポート