BF Forked & Threaded Stack Canaries
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
カナリアとPIE(位置独立実行可能ファイル)によって保護されたバイナリに直面している場合、バイパスする方法を見つける必要があります。
checksec
は、バイナリがカナリアによって保護されていることを見つけられない場合があります。これは静的にコンパイルされており、関数を特定できないためです。
ただし、関数呼び出しの最初にスタックに値が保存され、その値が終了前にチェックされるのを見つけることで、手動で気づくことができます。
単純なカナリアをバイパスする最良の方法は、バイナリが新しい接続を確立するたびに子プロセスをフォークするプログラムである場合です(ネットワークサービス)。なぜなら、接続するたびに同じカナリアが使用されるからです。
したがって、カナリアをバイパスする最良の方法は、文字ごとにブルートフォースすることであり、推測したカナリアバイトが正しいかどうかは、プログラムがクラッシュしたか、通常のフローを続けているかを確認することで判断できます。この例では、関数は8バイトのカナリア(x64)をブルートフォースし、正しく推測されたバイトと不正なバイトをチェックすることで区別します。サーバーからレスポンスが返されるかどうかを確認します(他の状況ではtry/exceptを使用することもできます):
この例は64ビット用に実装されていますが、32ビット用にも簡単に実装できます。
これは32ビット用に実装されていますが、64ビットに簡単に変更できます。 また、この例ではプログラムが最初に入力のサイズを示すバイトとペイロードを期待していることに注意してください。
同じプロセスのスレッドは同じカナリアトークンを共有するため、バイナリが攻撃のたびに新しいスレッドを生成する場合、カナリアをブルートフォースすることが可能です。
さらに、カナリアで保護されたスレッド関数内のバッファオーバーフローを利用して、TLSに保存されたマスターカナリアを変更することができます。これは、スレッドのスタック内のbofを介してTLSが保存されているメモリ位置に到達することが可能であるためです。 その結果、チェックは同じ(ただし変更された)2つのカナリアを使用するため、緩和策は無意味です。 この攻撃は、以下の書き込みで実行されます: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
また、https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015のプレゼンテーションも確認してください。ここでは、通常TLSは**mmap
によって保存され、スレッドのスタック**が作成されるときもmmap
によって生成されるため、前述の書き込みで示されたようにオーバーフローが可能になることが言及されています。
64ビット、PIEなし、nx、BFカナリア、execve
を呼び出すROPをメモリに書き込み、そこにジャンプします。