
Cobalt Strike BOF - インプロセスでの.NETアセンブリ実行に対応し、AMSI/ETWバイパス、カスタムAppDomain、名前付きパイプ/メールスロット出力リダイレクションを備えたツール。
InlineExecute-Assemblyは、Cobalt Strikeの従来のfork and run方式のexecute-assemblyモジュールの代替として、セキュリティ専門家がプロセス内で.NETアセンブリを実行できるようにする概念実証のBeacon Object File(BOF)です。InlineExecute-Assemblyは、エントリポイントが Main(string[] args) または Main() の任意のアセンブリを実行します。これにより、ほとんどの公開ツールを事前の修正なしに実行できるはずです。
BOFは、実行前にアセンブリに必要な共通言語ランタイム(CLR)(v2.0.50727またはv4.0.30319)を自動的に判断し、ほとんどの場合、問題が発生しても正常に終了します。また、BOFは、.NET実行前にオペレーターがいくつかの動作を指定できるフラグをサポートしています。メモリパッチによるAMSIの無効化、メモリパッチによるETWの無効化と復元、作成するCLR App Domain名のカスタマイズ、アセンブリのコンソール出力を名前付きパイプまたはメールスロットに作成してリダイレクトするかどうか、そしてデフォルトのエントリポイントMain(string[] args)をMain()に切り替えることができます。使用法、ユースケース、および可能な検出方法の詳細は、以下およびhttps://securityintelligence.com/posts/net-execution-inlineexecute-assembly/ にあります。
最後に、.NETアセンブリをビーコンインプラントと同じプロセス内で実行する利点は、Cobalt Strikeのexecute-assemblyモジュールのデフォルト動作(新しいプロセスを作成してCLR/.NETアセンブリをロード/インジェクトする)を回避できることです。ただし、他のOPSEC上の考慮事項も存在します。例えば、実行中のプロセスが通常CLRをロードするかどうか、実行する.NETアセンブリに既知のシグネチャがあるかどうかなどです。そのため、欠点は、例えばAMSIによって何かが検出されて強制終了された場合、ビーコンも強制終了されることです。
このツールは、セキュリティコミュニティのメンバーがすでに公開している優れた研究、ツール、コードを利用できなければ存在しませんでした。ありがとうございます。最後に、以下のリストに漏れていると思われる方がいれば、お知らせください。必ず追加します。
srcディレクトリ内で、VS 2019用のx64 Native Toolsコマンドプロンプトを使用して以下のコマンドを実行します。
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx64.o
srcディレクトリ内で、VS 2019用のx86 Native Toolsコマンドプロンプトを使用して以下のコマンドを実行します。
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx86.o
--dotnetassembly アセンブリへのディレクトリパス **必須**
--assemblyargs 渡すアセンブリ引数
--appdomain 送信されるAppDomainのデフォルト名を変更(デフォルト値はtotesLegitで、含まれているアグレッサースクリプトで設定) *ドメインは常にアンロードされます*
--amsi メモリパッチによるAMSIの無効化を試行(成功した場合、プロセスの全期間にわたってAMSIが無効になります)
--etw メモリパッチによるETWの無効化を試行(成功した場合、元に戻さない限りプロセスの全期間にわたってETWが無効になります)
--revertetw メモリパッチによるETWの無効化を試行し、その後元の状態に再パッチします
--pipe 名前付きパイプのデフォルト名を変更(デフォルト値はtotesLegitで、含まれているアグレッサースクリプトで設定)
--mailslot コンソール出力をリダイレクトするためにメールスロットを使用するように切り替えます。メールスロットのデフォルト名を変更(空白の場合はデフォルト値はtotesLegitで、含まれているアグレッサースクリプトで設定)
--main エントリポイントをMain()に変更(デフォルト値はMain(string[] args))
.NETアセンブリを実行
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe
引数付きで.NETアセンブリを実行
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker
引数付きで.NETアセンブリを実行し、AMSIを無効化
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi
引数付きで.NETアセンブリを実行し、ETWを無効化
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --etw
引数付きで.NETアセンブリを実行し、デフォルトの名前付きパイプの代わりにメールスロットで出力をリダイレクト
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --mailslot
引数付きで.NETアセンブリを実行し、アグレッサースクリプトで設定されたデフォルトの名前付きパイプ名を変更
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --pipe forRealLegit
.NETアセンブリを実行し、アグレッサースクリプトで設定されたデフォルトのアプリケーションドメインを変更
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --appdomain forRealLegit
デフォルトのMain(string[] args)の代わりにMain()エントリポイントで.NETアセンブリを実行
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/simpleMain.exe --main
全力で実行
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi --etw --appdomain forRealLegit --mailslot forRealLegit
使用できる検出および軽減戦略: