WMI 攻击手法研究 - 基础篇 (第一部分)
本篇文章翻译自:Offensive WMI - The Basics (Part 1) :: 0xInfection's Blog — Random ramblings of an Infected Geek这篇文章是有关 WMI 的多篇系列文章中的第一篇,如果读者对 PowerShell 有个基本的了解,那么对阅读本篇文章会有所帮助,但这不是必需的。
一、介绍
1.1 为何是 WMI
WMI 是 Microsoft 的一组规范,旨在对 Windows 系统进行快速高效的管理。正如你可能知道的那样,一项安全规则表明 任何对管理有用的东西也很容易被不法分子滥用,WMI 确实可以做很多事情 —— 从收集计算机状态和配置设置到运行应用程序和执行代码。此外,WMI 存在于所有可用的 Windows 操作系统版本中,因此这里的目标范围非常广泛。
1.2 什么是 WMI
让我们快速回顾一些重要术语,WMI 是 Windows Management Instrumentation 的缩写,它是 Microsoft 对 CIM (Common Information Model,通用信息模型) 和 WBEM (Web-Based Enterprise Management,基于 Web 的企业管理) 的实现 —— 这两者都是 DMTF (Distributed Management Task Force,分布式管理任务组) 标准。WMI 为应用程序或脚本提供了一个整洁统一的界面来管理计算机 (可能是远程的,也可能是本地的) —— 包括进程、服务等。
1.3 WMI 体系架构
了解体系架构对于了解整个 WMI 生态系统的工作方式非常重要,WMI 架构如下所示 (源于 Graeber 在 BHUSA 15 的演讲):
让我们来逐一了解主要组件:
Clients/Consumers:基本上是与 WMI 类交互 (查询数据、运行方法等) 终端。比较有代表性的客户端包括 wmic.exe、wbemtest.exe、winrm.exe、VBScript/JScript 和 ofc PowerShell cmdlets。
Query Languages:就像 SQL 提供查询数据库的方法一样,WMI 也有用于查询 WMI 服务的 WQL (WMI 查询语言) / CQL。在管理远程盒子方面,WBEM 标准开始发挥作用,其中包括 DCOM 和 WS-Man (如果你不理解这些术语,请不要担心,请继续阅读)。WQL 是 WMI 基础 SQL 语法,因此不区分大小写。一个简单查询 BIOS 信息语句如下:
select * from win32_bios
Repositories:存储类的所有静态数据的数据库,存储库由 MOF (managed object format,托管对象格式) 文件定义,MOF 文件定义了结构、类、名称空间等,可以在 %WINDIR%\System32\Wbem\Repository 目录下找到数据库文件。
MOF 文件:MOF 文件基本上用于定义 WMI 命名空间、类、provider 等,通常位于 %WINDIR%\System32\Wbem 下,扩展名为 MOF。在本系列的后续部分中,我们将了解如何编写自己的 MOF 文件来扩展 WMI 功能集。
Providers:可以在 WMI Providers 的帮助下访问存储库中定义的任何内容,它们通常是 Dll 文件,并与 MOF 文件 (cimwin32.dll、stdprov.dll 等) 关联。不过,它们也可以采用其它类型 (类、事件、事件使用者、方法等) 的形式。Providers 对生态系统至关重要,因为它们监视来自特定定义对象的事件和数据,比如驱动程序,它在托管对象和 WMI 之间提供了一个桥梁。在下面的截图中,dll 文件都有相对应的 MOF 文件:
Managed Objects:上下文中资源的别名,即托管对象可以是 WMI 管理的服务、进程或操作系统。
Namespaces:简言之,名称空间是类的逻辑划分,便于发现和使用,分为 3 组 (system、core、extension) 和 3 个类型 (abstract、static、dynamic),默认情况下具有代表性的名称空间是:root\cimv2、root\default、root\security、root\subscription 等。
体系架构基本就是这样,现在,让我们来了解如何将 WMI 与 PowerShell 一起使用。
二、用 PowerShell 来操作 WMI
现在我们已经完成了理论部分,让我们快速生成一个 PS 终端,请务必记住,在 PowerShell 的 v2 之前,只有少数 cmdlet 可以与 WMI 交互,检查 PowerShell 版本,并将版本更改为 2:
现在,让我们在 PowerShell 提示符中运行 Get-Command--CommandType Cmdlet *wmi* 命令:
提示:这些命令的名称是见名知意的 (稍后我们还会深入讨论)。在任何时候,都可以使用 Powershell 的标准语法:help <command> 来获取有关特定命令的更多信息。例如可能希望尝试帮助调用 WmiMethod 来查看该命令的功能,类似于 Linux 手册页。
从 PowerShell v3 开始,MS 引入了 CIM cmdlet,它利用 WS-MAN 和 CIM 标准来管理对象,访问 CIM cmdlet 在两种情况下具有优势:
在 WMI/DCOM 本身被阻止运行 (可能是由于基于主机的防火墙规则?) 但启用了 WinRM/WS-MAN (Windows 远程管理) 的计算机中,我们仍然可以使用 CIM 来执行与 WMI完全相同的操作。
CIM 本身是一个行业标准,是跨平台实现的,这意味着它也可以用于非 Windows 设备。
DCOM:分布式组件对象模型的别名,DCOM 是网络计算机上软件组件之间通信的专有 Microsoft 协议。WMI 使用分布式 COM (DCOM) 连接到远程计算机。然而,DCOM 并不是那么友好的防火墙。
WS-MAN:WS-MAN 或 WS-Management 是一种 DMTF 标准,它为系统跨 IT 基础架构访问管理信息提供了一种通用方法。另一方面,WS-MAN 使用 HTTP,因此绝对是防火墙友好的。
我们将重做上面所做的,但在将 Powershell 版本更改回默认版本后 (在示例中使用了 Powershell v5):
CIM cmdlet 可以做 WMI cmdlet 所能做的一切。如果我们希望映射 WMI cmdlet 和 CIM cmdlet 之间的功能,以下是两种类型之间功能比较的表格表示:
Use \ TypesWMI CmdletsCIM Cmdlets
获取类的信息Get-WmiObjectGet-CimInstance
调用方法Invoke-WmiMethodInvoke-CimMethod
订阅一个事件Register-WmiEventRegister-CimIndicationEvent
创建/更新类的实例Set-WmiInstanceSet-CimInstance
删除类的实例Remove-WmiObjectRemove-CimInstance
2.1 使用 PowerShell 进行 WMI 查询
现在我们已经知道了可供我们使用的不同 cmdlet,我们可以尝试运行上面的示例 WQL 查询。我们已经知道 Get WmiObject 可以用来获取关于类的信息。因此,让我们使用 -Query 参数运行 cmdlet:
Get-WmiObject -Query 'select * from win32_bios'
三、结论
这篇文章旨在概述我们将在本系列的下一部分中处理的内容。这里有很多技术术语,但理解它们是必要的。我希望你喜欢阅读本篇文章,期待与你一起探索。
再见,朋友!
页:
[1]