ManagementObject用于创建WMI类的实例与WINDOWS系统进行交互,通过使用WMI我们可以获取服务器硬件信息、收集服务器性能数据、操作Windows服务,甚至可以远程关机或是重启服务器。
WMI 的全称 Windows Management Instrumentation,即 Windows 管理规范,在 Windows 操作系统中,随着 WMI 技术的引入并在之后随着时间的推移而过时,它作为一项功能强大的技术,从 Windows NT 4.0 和 Windows 95 开始,始终保持其一致性。它出现在所有的 Windows 操作系统中,并由一组强大的工具集合组成,用于管理本地或远程的 Windows 系统。
微软提供了丰富的 WMI 对象用来与操作系统相关的信息进行通信。例如:Win32_Process,Win32_Service,AntiVirusProduct,Win32_StartupCommand
等等,所有的WMI对象都使用类似于一个 SQL 查询的语言称为 WMI 查询语言WQL, WQL 能够很好且细微的控制返回给用户的 WMI 对象。下图提供了微软实现 WMI 的一个高级别概述以及微软实现的组件和实现的标准之间的关系
0X02 WMI查询
WMI 提供了一种简单的语法WQL用于查询 WMI 对象实例,有三种类别的 WQL 查询: | ||
---|---|---|
名称 | 用途 | |
实例查询 | 用于查询 WMI 类的实例 | |
事件查询 | 用于一个 WMI 事件注册机制,例如 WMI 对象的创建、 删除或修改 | |
元查询 | 用于查询 WMI 类结构 |
实例查询是最常见的用于获取 WMI 对象实例的 WQL 查询。基本的实例查询采用以下形式:
**SELECT \[Class property name|*\] FROM \[CLASS NAME\] <WHERE \[CONSTRAINT\]>
**
以下查询将返回所有正在运行的进程的可执行文件名称中包含"Chrome"的结果。具体的说是,此查询将返回 Win32_Process 类的每个实例的所有属性的名称字段中包含字符串"Chrome"的结果。
**SELECT* FROM Win32\_Process WHERE Name LIKE "%chrome%"
**
事件查询提供了报警机制,触发事件的类。在 WMI 类实例被创建时被用于常用的事件查询触发器。事件查询将采取以下形式:
**SELECT \[Class property name|*\] FROM \[INTRINSIC CLASS NAME\] WITHIN \[POLLING INTERVAL\] <WHERE \[CONSTRAINT\]>
**
**SELECT \[Class property name|*\] FROM \[EXTRINSIC CLASS NAME\] <WHERE \[CONSTRAINT\]>
**
内部和外部的事件将在事件章节中进一步详细解释。
下面是交互式用户登录的事件查询触发器。根据MSDN 文档描述,交互式登录的LogonType值为 2。
**SELECT* FROM \_\_InstanceCreationEvent WITHIN 15 WHERE TargetInstance ISA 'Win32\_LogonSession' AND TargetInstance.LogonType = 2
**
下面是在可移动媒体插入时的事件查询触发器:
**SELECT* FROM Win32\_VolumeChangeEvent WHERE EventType = 2
**
元查询提供一个 WMI 类架构发现和检查机制。元查询采用以下形式:
**SELECT \[Class property name|*\] FROM \[Meta\_Class<WHERE \[CONSTRAINT\]>
**
以下查询将列出所有以字符串 "Win32" 开头的 WMI 类:
**SELECT* FROM Meta\_Class WHERE \_\_Class LIKE "Win32%"
**
当执行任何 WMI 查询时,除非显式提供命名空间,否则将隐式使用默认的命名空间 ROOT\CIMV2。
0X03 WMI基本用法
WMI 类的命名空间的层次结构非常类似于传统的,面向对象的编程语言的命名空间。所有的命名空间都派生自根命名空间,在用脚本语言查询对象并未显式指定命名空间时,微软使用 ROOT\CIMV2 作为默认的命名空间,Windows系统提供测试器 wbemtest.exe ,wbemtest.exe 是一个功能强大的带有图形界面的 WMI 诊断工具。它能够枚举对象实例、执行查询、注册事件、修改 WMI 对象和类,并且可以在本地或远程去调用方法。WQL: SELECT * FROM Meta_Class WHERE __Class LIKE "Win32%"
下面的 WMI 类是在攻击的侦察阶段可以收集数据的:
- 主机/操作系统信息:Win32_OperatingSystem, Win32_ComputerSystem
- 文件/目录列举: CIM_DataFile
- 磁盘卷列举: Win32_Volume
- 注册表操作: StdRegProv
- 运行进程: Win32_Process
- 服务列举: Win32_Service
- 事件日志: Win32_NtLogEvent
- 登录账户: Win32_LoggedOnUser
- 共享: Win32_Share
- 已安装补丁: Win32_QuickFixEngineering
.NET下需引入程序集:Assembly Name="System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",命名空间:using System.Management,该命名空间提供对一组符合WMI基础结构的系统、设备和应用程序的管理信息和管理事件的访问。
名称 | 用途 |
ManagementScope | 连接WMI命名空间 |
ManagementBaseObject | 管理对象的基本元素 |
ManagementObject | 管理WMI实例 |
ManagementObjectCollection | 通过WMI检索到的管理对象的集合 |
ManagementObjectSearcher | 查询检索管理对象的集合 |
ManagementObjectSearcher表示基于指定的查询检索管理对象的集合,笔者通过一段代码获取当前系统账户名,指定WMI的Key = Win32_UserAccount ,遍历出包含的所有系统账户,如下代码
private static string GetHardWareInfo(string item)
{
if (item == "" || item == null)
{
return null;
}
string hardinfo = null;
string querystr = string.Format("select * from {0}", item);
ManagementObjectSearcher objvide = new ManagementObjectSearcher(querystr);
foreach (ManagementObject obj in objvide.Get())
{
hardinfo += obj["Name"].ToString() + "\n";
}
return hardinfo;
}
//Main方法中调用
string v = GetHardWareInfo("Win32_UserAccount");
Console.WriteLine(v);
常用的WMI类还有如下列表
WMI类 | 释义 | 适用范围 |
Win32_StartupCommand | 系统自动启动程序 | 操作系统 |
Win32_Service | 系统安装的服务 | 操作系统 |
Win32_Group | 系统管理组 | 操作系统 |
Win32_GroupUser | 系统组帐号 | 操作系统 |
Win32_UserAccount | 用户帐号 | 操作系统 |
Win32_Process | 系统进程 | 操作系统 |
Win32_Thread | 系统线程 | 操作系统 |
Win32_Share | 共享 | 操作系统 |
Win32_SystemDriver | 驱动程序 | 操作系统 |
Win32_LogicalDisk | 逻辑磁盘 | 操作系统 |
Win32_ComputerSystem | 计算机信息简要 | 操作系统 |
Win32_OperatingSystem | 操作系统信息 | 操作系统 |
Win32_PrintJob | 打印机任务 | 硬件 |
Win32_BIOS | BIOS 芯片 | 硬件 |
Win32_DiskDrive | 硬盘驱动器 | 硬件 |
Win32_Keyboard | 键盘 | 硬件 |
Win32_Processor | CPU 处理器 | 硬件 |