
Carregar/Injetar assemblies .NET reutilizando o AppDomainManager do CLR carregado pelo processo hospedeiro (spawnto); Stomping dos cabeçalhos PE DOS do loader/assembly .NET, Desvinculação de módulos relacionados ao .NET, contornando ETW+AMSI, evitando hooks de EDR por meio de chamadas de sistema NT estáticas (x64) e ocultando importações resolvendo APIs dinamicamente (hash).
O ExecuteAssembly é uma alternativa ao execute-assembly do CS, construído em C/C++ e pode ser usado para Carregar/Injetar assemblies .NET por meio de; reutilização dos módulos CLR/AppDomainManager carregados pelo processo hospedeiro (spawnto), Stomping dos cabeçalhos DOS PE do Loader/assembly .NET, Desvinculação de módulos relacionados ao .NET, bypass de ETW+AMSI, evasão de hooks EDR via syscalls estáticos NT (x64) e ocultação de imports pela resolução dinâmica de APIs via algoritmo de hashing superfasthash.
x64(syscalls): esta versão depende principalmente do uso de syscalls estáticos para bypassar hooks EDR. Você pode usar esta versão para compilar apenas a versão x64 da DLL (suporte apenas x64 por enquanto).
x86|x64(PEB): recupera dinamicamente os endereços das APIs necessárias em tempo de execução percorrendo as tabelas EAP dos módulos do PEB e resolvendo APIs via hash superfasthash. No entanto, não considera hooks EDR colocados em kernel32.dll ou ntdll.dll. Você pode usar esta versão para compilar ambas as DLLs x86 e x64, ou apenas a DLL x86 e usar a versão x64(syscalls) para compilar a DLL x64 para lidar com hooks EDR comuns.
Compile as DLLs necessárias usando VS2017 e/ou Windows SDK 10.0.17134.0 (ou versões de SDK compatíveis).
Certifique-se de que o gzip esteja instalado e os seguintes artefatos estejam na mesma pasta, depois carregue o script aggressor "ExecuteAssembly.cna":
ExecuteAssembly.cna
ExecuteAssembly-x64.dll
ExecuteAssembly-x86.dll
Opções de CLI:
--dotnetassembly: Assembly .NET a ser carregado/injetado.
--assemblyargs: Argumentos do assembly .NET.
--unlink-modules: Desvincular módulos relacionados ao .NET, como DLLs CLR/MsCoree, das estruturas de dados do PEB.
--stomp-headers: Aplicar stomping nos cabeçalhos DOS PE do assembly .NET e da DLL reflexiva.
--etw: Bypass do Event Tracing for Windows (ETW).
--amsi: Bypass do AMSI.
--spawnto: Escolher processo spawnto, lista de binários .NET que carregam o CLR por padrão quando executados:
- PresentationHost.exe
- stordiag.exe
Verifique spawnto-list.txt para binários MS adicionais que carregam o CLR por padrão e são bons candidatos para definir como spawnto. (evitaria os conhecidos LOLBins, a menos que seja uma máquina de desenvolvedor, talvez)
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.exeFoi criado e testado principalmente no Cobalt Strike, mas também pode ser usado com outros frameworks C2 (MSF ..etc). Apenas lembre-se de que o DLLMAIN da DLL reflexiva espera o payload de uma linha como parâmetro (lpReserved) no seguinte formato (sem "."):
AMSI_FLAG|ETW_FLAG|STOMPHEADERS_FLAG|UNLINKMODULES_FLAG|LL_FLAG.LENGTH_FLAG.B64_ENCODED_COMPRESSED_PAYLOAD [ARGUMENTOS SEPARADOS POR ESPAÇO]
AMSI_FLAG: 0|1 (0 ou 1)ETW_FLAG: 0|1STOMPHEADERS_FLAG: 0|1UNLINKMODULES_FLAG: 0|1LENGTH_FLAG: tamanho do assembly .NET em bytesLL_FLAG: comprimento_de(LENGTH_FLAG) (apenas me ature aqui ou finja que não leu isso)B64_ENCODED_COMPRESSED_PAYLOAD: assembly .NET comprimido com Gzip e codificado em base64.[ARGUMENTOS SEPARADOS POR ESPAÇO]: argumentos do assembly .NET- ScriptRunner.exe- caitstatic.exe- Microsoft.Uev.SyncController.exe- TsWpfWrp.exe- UevAgentPolicyGenerator.exe- UevAppMonitor.exe- FileHistory.exe- UevTemplateBaselineGenerator.exe- UevTemplateConfigItemGenerator.exe