Splunk脅威調査チームは先日、悪質なPowerShellスクリプトの検出に役立つセキュリティコンテンツを生成するために、PowerShellのスクリプトブロックログに関するWindowsネイティブのイベントログを使用する方法を評価しました。この方法なら、PowerShellスクリプトの出力全体が「生の状態」で提供されるため、可視性をさらに向上できます。防御の強化に役立つソースには、モジュールログ、スクリプトブロックログ、トランスクリプトログの3つがあります。セキュリティコンテンツの生成では特に、スクリプトブロックログ(4104)に注目しました。このログを使用すれば、エンドポイントで実行されるPowerShellスクリプトを最も詳細に可視化できるためです。ただし、テストでの検証や本番環境で使用したい方、またはご興味のある方のために、3種類すべてのログを収集する方法もご紹介します。
各種ログの概要
- トランスクリプトログ:Microsoft社の説明によると、トランスクリプトログには、入力中のユーザーの画面を再現するかのようにPowerShellセッションで起きていることが記録されます。このログを見れば、ユーザーが入力したコマンドとその出力がわかります。多くの組織にとってはこのログの情報量が多すぎるため、フィルタリングをするか(Splunkの場合はSplunk UFを使用するなど)、重要な資産についてのみログを有効にする必要があるでしょう。次の図に、このログの例を示します。
- モジュールログ:モジュールログは少し特異なログで、コマンドの呼び出しとスクリプトの一部が記録されます。実行内容や結果がすべて記録されるとは限りません。イベントコードは4103です。次の図に、このログの例を示します。
- スクリプトブロックログ:このログには、コマンドラインから送られるか、関数、スクリプト、ワークフローなどにラップされた、難読化解除された生のスクリプトが記録されます。たとえば攻撃を受けたとき、エンコードされたPowerShellスクリプトやコマンドが実行されるたびに、スクリプトブロックログにそのデータが生の形式で記録されます。イベントコードは4104です。次の図に、このログの例を示します。
ハンティング分析
コンテンツの生成を開始したとき、私たち調査チームは、新しい分析で使用するキーワードを洗い出すために作成したデータセットの評価方法が必要だと考えました。そこで、使用されているすべての標準フレームワーク、具体的にはEmpire、Cobalt Strike、Metasploit、Atomic Red Team、AtomicTestHarnessesを利用しました。スクリプトブロックログには大量のデータが記録されるため、新しい分析に使用するキーワードを絞り込みすぎないように注意しました。今回のリリースでは、4104イベントデータの検索に役立つハンティング分析を公開します。この検出では、不審なPowerShellの使用を最大限に検出できるように、2つのクエリー(Alex Teixeira氏提供)を結合しています。この検出は、こちらのセキュリティコンテンツリポジトリから入手できます。
私たちはデータを調べるうちに、各キーワードにスコアを追加するとより効果的であることに気づきました。その鍵を握っているのが各「eval」です。今回は、忠実度に基づいてスコアを設定しています。「$DoIt」はCobalt Strikeで使用される関数なので、スコアは4に設定しました。また、「IEX」などのキーワードは比較的よく使用されるので、スコアは2に設定しました。次の図に、疑わしいPowerShellスクリプトを検出するために使用しているスコアの例を示します。evalステートメントをコピー&ペーストすれば、新しいキーワードを簡単に追加できます。今回の例はすべてを網羅しているわけではありませんが、詳細な調査の出発点として役立つでしょう。
検出
調査の手間をかけた甲斐あって、かなりの数の新しい分析を作成できました。これらを基に、GitHubのイシューまたはPRからコントリビューションを通じてカバー範囲を広げ、コミュニティに貢献していただけたら幸いです。
分析 |
Technique |
Tactic |
説明 |
T1059.001 |
デフォルトのPowerShell-Empireペイロードで常に使われる2つの値を検出します。 |
||
T1059.001 |
Mimikatzに関連するPowerShellスクリプトブロックコードでよく使われる文字列を検出します。 |
||
T1059.001、T1055 |
スクリプトブロック内でのGetProcAddressの使用を検出します。 |
||
T1059.001、T1027 |
スクリプトブロック内でのBase64の使用を検出します。 |
||
T1562 |
スクリプトブロック内で、AMSIを無効にするエンコードされたコマンドでよく使われるsystem.management.automation.amsiを検出します。 |
||
T1059.001 |
ドメインや信頼関係の列挙によく使われるコマンドを検出します。 |
||
PowerShell Loading .NET into Memory via System.Reflection.Assembly |
T1059.001 |
スクリプトブロック内で、悪質なPowerShellスクリプトの実行によく使われるsystem.reflection.assemblyの使用を検出します。 |
|
T1027.005 |
悪質なPowerShellスクリプトの実行によく使われるmutex関数を検出します。 |
||
T1059.001 |
イベントコード4104を介して、圧縮されたストリーミングデータを処理する不審なPowerShellスクリプトの実行を検出します。 |
||
T1140 |
スクリプトブロック内での、新規オブジェクトバックストアとしてのメモリーストリームの使用を検出します。 |
||
T1592 |
エンドポイントにインストールされているウイルス対策製品を調べる不審なPowerShellスクリプトの実行を検出します。 |
||
T1592 |
WMIでイベントクエリーを実行し、稼動中のプロセスまたはサービスを探す不審なPowerShellを検出します。 |
||
T1592 |
WMIでイベントクエリーを実行し、稼動中のプロセスまたはサービスを探す不審なPowerShellスクリプトの実行を検出します。 |
||
T1021.001 |
パブリックプロファイルで特定のローカルポートへの受信トラフィックを許可する不審なPowerShellコマンドを検出します。 |
||
T1114.001 |
エンドポイントで実行される既知のmailsniper.ps1関数を検出します。 |
||
T1490 |
WMIC PowerShellモジュールを使ってシャドーコピーを削除するPowerShellコマンドを検出します。 |
||
T1027.005 |
PowerShellのスクリプトブロックログを使って、smb1protocolの有効化を検出します。 |
||
T1546.003 |
永続化を確立するか権限昇格を実行するWMIイベントサブスクリプションを検出します。 |
ログを有効にする方法
PowerShellのログを有効にするには3つの方法があります。デプロイ方法によっては、または大規模なデプロイ環境では、レジストリかグループポリシーを使用するのがお勧めです。ラボ環境でのテストの場合は、どの方法でも問題ありません。
レジストリ
この方法は、デプロイまたはログインスクリプトを使用する場合に便利です。
- スクリプトブロックログを有効にする
- HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell \ScriptBlockLogging
- EnableScriptBlockLogging = 1
- HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell \ScriptBlockLogging
- モジュールログを有効にする
- HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\ModuleLogging
- EnableModuleLogging = 1
- HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\ModuleLogging \ModuleNames
- * = *
- HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\ModuleLogging \ModuleNames
- トランスクリプションを有効にする
- HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\Transcription\
- EnableInvocationHeader = 1
- EnableTranscripting = 1
- OutputDirectory = <path_to_directory>
- HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\Transcription\
PowerShellの動作ログは通常、次の場所にあります。
%SystemRoot%\system32\winevt\logs\Microsoft-Windows-PowerShell%4Operational.evtx
PowerShell
いずれのケースでも、Hurricane LabsではTim Ip氏が作成したスクリプトを参照し、流用、拡張しました。以下の機能を追加しています。
- PowerShellログの1つまたはすべての取得方法の有効化
- トランスクリプトログとPowerShell動作ログを記録する新しいinputs.confの作成
- すべてのログの無効化
- コマンドラインからのプロセス作成(4688)の有効化
Invoke-SPLPowerShellAuditLoggingはこちらから入手できます。
Splunkユニバーサルフォワーダーで現在使用しているWindows inputs.confを更新するか、Invoke-SPLPowerShellAuditLoggingを使って入力ファイルを作成します。
[WinEventLog://Microsoft-Windows-PowerShell/Operational] source = XmlWinEventLog:Microsoft-Windows-PowerShell/Operational renderXml = 0 disabled = false index = win
[monitor://c:\pstransactions\] sourcetype = powershell:transcript disabled = false multiline_event_extra_waittime = true time_before_close = 300 index = win
`Invoke-SPLPowerShellAuditLogging -method CreateInputs`
グループポリシーオブジェクトを使ってログを有効にする
より大規模な環境でポリシーを詳細に管理したい場合は、グループポリシー管理コンソールで新規オブジェクトを作成するか既存のオブジェクトを変更し、[コンピューターの構成] > [ポリシー] > [管理用テンプレート] > [Windowsコンポーネント] > [Windows PowerShell]に移動します。
ここで、目的のポリシーを有効にして、ログを開始します。重要な資産にのみ有効にすることも、必要であればすべての資産に有効にすることもできます。
この作業については、PowerShellログに関するさまざまな情報を参考にしました。主な情報源を以下に挙げます。
- Get Data into Splunk User Behavior Analytics - PowerShellログ
- Blueteam Powershell Recommendations
- PowerShell ♥ the Blue Team - Microsoft社
- about_Logging - Microsoft Docs
- Greater Visibility Through PowerShell Logging - FireEye社
- How to Use PowerShell Transcription Logs in Splunk - Hurricane Labs
- Hurricane Labs Add-on for Windows PowerShell Transcript
- How to detect suspicious PowerShell activity with Splunk? - Alex Teixeira氏
テスト
Atomic Red Team:Atomic Red TeamでInvoke-AtomicRedTeamを使って、PowerShellコマンドを簡単にシミュレートできます。まずは、こちらのWikiで詳細を確認してください。
ラボ設定または認可されたデバイスで、次のコマンドを実行して作業を開始します。
IEX (IWR 'https://raw.githubusercontent.com/redcanaryco/invoke-atomicredteam/master/install-atomicredteam.ps1' -UseBasicParsing);
Install-AtomicRedTeam -getAtomics -force
これにより、Invoke-AtomicRedTeamがインストールされます。その後、Atomic Red TeamからT1059.001を実行できます。
invoke-AtomicTest T1059.001
データが足りない場合は、AtomicTestHarnessesの使用を検討してください。
Out-ATHPowerShellCommandLineParameter -GenerateAllParamVariations -UseEncodedCommandParam -Execute
詳細情報
詳細は、オンデマンドのSplunk Tech Talk「Hunting for Malicious PowerShell using Script Block Logging (スクリプトブロックログを使って悪質なPowerShellを検出する)」でもご覧いただけます。