继上题,为什么 ADCS 这个漏洞能获取域管理员权限,原理是什么
1. ADCS 漏洞(ESC8)的核心原理
ADCS 漏洞(也被称为 ESC8,因为它是由 SpecterOps 发现的攻击链之一)是配置缺陷而非代码漏洞。攻击者利用的是 ADCS 证书模板中的一个或多个不安全配置
一个典型的可被利用的证书模板具有以下特征:
- 权限配置不安全:这个证书模板的“注册(Enrollment)”权限被授予了低权限用户,甚至是匿名用户。这意味着,任何人都可以向证书颁发机构(CA)请求一个基于这个模板的证书
- 用途配置不安全:这个证书模板的用途(Extended Key Usage)被设置为
Client Authentication
,这意味着它颁发的证书可以用于客户端身份验证 - 不安全的证书主体名(Subject Name):这个模板允许请求者自定义证书中的主体名(Subject Name)。主体名是用于在 Kerberos 认证中识别用户身份的关键字段
2. 攻击链的详细步骤
- 信息收集:攻击者首先需要通过侦察,找到域内存在的 ADCS 服务器,并识别出那些配置不安全的证书模板
- 工具:
Certify.exe
是一个常用的工具,可以扫描域内的 ADCS 服务器,并列出所有证书模板的配置,高亮显示那些存在漏洞的模板 - 关键信息:攻击者会寻找那些
Client Authentication
权限开启、且主体名可控的模板
- 工具:
- 以低权限用户身份请求高权限证书:
- 攻击者使用一个低权限的域用户,或者通过前面提到的 NTLM Relay 等方法,以任何一个普通域用户的身份,向 ADCS 服务器发起证书请求
- 在请求时,攻击者利用模板允许自定义主体名的缺陷,将请求的主体名(
Subject Name
)设置为一个高权限用户,例如域管理员 - 为什么能成功? 理论上,CA 应该验证请求者的身份和其请求的主体名是否匹配。但由于模板配置不安全,CA 没有进行这项验证,直接颁发了一个证书,其主体名是攻击者指定的域管理员
- 利用证书获取 Kerberos TGT:
- 攻击者获得这个伪造的证书后,就可以使用像
Rubeus.exe
这样的工具 Rubeus
可以利用这个证书,向域控制器发送 Kerberos 认证请求。这个过程被称为PKINIT
,是 Kerberos 协议的一个扩展,允许客户端使用证书进行身份验证- 为什么能成功? 域控制器会看到这个证书,并根据证书中的主体名(
Subject Name
)来识别用户身份。它会认为这个请求来自一个合法的域管理员,并为其颁发一个域管理员的 Kerberos 票据(TGT)
- 攻击者获得这个伪造的证书后,就可以使用像
- 域完全控制:
- 一旦攻击者获得了域管理员的 TGT,就相当于获得了域管理员的密码哈希,可以伪造任何其他用户的票据(Golden Ticket),或者使用
psexec
、WMI
等工具,在不提供密码的情况下,以域管理员的身份执行任意命令,从而实现对整个域的完全控制
- 一旦攻击者获得了域管理员的 TGT,就相当于获得了域管理员的密码哈希,可以伪造任何其他用户的票据(Golden Ticket),或者使用