
Rogue Assembly Hunterは、実行中のプロセスから'興味深い'.NET CLRモジュールを発見するためのユーティリティです。
__________ _____ . .
_____ \ ____ ____ __ __ ____ / _ \ ______ ______ ____ _ | | | ..
| // _ \ / __| | _/ __ \ / /\ \ / // __// __ \ / | __ | |< | |
| | ( <> ) // > | /\ / / | \ \ _ \ /| Y Y \ _\ \ |_ |
|| /_/_ /|/ _ > _| /____ >____ >___ >|| / /____/ |
/ // / / / / / / / /
___ ___ __
/ | \ __ __ / | ___________
/ ~ \ | |/ \ __/ __ _ __
\ Y / | / | \ | \ /| | /
_| /|/|| /| _ >|
/ / /
Rogue Assembly Hunter は、実行中のプロセスから「興味深い」.NET CLR モジュールを発見するためのユーティリティです。
.NET は、.NET マネージドアプリケーションを構築・実行するための非常に強力で高性能な開発プラットフォームおよびランタイムフレームワークです。ここ数年、.NET は攻撃作戦を支援するためのトレードクラフトを実装するために、Red Team(およびその関連組織)によって採用されてきました。特に、PowerShell から .NET への移行は、PowerShell v5 以降の可視性の向上と機会の増加により、多くの人にとって論理的な飛躍でした。その結果、.NET の攻撃ツールとトレードクラフトは、ホストベースの防御機能を回避し、アプリケーション制御をバイパスし、悪意のあるコードの構築/ステージング/配信/実行(PowerShell と同様)に成功裏に使用されてきました。
予防の観点から、Microsoft は .NET による脅威に対抗し、.NET 全体の攻撃対象領域を最小限に抑えるための取り組みを強化しています。例えば、Microsoft は .NET Framework 4.8 に AMSI 検査機能を追加し、WDAC/WLDP メカニズムも非常に効果的です。検出・対応の観点では、.NET エコシステムへのさらなる可視性と内部調査は、.NET に特化した脅威と戦うための新しい方法を発見する上で常に有利です。
2017 年、Joe Desimone (@dez_) は『Hunting For In-Memory .NET Attacks』(https://www.elastic.co/blog/hunting-memory-net-attacks) という素晴らしい記事を執筆しました。今日でも有効なこの記事では、最新の .NET 攻撃ベクトルと、オンデマンドおよびイベントベースの検出テクニックについて概説しています。この記事に合わせて、Joe は適切なディスク参照を持たないメモリ内の .NET CLR モジュールをプロアクティブに検出(および取得)するツール(Get-ClrReflection)を公開しました。Joe の研究に触発され、CLRMD ランタイム診断ライブラリ(およびそれに続く mscordacwks.dll のデータアクセス機能)の内部調査機能を活用して、Rogue Assembly Hunter は次の目的で作成されました。
--checks および --sleep スイッチで調整することを検討してください。場合によっては、実行速度(execute-assembly や使い捨てプロセスなど)のために特定のアセンブリのロードを「キャッチ」するのが難しい場合があります。[*] パラメータ:
--mode=<.> : 必須 | 分析モードを選択します。オプション: sweep、process、watch。
--hunt=<.> : オプション | 興味深い CLR モジュールを見つけるためのハントスキャンタイプを選択します。all(デフォルト)、memory-only、unusual-dir、
sig-status、imposter-file、list を指定します。
--export=<.> : オプション、実験的 | メモリハントスキャンおよび偽装ファイルハントスキャン用にロードされた CLR モジュールをエクスポートするファイルパスを指定します
(例:--hunt=memory-only/imposter-file/all)。
--pid=<.> : オプション | PID でターゲットプロセスを指定します。--mode=process パラメータ/値とともに使用する必要があります。
--checks=<.> : オプション | スキャンサイクルの値を指定します。これによりスキャン中の競合状態の欠落を減らすことができますが、結果出力が繰り返される可能性があります。
デフォルト値は 1 です。
--sleep=<.> : オプション | スリープ秒数を指定します。これによりチェックサイクルを遅延させてスキャン中の競合状態の欠落を減らすことができます。
デフォルト値は 0 秒です。
--debug : オプション | 例外情報を表示します(例:プロセス接続エラー)。
--nobanner : オプション | 表示バナーを非表示にします。PowerShell スクリプトでの実行や自動化を利用するユースケースに便利です。
--suppress : オプション | --mode=sweep または --mode=watch 中に RogueAssemblyHunter プロセスをスキャンしません。
--help : オプション | このヘルプを表示します。これにより他のコマンドラインパラメータがオーバーライドされ、アプリケーションが終了します。*パラメータなしの場合はデフォルトです。
[*] モード(--mode=)
- sweep : すべてのプロセスをスキャン/反復処理します(注:同じアーキテクチャ/「ビットネス」のプロセスだけが正常にスキャンされます。x86/x64 など用にコンパイルしてください)。
- process : 単一のプロセスをスキャンします。--pid=<PID> とともに使用します。
- watch : 新しいプロセスが作成されたときにスキャンします。--checks および --sleep でスキャン属性を調整します(注:実験的です。競合状態が発生する可能性があります)。
[*] ハント(--hunt=)
- all : デフォルト値。すべてのハントオプションで分析します('list' を除く)。
- memory-only : メモリハント。ディスクにバックアップされていない CLR モジュールを分析します。
- unusual-dir : 異常なディレクトリハント。「通常の」ディレクトリの外部からロードされた CLR モジュールを分析します。
カスタマイズするには '_huntUnusualDirectoryFilter' を編集してください。
- sig-status : ファイル署名ハント。異常な署名状態(例:未署名)の CLR モジュールを分析します。注:実験的です。誤検出の可能性があります。
カスタマイズするには '_huntSigExclusionsFilter' を編集してください。
- imposter-file : 予期しない CLR モジュールハント。疑わしいディスクファイルバッキングを持つ CLR モジュールを分析します。実験的。
- list : すべての CLR モジュールを反復処理し、リスト表示します。
[*] 使用例
- 例 1 : プロセスをスキャンし、アクセス可能な 64 ビットプロセスに対してすべてのハント('list' を除く)を実行 -
RogueAssemblyHunter_x64.exe --mode=sweep
- 例 2 : プロセスをスキャンし、アクセス可能な 32 ビットマネージドプロセスのすべての CLR モジュールをリスト表示し、エラー情報を表示 -
RogueAssemblyHunter_x86.exe --mode=sweep --hunt=list --debug
- 例 3 : 新しいプロセスを監視し、すべての CLR モジュール(マネージドかつ 64 ビットの場合)をスキャンし、RogueAssemblyHunter プロセスをスキャンせず、2 回のチェックと 3 秒の遅延を実行 -
RogueAssemblyHunter_x64.exe --mode=watch --suppress --checks=2 --sleep=3
- 例 4 : PID で単一プロセスをスキャンし、メモリ内のみの CLR モジュール結果をリスト表示し、CLR モジュールを指定されたパスにエクスポート -
RogueAssemblyHunter_x86.exe --mode=process --pid=4650 --hunt=memory-only --export=c:\evilassemblies\
- 例 5 : プロセスをスキャンし、アクセス可能な 64 ビットプロセスのメモリ内のみの CLR モジュール結果をリスト表示し、RogueAssemblyHunter プロセスをスキャンせず、タイトルバナーを表示しない -
RogueAssemblyHunter_x64.exe --mode=sweep --hunt=memory-only --suppress --nobanner
便宜上、PowerShell スクリプトと 2 つのコンパイル済みバイナリ(RogueAssemblyHunter_x64.exe および RogueAssemblyHunter_x86.exe)が \Release フォルダに含まれています。ユースケース(例:展開、埋め込み、チェック、スリープなど)に合わせて自由に変更してください。
使用例:
スイープモードで Invoke-RogueAssemblyHunter を実行し、すべてのハントオプションをチェック
cd c:\path\to\RogueAssemblyHunter
import-module .\Invoke-RogueAssemblyHunter.ps1
Invoke-RogueAssemblyHunter
ウォッチモードで Invoke-RogueAssemblyHunter を実行し、すべてのハントオプションをチェック
cd c:\path\to\RogueAssemblyHunter
import-module .\Invoke-RogueAssemblyHunter.ps1
Invoke-RogueAssemblyHunter -ScanMode watch
SHA256 ハッシュ:
e804711a8b6469f1b13b388de47dfa6dde1c85279d365db7b6e19e1644990fa6 Invoke-RogueAssemblyHunter.ps1
cc985d918e566671aa209142abc55bd798ca6c1a18730b785ac8c18d489736c3 RogueAssemblyHunter_x64.exe
ae3aead43871e263cd8465d5356c4daaae0635714321f872c931ec825008287a RogueAssemblyHunter_x86.exe