前言
域渗透中,如果能够获取域控的权限,便可接管域内所有机器,而域渗透中,Kerberos 是最常用的,是整个域的基础认证协议
参考:
Kerberos 票据攻击:黄金、白银、钻石、蓝宝石票据的攻防全解析 - FreeBuf网络安全行业门户
https://y4er.com/posts/kerberos-as_req-and-as_rep/
https://www.freebuf.com/articles/network/384457.html
基础
包括三个部分:
- Client
- Server
- KDC(密钥分发中心):包含 AS(认证服务器)和 TGS(票据授权服务器)
基础认证流程如下:

- AS_REQ: Client 向 AS 发起 AS_REQ,请求凭据是 Client hash 加密的时间戳,请求内容为通过 Client 的哈希加密的时间戳、ClientID 等内容
- AS_REP: AS 使用 Client hash 进行解密,如果结果正确就返回用 krbtgt(域控中用来管理发放票据的用户) 的 NTLM-hash 加密的 TGT (Ticket Granting Ticket,票据授权凭证)票据,TGT 里面包含 PAC(Privlege Attribute 特权属证书),PAC 包含 Client 的 sid,Client 所在的组,用于验证用户权限,只有 KDC 能制作和查看 PAC。
- TGS_REQ: Client 凭借 TGT 票据向 KDC 发起针对特定服务的 TGS_REQ 请求
- TGS_REP: KDC 使用 krbtgt NTLM-hash 进行解密,如果结果正确,就返回用服务 NTLM-hash 加密的 TGS 票据(简称 ST);注意,不管用户有没有访问服务的权限,只要 TGT 正确,就返回 TGS 票据
- AP_REQ: Client 拿着 TGS 票据去请求服务
- AP_REP: 服务使用自己的 NTLM-hash 解密 TGS 票据。如果解密正确,就拿着 PAC 去 KDC 那边问 Client 有没有访问权限,域控解密 PAC。获取 Client 的 sid,以及所在的组,再根据该服务的 ACL,判断 Client 是否有访问服务的权限。
攻击
AS_REQ & AS_REP 阶段攻击
此阶段与 AS 认证服务器进行交互,那么就会出现最基础的用户枚举和密码喷洒
域内用户枚举
用户名存在与不存在的报错不一致,那么可以进行用户枚举
Kerberos 服务所在端口为 88 端口,采用 tcp 连接,所以通过 88 端口来探测;其次是用户名登录存在三种状态,根据不同状态可以判断其是否存在:
KDC_ERR_PREAUTH_REQUIRED- 需要额外的预认证(启用)KDC_ERR_CLIENT_REVOKED- 客户端凭证已被吊销(禁用)KDC_ERR_C_PRINCIPAL_UNKNOWN- 在Kerberos数据库中找不到客户端(不存在)
相关工具: https://github.com/ropnop/kerbrute/releases/
密码喷洒攻击
对其他用户进行密码爆破
AS_REP Roasting 攻击
对于域用户,如果设置了选项 "Do not require Kerberos preauthentication",此时向域控制器的 88 端口发送 AS-REQ 请求,对收到的 AS-REP 内容重新组合,能够拼接成 "Kerberos 5 AS-REP etype 23"(18200) 的格式,接下来可以使用 hashcat 对其破解,最终获得该用户的明文口令。
通常情况此选项默认关闭
工具:impacket 的 GetNPUsers.py 可检索启动了"Do not require Kerberos preauthentication"的目标域用户
黄金票据攻击
针对 Kerberos 认证中生成 **TGT (Ticket Granting Ticket,票据授权票据)**的部分
Kerberos 中每个用户的票据都是由 krbtgt 的 NTLM 哈希值加密生成的,所以只要我们获得了 krbtgt 的哈希值,就能伪造任意用户的票据,即黄金票据攻击
攻击者需要的信息:域名、域 sid、krbtgt 哈希值、要伪造的用户
首先要获取 krbtgt 的 hash,此处可以用 DCSync 攻击,从域控直接请求,但是需要域管或者等效权限:
lsadump::dcsync /domain:test.local /user:krbtgt
或者在已经提权的域控上直接导出所有用户的 hash
然后需要 sid 的 hash:
lsadump::lsa /patch
接下来就能生成 golden ticket 了,此处可以用 aes256 也可以用 krbtgt 的 NTLM hash:
kerberos::golden /domain:test.local /sid:S-1-5-21-514356739-3204155868-1239341419 /aes256:b4e2924c2d378eda457c2dd3810fdde0a5312354c2b26bc677dfb48e46a17fe7 /user:administrator /ticket:gold.kirbi
###############################
kerberos::golden /user:administrator /domain:test.local /sid:S-1-5-21-514356739-3204155868-1239341419 /krbtgt:bfb69399cb7ac7828c70a1a0833119f6 /ticket:gold.kirbi
然后用 /ptt (Pass The Ticket)参数将生成的票据注入到当前会话中,无需重启即可使用:
kerberos::ptt gold.kirbi
TGS_REQ&TGS_REP 阶段攻击
SPN && Kerberoast 攻击
SPN(Service Principal Name,服务器主体名称)是服务器所运行服务的唯一标识,每个使用 Kerberos 认证的服务都必须正确配置相应的 SPN,一个账户下可以有多个 SPN
根据权限,SPN 有两种注册方式,分别为:机器账户 computers、域用户账户 users。KDC 查询 SPN 也按照账户方式进行查找
Kerberoast 攻击:针对 TGS_REP 阶段使用服务的 NTLM Hash 返回的加密数据 ST 进行爆破,注意只有域用户的 SPN 是可以被利用的,机器账户会定期更改为随机字符所以无法利用
首先在已经能登录某台域用户的基础上查询 SPN 寻找在 Users 下并且是高权限域用户的服务,然后请求并导出 TGS
python3 GetUserSPNs.py -request -dc-ip 172.22.9.7 xiaorang.lab/zhangjian:i9XDE02pLVf
最后爆破 TGS 得出密码即可
相关工具:impacket 的 GetUserSPNs.py、hashcat、一个正确的密码字典
白银票据攻击
在 TGS_REP 中,不管 Client 是否有权限访问特殊服务,只要 Client 发送的 TGT 票据是正确的,那么就会返回服务 NTLM Hash 加密的 TGS 票据。如果我们有了服务 NTLM Hash,就可以签发 TGS 票据
原理即伪造 ST 来访问服务,但是只能访问特定服务器上的部分服务
需要如下信息:
- /domain
- /sid
- /target:目标服务器的域名全称
- /service:目标服务器上面的 Kerberos 服务
- /rc4:计算机账户的 NTLM hash,域控主机的计算机账户
- /user:要伪造的用户名
mimikatz 导出服务账户的 NTLM Hash
sekurlsa::logonpasswords
如果导出的是域控服务账户 DC$ 的哈希,那么就可以获取 DC 机器名的哈希值和域 id,执行下面的命令便可获取 krbtgt 的 hash 从而制作黄金票据
kerberos::golden /domain:test.local /sid:S-1-5-21-514356739-3204155868-1239341419 /target:dc.test.local /service:cifs /rc4:9150e40e4ec936a15baf384ca382a3df /user:dc$ /ptt
lsadump::dcsync /domain:test.local /user:krbtgt
与黄金票据的区别
| 黄金票据 | 白银票据 | |
|---|---|---|
| 访问权限 | 伪造 TGT,可以获取任何 Kerberos 服务权限 | 伪造 TGS,只能访问指定的服务 |
| 加密方式 | 由 krbtgt 的 Hash 加密 | 由服务账号(通常为计算机账户)的 Hash 加密 |
| 认证流程 | 需要访问域控 | 不需要访问域控 |
委派攻击
非约束委派
S4U && 约束委派
Windows Server 2003 中引入了约束委派,对 Kerberos 协议进行了拓展,引入了 S4U 协议:S4U2Self 和 S4U2proxy,前者用于生成本身服务的 TGS 票据,S4U2proxy 用于“代理”相关用户申请其他服务票据
请求过程:

具体过程是收到用户的请求之后,首先代表用户获得针对服务自身的可转发的 Kerberos 服务票据(S4U2SELF),拿着这个票据向 KDC 请求访问特定服务的可转发的 TGS(S4U2PROXY),并且代表用户访问特定服务,而且只能访问该特定服务。
注意:约束委派的前置条件服务自身需要通过 KDC 认证的 TGT