スクリプトブロックログを使って悪質なPowerShellを検出する

Security Splunk Threat Research Team

Splunk脅威調査チームは先日、悪質なPowerShellスクリプトの検出に役立つセキュリティコンテンツを生成するために、PowerShellのスクリプトブロックログに関するWindowsネイティブのイベントログを使用する方法を評価しました。この方法なら、PowerShellスクリプトの出力全体が「生の状態」で提供されるため、可視性をさらに向上できます。防御の強化に役立つソースには、モジュールログ、スクリプトブロックログ、トランスクリプトログの3つがあります。セキュリティコンテンツの生成では特に、スクリプトブロックログ(4104)に注目しました。このログを使用すれば、エンドポイントで実行されるPowerShellスクリプトを最も詳細に可視化できるためです。ただし、テストでの検証や本番環境で使用したい方、またはご興味のある方のために、3種類すべてのログを収集する方法もご紹介します。

各種ログの概要

トランスクリプトログの例
モジュールログの例
スクリプトブロックログの例

ハンティング分析

コンテンツの生成を開始したとき、私たち調査チームは、新しい分析で使用するキーワードを洗い出すために作成したデータセットの評価方法が必要だと考えました。そこで、使用されているすべての標準フレームワーク、具体的には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
説明
Detect Empire with PowerShell Script Block Logging
T1059.001
実行
デフォルトのPowerShell-Empireペイロードで常に使われる2つの値を検出します。
Detect Mimikatz With PowerShell Script Block Logging
T1059.001
実行
Mimikatzに関連するPowerShellスクリプトブロックコードでよく使われる文字列を検出します。
Powershell Fileless Process Injection via GetProcAddress
T1059.001、T1055
実行防御回避、権限昇格
スクリプトブロック内でのGetProcAddressの使用を検出します。
Powershell Fileless Script Contains Base64 Encoded Content
T1059.001、T1027
実行
スクリプトブロック内でのBase64の使用を検出します。
Unloading AMSI via Reflection
T1562
防御回避
スクリプトブロック内で、AMSIを無効にするエンコードされたコマンドでよく使われるsystem.management.automation.amsiを検出します。
PowerShell Domain Enumeration
T1059.001
実行
ドメインや信頼関係の列挙によく使われるコマンドを検出します。
PowerShell Loading .NET into Memory via System.Reflection.Assembly
T1059.001
実行
スクリプトブロック内で、悪質なPowerShellスクリプトの実行によく使われるsystem.reflection.assemblyの使用を検出します。
Powershell Creating Thread Mutex
T1027.005
防御回避
悪質なPowerShellスクリプトの実行によく使われるmutex関数を検出します。
Powershell Processing Stream Of Data
T1059.001
実行
イベントコード4104を介して、圧縮されたストリーミングデータを処理する不審なPowerShellスクリプトの実行を検出します。
Powershell Using memory As Backing Store
T1140
防御回避
スクリプトブロック内での、新規オブジェクトバックストアとしてのメモリーストリームの使用を検出します。
Recon AVProduct Through Pwh or WMI
T1592
偵察
エンドポイントにインストールされているウイルス対策製品を調べる不審なPowerShellスクリプトの実行を検出します。
Recon Using WMI Class
T1592
偵察
WMIでイベントクエリーを実行し、稼動中のプロセスまたはサービスを探す不審なPowerShellを検出します。
WMI Recon Running Process or Services
T1592
偵察
WMIでイベントクエリーを実行し、稼動中のプロセスまたはサービスを探す不審なPowerShellスクリプトの実行を検出します。
Allow Inbound Traffic In Firewall Rule
T1021.001
ラテラルムーブメント
パブリックプロファイルで特定のローカルポートへの受信トラフィックを許可する不審なPowerShellコマンドを検出します。
Mailsniper Invoke functions
T1114.001
収集
エンドポイントで実行される既知のmailsniper.ps1関数を検出します。
Delete ShadowCopy With PowerShell
T1490
影響
WMIC PowerShellモジュールを使ってシャドーコピーを削除するPowerShellコマンドを検出します。
Powershell Enable SMB1Protocol Feature
T1027.005
防御回避
PowerShellのスクリプトブロックログを使って、smb1protocolの有効化を検出します。
Detect WMI Event Subscription Persistence
T1546.003
権限昇格、永続化
永続化を確立するか権限昇格を実行するWMIイベントサブスクリプションを検出します。

ログを有効にする方法

PowerShellのログを有効にするには3つの方法があります。デプロイ方法によっては、または大規模なデプロイ環境では、レジストリかグループポリシーを使用するのがお勧めです。ラボ環境でのテストの場合は、どの方法でも問題ありません。

レジストリ

この方法は、デプロイまたはログインスクリプトを使用する場合に便利です。

PowerShellの動作ログは通常、次の場所にあります。

%SystemRoot%\system32\winevt\logs\Microsoft-Windows-PowerShell%4Operational.evtx

PowerShell

いずれのケースでも、Hurricane LabsではTim Ip氏が作成したスクリプトを参照し、流用、拡張しました。以下の機能を追加しています。

Invoke-SPLPowerShellAuditLoggingはこちらから入手できます。

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ログに関するさまざまな情報を参考にしました。主な情報源を以下に挙げます。

テスト

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を検出する)」でもご覧いただけます。

このブログはこちらの英語ブログの翻訳、横田 聡によるレビューです。

関連記事

セキュリティの脅威トップ50
セキュリティ
1 分程度

セキュリティの脅威トップ50

今日の脅威でよく用いられる戦術と技法を解説した実践的なガイド、『セキュリティの脅威トップ50』をご紹介します。
いま押さえておきたいサプライチェーン攻撃:AI悪用含む最新動向と対策
セキュリティ
10 分程度

いま押さえておきたいサプライチェーン攻撃:AI悪用含む最新動向と対策

近年、ターゲットの企業に直接攻撃を仕掛けるのではなく、その“サプライチェーン”を狙った攻撃が増えています。こうしたサプライチェーン攻撃にはさまざまな形態があり、攻撃手法ごとに求められる対策も異なります。本記事では、サプライチェーン攻撃の基本から最新動向、さらに具体的な対策のポイントまでを解説します。
Splunk、ガートナー社による2024年セキュリティ情報およびイベント管理のクリティカル・ケイパビリティにおいて全ユースケースで1位のスコアを獲得
セキュリティ
2 分程度

Splunk、ガートナー社による2024年セキュリティ情報およびイベント管理のクリティカル・ケイパビリティにおいて全ユースケースで1位のスコアを獲得

SplunkのSIEMソリューションは、ガートナー社による『2024年セキュリティ情報およびイベント管理のクリティカル・ケイパビリティ』レポートにおいて、3つすべてのユースケースで1位のスコアを獲得しました。