Tcache Bin Attack

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

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

基本情報

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

pageBins & Memory Allocations

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

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

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

Tcacheインデックス攻撃

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

  • Libc情報リーク: tcacheを埋め、チャンクをアンソートリストに追加し、tcacheを空にし、アンソートされたbinからチャンクを再割り当てするだけで、最初の8Bを上書きし、チャンクの2番目のアドレスをそのまま読み取ることができる

  • Tcache攻撃: バイナリには1Bのヒープオーバーフローがあります。これを悪用して、割り当てられたチャンクのサイズヘッダーを大きく変更します。その後、このチャンクを解放し、偽のサイズのチャンクのtcacheに追加します。その後、偽のサイズでチャンクを割り当て、前のチャンクが実際にはより小さいことを知っているため、これによりメモリ内の次のチャンクを上書きする機会が得られます。 これを悪用して、次のチャンクのFDポインタを**malloc_hookを指すように上書き**し、その後、2つのポインタを割り当てることが可能になります:まず、変更した正当なポインタ、そして次に、malloc_hookにあるチャンクが返され、ワンガジェットを書き込むことが可能です。

  • Libc情報リーク: 使用後に解放されたチャンクと二重解放があります。この解説では、小さなbinに配置されたチャンクのアドレスを読み取ることで、libcのアドレスを漏洩させました(アンソートされたbinからではなく、小さなbinから漏洩させました)。

  • Tcache攻撃: 二重解放を介してTcacheが実行されます。同じチャンクが2回解放されるため、Tcache内ではチャンクが自分自身を指すようになります。その後、割り当てられ、そのFDポインタがfree hookを指すように変更され、再度割り当てられるため、リスト内の次のチャンクはfree hookになります。その後、これも割り当てられ、systemのアドレスをここに書き込むことが可能になります。そのため、"/bin/sh"を含むmallocが解放されるとシェルが取得できます。

  • ここでの主な脆弱性は、オフセットを指定してヒープ内の任意のアドレスをfreeできることです

  • Tcacheインデックス攻撃: tcacheチャンク(tcache binの情報を含むチャンク)に格納されるサイズのチャンクを割り当てて解放することで、値が0x100のアドレスを生成することが可能です。これは、tcacheが異なるバイトで各bin内のチャンクの数を格納しているためです。したがって、特定のインデックスの1つのチャンクが値0x100を生成します。

  • その後、この値はサイズ0x100のチャンクがあるかのように見えます。これを悪用して、このアドレスをfreeすることが可能です。これにより、そのアドレスがtcache内のサイズ0x100のチャンクのインデックスに追加されます。

  • その後、サイズが0x100のチャンクを割り当てすると、前のアドレスがチャンクとして返され、他のtcacheインデックスを上書きすることが可能になります。 たとえば、その中のmallocフックのアドレスを入れて、そのインデックスのサイズのチャンクを割り当てると、callocフック内のチャンクが得られ、ワンガジェットを書き込むことが可能になります。

  • 以前と同じ脆弱性がありますが、1つの追加の制限があります

  • Tcacheインデックス攻撃: 前の攻撃と似た攻撃ですが、tcache情報を含むチャンクを解放することでステップ数を減らして行います。そのため、そのアドレスがそのサイズのtcacheインデックスに追加されるため、そのサイズを割り当ててtcacheチャンク情報を取得し、その情報を使用してfree hookを1つのインデックスのアドレスとして追加し、それを割り当て、その上にワンガジェットを書き込むことが可能になります。

Last updated