WMI 攻击手法研究 – 基础篇 (第一部分)

2022-11-23 19:04:23 浏览数 (2)

文章目录[隐藏]

  • 介绍
  • 用 PowerShell 操作 WMI
  • 使用 PowerShell 里的 WMI 查询
  • 结论

这篇文章是有关 WMI 的多篇系列文章中的第一篇,如果读者对 PowerShell 有个基本的了解,那么对阅读本篇文章会有所帮助,但这不是必需的。

介绍

为何是 WMI

WMI 是 Microsoft 的一组规范,旨在对 Windows 系统进行快速高效的管理。正如你可能知道的那样,一项安全规则表明任何对管理有用的东西也很容易被不法分子滥用,WMI 确实可以做很多事情 —— 从收集计算机状态和配置设置到运行应用程序和执行代码。此外,WMI 存在于所有可用的 Windows 操作系统版本中,因此这里的目标范围非常广泛。

什么是 WMI

让我们快速回顾一些重要术语,WMI 是 Windows Management Instrumentation 的缩写,它是 Microsoft 对 CIM (Common Information Model,通用信息模型) 和 WBEM (Web-Based Enterprise Management,基于 Web 的企业管理) 的实现 —— 这两者都是 DMTF (Distributed Management Task Force,分布式管理任务组) 标准。WMI 为应用程序或脚本提供了一个整洁统一的界面来管理计算机 (可能是远程的,也可能是本地的) —— 包括进程、服务等。

WMI 体系架构

了解体系架构对于了解整个 WMI 生态系统的工作方式非常重要,WMI 架构如下所示 (源于 Graeber 在 BHUSA 15 的演讲):

让我们来逐一了解主要组件:

  • Clients/Consumers:基本上是与 WMI 类交互 (查询数据、运行方法等) 终端。比较有代表性的客户端包括 wmic.exewbemtest.exewinrm.exe、VBScript/JScript 和 ofc PowerShell cmdlets。
  • Query Languages:就像 SQL 提供查询数据库的方法一样,WMI 也有用于查询 WMI 服务的 WQL (WMI 查询语言) / CQL。在管理远程盒子方面,WBEM 标准开始发挥作用,其中包括 DCOM 和 WS-Man (如果你不理解这些术语,请不要担心,请继续阅读)。WQL 是 WMI 基础 SQL 语法,因此不区分大小写。一个简单查询 BIOS 信息语句如下:
代码语言:javascript复制
select * from win32_bios
  • Repositories:存储类的所有静态数据的数据库,存储库由 MOF (managed object format,托管对象格式) 文件定义,MOF 文件定义了结构、类、名称空间等,可以在 %WINDIR%System32WbemRepository 目录下找到数据库文件。
  • MOF 文件:MOF 文件基本上用于定义 WMI 命名空间、类、provider 等,通常位于 %WINDIR%System32Wbem 下,扩展名为 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),默认情况下具有代表性的名称空间是:rootcimv2、rootdefault、rootsecurity、rootsubscription 等。

体系架构基本就是这样,现在,让我们来了解如何将 WMI 与 PowerShell 一起使用。

用 PowerShell 操作 WMI

现在我们已经完成了理论部分,让我们快速生成一个 PS 终端,请务必记住,在 PowerShell 的 v2 之前,只有少数 cmdlet 可以与 WMI 交互,检查 PowerShell 版本,并将版本更改为 2:

提示:这些命令的名称是见名知意的 (稍后我们还会深入讨论)。在任何时候,都可以使用 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 Type

WMI Cmdlets

Cim Cmdlets

获取类的信息

Get-WmiObject

Get-CimInstance

调用方法

Invoke-WmiMethod

Invoke-CimMethod

订阅一个事件

Register-WmiEvent

Register-CimIndicationEvent

创建/更新类的实例

Set-WmiInstance

Set-CimInstance

删除类的实例

Remove-WmiObject

Remove-CimInstance

使用 PowerShell 里的 WMI 查询

现在我们已经知道了可供我们使用的不同 cmdlet,我们可以尝试运行上面的示例 WQL 查询。我们已经知道 Get WmiObject 可以用来获取关于类的信息。因此,让我们使用 -Query 参数运行 cmdlet:

代码语言:javascript复制
Get-WmiObject -Query 'select * from win32_bios'

结论

这篇文章旨在概述我们将在本系列的下一部分中处理的内容。这里有很多技术术语,但理解它们是必要的。我希望你喜欢阅读本篇文章,期待与你一起探索。

再见,朋友!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

0 人点赞