原文:https://medium.com/threatpunter/detecting-removing-wmi-persistence-60ccbb7dff96
当前,Windows Management Instrumentation(WMI)事件订阅已经变成了一种非常流行的在端点上建立持久性后门的技术。于是,我决定鼓捣一下Empire的WMI模块,并分析相关的代码,看看能不能清除这些持久化后门。此外,文中还介绍了用于查看和删除WMI事件订阅的一些PowerShell命令。
关于“Windows Management Instrumentation事件订阅”的介绍,可以参考MITRE ATT&CK网站上的相关文章。
攻击者可以使用WMI的功能来订阅事件,并在事件发生时执行任意代码,从而在系统上留下持久性后门。
WMI是啥?
“WMI是微软为基于Web的企业管理(WBEM)规范提供的一个实现版本,而WBEM则是一项行业计划,旨在开发用于访问企业环境中管理信息的标准技术。WMI使用公共信息模型(CIM)行业标准来表示系统、应用程序、网络、设备和其他托管组件。”
实际上,所谓事件过滤器只不过就是一个WMI类,用于描述WMI向事件使用者传递的事件。于此同时,事件过滤器还给出了WMI传递事件的条件。
配置Sysmon日志记录
我们可以将Sysmon配置为记录WmiEventFilter、WmiEventConsumer
和WmiEventConsumerToFilter
等活动,并启用WMI滥用检测。
WMI活动的Sysmon事件ID
Roberto Rodriguez(@Cyb3rWard0g)的Sysmon配置文件可以捕获上述事件ID。
为此,可以执行以下命令来安装Sysmon,并启用相关的配置文件。
sysmon.exe -i -c .\config_file.xml
建立持久性后门
下面,让我们使用Empire提供的Invoke-WMI模块来创建一个永久的WMI订阅,使其能够常驻受害者端点。
查看Empire的WMI相关模块
查看Empire的Invoke-WMI模块的选项
运行模块
检测方法
查看Sysmon日志,我们就可以看到Empire模块:
注册了一个WMI事件过滤器
注册了一个WMI事件使用者
将事件使用者绑定到事件过滤器
执行Empire的Invoke-WMI模块后,记录Sysmon事件
WMI事件过滤器为该stager设置了相应的执行条件,其中包括对系统正常运行时间的引用。
Sysmon事件ID 19:WmiEvent(检测到了WmiEventFilter的活动)
WMI事件使用者包含了一个Base64编码形式的Empire stager,并且在注册时使用了一个不容易引起人们怀疑的名称,即Updater。
Sysmon事件ID 20:WmiEvent(检测到了WmiEventConsumer的活动)
WMI事件使用者CommandLineEventConsumer.Name=\"Updater\"
被绑定到了事件过滤器__EventFilter.Name=\"Updater\"
上面。
Sysmon事件ID 21:WmiEvent(检测到了WmiEventConsumerToFilter的活动)
现在,事件使用者被绑定到了事件过滤器上面,所以,当事件过滤条件为真时,就会触发相应的事件使用者(即stager)。
如何清除后门
从WMI数据库中删除条目的最简单方法,就是使用Autoruns。为此,我们不妨以管理员身份启动Autoruns,并选择WMI选项卡,这样就可以查找与WMI相关的持久性后门了。
使用Autoruns查看WMI数据库的内容
为了删除相关条目,只需右键单击恶意WMI数据库条目,然后选择“Delete”即可。
此外,我们也可以从命令行中删除相应的WMI事件订阅。
在PowerShell中,我们可以使用Get-WMIObject命令来查看事件筛选器绑定的WMI事件过滤器、事件使用者和使用者过滤器。这里,我们要特别感谢Boe Prox(@proxb)在他的博客上对这些命令给出了详细的解释。
# Reviewing WMI Subscriptions using Get-WMIObject
# Event Filter
Get-WMIObject -Namespace root\Subscription -Class __EventFilter -Filter “Name=’Updater’”
# Event Consumer
Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer -Filter “Name=’Updater’”
# Binding
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter “__Path LIKE ‘%Updater%’”
下面,我们使用Remove-WMIObject命令来删除WMI持久性后门的所有组件。
# Removing WMI Subscriptions using Remove-WMIObject
# Event Filter
Get-WMIObject -Namespace root\Subscription -Class __EventFilter -Filter “Name=’Updater’” | Remove-WmiObject -Verbose
# Event Consumer
Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer -Filter “Name=’Updater’” | Remove-WmiObject -Verbose
# Binding
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter “__Path LIKE ‘%Updater%’” | Remove-WmiObject -Verbose
删除WMI事件订阅
再次运行Autoruns命令,以验证是否已删除相应的持久性后门。