Tcache Bin Attack

Reading time: 10 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をサポートする

基本情報

Tcache bin についての詳細はこのページを確認してください:

Bins & Memory Allocations

まず、Tcache は Glibc バージョン 2.26 で導入されたことに注意してください。

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

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

Tcache インデックス攻撃

通常、ヒープの最初に インデックスごとのチャンクの数 を含むチャンクと 各 Tcache インデックスのヘッドチャンクへのアドレス が見つかります。何らかの理由でこの情報を変更できる場合、特定のインデックスのヘッドチャンクを希望のアドレス(例えば __malloc_hook)にポイントさせることが可能になり、その後インデックスのサイズのチャンクを割り当ててこの場合の __malloc_hook の内容を上書きすることができます。

  • CTF https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html
  • Libc 情報漏洩: Tcache を埋め、未ソートリストにチャンクを追加し、Tcache を空にし、未ソート bin からチャンクを再割り当てすることが可能です。最初の 8B を上書きするだけで、チャンクからの libc への 2 番目のアドレスをそのままにしておくことができます
  • Tcache 攻撃: バイナリは 1B ヒープオーバーフローに対して脆弱です。これを利用して、割り当てられたチャンクの サイズヘッダー を変更して大きくします。その後、このチャンクは 解放され、偽のサイズのチャンクの Tcache に追加されます。次に、偽のサイズのチャンクを割り当てると、前のチャンクが 返され、実際にはこのチャンクが小さいことがわかります。これにより、メモリ内の次のチャンクを上書きする機会が得られます。
    これを利用して、次のチャンクの FD ポインタを malloc_hook にポイントさせ、最初に修正した正当なポインタを割り当て、その後の割り当てで malloc_hook にチャンクを返すことが可能になります。これを利用して one gadget を書き込むことができます。
  • 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 チャンク内に格納されたサイズのチャンクを割り当てて解放することが可能で、これにより 値 0x100 のアドレス が生成されます。これは、Tcache が各 bin のチャンク数を異なるバイトで保存するため、特定のインデックスのチャンクが値 0x100 を生成するからです。
  • 次に、この値はサイズ 0x100 のチャンクが存在するように見えます。これにより、このアドレスを free することで悪用できます。これにより、そのアドレスが Tcache 内のサイズ 0x100 のチャンクのインデックスに追加されます
  • 次に、サイズ 0x100 のチャンクを割り当てると、前のアドレスがチャンクとして返され、他の Tcache インデックスを上書きすることが可能になります。
    例えば、malloc hook のアドレスをそのうちの一つに入れ、そのインデックスのサイズのチャンクを割り当てることで calloc hook にチャンクを得ることができ、これにより one gadget を書き込んでシェルを得ることができます。
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html
  • 前回と同じ脆弱性ですが、1 つの追加制限があります。
  • Tcache インデックス攻撃: 前の攻撃と似ていますが、Tcache 情報を含むチャンクを解放することによって手順を減らします。これにより、そのアドレスがそのサイズの Tcache インデックスに追加され、そのサイズを割り当てて Tcache チャンク情報をチャンクとして取得できるようになります。これにより、インデックスのアドレスとして free hook を追加し、割り当てて、one gadget を上書きすることが可能になります。
  • Math Door. HTB Cyber Apocalypse CTF 2023
  • fd ポインタに数値を追加するための Write After Free
  • このチャレンジでは多くの heap feng-shui が必要です。書き込みでは、Tcache のフリーリストのヘッドを制御することが非常に便利であることが示されています。
  • stdout を介した Glibc 漏洩 (FSOP)。
  • 任意の書き込みプリミティブを得るための Tcache poisoning

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