
ユーザランドエクスプロイトを使用してPPLのメモリをダンプする
⚠️ 2022-07-24 - Windows 10 21H2 10.0.19044.1826(2022年7月更新)以降、PPLdump に実装されているエクスプロイトは__動作しなくなりました__。NTDLL のパッチにより、PPL が Known DLL を読み込めなくなりました。詳細はこちら。
このツールは、James Forshaw(別名 @tiraniddo)がこのブログ記事で最初に議論した、管理者として__任意のPPLのメモリをダンプする__ための__ユーザーランド__エクスプロイトを実装しています。
このツールについて2つのブログ記事を書きました。前半は Protected Processes の概念について、後半はバイパス手法自体について説明しています。
引数なしで実行可能ファイルを実行するだけで、詳細なヘルプ/使用方法が表示されます。
c:\Temp>PPLdump64.exe
_____ _____ __ _
| _ | _ | | _| |_ _ _____ ___
| __| __| |__| . | | | | . | version 0.4
|__| |__| |_____|___|___|_|_|_| _| by @itm4n
|_|
Description:
Dump the memory of a Protected Process Light (PPL) with a *userland* exploit
Usage:
PPLdump.exe [-v] [-d] [-f] <PROC_NAME|PROC_ID> <DUMP_FILE>
Arguments:
PROC_NAME The name of a Process to dump
PROC_ID The ID of a Process to dump
DUMP_FILE The path of the output dump file
Options:
-v (Verbose) Enable verbose mode
-d (Debug) Enable debug mode (implies verbose)
-f (Force) Bypass DefineDosDevice error check
Examples:
PPLdump.exe lsass.exe lsass.dmp
PPLdump.exe -v 720 out.dmp
まず、PPLはWindows 8.1で導入されたため、古いバージョンのWindowsは明らかにサポートされていません。このプロジェクトは主にWindows 10(およびそのサーバーエディション)を対象としていますが、古いバージョンでもテストしました。テスト結果の要約表は同名のセクションにあります。
他のPPLバイパスツールは通常、デジタル署名されたドライバを介してカーネル内で任意のコードを実行します。このツールは、ユーザーランドのトリックのみを使用し、(ほぼ)ファイルレスである点が異なります。
このツールは、James Forshawが2018年に最初に議論した非常に巧妙なトリックを利用しています(クレジット参照)。DefineDosDevice API関数を使用して、システムを騙して任意のKnown DLLエントリを作成させます。PPLはKnown DLLのデジタル署名をチェックしないため、後でDLLハイジャック攻撃を実行し、PPL内部で任意のコードを実行するために使用できます。
このツールは第2段階としてDLLハイジャック攻撃を実行しますが、ディスク上に新しいDLLファイルを作成しません。代わりに、NTFSトランザクションを使用して既存のDLLの内容を仮想的に置き換えます。これは、@_ForrestOrrの研究から直接着想を得た手法です(クレジット参照)。
簡単に答えると「いいえ」です。まず、直接的なカーネルアクセスを伴わないため、その観点からBSODを引き起こすリスクはありません。最悪の場合、作成したKnown DLLエントリの削除に失敗する可能性がありますが、これはサービス拒否を引き起こしません。次のマシン再起動までそのまま残ります。作成されたエントリは存在しないセクションを指すシンボリックリンクに過ぎないため、システムは最終的にデフォルトの場所(つまり System32 フォルダ)にフォールバックするため、マシン上で実行されている他のプログラムには影響しません。
⚠️ 完全に更新されたWindows 8.1 / Server 2012 R2マシンではエクスプロイトが失敗します。どのパッチが原因かはまだ特定できていません。
[-] DefineDosDevice failed with error code 6 - The handle is invalid.
⚠️ Windows 8.1 / Server 2012 R2では、バイナリを静的にコンパイルする必要がある場合もあります(下記の「ビルド手順」を参照)。
このVisual Studioソリューションは2つのプロジェクト(実行可能ファイルとペイロードDLL)で構成されており、特定の順序でコンパイルする必要があります。すべて事前設定されているため、以下の簡単な手順に従うだけです。コンパイルされたペイロードDLLは、最終的な実行可能ファイルに自動的に埋め込まれます。
Release / x64 または Release / x86 を選択します。ビルド > ソリューションのビルド を選択します。Windows 8.1 / Server 2012 R2では、バイナリを静的にコンパイルする必要がある場合があります。
PPLdump プロジェクトを右クリックします。構成プロパティ > C/C++ > コード生成 に移動します。ランタイム ライブラリ オプションとして マルチスレッド (/MT) を選択します。| Windows バージョン | ビルド | エディション | アーキテクチャ | 管理者 | SYSTEM |
|---|
| Windows 10 20H2 | 19042 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 20H2 | 19042 | Pro | x86 | ✔️ | ✔️ |
| Windows 10 1909 | 18363 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Educational | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Home | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Pro | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Standard | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Essentials | x64 | ✔️ | ✔️ |
| Windows 8.1 | 9600 | Pro | x64 | ⚠️ | ⚠️ |
| Windows Server 2012 R2 | 9600 | Standard | x64 | ⚠️ | ⚠️ |