导语:这篇文章,主要讲述了使用WMI如何执行命令及解决WMI执行命令回显的问题。

在一次渗透时,我通过GPP漏洞拿到一个本地管理员组的账户跟密码,我计划是准备撞号攻击(使用同一账户密码,在内网批量登录),批量登录主机之后使用mimikatz抓取lsass.exe进程的明文密码及hash,拖回本地看看是否域管理员存在。

远程执行命令方式

既然要抓密码,肯定需要远程执行命令,首先我们在看看远程登录WIN主机执行命令有几种方式。

· IPC$+AT

· PSEXEC

· WMI

· Winrm

远程执行命令需要条件

我们来看这些命令的方式,都需要哪些端口。

IPC$+AT  445
PSEXEC   445
WMI      135
       Winrm    5985(HTTP )&5986 (HTTPS)

面临问题

目前问题是,我遇到的这个内网极大多数机器都关闭445端口(可能为了防止MS17010?哈哈)。那么PC$+AT、PSEXEC是无法使用的。只能使用WMI、Winrm,但是Winrm在2012才默认开启,为了通用性只能选择WMI执行命令。

WMI的全称是Windows Management Instrumentation,它出现在所有的Windows操作系统中,默认开启,通用性特别好。

WMI执行命令方式

首先WMI并不支持执行命令,而是支持执行文件但是你可以加相应的参数,比如"wmic /node:127.0.0.1 /user:test /password:!123  process call create "cmd.exe /c ipconfig"。

上面那条命令的意思是创建一个新的进程,进程为CMD.EXE并且我加了相应的参数。

1527143200548078.png

但是存在一个严重问题,执行完Ipconfig命令之后,返回执行结果是否成功,并没有结果的内容,这对渗透测试来说特别不方便。

之后很多安全研究员研究WMI,执行完的结果如何能知道? 早些年大概都是把执行的结果写入目标机器的本地盘符中的某个文件,之后读取这个文件进行回显。

微信图片_20180524162207.png

结果回显的问题解决了,但是存储在服务器上,如何把结果文件拿回本地呢?

下面我们分析下国内安全研究员“Twi1ight”在早些年写的WMI远程执行命令工具“Wmiexec.vbs”,看看他是如何把结果拿回本地呢?

3.png

他是通过FSO组件访问远程共享文件夹中的结果文件,将结果输出。

Wmiexec.vbs整个执行过程是“当用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件,这个文件位于之前创建的共享文件夹中。最后,通过FSO组件访问远程共享文件夹中的结果文件,将结果输出。当结果读取完成时,调用WMI执行命令删除结果文件。最后当WMIEXEC退出时,删除文件共享”。

执行过程也说了需要访问远程共享文件,那么肯定需要445,而我们环境只有135开启,那么Wmiexec是无法使用的。

在脑子回想WMI执行命令之后,想起NCCGROUP写过一款工具"WMICMD.exe"貌似使用了其他的回显方式,看看他们是怎么样回显的?

https://github.com/nccgroup/WMIcmd

甚至源码都不需要看,NCCGROUP直接在README.md已经给结果回显的思路。

4.png

WMICMD执行过程是把结果写入注册表,之后读取注册表并删除,之后回显到本地。因为WMI可以远程操作注册表信息,查询的注册表的信息会有回显。

大概过程就是利用wmi(135)远程执行命令。结果写入注册表中,之后远程读取注册表的结果就OK。

目前我遇到的这种奇葩环境,使用Wmicmd.exe完美解决。

NMAP扫描只开放135端口

5.png

使用WMICMD.EXE执行命令,使用火绒剑分析进程行为。

1527143301929115.png

总结:

这篇文章,主要讲述了使用WMI如何执行命令及解决WMI执行命令回显的问题。当然除了我说的WMI&Net use模式及WMI&Registry,还有其他WMI执行命令回显的方式。

如果想要执行自己特定的文件,可以使用WMI执行系统文件bitsadmin、IEExec、Certutil去执行下载到目标机,再次执行就OK;或者上传到到注册表,之后导出执行也OK。

源链接

Hacking more

...