WML实战应用(一) - WMI 技术详解

前言:
之前使用脚本语言写过一些Windows管理脚本,其中需要 更换DNS 的时候使用到这个技术,后面自行查阅了诸多资料结合自己的研究,发现这个技术在Windows下真的是非常强大的,而且因为是比较经典的技术,在国内搜索引擎中大概09年就已经有了很多WMI的介绍使用文章,阅读之后发现其功能强大,文档丰富。而且它不仅仅可以写一些简短的脚本来进行"获取或者更改资源的操作",也可以利用这个技术进行横向移动、权限维持、权限提升、甚至免杀。故写作此分类文章,特此记录。(此系列文章使用的复现语言有VB6,Python,Power Shell)

WMI 概述

WMI的全称是Windows Management
Instrumentation,即Windows管理工具。它是Windows操作系统中管理数据和操作的基础模块。我们可以通过WMI脚本或者应用程序去管理本地或者远程计算机上的资源。对于VC和汇编程序员,想获取诸如CPU序列号和硬盘序列号等信息是非常容易的。但是对于VB以及其他一些脚本语言,想尝试获取系统中一些硬件信息可能就没那么容易了。微软为了能达到一种通用性目的(遵守某些行业标准),设计了WMI。

此段引用自breaksoftware的博文,大致意思是WMI是为了兼顾VB的查询信息的操作,所以设计了WMI,其他的脚本性质的语言也可以通过此种方式来进行资源管理。这里我们知道了WMI并不是所有语言都可以使用,不过现在大部分脚本语言都具有黏合性,所以基本支持Windows系统的编程语言都可以使用(也有的文章说,是需要支持ActiveX技术)

可以通过查阅Microsoft官方的帮助文档WMI来进行语言支持的查看
Snipaste_2022-08-28_01-43-01.png
在上图可以看到可以利用的语言有VB6,VBS,C++,ASP,C#,Power Shell
其没有Python API,但是可以使用win32的方式间接利用,这个会在后面的章节提到。

运行原理

wmi2.png

WMI基础结构是Windows系统的系统组件。它包含两个模块:包含WMI Core(WMI核心)的WMI Service(WMI服务)(Winmgmt)和WMI Repository(WMI存储库)。WMI存储库是通过WMI Namespace(WMI命名空间)组织起来的。在系统启动时,WMI服务会创建诸如root\default、root\cimv2和root\subscription等WMI命名空间,同时会预安装一部分WMI类的定义信息到这些命名空间中。其他命名空间是在操作系统或者产品调用有关WMI提供者(WMI Provider)时才被创建出来的。简而言之,WMI存储库是用于存储WMI静态数据的存储空间。WMI服务扮演着WMi提供者、管理应用和WMI存储库之间的协调者角色。一般来说,它是通过一个共享的服务进程Svchost来实施工作的。当第一个管理应用向WMI命名空间发起连接时,WMI服务将会启动。当管理应用不再调用WMI时,WMI服务将会关闭或者进入低内存状态。如我们上图所示,WMI服务和上层应用之间是通过COM接口来实现的。当一个应用通过接口向WMI发起请求时,WMI将判断该请求是请求静态数据还是动态数据。

WML功能

对于运维人员:

访问本地主机的一些信息和服务,可以管理远程计算机(当然你必须要拥有足够的权限,并且双方开启WMI服务,且135端口的防火墙策略是入站出站允许的),比如:重启,关机,关闭进程,创建进程等。可以自定义脚本来进行自动化运维,十分方便,例如可以使用wmic、wbemtest工具。WMIC命令解释。

对于网安人员

利用WMI进行横向移动、权限维持、权限提升、免杀

以上提到的功能会在后面一一进行介绍。

参考文章

  1. WMI的讲解(是什么,做什么,为什么)
  2. WMI技术介绍和应用——WMI概述