ETW机制详解与安全研究
Arcueid 历史精选 326浏览 · 2025-03-25 09:05

记录一下ETW这块的学习

简介

ETW(Event Tracing for Windows) 是Windows提供的一个机制 用于跟踪,记录应用程序产生的事件

整个体系主要由提供者(provider), 跟踪会话(Tracing session) 和 消费者(consumer)构成

每个 Provider 都用唯一的GUID标识,并定义其可用事件

通过logman query providers可以查看所有的提供者



可以通过命令logman query providers "Provider Name" 查看所有该provider提供的事件

这里用我们之前在ppid伪造时提到的进程创建监控举例 提供者是Microsoft-Windows-Kernel-Process



也可以查看指定GUID的事件



在性能监视器的事件跟踪会话中我们可以看见所有正在运行的消费者



或通过命令 logman query -ets



创建一个跟踪会话 并订阅Microsoft-Windows-Kernel-ProcessWINEVENT_KEYWORD_PROCESS





这里事件id的含义可以通过wevtutil查找

wevtutil gp Microsoft-Windows-Kernel-Process /ge:true



三环API

介绍一下下面可能要用到的 用户模式下API

EventRegister

注册一个ETW提供者

ProviderId 要求提供一个GUID 用于标识事件源 例如

GUID guid = { 0xd99e9dba, 0x1772, 0x407c, {0xa9, 0x60, 0x81, 0xa3, 0xd4, 0x52, 0x2a, 0x98} };;

EnableCallback 回调函数

CallbackContext 参数

RegHandle 返回的句柄

对应的EventUnregister 接收句柄并取消注册

EventWrite

RegHandle 句柄

EventDescriptor 描述事件的结构

UserDataCount UserData的结构数量

UserDataEVENT_DATA_DESCRIPTOR结构的指针 该结构用EventDataDescCreate函数初始化

EVENT_DESCRIPTOR

其中比较重要的

Level 描述事件的重要性



Task 用于事件分类



Keyword 用于事件分类 提供者为消费者提供的事件类型



StartTrace

启动事件追踪

TraceId 写回的id

InstanceName 名字 描述性名称

Properties 指向EVENT_TRACE_PROPERTIES结构的指针

对应的关闭操作是利用ControlTrace完成的 当ControlCode设置为EVENT_TRACE_CONTROL_STOP时停止事件追踪

EVENT_TRACE_PROPERTIES

比较重要的成员

Wnode.BufferSize 结构体大小

Wnode.Flags 特性



Wnode.ClientContext 时间戳来源

LogFileMode 日志存储模式 EVENT_TRACE_FILE_MODE_SEQUENTIAL



EnableFlags 要捕获的事件类型



QueryAllTraces

查询所有正在运行的跟踪会话属性

PropertyArray 写回的指针数组

PropertyArrayCount 数组的元素个数

LoggerCount 写回正在运行的追踪会话的总数

MSDN提供的demo输出类似这样



EnableTraceEx2

ProviderId provider的GUID

ControlCode 禁用或启用



EnableParameters 指向ENABLE_TRACE_PARAMETERS结构的指针 比较重要

ENABLE_TRACE_PARAMETERS

其中最重要的成员EnableProperty 也就是用logman查询到的properties



一般都是65 0x41 也就是EVENT_ENABLE_PROPERTY_SID | EVENT_ENABLE_PROPERTY_ENABLE_KEYWORD_0



TdhEnumerateProviders

获取所有提供者信息 包括GUID nameoffset



EnumerateTraceGuidsEx

获取跟踪会话相关信息 TraceQueryInfoClass枚举的值可以在evntrace.h中查看详细介绍

不同的枚举对输入要求不同



这里涉及到三个结构

TRACE_GUID_INFOTRACE_PROVIDER_INSTANCE_INFOTRACE_ENABLE_INFO

TRACE_GUID_INFO.InstanceCount 表明 TRACE_PROVIDER_INSTANCE_INFO 的数量

TRACE_PROVIDER_INSTANCE_INFO.EnableCount 表明 TRACE_ENABLE_INFO 的数量

