WMI渗透
[toc]
WMI(Windows Management Instrumentation),它是由CIM (Common Information Model) 和 WBEM (Web-Based Enterprise Management)实现
WMI在windows中的架构
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}