


Revoke-Obfuscationは、PowerShell v3.0以上に対応したPowerShell難読化検出フレームワークです。
Daniel Bohannon (@danielhbohannon) Lee Holmes (@Lee_Homes)
ブログ記事:https://www.fireeye.com/blog/threat-research/2017/07/revoke-obfuscation-powershell.html
ホワイトペーパー:https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/revoke-obfuscation-report.pdf
2016年秋から2017年春にかけて、Daniel Bohannon(@danielhbohannon)は、Invoke-ObfuscationとInvoke-CradleCrafterという2つのオープンソースPowerShell難読化フレームワークを公開しました。この研究とフレームワークの目的は、攻撃者によるPowerShellの利用を検出するための純粋なシグネチャベースのアプローチの限界を浮き彫りにすることでした。防御者への核となるメッセージは、既知の怪しい構文に加えて難読化の兆候を検出することに焦点を当てるというものでした。
しかし、Invoke-ObfuscationとInvoke-CradleCrafterにおける極端なランダム化と、PowerShellのスクリプトブロックログでデオブフスケーションされないトークンレイヤーの難読化オプションの組み合わせにより、防御者は既知および未知の難読化手法を汎用的に検出するための新しくスケーラブルな手段を模索するようになりました。
Invoke-Obfuscationの公開から数週間後、Lee Holmes(@Lee_Homes)は「More Detecting Obfuscated PowerShell」と題したブログ記事を執筆し、その中で高度に難読化されたスクリプト(特にInvoke-Obfuscationが生成したもの)に見られる異常な特徴を検出するための統計分析手法を紹介しました。
このやり取り以降、DanielとLeeは親友となり、多くの共通の関心・執念を共有するようになりました。それは、上質なコーヒーへの愛情と、難読化されたPowerShellを徹底的に検出する新しい方法の追求です。
両ブルーチーマーが研究と概念実証コードに費やした時間は、適切な4分間の抽出時間を想定した場合(少なくとももう一人のコーヒー愛好家がこの「pour over」ダジャレに気づいたと仮定して)、数千杯のChemex抽出コーヒーに相当するでしょう。
Revoke-Obfuscationは、こうした努力の最終的な手作り製品です。
Revoke-Obfuscationは、スケーラブルに難読化されたPowerShellコマンドやスクリプトを検出するためのオープンソースのPowerShell v3.0以上フレームワークです。PowerShellのAST(抽象構文木)を利用して、入力されたPowerShellスクリプトから数千の特徴量を迅速に抽出し、この特徴ベクトルを、40万8000以上のPowerShellスクリプトのコーパスに対して自動学習プロセスによって計算された、いくつかの事前定義された重み付き特徴ベクトルのいずれかと比較します。完全なコーパスは(https://aka.ms/PowerShellCorpus)からダウンロードできます。この研究のデータサイエンス面の詳細は、リポジトリの「DataScience」サブディレクトリにあります。
Revoke-Obfuscationは純粋なIOCや正規表現マッチングではなく、特徴量抽出と比較に依存しているため、攻撃者が文字頻度分析のような基本的なチェックを無効にするために難読化されていないスクリプト内容で難読化を埋め込もうとしても、未知の難読化手法を識別する能力がより堅牢です。
Revoke-Obfuscationは、ほとんどの入力PowerShellスクリプトを100〜300ミリ秒で簡単に測定できます。このパフォーマンスレベルにより、組織は(最悪の場合)1時間あたり1万2000以上のPowerShellスクリプトの難読化を測定でき、SIEMで冗長なPowerShellスクリプトブロックログをインデックス化する必要はありません。
最後に、Revoke-Obfuscationは簡単なホワイトリスト機能をサポートしており、PowerShell Operationalイベントログレコードを取り込み、複数のスクリプトブロックEID 4104レコードにわたって記録されたスクリプトブロックを再構築することもできます。環境のPowerShell Operationalイベントログを取り込み、それらのログ内のすべてのスクリプトを再構築してユニーク化し、手動検査が必要な難読化されたPowerShellスクリプトを特定するためのワンストップショップとして簡単に機能します。
Revoke-ObfuscationのソースコードはGithubでホストされており、このリポジトリ(https://github.com/danielbohannon/Revoke-Obfuscation)からダウンロード、フォーク、レビューできます。問題や機能リクエストは、このプロジェクトに関連するGithubのバグトラッカーを通じて報告してください。
インストールするには(Githubから):
Import-Module .\Revoke-Obfuscation.psd1
ソースコードは、PowerShellギャラリーから以下のコマンドで直接インストールすることもできます。
インストールするには(PowerShellギャラリーから):
Install-Module Revoke-Obfuscation
Import-Module Revoke-Obfuscation
Revoke-Obfuscation は詳細なチュートリアルと、いくつかの楽しいサプライズを提供します。しかし、そういうのが好みでなければ、単に Get-Help Measure-RvoObfuscation を実行して使用法の構文を確認するか、このまま読み進めてください。
このフレームワークで使用される主な関数は2つです:
PowerShell Operationalログからスクリプトブロックログを再構築して抽出する必要がある場合は、Get-RvoScriptBlock が適切な関数です。この関数は自動的にユニークなスクリプトブロックのみを返し、悪意がないと判断された特定のデフォルトスクリプトブロック値を除外します。これは -Deep スイッチでオーバーライドできます。
Get-RvoScriptBlock -Path 'C:\Windows\System32\Winevt\Logs\Microsoft-Windows-PowerShell%4Operational.evtx' -VerboseGet-ChildItem .\Demo\demo.evtx | Get-RvoScriptBlock -VerboseGet-WinEvent -LogName Microsoft-Windows-PowerShell/Operational | Get-RvoScriptBlock -VerboseGet-RvoScriptBlock は、MIR/HX監査結果や、Matt Graeber(@mattifestation)のCimSweepプロジェクト(https://github.com/PowerShellMafia/CimSweep)を介して取得されたPowerShell Operationalログもサポートしています。CimSweepでは、WMIが非クラシックイベントログをクエリできるようにするための軽微なレジストリ調整が必要です。詳細は Get-RvoScriptBlock のNOTESセクションにあります。
Get-ChildItem C:\MirOrHxAuditFiles\*_w32eventlogs.xml | Get-RvoScriptBlock -VerboseGet-CSEventLogEntry -LogName Microsoft-Windows-PowerShell/Operational | Get-RvoScriptBlockdemo.evtx に記録されたテストデータに対する完全な例は以下の通りです:
$obfResults = Get-WinEvent -Path .\Demo\demo.evtx | Get-RvoScriptBlock | Measure-RvoObfuscation -OutputToDisk -Verbose
ローカルおよびリモートでホストされているテストスクリプトに対する完全な例は以下の通りです:
Measure-RvoObfuscation -Url 'http://bit.ly/DBOdemo1' -Verbose -OutputToDiskGet-Content .\Demo\DBOdemo*.ps1 | Measure-RvoObfuscation -Verbose -OutputToDiskGet-ChildItem .\Demo\DBOdemo*.ps1 | Measure-RvoObfuscation -Verbose -OutputToDisk-OutputToDisk スイッチは、難読化されたすべてのスクリプトを自動的に .\Results\Obfuscated\ に出力します。いずれの場合も、すべての結果はPSCustomObjectとして返され、スクリプト内容とともに、難読化スコア、測定時間、ホワイトリスト結果、抽出されたすべてのスクリプト特徴量などのメタデータが含まれます。
Revoke-Obfuscationには、ホワイトリストオプションが3つ、2か所に存在します:
-WhitelistFile .\files\*.ps1,.\more_files\*.ps1,.\one_more_file.ps1-WhitelistContent 'string 1 to whitelist','string 2 to whitelist'-WhitelistRegex 'regex 1 to whitelist','regex 2 to whitelist'独自のトレーニングデータセットを作成し、Measure-Vector関数用の重み付きベクトルを生成することに興味がある場合は、ModelTrainer.cs/ModelTrainer.exeをラベル付きデータセットに対して実行できます。以下のコマンドは、すべての入力スクリプトから特徴ベクトルを抽出し、このトレーニングフェーズで使用される単一のCSVに集約します:
Get-ChildItem .\*.ps1 | ForEach-Object { [PSCustomObject](Get-RvoFeatureVector -Path $_.FullName) | Export-Csv .\all_features.csv -Append }
最後に、PowerShellのAST(抽象構文木)の力を活用したインジケーター(IOC)を作成するためのプラットフォームを探している場合(難読化されていない悪意のあるPowerShellアクティビティを識別するために強くお勧めします)、PS Script Analyzerはそのようなタスクを処理するために設計された優れたフレームワークです。
Revoke-ObfuscationはApache 2.0ライセンスの下でリリースされています。
v1.0 - 2017-07-27 Black Hat USA & 2017-07-30 DEF CON: Revoke-Obfuscationのパブリックリリース。