WMI ——重写版

本文是关于Windows Management Instrumentation (WMI) 的深入解析,介绍了WMI的历史、概念、交互方式、WQL查询语言、远程协议以及安全方面的考虑。WMI是Windows系统中的管理数据和操作基础设施,通过CIM模型表示系统、应用等管理对象。与WMI交互的工具包括Powershell、wmic.exe等,而WQL是其查询语言的子集。远程WMI协议使用DCOM和WinRM,其中WinRM基于WS-Management协议。文章还探讨了WMI在攻击防御和缓解措施中的角色,以及如何利用WMI进行持久化、命令执行和数据存储。
摘要由CSDN通过智能技术生成

本文作者:伍默(内网知识星球学员)

本文是以WMI的重写版,本来这份笔记会更长,原版的笔记以Black Hat 2015的Abusing Windows Management Instrumentation (WMI) to Build a Persistent, Asyncronous, and Fileless Backdoor为主要学习资料,在笔记写到大概一万字的时候,Typora 中保存的内容部分丢失。于是重新整理,有了这份,我认为精简版的WMI笔记。

WMI 背景


WMI 是什么?Windows管理规范(WMI)是Microsoft对基于Web的业务管理标准(WBEM),公共信息模型(CIM)和分布式管理任务组(DMTF)的实现。

换句话说:Microsoft + CIM + WBEM +DMTF = WMI

打开MSDN 中关于WMI的描述是这样:

  • Windows Management Instrumentation (WMI) is the infrastructure for management data and operations on Windows-based operating systems。

    Windows管理工具(WMI)是基于Windows操作系统的管理数据和操作的基础设施。

快速的过一下这部分内容的重点:

  • WMI实际上的历史非常久远,最早在Windows 2000中内置,后面所有的Windows 系统中都内置了该项服务。

  • WMI使用公共信息模型 (CIM) 表示托管组件,其中包括系统、应用程序、网络等等

  • CIM中使用 “Class"(类)表示管理对象,类的实例是“Object”,名称空间(Namespace)是一个类的集合。类包含属性(Property)和方法(Method)。

  • WMI支持Schema的概念。Schema 是描述特定管理环境的一组类。Microsoft Windows SDK 中使用了两个 Schema : CIM Schema 和 Win 32 Schema 。CIM Schema Class 使用 "CIM_" 开头,Win32 Schema Class 使用 "Win32_" 开头。

和WMI交互


在开始WMI之前,我建议 WmiExplorer 查看 自己机器上的Namespaces、Class、Property、Method等等,对我说的概念有一个简单的了解,复杂你可能会看着很懵。

为了验证上面我描述的一些内容,我建议WmiExplorer进行查看:

可以注意到前面描述中的Namespace、Class、Properties、Methods……。

实际上和WMI交互有多种方法:

  • Powershell

  • wmic.exe

  • wbemtest.exe

  • winrm.exe and winrm.vbs

  • WMI Explorer

    • WMI Explorer 2.0.0.2

    • WMI Explorer

    • WMI Tools

    • CIM Explorer 2020(收费,但是非常强大,对类进行了中文说明,VBscript、powershell 代码简洁,推荐)

  • Windows Script Host Languages(VBScript – JScript)

  • IWbem* COM API

  • .NET System.Management classes

  • Linux:wmic and wmis

另外两个小工具:

  • WMI Code Creator

    这是微软官方出的一款代码生成器,可生成C#、VB .net 、VB Script代码

  • WMIGen

    可生成各种变成语言,调用WMI

除了”IWbem* COM API“和”.NET System.Management classes“没有试过,其余的工具均有测试,推荐使用WMI Explorer ,GUI界面非常好用。

WMI Query Language (WQL)


参考:

Querying with WQL

