Ret2lib
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)
Ret2Libcの本質は、脆弱なプログラムの実行フローを攻撃者が提供したスタック上のシェルコードを実行するのではなく、共有ライブラリ内の関数(例:system、execve、strcpy)にリダイレクトすることです。攻撃者は、スタック上の戻りアドレスを目的のライブラリ関数を指すように変更するペイロードを作成し、呼び出し規約に従って必要な引数が正しく設定されるようにします。
呼び出す関数のアドレス(例:system)と呼び出すコマンド(例:/bin/sh)を取得する
コマンド文字列を指す最初の引数を渡し、関数への実行フローを生成するROPチェーンを作成する
使用するlibc
が現在のマシンのものであると仮定すると、メモリにロードされる場所を次のコマンドで見つけることができます:
libcのアドレスがASLRによって変更されているか確認したい場合は、次のようにできます:
使用されているlibcを知っていれば、次のコマンドでsystem
関数へのオフセットを見つけることも可能です:
使用されているlibcを知っていれば、次のようにして文字列/bin/sh
関数へのオフセットを見つけることも可能です:
使用されているlibcを知っていれば、PedaやGEFを使ってsystem関数、exit関数、そして文字列**/bin/sh
**のアドレスを取得することも可能です:
プロセスが子プロセスを作成するたびに話しかける場合(ネットワークサーバー)、そのファイルを読み取ることを試みてください(おそらくroot権限が必要です)。
ここでは、プロセス内でlibcがどこにロードされているか、およびプロセスの各子プロセスに対してどこにロードされるかを正確に見つけることができます。
この場合、0xb75dc000にロードされています(これがlibcのベースアドレスになります)。
バイナリがロードしているlibcを知らない可能性があります(アクセスできないサーバーにあるかもしれません)。その場合、脆弱性を悪用していくつかのアドレスをリークし、どのlibcライブラリが使用されているかを見つけることができます:
これに関するpwntoolsテンプレートは次の場所で見つけることができます:
ページhttps://libc.blukat.me/を確認し、libc内のいくつかの関数のアドレスを使用して使用されているバージョンを特定してください。
これらのブルートフォース攻撃は32ビットシステムにのみ有効です。
エクスプロイトがローカルの場合、libcのベースアドレスをブルートフォースすることを試みることができます(32ビットシステムに有用):
リモートサーバーを攻撃する場合、libc
関数usleep
のアドレスをブルートフォースすることを試みることができます。引数として10を渡します(例えば)。もしある時点でサーバーが応答するのに10秒余分にかかる場合、その関数のアドレスを見つけたことになります。
libcの特定のアドレスにジャンプしてシェルを実行します:
この例では、ASLRブルートフォースがコードに統合されており、脆弱なバイナリがリモートサーバーにあります:
以下の例を確認してください:
ARM64 の場合、ret 命令は x30 レジスタが指している場所にジャンプし、スタックレジスタが指している場所にはジャンプしません。したがって、少し複雑です。
また、ARM64 では命令はその命令が行うことを行います(命令の途中でジャンプして新しい命令に変換することはできません)。
以下の例を確認してください:
これは、printf
/puts
を特定のデータを引数として呼び出すことで プロセスから情報を漏洩させる ことを可能にします。例えば、puts
のアドレスを GOT に入れて puts
を実行すると、メモリ内の puts
のアドレスが漏洩します。
これは基本的に、Ret2lib を悪用して printf
フォーマット文字列の脆弱性に変換する ことを意味します。ret2lib
を使用して printf を呼び出し、悪用する値を渡します(無駄に聞こえますが可能です):
Ret2lib、libc の関数のアドレスへの漏洩を与え、one gadget を使用
64 ビット、ASLR 有効だが PIE なし、最初のステップはオーバーフローを埋めてから puts を呼び出して漏洩させることです。カナリアを使って ROP ガジェットを作成し、puts を呼び出して GOT から puts のアドレスを漏洩させ、次に system('/bin/sh')
を呼び出す ROP ガジェットを作成します。
64 ビット、ASLR 有効、カナリアなし、子関数からのメインでのスタックオーバーフロー。ROP ガジェットを使って GOT から puts のアドレスを漏洩させ、その後 one gadget を呼び出します。
64 ビット、PIE なし、カナリアなし、relro なし、nx。write 関数を使用して write (libc) のアドレスを漏洩させ、one gadget を呼び出します。
フォーマット文字列を使用してスタックからカナリアを漏洩させ、バッファオーバーフローを使用して system に呼び出します(それは GOT にあります) /bin/sh
のアドレスで。
32 ビット、relro なし、カナリアなし、nx、pie。悪いインデックスを悪用してスタックから libc とヒープのアドレスを漏洩させます。バッファオーバーフローを悪用して system('/bin/sh')
を呼び出す ret2lib を行います(ヒープアドレスはチェックをバイパスするために必要です)。
AWS ハッキングを学び、練習する:HackTricks Training AWS Red Team Expert (ARTE) GCP ハッキングを学び、練習する: HackTricks Training GCP Red Team Expert (GRTE)