Invoke-Obfuscation v1.8

はじめに
Invoke-Obfuscation は PowerShell v2.0+ 互換の PowerShell コマンドおよびスクリプト難読化ツールです。
背景
2015 年の秋、私は PowerShell 言語の柔軟性の研究を始め、ほとんどの攻撃者が日常的に使用する一般的なテクニックを達成するためのさまざまな方法のカタログ化を開始しました。
最初はエンコードされたコマンドとリモートダウンロードクレードルの構文に焦点を当てていました。そこで、コマンドの実行を妨げないさまざまなエスケープ文字が、実行中のプロセスだけでなく、Security EID 4688 や Sysmon EID 1 イベントログに記録されるものにも、コマンドライン引数に残ることを発見しました。このことから、PowerShell のコマンドやスクリプトに含まれるあらゆる種類の「トークン」を難読化する方法を体系的に探求するようになりました。
その後、文字レベルの難読化を実行するためのより難解な方法、さまざまなエンコード/暗号化手法(ASCII/hex/octal/binary、SecureString など)、そして最後に、powershell.exe からコマンドライン引数を抽象化し、親プロセスや祖父母プロセスに押し戻すための PowerShell 起動テクニックを探求しました。
目的
攻撃者やマルウェアは、powershell.exe のコマンドライン引数からコマンドの大部分を隠すために、非常に基本的な難読化手法を使い始めています。私はこのツールを、現在 PowerShell 2.0-5.0 で構文的に可能であると知られている難読化コマンドをシミュレートすることで、ブルーチームがこれらの手法の検出能力をテストできるように支援するために開発しました。
このツールの唯一の目的は、PowerShell コマンドがコマンドラインにどのように現れるかについて、防御者として私たちが持つ可能性のある前提を打ち破ることです。このツールが、ブルーチームが PowerShell ログを更新してモジュール、スクリプトブロック、文字起こしログを含めることに加えて、コマンドライン上の難読化の指標を探すようにシフトすることを促すことを願っています。これらのソースは、このツールによって生成される難読化手法のほとんどの側面を簡素化するためです。
使用方法
難読化のすべてのレイヤーは別々のスクリプトに組み込まれていますが、ほとんどのユーザーは Invoke-Obfuscation 関数が、このフレームワークが現在サポートしている難読化手法を探求し可視化する最も簡単な方法だと感じるでしょう。
インストール
Invoke-Obfuscation のソースコードは Github でホストされており、このリポジトリ (https://github.com/danielbohannon/Invoke-Obfuscation) からダウンロード、フォーク、レビューできます。問題や機能リクエストは、このプロジェクトに関連する Github のバグトラッカーを通じて報告してください。
インストール方法:
Import-Module ./Invoke-Obfuscation.psd1
Invoke-Obfuscation
ライセンス
Invoke-Obfuscation は Apache 2.0 ライセンスの下でリリースされています。
リリースノート
v1.0 - 2016-09-25 DerbyCon 6.0 (Louisville, Kentucky USA): Invoke-Obfuscation の公開リリース。
v1.1 - 2016-10-09 SANS DFIR Summit (Prague, Czech Republic): 該当するすべての TOKEN 難読化関数に -f フォーマット演算子の並べ替え機能を追加。また、変数値の設定に関する追加の構文オプションを追加。
v1.2 - 2016-10-20 CODE BLUE (Tokyo, Japan): タイプ TOKEN 難読化を追加(型名に文字列難読化オプションを伴う直接型キャスト)。
v1.3 - 2016-10-22 Hacktivity (Budapest, Hungary): 2 つの新しい LAUNCHER (CLIP+ と CLIP++) を追加。また、For-EachObject/% を必要としない、すべての ENCODING 関数向けの追加の(よりシンプルな)配列文字変換構文を追加。
v1.4 - 2016-10-28 BruCON (Ghent, Belgium): 新しい BXOR ENCODING 関数を追加。また、すべての ENCODING 関数のすべてのコンポーネント、およびすべての LAUNCHER の PowerShell 実行フラグに対して、ランダム化された大文字小文字を強化。さらに、すべての LAUNCHER に -ExecutionPolicy の -EP 短縮オプション、および PowerShell 実行フラグ -WindowStyle のオプションの整数表現 (Normal (0)、Hidden (1)、Minimized (2)、Maximized (3)) を追加。
v1.5 - 2016-11-04 Blue Hat (Redmond, Washington USA): WMIC コマンドライン引数の一部をランダム化した WMIC LAUNCHER を追加。
v1.6 - 2017-01-24 Blue Hat IL (Tel Aviv, Israel):
- CLI 機能を追加:
例: Invoke-Obfuscation -ScriptBlock {Write-Host 'CLI FTW!'} -Command 'Token\All\1,Encoding\1,Launcher\Stdin++\234,Clip' -Quiet -NoExit
- UNDO 機能を追加。一度に 1 つの難読化レイヤーを削除します。
- Token\All\1 から空白難読化を削除し、大きなスクリプトの難読化を高速化。
- 防御者を支援するために、すべてのランチャーにプロセス引数ツリー出力を追加。
- HOME や BACK を使用する必要がないように、ベースメニューの自動検出機能を追加:
例: TOKEN、ALL、1 を実行した場合、HOME や BACK を使ってホームメニューに戻らなくても、LAUNCHER と入力するだけで LAUNCHER メニューに移動できます。
- CLI およびインタラクティブモードで使用されるマルチコマンド構文を追加:
例: Token\All\1,String\3,Encoding\5,Launcher\Ps\234,Clip
- すべてのメニューおよび難読化コマンドに正規表現機能を追加:
例: Token**,String[13],Encoding(1|6),Launcher.*[+]{2}\234,Clip
- 単一コマンドの OUT FILEPATH 機能を追加。
- SCRIPTBLOCK 値として powershell -enc 構文が入力された場合のデコード機能を追加。
- すべての ENCODING 関数における ForEach-Object/% のランダム化された構文オプションとして、エイリアス ForEach を追加。
- Out-SecureStringCommand.ps1 に -Key -Ke -K KEY サブストリング構文オプションを追加。
- すべての \Home\String 難読化関数に、より徹底した大文字小文字のランダム化を追加。
- CLIP+ および CLIP++ ランチャー関数に -ST/-STA (シングルスレッドアパートメント) フラグを追加。PowerShell 2.0 で実行する場合に必要です。
- 変数値を取得するために Get-ChildItem が使用されるすべての場所に Get-Item/GI/Item 構文を追加。
- TYPE 難読化関数に Set-Item 変数インスタンス化構文を追加。
- Out-ObfuscatedStringCommand.ps1 の Out-EncapsulatedInvokeExpression 関数において、PowerShell 自動変数と環境変数値の連結を使用した追加の Invoke-Expression/IEX 構文を追加し、すべてのランチャー、STRING、ENCODING 関数にコピーして、IEX の多数のコマンドライン構文を追加。
- String\Reverse およびすべての ENCODING 難読化オプションに 2 つの新しい JOIN 構文を追加:
- [String]::Join('',$string) JOIN 構文
- OFS 変数 JOIN 構文 (出力フィールド区切り自動変数)
- Encoding\5 にさらに 2 つの SecureString 構文を追加:
- PtrToStringAnsi / SecureStringToGlobalAllocAnsi
- PtrToStringBSTR / SecureStringToBSTR
- いくつかの SecureString メンバーに対して 6 つの GetMember 代替構文を追加:
- PtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[3].Name).Invoke
- PtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[5].Name).Invoke
- PtrToStringUni , ([Runtime.InteropServices.Marshal].GetMembers()[2].Name).Invoke
- PtrToStringUni , ([Runtime.InteropServices.Marshal].GetMembers()[4].Name).Invoke
- PtrToStringAnsi, ([Runtime.InteropServices.Marshal].GetMembers()[0].Name).Invoke
- PtrToStringAnsi, ([Runtime.InteropServices.Marshal].GetMembers()[1].Name).Invoke
- Out-ObfuscatedTokenCommand.ps1 を更新: VARIABLE 難読化が、変数が既に ${} でカプセル化されている場合にカプセル化しないように変更(${${var}} の発生を防止。これはエラーの原因となるため)。
- Invoke-Obfuscation.psm1 を Invoke-Obfuscation.psd1 に置き換え(@Carlos_Perez に感謝)。
- @cobbr_io および @IISResetMe によって報告されたいくつかの TOKEN レベルの難読化のバグを修正。
v1.7 - 2017-03-03 nullcon (Goa, India):
- 3 つの新しい LAUNCHER を追加: RUNDLL、RUNDLL++、MSHTA++
- 追加の ExecutionContext ワイルドカード変数文字列を追加
v1.8 - 2017-07-27 Black Hat (Las Vegas, Nevada USA):
- 2 つの新しい ENCODING オプションを追加: 特殊文字と空白
v1.8.1 - 2017-12-19:
- COMPRESS 関数を追加。複数行のスクリプトを 1 行のコマンドに簡単に変換し、cmd.exe のコマンドライン長制限のためにコマンド長を大幅に削減します。
v1.8.2 - 2018-01-04:
- AST 難読化関数を追加。特殊文字を多用せずに AbstractSyntaxTree の構造を操作して難読化します。