
.NET アセンブリをロード/インジェクトする方法;(spawnto) プロセスがロードした CLR AppDomainManager を再利用し、Stomping Loader/.NET アセンブリ PE DOS ヘッダーを破壊し、.NET 関連モジュールをアンリンクし、ETW+AMSI をバイパスし、NT 静的システムコール (x64) を介して EDR フックを回避し、API を動的に解決 (ハッシュ) してインポートを隠蔽します。
ExecuteAssemblyはCSのexecute-assemblyの代替であり、C/C++で構築されています。ホスト(spawnto)プロセスに読み込まれたCLRモジュール/AppDomainManagerの再利用、ローダー/.NETアセンブリのPE DOSヘッダーの隠蔽、.NET関連モジュールのリンク解除、ETW+AMSIのバイパス、NT静的システムコール(x64)によるEDRフックの回避、superfasthashハッシュアルゴリズムを使用したAPIの動的解決によるインポートの隠蔽により、.NETアセンブリを読み込み/インジェクションするために使用できます。
x64(syscalls): このバージョンは主に静的システムコールを使用してEDRフックをバイパスします。このバージョンを使用してDLLのx64版のみをビルドできます(現時点ではx64のみ対応)。
x86|x64(PEB): PEBモジュールのEAPテーブルを走査し、superfasthashハッシュを介してAPIを解決することで、実行時に必要なAPIアドレスを動的に取得します。ただし、kernel32.dllまたはntdll.dllに配置されたEDRフックは考慮しません。このバージョンを使用してx86とx64の両方のDLLをビルドするか、x86 DLLのみをビルドし、x64(syscalls)バージョンを使用してx64 DLLをビルドすることで、一般的なEDRフックに対応できます。
必要なDLLをVS2017および/またはWindows SDK 10.0.17134.0(または互換性のあるSDKバージョン)を使用してビルドします。
gzipがインストールされ、以下のアーティファクトが同じフォルダに配置されていることを確認し、アグレッサースクリプト「ExecuteAssembly.cna」を読み込むだけです。
ExecuteAssembly.cna
ExecuteAssembly-x64.dll
ExecuteAssembly-x86.dll
CLI オプション:
--dotnetassembly: 読み込み/インジェクションする.NETアセンブリ。
--assemblyargs: .NETアセンブリの引数。
--unlink-modules: CLR/MsCoree関連DLLなどの.NET関連モジュールをPEBデータ構造からリンク解除します。
--stomp-headers: .NETアセンブリとリフレクティブDLLのPE DOSヘッダーを隠蔽します。
--etw: Windowsのイベントトレーシング(ETW)をバイパスします。
--amsi: AMSIをバイパスします。
--spawnto: spawntoプロセスを選択します。デフォルトで実行時にCLRを読み込む.NETバイナリのリスト:
- PresentationHost.exe
- stordiag.exe
- ScriptRunner.exe
- caitstatic.exe
- Microsoft.Uev.SyncController.exe
- TsWpfWrp.exe
- UevAgentPolicyGenerator.exe
- UevAppMonitor.exe
- FileHistory.exe
- UevTemplateBaselineGenerator.exe
- UevTemplateConfigItemGenerator.exe
spawnto-list.txtをチェックして、デフォルトでCLRを読み込む他のMSバイナリを確認し、spawntoとして設定する良い候補にしてください。(既知のLOLBinsは避けるべきですが、開発者のマシンでは問題ない場合があります)
ExecuteAssembly --dotnetassembly /tmp/Seatbelt.exe --assemblyargs LogonSessions --unlink-modules --stomp-headers --amsi --etw --spawnto PresentationHost.exeExecuteAssembly --amsi --etw --unlink-modules --stomp-headers --dotnetassembly /tmp/ghostpack/SharPersist.exe --assemblyargs -t reg -c "C:\Windows\SysWow64\mshta.exe C:\Users\admin\Downloads\Test2.hta" -k logonscript -m add --spawnto FileHistory.exeExecuteAssembly --unlink-modules --stomp-headers --dotnetassembly /tmp/ghostpack/SharPersist.exe --assemblyargs -t reg -k "logonscript" -v "C:\Windows\SysWow64\mshta.exe C:\Users\admin\Downloads\Test.hta" -m remove --spawnto FileHistory.exeExecuteAssembly --unlink-modules --amsi --dotnetassembly /tmp/ghostpack/SharpWMI.exe --assemblyargs action=query computername=localhost query="select * from win32_service" --spawnto FileHistory.exeExecuteAssembly --amsi --etw --dotnetassembly /tmp/ghostpack/SharpWMI.exe --assemblyargs action=query query="select * from win32_process" --spawnto PresentationHost.exe主にCobalt Strikeで作成およびテストされましたが、他のC2フレームワーク(MSFなど)でも使用できます。リフレクティブDLLのDLLMAINは、ペイロードを次の形式(「.」なし)でパラメータ(lpReserved)として期待していることに注意してください。
AMSI_FLAG|ETW_FLAG|STOMPHEADERS_FLAG|UNLINKMODULES_FLAG|LL_FLAG.LENGTH_FLAG.B64_ENCODED_COMPRESSED_PAYLOAD [スペース区切りの引数]
AMSI_FLAG: 0|1(0または1のいずれか)ETW_FLAG: 0|1STOMPHEADERS_FLAG: 0|1UNLINKMODULES_FLAG: 0|1LENGTH_FLAG: .NETアセンブリのサイズ(バイト単位)LL_FLAG: length_of(LENGTH_FLAG)(ここは気にしないでください。見なかったことにしても構いません)B64_ENCODED_COMPRESSED_PAYLOAD: Gzip圧縮されBase64エンコードされた.NETアセンブリ。[スペース区切りの引数]: .NETアセンブリの引数