如例子中给出的InstanceCount = 2 代表块中一共有两个TRACE_PROVIDER_INSTANCE_INFO TRACE_PROVIDER_INSTANCE_INFO.EnableCount = 2 接下来有两个TRACE_ENABLE_INFO

其中比较重要的成员 TRACE_ENABLE_INFO.LoggerId 也就是TraceId 调用EnableTraceEx2等函数需要TraceId

可以考虑hook上述函数进行ETW的规避

AMSI

将amsi.dll拖入ida

可以在GenerateEtwEvent中找到EventWrite的调用





id: 0x44d

Version: 0x0

Channel: 0x10

Level: 0x4 (TRACE_LEVEL_INFORMATION)

Opcode: 0x0

Task 0x0

Keyword 0x8000000000000001 event1



相关对抗

1.移除Autologger子项

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI\Autologger下移除指定事件会话的提供者 在下次开机时无法接受到对应事件



当然修改Enable的值也是一样的

重启后生效

2.修改Properties

前文说到的Provider的Properties 一般是0x65

EVENT_ENABLE_PROPERTY_SID | EVENT_ENABLE_PROPERTY_ENABLE_KEYWORD_0

在事件的扩展数据中包含用户的安全标识符 且 记录keyword为0的事件

EVENT_ENABLE_PROPERTY_ENABLE_KEYWORD_0替换成EVENT_ENABLE_PROPERTY_IGNORE_KEYWORD_0 也就是0x11 将导致不记录keyword为0的事件



重启后生效

3.从事件会话中移除提供者

需要system权限 立即生效

logman update trace EventLog-Application --p Microsoft-Windows-PowerShell -ets

--p取消订阅 -p订阅

通过winApi实现如下



4.Hook EtwEventWrite



底层调用EtwpEventWriteFull 最终调用到NtTraceEvent进0环

hook就不多说了

这里选择hook 未导出的EtwpEventWriteFull比较好

5.会话劫持

首先通过QueryAllTraces获取当运行的所有会话

接着遍历traceProps获取目标会话 通过ControlTrace停止会话 修改LogFileName

之后事件将会被写入修改后的logfile中

重新启动





内核

NtAllocateVirtualMemory 调用了MiAllocateVirtualMemory

其中调用了EtwTiLogAllocExecVm



这类EtwTi开头的函数都是用于记录威胁信息的 这里的ti指的是Threat-Intelligence





这里的ProtectionMask 不是三环那个掩码 而是通过MiMakeProtectionMask生成的

高低位分开 高位为0则查低位 低位为0则查高位 比如PAGE_READONLY 对应着0x2 也就是查低位 得到MM_READONLY

对应的也就是0x1

这里ProtectionMask&2 != 0 也就是记录的MM_EXECUTE 对应的三环0x10

接着看EtwTiLogAllocExecVm 其中调用了EtwProviderEnabledEtwEventEnabled

当这两个函数均返回TRUE后才会走进EtwWrite记录日志

前者验证Provider是否在指定的level和keyword上启用

后者验证是否启用了事件







参考

https://blog.trailofbits.com/2023/11/22/etw-internals-for-security-research-and-forensics/

https://blog.palantir.com/tampering-with-windows-event-tracing-background-offense-and-defense-4be7ac62ac63

https://www.ired.team/miscellaneous-reversing-forensics/windows-kernel-internals/etw-event-tracing-for-windows-101

https://posts.specterops.io/uncovering-windows-events-b4b9db7eac54

https://github.com/maxamin/Offensive-SysAdmin-Security-Utilities/blob/76bb59a47bbea79017c09e367ff9a34d54b65df2/etwkiller.c

https://www.binarly.io/blog/design-issues-of-modern-edrs-bypassing-etw-based-solutions

https://undev.ninja/introduction-to-threat-intelligence-etw/

https://b4rtik.github.io/posts/evading-windefender-atp-credential-theft-kernel-version/



0 条评论
某人
表情
可输入 255

没有评论