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

7.9 KiB
Raw Blame History

Tcache Bin Attack

ゼロからヒーローまでのAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricksをサポートする他の方法

基本情報

Tcache binとは何かについての詳細は、このページをチェックしてください

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

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

guyinatuxidoページで提案されているTcache攻撃は、次のチャンク内のbin内の次のチャンクへのポインタを任意のアドレスに上書きして、後でその特定のアドレスを割り当ててポインタを上書きすることが可能になるようにすることを目的としています。

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

Tcacheインデックス攻撃

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

  • CTF https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html
  • Libc情報リーク: Tcacheを埋め、チャンクをアンソートリストに追加し、Tcacheを空にして、アンソートされたbinからチャンクを再割り当てし、最初の8Bだけを上書きして、チャンクの2番目のアドレスをそのままにして読み取ることができる
  • Tcache攻撃: バイナリには1Bのヒープオーバーフローがあります。これを悪用して、割り当てられたチャンクのサイズヘッダーを変更して大きくします。その後、このチャンクを解放し、偽のサイズのチャンクのTcacheに追加します。その後、偽のサイズでチャンクを割り当て、前のチャンクが実際にはより小さいことを知っているため、これによりメモリ内の次のチャンクを上書きする機会が得られます。
    これを悪用して、次のチャンクのFDポインタを**malloc_hookを指すように上書き**し、その後、2つのポインタを割り当てることが可能になりますまず、変更した正当なポインタ、そして次にmalloc_hookにあるチャンクが返され、ワンガジェットを書き込むことが可能になります。
  • CTF https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html
  • Libc情報リーク: 使用後に解放されたメモリと二重解放があります。この解説では、小さなbinに配置されたチャンクのアドレスを読み取ることで、libcのアドレスを漏洩させましたアンソートされたbinからではなく、小さなbinから漏洩させました
  • 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 binの情報を含むチャンクに格納されるサイズのチャンクを割り当てて解放すると、値が0x100のアドレスが生成されます。これは、Tcacheが各bin内のチャンクの数を異なるバイトで格納するためです。したがって、特定のインデックスの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つのインデックスのアドレスとして追加し、それを割り当て、その上にワンガジェットを書き込むことが可能になります。