WMI渗透

[toc]

WMI(Windows Management Instrumentation),它是由CIM (Common Information Model) 和 WBEM (Web-Based Enterprise Management)实现

WMI在windows中的架构

image-20211018214428041

Client:常用的客户端应用程序,类似Wmic、powershell、wbemtest

Query languages:wmi的sql查询组件,主要是通过WQL/CQL实现,而WBEM主要包括DCOM和WS-Man

Repositories:由MOF(managed object format)定义的存储数据库,文件存储在%WINDIR%\System32\Wbem\Repository目录。

MOF Files:主要用来定义WMI的命名空间、类、提供的程序等,文件在%WINDIR%\System32\Wbem中,扩展名为.mof。

Providers:wmi管理和具体实现的桥梁,通过驱动连接内核。

Managed Objects:wmi管理的对象进程、服务或者文件。

Namespaces:命名空间,主要包含三组(system、core、extension)和三类(abstract、static、dynamic)。默认的命名空间有root\cimv2 root\default,root\security,root\subscription

namespace:

powershell获取所有的namespace的命令

Get-WmiObject -Namespace root -Class __Namespace | select name

classes:

classes主要包含三个主要目录分别是:

core classes:提供基础功能,通常由两个下划线开始(__systemSecurity)

common classes:内核类的扩展,前缀通常是CIM_(CIM_TemperatureSensor)

Extened Classes:额外加入的公共类(win32_Process)

这些类又被进一步分为四个类型,抽象类、静态类、动态类、相关类。

工作组信息收集

获取特定类名的类

Get-WmiObject -Class *user* -List

获取特定类的数据

查询用户类:Get-WmiObject -Class Win32_UserAccount,如果要获取更加详细的输出,可以使用Get-WmiObject -Class Win32_UserAccount | fl *

查询进程类:Get-WmiObject -Class Win32_Process -Filter 'name="lsass.exe"'

通过进程类来关闭进程

Get-CimInstance -ClassName Win32_Process -Filter 'name="calculator.exe"' | Remove-CimInstance

获取具体类中可用的方法

Get-WmiObject -Class Win32_Process -List | select -ExpandProperty Methods

使用类中的具体方法

Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList calc.exe

wmi查询注册表key值

Invoke-WmiMethod -Namespace root\default -Class stdregprov -Name EnumKey @(2147483650, "software\microsoft\windows nt\currentversion") | select -ExpandProperty snames

获取具体值

Invoke-WmiMethod -Namespace root\default -Class stdregprov -Name enumvalues @(2147483650, "software\microsoft\windows nt\currentversion\drivers32")

获取注册表具体子项

Invoke-WmiMethod -Namespace root\default -Class stdregprov -Name GetStringValue @(2147483650, "software\microsoft\windows nt\currentversion\drivers32", "aux")

创建注册表值

Invoke-WmiMethod -Namespace root\default -Class stdregprov -Name SetStringValue @(2147483649, "software\microsoft\windows\currentversion\run", "C:\Windows\System32\calc.exe", "Calculator")

删除注册表值

Invoke-WmiMethod -Namespace root\default -Class stdregprov -Name DeleteValue @(2147483649, "software\microsoft\windows\currentversion\run", "Calculator")

创建新注册表key值

Invoke-WmiMethod -Namespace root\default -Class stdregprov -Name CreateKey @(2147483650, "software\openssh\CustomAgent")

删除注册表key值

Invoke-WmiMethod -Namespace root\default -Class stdregprov -Name DeleteKey @(2147483650, "software\openssh\CustomAgent")

收集系统信息

Get-WmiObject -Class win32_operatingsystem | fl *

查找具体文件

Get-WmiObject -Class win32_directory -Filter 'name LIKE "%snapshots%"'

查询杀软信息

Get-WmiObject -Namespace root\securitycenter2 -Class antivirusproduct

查询服务信息

Get-WmiObject -Class win32_service -Filter 'startname="localsystem"' | select *

获取登录用户的登录id、开始时间、登录方式

Get-WmiObject -Class win32_logonsession | select authenticationpackage,logonid,starttime,scope

获取windows系统日志

Get-WmiObject -Class win32_ntlogevent

获取windows中的共享资源信息

Get-WmiObject -Class win32_share | select type,name,allowmaximum,description,scope

获取用户组

Get-WmiObject -Class win32_group

获取系统其他的信息

通过创建shadow copy可以创建一个windows备份或者当前镜像,然后使用Invoke-SessionGopher.ps1工具来获取rdp、winSCP的信息。

先创建文件(Get-WmiObject -Class win32_shadowcopy -List).create("C:\", "ClientAccessible"),在进行符号链接

$link = (Get-WmiObject -Class win32_shadowcopy).deviceobject + "/" cmd /c mklink /d C:\shadowcopy "$link"

域信息收集

获取域名

Get-WmiObject -Namespace root\directory\ldap -Class ds_domain | select ds_dc, ds_distinguishedname, pscomputername

获取域策略

获取密码过期时间、最小密码长度、密码历史长度等

Get-WmiObject -Namespace root\directory\ldap -Class ds_domain | select ds_lockoutduration, ds_lockoutobservationwindow, ds_lockoutthreshold, ds_maxpwdage, ds_minpwdage, ds_minpwdlength, ds_pwdhistorylength, ds_pwdproperties

查询域控制器

Get-WmiObject -Namespace root\directory\ldap -Class ds_computer | where { $_.ds_useraccountcontrol -match 532480 } | select ds_cn, ds_dnshostname, ds_operatingsystem, ds_lastlogon, ds_pwdlastset

搜索域内账户

Get-WmiObject -Class win32_useraccount | select name, domain, accounttype

获取单个域的账户:Get-WmiObject -Class win32_useraccount -Filter 'domain="infected"' | select caption

获取当前登录账号及域

Get-WmiObject -Class win32_loggedonuser | where { $_ -match 'infected' } | foreach {[wmi]$_.antecedent}

获取组内所有用户

Get-WmiObject -Class win32_groupuser | where { $_.groupcomponent -match 'domain admins' } | foreach {[wmi]$_.partcomponent}

获取所有特定用户的组(可以获取所有有管理员权限的组)

Get-WmiObject -Class win32_groupuser | where { $_.partcomponent -match 'Administrator' } | foreach {[wmi]$_.groupcomponent}