SECURITY

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

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

説明

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

レジストリ

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

  • スクリプトブロックログを有効にする
    • HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell \ScriptBlockLogging
      • EnableScriptBlockLogging = 1
  • モジュールログを有効にする
    • 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\Transcription\
      • EnableInvocationHeader = 1
      • EnableTranscripting = 1
      • OutputDirectory = <path_to_directory>

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

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

PowerShell

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

  • PowerShellログの1つまたはすべての取得方法の有効化
  • トランスクリプトログとPowerShell動作ログを記録する新しいinputs.confの作成
  • すべてのログの無効化
  • コマンドラインからのプロセス作成(4688)の有効化
     

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

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

 

The Splunk Threat Research Team is an active part of a customer’s overall defense strategy by enhancing Splunk security offerings with verified research and security content such as use cases, detection searches, and playbooks. We help security teams around the globe strengthen operations by providing tactical guidance and insights to detect, investigate and respond against the latest threats. The Splunk Threat Research Team focuses on understanding how threats, actors, and vulnerabilities work, and the team replicates attacks which are stored as datasets in the Attack Data repository

Our goal is to provide security teams with research they can leverage in their day to day operations and to become the industry standard for SIEM detections. We are a team of industry-recognized experts who are encouraged to improve the security industry by sharing our work with the community via conference talks, open-sourcing projects, and writing white papers or blogs. You will also find us presenting our research at conferences such as Defcon, Blackhat, RSA, and many more.


Read more Splunk Security Content