WMI攻击方法研究 - 基础篇(第 1 部分)
这篇博客文章是关于WMI的系列文章的第一部分,面向的是没基础的读者。对Powershell有一个基本的了解肯定会对阅读本博客的读者有所帮助,但是,这并不是必需的。好了,让我们进入正题吧。
介绍
为什么是 WMI?
WMI 是 Microsoft 的一组规范,用于Windows系统的快速和高效管理。你可能知道,有一条安全规则说:“任何对管理有用的东西也很容易被坏人滥用。”WMI确实可以做很多事情——从收集计算机状态和配置设置到运行应用程序和执行代码。此外,WMI在所有可用的Windows操作系统版本中都存在,所以这里的目标界面相当广泛。
什么是 WMI?
让我们快速浏览一下几个重要的术语。WMI 代表Windows Management Instrumentation,它是 Microsoft 对 CIM(公共信息模型)和 WBEM(基于 Web 的企业管理)的实现——两者都是DMTF(分布式管理任务组)标准。WMI 为应用程序/脚本提供了一个整洁统一的界面来管理计算机(可能是远程的和本地的)——包括。流程、服务等。
WMI 架构
理解架构对于理解整个 WMI 生态系统的工作方式至关重要。WMI 架构的广泛概述如下所示(源自[Graeber 在 BHUSA 15 的演讲](https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent Asynchronous-And-Fileless-Backdoor-wp.pdf)):
让我们一一解释主要组件:
-
客户端/使用者(Clients/Consumers):它们本质上是与WMI类交互以查询数据、运行方法等的终端使用者。少数知名的客户端包括
wmic.exe
,wbemtest.exe
,winrm.exe
, VBScript/JScript和ofc Powershell cmdlets。 -
查询语言(Query Languages):就像SQL提供了查询数据库的方法一样,WMI也有WQL (WMI查询语言)/ CQL来查询WMI服务。当涉及到管理远程计算机时,WBEM标准开始发挥作用——其中包括DCOM和WS-Man(如果你不理解这些术语,请不要担心,继续阅读)。WQL基本上是用于WMI的SQL语法,所以不区分大小写。
一个简单的查询可能如下所示:
select * from win32_bios
这给了我们关于BIOS的信息。
-
存储库(Repositories):这是我们前面讨论过的存储类的所有静态数据(定义)的数据库。存储库是由MOF(托管对象格式)文件定义的,该文件定义了结构、类、名称空间等。数据库文件可以在
%WINDIR% System32\Wbem\Repository
目录下找到。
-
MOF 文件(MOF Files):MOF 文件基本上用于定义 WMI 命名空间、类、提供程序等。你通常会在
%WINDIR%\System32\Wbem
具有扩展名的目录下找到它们.mof
。在本系列的后面部分,我们将了解如何编写自己的 MOF 文件来扩展 WMI 的功能集。 -
提供者(Providers):在WMI提供者的帮助下,可以访问存储库中定义的任何内容。它们通常是DLL文件,并与MOF文件相关联——cimwin32.dll、stdprove . DLL等,不过,它们也可以采取其他类型的形式(类、事件、事件消费者、方法等)。提供者对生态系统是必不可少的,因为它们监视来自特定定义对象的事件和数据。可以将提供程序看作是在托管对象和WMI之间提供桥梁的驱动程序。
在下面的屏幕截图中,DLL 文件是相关 MOF 文件的提供者:
-
托管对象(Managed Objects):这些是上下文中资源的别名,即托管对象可以是 WMI 管理的服务、进程或操作系统。
-
命名空间(Namespaces):简而言之,命名空间是类的逻辑划分,旨在便于发现和使用。他们分为
3组:
system(系统)
core(核)
extension(扩展)
3 种类型:
abstract(抽象)
static(静态)
dynamic (动态)
这就是架构。现在让我们学习一些有关在 Powershell 中使用 WMI 的知识。
将 WMI 与 Powershell 结合使用
现在我们已经完成了理论部分,我们打开一个PS终端。要记住,在Powershell v2之前,只有几个cmdlet可以与WMI交互。我们将快速检查我们的Powershell版本,并将版本更改为2:
现在,让我们在 Powershell 提示符下运行Get-Command -CommandType Cmdlet *wmi*
:
提示:命令的名称一目了然(我们稍后还会深入研究)。在任何时候,你都可以使用 Powershell 的标准语法:help <command>
获取有关特定命令功能的更多信息。例如,你可能想尝试help Invoke-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 之间的功能,这里是两种类型之间功能比较的表格表示:
使用 Powershell 运行 WMI 查询
现在我们知道了可供我们使用的不同 cmdlet,我们可以尝试运行上面的示例 WQL 查询。我们已经知道Get-WmiObject
可以用来获取关于类的信息。因此,让我们运行带有-Query
参数的 cmdlet :
Get-WmiObject -Query 'select * from win32_bios'
原文地址:https://0xinfection.github.io/posts/wmi-basics-part-1/
结论
这篇博客文章的目的是概述我们将在本系列的下一部分中处理的内容。这里有很多技术术语,但理解它们是必要的。我希望你喜欢到目前为止的阅读,我期待着我们一起探索WMI的旅程。