利用WMI代替psexec——WMIEXEC.vbs
0x01 背景
内网渗透中经常用到psexec这个工具,可以很方便的得到一个半交互式的cmd shell。
但是psexec也有一些问题:psexec需要对方开启ADMIN$共享,而且需要安装服务;另外,psexec退出时有可能服务删除失败,这个情况只是偶尔,但是我碰到过。
安装服务会留下明显的日志,而且服务没有删除的风险更大,管理员很容易就会发现。
WMI可以远程执行命令,所以我就想用VBS脚本调用WMI来模拟psexec的功能,于是乎WMIEXEC就诞生了。基本上psexec能用的地方,这个脚本也能够使用。
0x02 WMIEXEC功能
WMIEXEC支持两种模式,一种是半交互式shell模式,另一种是执行单条命令模式。
WMIEXEC需要提供账号密码进行远程连接,但是如果没有破解出账号密码,也可以配合WCE的hash注入功能一起使用,先进行hash注入,然后再使用WMIEXEC即可。
半交互式shell模式
提供账号密码,执行如下命令:
cscript.exe //nologo wmiexec.vbs /shell 192.168.1.1 username password
这样就获得了一个半交互式的shell,这个shell和psexec的shell没什么区别。之所以称为半交互式,是因为这个shell也不能执行实时交互的命令,和psexec是一样的。
上个执行命令的图:
左边是虚拟机里面执行的命令,右边是WMIEXEC里面执行的。
还可以抓取hash:
单个命令执行的模式
这个模式适用于只需要执行一个命令,或者说当前的环境不是交互式shell,没法运行WMIEXEC的shell模式时(比如在webshell里面)。
cscript.exe wmiexec.vbs /cmd 192.168.1.1 username password "command"
上面是提供账号密码的情况,如果有时候我们抓取到的是hash,破解不了时可以利用WCE的hash注入,然后再执行WMIEXEC(不提供账号密码)就可以了。
Tips:
如果抓取的LM hash是AAD3开头的,或者是No Password之类的,就用32个0代替LM hash即可。
0x03 原理和相关问题
整个过程是先调用WMI通过账号密码或者NTLM认证(WCE注入)连接到远程计算机,然后如果提供了账号密码,则用这个账号密码建立一个到目标的IPC连接。随后WMI会建立一个共享文件夹,用于远程读取命令执行结果。
当用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件,这个文件位于之前创建的共享文件夹中。最后,通过FSO组件访问远程共享文件夹中的结果文件,将结果输出。当结果读取完成时,调用WMI执行命令删除结果文件。最后当WMIEXEC退出时,删除文件共享。
由于WMI只负责创建进程,没有办法可以判断命令是否执行完毕,所以脚本采用的方法是延迟1200ms后读取结果文件,但是如果命令执行的时间大于1200ms,比如systeminfo 或者ping之类的,这时候读取结果文件会导致读取的结果不完整,然后在删除结果文件时会出错。
比如正常的执行ping:
Ping结果没有读取完整,而且命令执行完后目标服务器上的wmi.dll结果文件并没有被删除!
为了防止出现这种情况,于是在shell模式里面加入了-waitTIME选项,TIME是要等待的时间。当执行的命令后面跟上-wait5000时,表示这个命令等待5s后再读取结果.
由于正常的命令都要查看结果,所以执行的命令后面都会加上重定向符,把结果输出到文件中。
所以用这个执行木马会有问题,因为木马进程会一直存在,导致结果文件被占用,不能删除,也不能改写,如果执行不带任何参数的nc.exe也是这种效果
出现这种情况后由于结果文件被占用,所以WMIEXEC不能工作,除非手动更改脚本中的结果文件名。或者可以用taskkill 远程结束掉卡死的进程,然后WMIEXEC可以恢复工作。
为了解决这个问题,加入了-persist选项。
当命令加了persist选项后,程序会在后台运行,不会有结果输出,而且会返回这个命令进程的PID,方便结束进程。
这样就可以运行nc或者木马程序了。
下面是测试nc的结果:
相关设定:
Const Path = "C:\"
Const FileName = "wmi.dll"
Const timeOut = 1200
0x04 题外话:UAC的探讨
测试中发现在Server 2008以及2012中,只有Administrator账号能进行远程连接,并且psexec也是一样的情况,还有IPC连接也是。就算是管理员用户组的其他用户也不能进行远程连接。
后来发现是UAC的问题,默认UAC是开启的,这时候只有Administrator账户能够远程访问共享或者连接WMI。
图中hehe是管理员用户组的用户,但是PSEXEC在连接时提示拒绝访问,WMIEXEC也是一样。
Google查到可以通过禁用UAC然后psexec就可以使用了,如何禁用参考:http://support.microsoft.com/kb/942817
禁用之后psexec可以通过hehe账户连接,但是是普通的权限,此时要加上-h选项即可获得管理员的权限。
禁用UAC后WMIEXEC用hehe账户连接直接就是管理员权限
值得一提的是,UAC并不会拦截域管理员,就算UAC是开启的,域管理员也可以直接连接,可以直接使用PSEXEC或者WMIEXEC。
0x05 WMIEXEC使用实例
还是用抓取server 2012域控上的hash作为例子吧,具体操作步骤就不介绍了,直接上图:
0x06 总结
运行时间长的命令时,如ping,systeminfo之类的,记得加上-wait5000或者更久的时间选项
运行nc反弹或者木马等不需要输出结果、同时需要一直运行的程序时,一定要加上-persist选项,不然你就只能去taskkill远程结束进程了
应该还会有不少bug,大家用了有什么问题可以回帖或者直接PM
WMIEXEC.vbs:
12.15更新:
现在单命令执行模式(/cmd)也可以解析-waitTIME 和 -persist选项了,这样就可以用单命令模式运行nc或者远控
编辑帖子好像不能上传附件,就放到百度网盘了:http://pan.baidu.com/share/link?shareid=160003&uk=1965926143
解压密码是Www.T00ls.Net
转载请注明T00ls论坛以及作者ID
评论74次
很好很高端。。
好东西啊。。。路过
我测试了下,如果直接在脚本开头把Path指定为%temp%的话会导致下面WMI创建共享时报错,错误是Invalid Path,也就是创建共享时必须是绝对路径 当然如果一定要支持环境变量也是可以的,可以用Win32_Environment在远程解析完这个环境变量后返回具体的路径,然后把Path指定为返回的这个路径即可,不过这样就要加一些代码了
%temp%试试
我一开始想的是放到recycler目录,但是08和03这个目录不太一样,而且我曾经碰到过有管理员监控recycler目录,有文件写入这个根目录就报警,所以最后我就干脆写到C盘的根目录了 环境变量这个我倒是没测试,因为windows这些敏感目录有些杀毒软件监控的蛮严的,不过倒是可以看看%userprofile%或者%ProgramFiles%之类的行得通不,我测试下看看
好东西支持
想写wmi脚本,结果LZ写好了就占个便宜不写了,有一个疑问 Const Path="c:\" 能想办法改写脚本让他支持环境变量吗 例如 %systemroot%\system32
好东西啊
改天试试。谢谢楼主
吐司没想到还能见到这么好的文章 。
没法过的 除非你直接用administrator账户连接
果然强大啊。牛B哄哄了 顶一个。
支持原创
我很纳闷,无法ps 无法wmi ,win 7 uac怎么远程突破呢??
楼主用psexec,很精通啊。
很强大的说,学些啦。
不错的工具
刚好遇见一个内网,嘿嘿,我去研究下,尝个鲜
t00ls有你更精彩
分析的 很好 收藏了 。