(https://docs.microsoft.com/en-us/windows/win32/wmisdk/querying-with-wql)

WQL (SQL for WMI)

(https://docs.microsoft.com/en-us/windows/win32/wmisdk/wql-sql-for-wmi)

WMI 查询语言(WQL)是ANSI SQL 的子集,WQL支持以下的查询:

  • Data queries

    SELECT [Class property name|*] FROM [CLASS NAME] <WHERE [CONSTRAINT]>
    
  • Event queries

    SELECT [Class property name|*] FROM [INTRINSIC CLASS NAME] WITHIN [POLLINGINTERVAL] <WHERE [CONSTRAINT]>
    
  • Schema queries

    SELECT [Class property name|*] FROM [Meta_Class<WHERE [CONSTRAINT]>
    

详细的语法请参考文档,这里不做过多介绍,用的最多的是 data queries ,请在实际查询中使用,需要明确的是WQL仅能查询,无法使用 Methods 进行增删改等操作。

Remote WMI Protocols


WMI 可以使用两种协议用于Remote WMI:分布式组件对象模型 (DCOM) 和 Windows 远程管理 (WinRM)。

DCOM

  • Microsoft 在TCP 135 端口和一系列的动态端口(不同版本不一样) 运行DCE RPC end-point mapper为它的DCOM服务

  • 端口可通过注册表项

    HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc\Internet\中

    的Ports设置

  • 可通过DCOMCNFG.exe 配置

  • 对防火墙不友好(使用 TCP 135和一系列动态端口 1024 到 65535)

  • 默认情况下 Wmi Service ——Winmgmt 在135端口下运行和监听

WinRM/PowerShell Remoting


参考:

About Windows Remote Management(https://docs.microsoft.com/en-us/windows/win32/winrm/about-windows-remote-management)

  • 实验之前,请务必阅读一遍官方官方文档,哪怕是草草看过。

介绍Windows Remote Management(Winrm)之前,先了解WS-Management ,Ws-Man 协议是基于SOAP协议的DMTF开放标准,WinRM则是对WS-Man协议的 Windows 实现。

  • DMTF是不是感觉有点耳熟?前面说WMI背景中就提到过。

  • 默认情况下,从Windows Vista开始成为Windows 的默认组件,从Windows Server 2008 开始, WinRM服务自动启动

  • 默认情况下,未配置WinRM侦听器,即使WinRM服务在运行,无法接受和请求WS-Man 协议消息

  • Ws-Man 流量是加密的,不论HTTP 或HTTPS

  • 默认配置侦听端口是:HTTP(5985)和HTTPS(5986)

    • 注意,这里的默认配置指定是 Winrm quickconfig 之后。

需要明确的是两种协议均支持NTLM or Kerberos,也就是说,Pass The Hash和Pass The Ticket对 Wmi 和WinRM均适用

Powershell-DCOM


从Powershell v3 及后续版本,Powershell 中提供了两种 Cmdlets:

  • CIM Cmdlets

  • WMI Cmdlets

  • 前面我提到过namespace,如果不显式指定,默认namespace 为 root\CIMv2

CIM cmdlets 和WMI Cmdlets 差异在于 CIM Cmdlets 使用WSMAN(WinRM)连接远程计算机,WMI Cmdlets 是所有的是DCOM 连接远程计算机。

  • 如果CIM Cmdlets 使用DCOM 无法建立会话,可以使用 -Protocol 参数退回到DCOM

#WMI Cmdlets
$Username ="0day\Administrator"
$Password = ConvertTo-SecureString "Admin!@#45" -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential
$Username,$Password
#为了避免凭据提示弹框
Get-WmiObject -ComputerName OWA2010SP3 -Credential $Credential -Class
Win32_Process |Select-Object Name,ProcessId
#这里枚举了下进程
#另外支持WQL查询
Get-WmiObject -Query "select * from Win32_Process" |Select-Object Name,ProcessID
#该命令和上面的效果相同
Powershel-WinRM
#CIM cmdlets
$Username ="0day\Administrator"
$Password = ConvertTo-SecureString "Admin!@#45" -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential
$Username,$Password
$CimSessionOption = New-CimSessionOption -Protocol Dcom
$CimSession = New-CimSession -computerName OWA2010SP3 -Credential $Credential -SessionOption $CimSessionOption

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值