
Charger/Injecter des assemblys .NET par ; réutilisant le CLR AppDomainManager chargé du processus hôte (spawnto), Stomping Loader/en-têtes PE DOS d'assembly .NET, dissociant les modules liés à .NET, contournant ETW+AMSI, évitant les hooks EDR via des appels système statiques NT (x64) et cachant les imports en résolvant dynamiquement les API (hash).
ExecuteAssembly est une alternative de CS execute-assembly, construit avec C/C++ et peut être utilisé pour charger/injecter des assemblies .NET en ; réutilisant les modules CLR/AppDomainManager chargés par le processus hôte (spawnto), en écrasant les en-têtes DOS PE du loader/de l'assembly .NET, en déliant les modules liés à .NET, en contournant ETW+AMSI, en évitant les hooks EDR via des appels système statiques NT (x64) et en masquant les importations en résolvant dynamiquement les API via l'algorithme de hachage superfasthash.
x64(syscalls): cette version dépend principalement de l'utilisation d'appels système statiques pour contourner les hooks EDR, vous pouvez utiliser cette version pour construire la version x64 de la DLL uniquement (support x64 uniquement pour l'instant).
x86|x64(PEB): récupère les adresses API requises dynamiquement à l'exécution en parcourant les tables EAP des modules PEB et en résolvant les API via le hachage superfasthash. Cependant, ne tient pas compte des hooks EDR placés sur kernel32.dll ou ntdll.dll. Vous pouvez utiliser cette version pour construire les DLL x86 et x64, ou seulement la DLL x86 et utiliser la version x64(syscalls) pour construire la DLL x64 afin de tenir compte des hooks EDR courants.
Construisez les DLL requises en utilisant VS2017 et/ou Windows SDK 10.0.17134.0 (ou des versions SDK compatibles).
Assurez-vous que gzip est installé et que les artefacts suivants sont placés dans le même dossier, puis chargez simplement le script aggressor "ExecuteAssembly.cna" :
ExecuteAssembly.cna
ExecuteAssembly-x64.dll
ExecuteAssembly-x86.dll
Options CLI :
--dotnetassembly: Assembly .NET à charger/injecter.
--assemblyargs: Arguments de l'assembly .NET.
--unlink-modules: Délier les modules liés à .NET tels que les DLL CLR/MsCoree des structures de données PEB.
--stomp-headers: Écraser les en-têtes DOS PE de l'assembly .NET et de la DLL réflexive.
--etw: Contourner le suivi d'événements sur Windows (ETW).
--amsi: Contourner AMSI.
--spawnto: Choisir le processus spawnto, liste des binaires .NET chargeant le CLR par défaut lorsqu'ils sont exécutés :
- PresentationHost.exe
- stordiag.exe
Consultez spawnto-list.txt pour des binaires MS supplémentaires chargeant le CLR par défaut et qui sont de bons candidats à définir comme spawnto. (éviterait les LOLBins connus sauf s'il s'agit d'une machine de développement peut-être)
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.exeA été créé et testé principalement sur cobalt strike, mais peut également être utilisé avec d'autres frameworks C2 (MSF, etc.), gardez simplement à l'esprit que le DLLMAIN de la DLL réflexive attend le payload one-liner comme paramètre (lpReserved) dans le format suivant (sans ".");
AMSI_FLAG|ETW_FLAG|STOMPHEADERS_FLAG|UNLINKMODULES_FLAG|LL_FLAG.LENGTH_FLAG.B64_ENCODED_COMPRESSED_PAYLOAD [SPACE SEPARATED ARGUMENTS]
AMSI_FLAG: 0|1 (soit 0 ou 1)ETW_FLAG: 0|1STOMPHEADERS_FLAG: 0|1UNLINKMODULES_FLAG: 0|1LENGTH_FLAG: Taille de l'assembly .NET en octetsLL_FLAG: length_of(LENGTH_FLAG) (supportez-moi ici ou faites comme si vous n'aviez pas lu ça)B64_ENCODED_COMPRESSED_PAYLOAD: Assembly .NET compressé Gzip et encodé en base64.[SPACE SEPARATED ARGUMENTS]: Arguments de l'assembly .NET- ScriptRunner.exe- caitstatic.exe- Microsoft.Uev.SyncController.exe- TsWpfWrp.exe- UevAgentPolicyGenerator.exe- UevAppMonitor.exe- FileHistory.exe- UevTemplateBaselineGenerator.exe- UevTemplateConfigItemGenerator.exe