该工具是一款用 C 语言编写的 Windows 命令行实用程序,用于创建和配置持久化的 Windows 事件跟踪(ETW)AutoLogger 会话。AutoLogger 会在系统启动时自动开始跟踪特定的 ETW 提供程序,这使得它们对于捕获启动早期发生的事件或进行持续监控场景非常有用。
该工具允许通过命令行参数选择与已知 EDR 相关的预定义 ETW 提供程序列表,并将其包含在 AutoLogger 会话中。如果同一提供程序包含在多个选定的列表中,它会合并配置,确保使用最高的日志级别,并适当组合关键字标志,以根据所选列表最大化事件覆盖范围。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI\Autologger\Metamorph)创建持久化的 ETW AutoLogger 会话。-Defender、-Crowdstrike、-MDE、-Sentinelone、-Cortex)。-All)。-noisy)Level。MatchAnyKeyword 标志进行按位或运算,以确保最广泛的关键字覆盖范围。MatchAllKeyword。你需要一个 C 编译器,例如 Visual Studio 自带的那个。
该项目没有任何非标准导入,因此使用 Cl 编译应该不会遇到太多麻烦。
重要提示: 该工具会修改 Windows 注册表(HKEY_LOCAL_MACHINE),因此需要管理员权限才能正确运行。
.\Metamorph.exe <options>
# 仅启用 Defender 中的提供程序
.\Metamorph.exe -Defender
# 启用 Defender 和 MDE 中的提供程序,合并重复项
.\Metamorph.exe -Defender -MDE
# 启用所有引擎中的所有提供程序,合并重复项
.\Metamorph.exe -All
# 启用某个提供程序,同时也启用嘈杂的提供程序,毕竟为什么不填满磁盘空间呢?
.\Metamorph.exe -All -noisy
初始化之后,必须重启系统才能启动新注册的提供程序。
要清理此提供程序,需要:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI\Autologger\Metamorph)ETW 提供对运行时事件的深度可见性。这可用于检测潜在的可疑活动,这些活动可能表明存在恶意软件活动或混淆技术。 安装后,这些提供程序应提供与“被克隆的”EDR 相同级别的“事件日志”遥测数据。 这应当有助于研究内部工具可能留下的 IOC。
系统重启且相关应用程序运行完毕后,.etl 文件(例如,Metamorph.etl)将包含捕获的事件。
生成的文件(C:\Windows\System32\LogFiles\WMI\Metamorph.etl.00x)可以被多种公共工具摄取,例如:
注意:Metamorph 使用循环日志文件,以避免在重启后意外丢失数据,但某些工具要求文件以 .etl 结尾,因此你需要在使用前移除后缀。
此外,还可以简单地将 .etl 文件转换为 CSV 文件,以便进行快速 grep:
tracerpt MyKeywordMergedETWLogger.etl -o logdump.csv -of CSV
假设我们有以下使用 Assembly.Load 加载文件的 PowerShell 程序:
[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" }
该脚本基本上执行了一种类似于 impersonate.exe 工具可能执行的攻击。




因此,最终 EDR 和分析人员有机会基于已知二进制的 AssemblyName 进行签名分析(例如:"Rubeus"),此外,他们还可能在事后分析中检索到 PowerShell 脚本(包括注释)。
如果你觉得这个工具很有用,你可以按照 CONTRIBUTING.md 中的说明添加你自己的(或其他人的)解决方案。我会尽量定期更新它,但由于它完全取决于在渗透测试中遇到的解决方案,如果你希望你的更改对所有人可用,请随时提交 PR。