Lsass メモリからのパスワード盗難の手口の高度化 - パート2
以前の記事では、資格情報抽出のためにLSASSメモリをダンプする多数の方法を詳しく説明しましたが、今回はエンドポイントに新しいツールを落とさずにLSASSをダンプする新しい手口を紹介します。
MITRE テクニック番号: T1003.001
技術概要
WerFault.exe(プロセス・クラッシュを処理するWindowsエラー報告プロセス)を使用してlsass.exeのメモリ・ダンプを任意の場所に作成する手口をご紹介します。この方法の最大の利点は、lsass.exeをクラッシュさせないことです。また、WerFault.exeは常にファイル・ダンプを作成するために使用されるため(lsass.exeだけではありません)、この方法は検出されないという利点があります。 WerFault.exeは、すべてのクラッシュプロセスをダンプすることで知られるプロセスです。攻撃者の観点でいうと、セキュリティからは通常の活動の範囲内で、不正なクレデンシャル抽出とは見えにくいため、これは魅力的です。
この方法は、Windows 7で導入された サイレントプロセス終了と呼ばれるメカニズムに依存しています。これは、2つのシナリオのいずれかで監視されているプロセスの特定のアクションをトリガーする機能を提供します:ExitProcess()を呼び出してプロセス自身を終了させるか、別のプロセスが TerminateProcess() API を介して終了させるかのいずれかです。
サイレントプロセスの終了時に発生するように設定できる複数のアクションがあります。
- モニタプロセスを起動
- ポップアップを表示
- ダンプファイルの作成
1つ目のオプション永続化のメカニズムとして使用することができます。今回は調査のために、lsassをダンプする3つ目のオプションを使用する方法を説明します。
サイレント終了監視のためのプロセスをセットアップするには、いくつかのレジストリ設定を設定する必要があります:
-
- 以下のフラグを含む、プロセスのイメージファイル実行オプションの GlobalFlag をセットします
FLG_MONITOR_SILENT_PROCESS_EXIT (0x200)
- 以下のフラグを含む、プロセスのイメージファイル実行オプションの GlobalFlag をセットします
2. SilentProcessExit は以下のいずれかで設定します:
a. グローバル設定の以下キーの配下:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit
b. アプリケーション固有の設定の以下キーの配下:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\ProcessName
SilentProcessExit の設定はレジストリ値で設定されています:
ReportingMode (REG_DWORD) – 以下フラグのビット演算:
- LAUNCH_MONITORPROCESS (0x1) – モニター・プロセスを起動
- LOCAL_DUMP (0x2) – 終了の原因となったプロセスと終了したプロセスのダンプファイルを作成
- NOTIFICATION (0x4) – ポップアップ通知を表示
LocalDumpFolder (REG_SZ) – ダンプ・ファイルが作成されるディレクトリ、デフォルトの場所は %TEMP%Silent Process Exit
DumpType –MINIDUMP_TYPE enumに従ってダンプファイルのタイプ (Micro、Mini、Heap、またはCustom) を指定、フルミニダンプは MiniDumpWithFullMemory (0x2) の値を指定
では、SilentProcessExit レジストリ設定で LSASS.exe が自分自身をダンプするように設定されていて、lsass.exe が kill されるか、コンピュータがシャットダウンされるとどうなるのでしょうか?
では実際に、タスクキルを使用して lsass を終了させます。すると、Windowsはlsass.exeがシャットダウンされることを嫌うため、このメッセージが表示されます:
A warning like this is problematic for an endpoint user to see during an attempt to gather credentials, but it does provide a new directory under C:\temp, which contains the full memory dump of lsass.
このような警告がエンドポイント・ユーザが見られてしまうのは問題ですが、これによってC:\temp の下に新しいディレクトリを作成し、そこには lsass の完全なメモリダンプが含まれています。
やりました!
また、lsass.exe を終了する代わりにコンピュータをシャットダウンした場合、通常はアクセスできない taskkill.exe のダンプも取得されます。これは、サイレント・プロセス終了メカニズムが終了を開始したプロセスも同様にダンプされるために発生しました。
ここで疑問なのは、プロセスはどのようにしてダンプされるのかということです。Hexacornのブログのおかげで、プロセスが終了すると、ntdll.dllからRtlReportSilentProcessExit() APIを呼び出し、Windowsエラー報告サービス(WERSvcGroupの下のWERSvc)にプロセスがサイレント終了を実行していることを伝えることがわかっています。WER サービスはその後 WerFault.exe を起動し、終了するプロセスのダンプを行います。興味深いのは、このAPIを呼び出してもプロセスが終了しないことです。これにより、ファイル・ダンプを取得するために lsass.exe でこのプロセスを実行しますが、lsass を終了させることはありませんでした。
ここに RtlReportSilentProcessExit() 関数の定義があります:
<span style="color: #119fc2;">NTSTATUS</span><span style="color: #9d73c7;">(NTAPI</span>* <span style="color: #00ccff;"><span style="color: #119fc2;">RtlReportSilentProcessExit</span><span style="color: #000000;">)</span></span> ( <span style="color: #9d73c7;">_In_ </span> <span style="color: #119fc2;">HANDLE</span> ProcessHandle, <span style="color: #9d73c7;">_In_</span> <span style="color: #119fc2;">NTSTATUS</span> ExitStatus );
しかし、もしLSASSの外部からLSASS.exeのProcessHandleを供給するとどうなるでしょうか?
この方法でRtlReportSilentProcessExitを呼び出すには、PROCESS_VM_READ権限を持つlsass.exeへのハンドルが必要になり、SeDebugPrivilege権限も必要になりますが、そうでなければ、ダンプファイルは作成されますが、中身はありません。さらに、x64 lsass プロセスへのハンドルを開くには、x64 プロセスが必要です。
作成したテストプログラムを使用して、作成されたダンプ・ファイルを見ることができます:
素晴らしい!
これで、自分のプロセスの不要なダンプを削除して、lsass ダンプを攻撃者サーバに送信して、パスワード情報を抽出してもらうことができます。
しかし、さらに進んで、lsass.exe 自身でダンプを作成するように強制することはできるでしょうか?lsass.exe で CreateRemoteThread を使用して、RtlReportSilentProcessExit を実行させることができました:
ほら、Lsass.exe自身のダンプ・ファイルです!
EDRの観点からは、lsass.exeがWERから自身のダンプを要求したように見えます。WERはとにかくダンプ・ファイルを作成するWindowsのメカニズムなので、誤検出を減らすためにlsass.exeのダンプ・ファイルを作成するプロセスとしてホワイトリストに登録されている可能性が高いです。
これらの両方の方法を実行するコードは、GitHub のレポジトリにあります。
解決方法の提案
次のセクションでは、lsass.exeプロセスのダンプを検出するための対策を詳しく説明します。
レジストリの監視
GlobalFlagのレジストリ値作成ルールを設定しました:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\lsass.exe
GlobalFlag REG_DWORD 0x200
GlobalFlag はビット演算であることに注意してください。
次のレジストリ・キーもまた、作成および変更のために監視する必要があります:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\lsass.exe
ファイルの監視
以下のパターンのファイル名を持つものに対して、ファイル作成の検知ルールを設定します:
“lsass*.dmp”
RunAsPPL
Windows のProcess Protected Light (PPL) を使用して lsass.exe プロセスを起動する機能を有効にし、非 PPL プロセスが OpenProcess() を使用して lsass.exe にアクセスすることを防ぎます。これは、この記事で説明されているすべての方法を無効にします (フル・メモリ・ダンプ・メソッド以外)。以下のレジストリ値を設定する必要があります:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
RunAsPPL REG_DWORD 0x1
この方法の欠点は、lsass.exeを設定すると、既知の良性の認証パッケージを含むサードパーティ製のDLLのロードが阻止されることです。例えば、組織がスマートカードソリューションを利用している場合、これはよい方法ではありません。
この攻撃ベクトルが不明瞭であるため、利用可能な AV や EDR ソリューションにはこれらの検出と緩和の設定はなく、手動で設定する必要があります。近日公開予定の次期バージョンでは、Deep Instinctの顧客は、クレデンシャルダンピングヒューリスティック内でこの手法から自動的に保護 されることを期待することができます。
まとめ
LSASSのメモリをダンプする多数の手法は、攻撃者にウイルス対策製品やEDRによって検出されないようにするための様々なオプションを提供します。私たちがLSASSのプロセスダンプをディスクに取得するために導入したこの新しい方法は、WERを使用することで不正なメモリ抽出を良性に見えるようにするという付加的な利点がある一方で、これまでは利用されたことがありませんでした。 多くのセキュリティ環境でファイルダンププロセスが見えなくなっている可能性があり、ハッカーにとっては絶好のチャンスとなります。