Tcache Bin Attack
Reading time: 9 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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
基本情報
Tcache bin についての詳細はこのページを参照してください:
まず最初に、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を空にし、未ソートビンからチャンクを再割り当てすることが可能です。最初の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情報漏洩:使用後の解放と二重解放があります。この書き込みでは、著者が小さなビンに配置されたチャンクのアドレスを読み取ることで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が各ビンのチャンク数を異なるバイトに格納するため、特定のインデックスのチャンクが値0x100を生成するからです。
- その後、この値はサイズ0x100のチャンクがあるように見えます。これにより、このアドレスを
free
することで悪用できます。これにより、Tcache内のサイズ0x100のチャンクのインデックスにそのアドレスが追加されます。 - 次に、サイズ0x100のチャンクを割り当てると、前のアドレスがチャンクとして返され、他のTcacheインデックスを上書きすることが可能になります。
例えば、malloc hookのアドレスをそのうちの1つに入れ、そのインデックスのサイズのチャンクを割り当てることで、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
- Write After Freeで
fd
ポインタに数値を追加します。 - このチャレンジでは多くのヒープフェンシュイが必要です。書き込みでは、Tcacheのフリーリストのヘッドを制御することが非常に便利であることが示されています。
- Glibc漏洩を
stdout
を介して(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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。