mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-21 20:23:18 +00:00
.. | ||
tools | ||
elf-tricks.md | ||
README.md |
ベーシックバイナリエクスプロイテーション手法
htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学ぶ!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したいまたはHackTricksをPDFでダウンロードしたい場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksスウォッグを入手する
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つける
- **💬 Discordグループ**に参加するか、telegramグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローする。
- ハッキングトリックを共有するために HackTricksとHackTricks CloudのGitHubリポジトリにPRを提出する。
ELF基本情報
何かをエクスプロイトする前に、ELFバイナリの構造の一部を理解することが興味深いです:
{% content-ref url="elf-tricks.md" %} elf-tricks.md {% endcontent-ref %}
エクスプロイトツール
{% content-ref url="tools/" %} tools {% endcontent-ref %}
スタックオーバーフローメソドロジー
多くのテクニックがあるため、各テクニックがいつ役立つかを理解するためのスキームを持っていると良いです。同じ保護が異なるテクニックに影響を与えることに注意してください。保護をバイパスする方法は各保護セクションで見つけることができますが、この手法では見つけることはできません。
フローの制御
プログラムのフローを制御する方法はいくつかあります:
- スタックオーバーフローを使用して、スタックから戻りポインタまたはEBP -> ESP -> EIPを上書きする
- 整数オーバーフローを悪用してオーバーフローを引き起こす必要がある場合があります
- または任意の書き込み+書き込む場所への実行を介して
- フォーマット文字列:
printf
を悪用して、任意のアドレスに任意のコンテンツを書き込む - 配列インデックス:設計が不十分なインデックスを悪用して、いくつかの配列を制御し、任意の書き込みを取得できるようにする
- 整数オーバーフローを悪用してオーバーフローを引き起こす必要がある場合があります
- bof to WWW via ROP:バッファオーバーフローを悪用してROPを構築し、WWWを取得できるようにする
Write What Where to Executionのテクニックは以下で見つけることができます:
{% content-ref url="../arbitrary-write-2-exec/" %} arbitrary-write-2-exec {% endcontent-ref %}
永続的なループ
考慮すべき重要な点は、通常脆弱性の単一のエクスプロイトだけでは十分でないことです。特にいくつかの保護をバイパスする必要がある場合があります。したがって、単一の脆弱性を同じバイナリの実行中に複数回エクスプロイト可能にするいくつかのオプションを検討することが重要です:
- ROPチェーンに**
main
関数のアドレスまたは脆弱性が発生しているアドレス**を書き込む - 適切なROPチェーンを制御することで、そのチェーン内のすべてのアクションを実行できるかもしれません
exit
アドレスをGOT(または終了前にバイナリで使用される他の関数)に書き込んで脆弱性に戻るアドレスを指定する- .fini_arrayで説明されているように、ここに2つの関数を保存し、脆弱性を再度呼び出すための1つと
.fini_array
から再度関数を呼び出す**__libc_csu_fini
**のためのもう1つを保存します。
エクスプロイトの目標
目標:既存の関数を呼び出す
- ret2win:呼び出す必要のあるコード内の関数があります(おそらく特定のパラメータを使用して)。フラグを取得するために。
- PIEとcanaryなしの通常のbofでは、スタックに格納された戻りアドレスにアドレスを書き込むだけで済みます。
- PIEを使用するbofでは、バイパスする必要があります
- canaryを使用するbofでは、バイパスする必要があります
- ret2win関数を正しく呼び出すために複数のパラメータを設定する必要がある場合は、次のようにできます:
- ROPチェーン(十分なガジェットがある場合)を使用してすべてのパラメータを準備する
- SROP(このシステムコールを呼び出すことができる場合)を使用して多くのレジスタを制御する
- ret2csuおよびret2vdsoからのガジェットを使用して複数のレジスタを制御する
- Write What Whereを介して、他の脆弱性(bof以外)を悪用して**
win
**関数を呼び出すことができます。 - ポインタリダイレクト:スタックに関数へのポインタが含まれているか、興味深い関数(systemまたはprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることができます。
- ASLRまたはPIEはアドレスに影響を与える可能性があります。
- 未初期化変数:わからないことがあります。
目標:RCE
nxが無効になっている場合やシェルコードをROPと混在させる場合:
- (スタック)シェルコード:これは、スタックにシェルコードを保存してから、戻りポインタを上書きした後にそれにジャンプして実行するために役立ちます:
- 通常のbofで canaryがある場合は、バイパス(リーク)が必要です
- ASLRとnxがない場合、スタックのアドレスにジャンプできるため、そのアドレスにジャンプできます
- ASLRがある場合、ret2esp/ret2regなどのテクニックを使用してジャンプする必要があります
- nxがある場合、ROPを使用して
memprotect
を呼び出してページをrwx
にする必要があります。その後、そこにシェルコードを保存するために(たとえばreadを呼び出して)ジャンプする必要があります。 - これにより、シェルコードがROPチェーンと混在します。
シスコール経由
- Ret2syscall: 任意のコマンドを実行するために
execve
を呼び出すのに便利です。特定のシスコールをパラメータとともに呼び出すためのガジェットを見つける必要があります。 - もしASLRまたはPIEが有効になっている場合、バイナリやライブラリからのROPガジェットを使用するためにそれらを打破する必要があります。
- SROPはret2execveを準備するのに役立ちます。
- ret2csuやret2vdsoから複数のレジスタを制御するためのガジェット
libc経由
- Ret2lib: 通常は**
libc
からの関数(通常はsystem
)を呼び出すのに便利です。準備された引数(例:'/bin/sh'
)と共に。呼び出したい関数を含むライブラリをバイナリがロードする必要があります**。 - 静的にコンパイルされておりPIEがない場合、
system
と/bin/sh
のアドレスは変わらないため、それらを静的に使用することが可能です。 - ASLRなしでlibcのバージョンを知っている場合、
system
と/bin/sh
のアドレスは変わらないため、それらを静的に使用することが可能です。 - ASLRがあるがPIEがない場合、libcを知っていてバイナリが
system
関数を使用している場合、'/bin/sh'
のアドレスをパラメータとしてGOT
内のsystemのアドレスに**ret
する**ことが可能です(これを解決する必要があります)。 - ASLRがあるがPIEがない場合、libcを知っていてバイナリが
system
を使用していない場合: ret2dlresolve
を使用してsystem
のアドレスを解決し、それを呼び出す- ASLRをバイパスして、メモリ内の
system
と'/bin/sh'
のアドレスを計算します。 - ASLRがあり、PIEがあり、libcがわからない場合:次の手順が必要です:
- PIEをバイパスする
- 使用されている**
libc
バージョン**を見つける(いくつかの関数アドレスをリークさせる) - 続行するためにASLRの前のシナリオを確認します。
EBP/RBP経由
- Stack Pivoting / EBP2Ret / EBP Chaining: スタック内の保存されたEBPを介してESPを制御してRETを制御します。
- オフバイワンスタックオーバーフローに便利
- EIPを制御する代替手段として役立ち、EIPを悪用してメモリ内でペイロードを構築し、それにジャンプする方法
その他
- Pointers Redirecting: スタックに呼び出される関数へのポインタや、興味深い関数(systemやprintf)で使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
- ASLRまたはPIEがアドレスに影響を与える可能性があります。
- Uninitialized variables: 予測できません。