
Um utilitário de linha de comando para Windows escrito em C que cria e configura sessões AutoLogger persistentes do Event Tracing for Windows (ETW).
Esta ferramenta é um utilitário de linha de comando para Windows escrito em C que cria e configura sessões persistentes de AutoLogger do Event Tracing for Windows (ETW). Os AutoLoggers iniciam automaticamente o rastreamento de provedores ETW específicos na inicialização do sistema, tornando-os úteis para capturar eventos que ocorrem no início do processo de inicialização ou para cenários de monitoramento contínuo.
Esta ferramenta permite selecionar listas predefinidas de provedores ETW relacionados a EDRs conhecidos para incluir na sessão do AutoLogger por meio de argumentos de linha de comando. Ela mescla configurações se o mesmo provedor estiver incluído em várias listas selecionadas, garantindo que o maior nível de registro seja usado e que os sinalizadores de palavra-chave sejam combinados adequadamente para maximizar a cobertura de eventos com base nas listas selecionadas.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI\Autologger\Metamorph).-Defender, -Crowdstrike, -MDE, -Sentinelone, -Cortex).-All).-noisy)Level especificado entre todas as duplicatas para um provedor.MatchAnyKeyword usando OR bit a bit de todas as duplicatas (independentemente do nível) para garantir a cobertura mais ampla de palavras-chave.MatchAllKeyword da entrada de configuração que forneceu o nível mais alto.Você precisa de um compilador C, como o incluído no Visual Studio.
Não há imports não padrão, então a compilação com Cl deve ser possível sem muita dificuldade.
Importante: Esta ferramenta modifica o Registro do Windows (HKEY_LOCAL_MACHINE) e, portanto, requer privilégios de Administrador para ser executada corretamente.
.\Metamorph.exe <options>
# Enable only providers from Defender
.\Metamorph.exe -Defender
# Enable providers from Defender and MDE, merging duplicates
.\Metamorph.exe -Defender -MDE
# Enable all providers from all engines, merging duplicates
.\Metamorph.exe -All
# Enabling one provider, also with noisy ones, because why not filling disk space after all?
.\Metamorph.exe -All -noisy
Após a inicialização, uma reinicialização deve ocorrer para iniciar o provedor recém-registrado.
Para limpar este provedor, é necessário:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI\Autologger\Metamorph)O ETW fornece visibilidade profunda dos eventos em tempo de execução. Isso pode ser usado para detectar atividades potencialmente suspeitas que possam indicar atividade de malware ou técnicas de ofuscação. Uma vez instalado, os provedores devem fornecer o mesmo nível de telemetria de "Log de Eventos" que o EDR "clonado". Isso deve facilitar a pesquisa de IOCs que possam ser deixados por ferramentas internas.
Após o sistema ser reinicializado e os aplicativos de interesse terem sido executados, o arquivo .etl (por exemplo, Metamorph.etl) conterá os eventos capturados.
O arquivo gerado (C:\Windows\System32\LogFiles\WMI\Metamorph.etl.00x) pode ser consumido por várias ferramentas públicas, como:
Nota: Metamorph usa arquivos de log circulares para evitar perdê-los acidentalmente após uma reinicialização, mas algumas ferramentas exigem que os arquivos terminem com .etl, então você precisará remover o sufixo antes do uso.
Além disso, é possível basicamente traduzir o arquivo .etl para um arquivo CSV para grep rápido:
tracerpt MyKeywordMergedETWLogger.etl -o logdump.csv -of CSV
Digamos que temos o seguinte programa PowerShell que carrega um arquivo usando Assembly.Load:
[Reflection.Assembly]:https://raw.githubusercontent.com/synacktiv/metamorph/HEAD/:Load(%5BSystem.Convert%5D::FromBase64String(%22TVqQAAMAAAAEAAAA/8AALgAAAAAAAAAQAAAAAA%5B...%5DAAAAAAAAAAAAA%22))
#Récupération du handle sur le process cible
$ProcessDesiredAccess = 0x00000400
$InheritHandle = 0
$ProcessId = $PID
$hProcess = [api32.run]::OpenProcess($ProcessDesiredAccess, $InheritHandle, $ProcessId)
if($hProcess -eq 0){ Write-Output "OpenProcess Error" }
#Récupération du handle sur le token du process cible
$hToken = [IntPtr]::Zero
$TokenDesiredAccess = 0x00000006
$Success = [api32.run]::OpenProcessToken($hProcess, $TokenDesiredAccess, [ref]$hToken)
if(-not $Success){ Write-Output "OpenProcessToken Error" }
#Duplication du token
$DesiredAccess = 0x10000000
$SecurityAttribute = New-Object api32.run+_SECURITY_ATTRIBUTES
$SecurityAttribute.lpSecurityDescriptor = [IntPtr]::Zero
$SecurityAttribute.bInheritHandle = $true
$ImpersonationLevel = 3
$TokenType = 1
$hDuplicatedToken = [IntPtr]::Zero
$Success = [api32.run]::DuplicateTokenEx($hToken, $DesiredAccess,[ref]$SecurityAttribute, $ImpersonationLevel, $TokenType,[ref]$hDuplicatedToken)
if(-not $Success) { Write-Debug "DuplicateTokenEx Error" }
#Creation du cmd avec le token dupliqué
$LogonFlags = 0
$ApplicationName = "cmd.exe"
$CommandLine = "/K whoami /all"
$CreationFlags = 0x00000010
$Environnement = [IntPtr]::Zero
$CurrentDirectory = "c:\windows\system32"
$StartUpinformation = New-Object api32.run+STARTUPINFOA
$ProcessInformation = New-Object api32.run+_PROCESS_INFORMATION
$Success = [api32.run]::CreateProcessWithTokenW($hDuplicatedToken, $LogonFlags,$ApplicationName, $CommandLine, $CreationFlags, $Environnement, $CurrentDirectory, [ref]$StartUpinformation,[ref]$ProcessInformation)
if(-not $Success) { Write-Debug "CreateProcessWithTokenW Error" }
Este script basicamente executa um ataque como o que poderia ser realizado pela ferramenta impersonate.exe.




Então, no final, EDRs e analistas têm a oportunidade de realizar análise de assinatura com base no AssemblyName para binários conhecidos (como: "Rubeus") e, caso contrário, eles têm a possibilidade de recuperar scripts PowerShell (incluindo comentários) para análise pós-mortem.
Se você achar esta ferramenta útil, você pode adicionar suas próprias soluções (ou de outros) seguindo as instruções em CONTRIBUTING.md. Vou tentar atualizá-la regularmente, mas como ela será completamente dependente das soluções encontradas durante pentests, sinta-se à vontade para abrir um PR se quiser que suas alterações estejam disponíveis para todos.