
Cargar/Inyectar ensamblados .NET mediante; reutilizando el CLR AppDomainManager cargado del proceso anfitrión (spawnto), Stomping de encabezados DOS PE del cargador/ensamblado .NET, desvinculación de módulos relacionados con .NET, evadiendo ETW+AMSI, evitando hooks de EDR mediante syscalls NT estáticas (x64) y ocultando importaciones resolviendo dinámicamente APIs (hash).
ExecuteAssembly es una alternativa de CS execute-assembly, construida con C/C++ y puede usarse para cargar/inyectar ensamblados .NET mediante; reutilización de los módulos CLR cargados por el proceso anfitrión (spawnto)/AppDomainManager, pisoteo de cabeceras DOS PE del cargador/ensamblado .NET, desvinculación de módulos relacionados con CLR, bypass de ETW+AMSI, evasión de hooks EDR mediante syscalls estáticas NT (x64) y ocultación de importaciones resolviendo APIs dinámicamente mediante el algoritmo de hash superfasthash.
x64(syscalls): esta versión depende principalmente del uso de syscalls estáticas para evadir hooks EDR. Puedes usar esta versión para compilar únicamente la versión x64 de la DLL (solo soporte x64 por ahora).
x86|x64(PEB): recupera las direcciones de API requeridas dinámicamente en tiempo de ejecución recorriendo las tablas EAP de los módulos del PEB y resolviendo las APIs mediante hash superfasthash. Sin embargo, no tiene en cuenta los hooks EDR colocados en kernel32.dll o ntdll.dll. Puedes usar esta versión para compilar tanto las DLLs x86 como x64, o solo la DLL x86 y usar la versión x64(syscalls) para compilar la DLL x64 para cubrir los hooks EDR comunes.
Compila las DLLs requeridas usando VS2017 y/o Windows SDK 10.0.17134.0 (o versiones de SDK compatibles).
Asegúrate de que gzip esté instalado y los siguientes artefactos estén colocados dentro de la misma carpeta, luego solo carga el script aggressor "ExecuteAssembly.cna":
ExecuteAssembly.cna
ExecuteAssembly-x64.dll
ExecuteAssembly-x86.dll
Opciones de CLI:
--dotnetassembly: Ensamblado .NET a cargar/inyectar.
--assemblyargs: Argumentos del ensamblado .NET.
--unlink-modules: Desvincula módulos relacionados con .NET, como DLLs de CLR/MsCoree, de las estructuras de datos del PEB.
--stomp-headers: Pisotea las cabeceras DOS PE del ensamblado .NET y de la DLL reflectiva.
--etw: Evita el seguimiento de eventos en Windows (ETW).
--amsi: Evita AMSI.
--spawnto: Elige el proceso spawnto, lista de binarios .NET que cargan el CLR por defecto al ejecutarse:
- PresentationHost.exe
- stordiag.exe
Revisa spawnto-list.txt para binarios MS adicionales que cargan el CLR por defecto y son buenos candidatos para configurar como spawnto. (se evitarían los conocidos LOLBins a menos que sea una máquina de desarrollo quizás)
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.exeFue creado y probado principalmente en Cobalt Strike, sin embargo puede usarse con otros frameworks C2 también (MSF ..etc), solo ten en cuenta que el DLLMAIN de la DLL reflectiva espera el payload de una línea como parámetro (lpReserved) en el siguiente formato (sin ".");
AMSI_FLAG|ETW_FLAG|STOMPHEADERS_FLAG|UNLINKMODULES_FLAG|LL_FLAG.LENGTH_FLAG.B64_ENCODED_COMPRESSED_PAYLOAD [ARGUMENTOS SEPARADOS POR ESPACIOS]
AMSI_FLAG: 0|1 (0 o 1)ETW_FLAG: 0|1STOMPHEADERS_FLAG: 0|1UNLINKMODULES_FLAG: 0|1LENGTH_FLAG: tamaño del ensamblado .NET en bytesLL_FLAG: longitud_de(LENGTH_FLAG) (ten paciencia conmigo o finge que no leíste esto)B64_ENCODED_COMPRESSED_PAYLOAD: ensamblado .NET comprimido con Gzip y codificado en base64.[ARGUMENTOS SEPARADOS POR ESPACIOS]: argumentos del ensamblado .NET- ScriptRunner.exe- caitstatic.exe- Microsoft.Uev.SyncController.exe- TsWpfWrp.exe- UevAgentPolicyGenerator.exe- UevAppMonitor.exe- FileHistory.exe- UevTemplateBaselineGenerator.exe- UevTemplateConfigItemGenerator.exe