继上题,为什么 ADCS 这个漏洞能获取域管理员权限,原理是什么

1. ADCS 漏洞(ESC8)的核心原理

ADCS 漏洞(也被称为 ESC8,因为它是由 SpecterOps 发现的攻击链之一)是配置缺陷而非代码漏洞。攻击者利用的是 ADCS 证书模板中的一个或多个不安全配置

一个典型的可被利用的证书模板具有以下特征:

  • 权限配置不安全:这个证书模板的“注册(Enrollment)”权限被授予了低权限用户,甚至是匿名用户。这意味着,任何人都可以向证书颁发机构(CA)请求一个基于这个模板的证书

  • 用途配置不安全:这个证书模板的用途(Extended Key Usage)被设置为 Client Authentication,这意味着它颁发的证书可以用于客户端身份验证

  • 不安全的证书主体名(Subject Name):这个模板允许请求者自定义证书中的主体名(Subject Name)。主体名是用于在 Kerberos 认证中识别用户身份的关键字段

2. 攻击链的详细步骤

  1. 信息收集:攻击者首先需要通过侦察,找到域内存在的 ADCS 服务器,并识别出那些配置不安全的证书模板

  2. 工具Certify.exe 是一个常用的工具,可以扫描域内的 ADCS 服务器,并列出所有证书模板的配置,高亮显示那些存在漏洞的模板

  3. 关键信息:攻击者会寻找那些 Client Authentication 权限开启、且主体名可控的模板

  4. 以低权限用户身份请求高权限证书

  5. 攻击者使用一个低权限的域用户,或者通过前面提到的 NTLM Relay 等方法,以任何一个普通域用户的身份,向 ADCS 服务器发起证书请求
  6. 在请求时,攻击者利用模板允许自定义主体名的缺陷,将请求的主体名(Subject Name)设置为一个高权限用户,例如域管理员
  7. 为什么能成功? 理论上,CA 应该验证请求者的身份和其请求的主体名是否匹配。但由于模板配置不安全,CA 没有进行这项验证,直接颁发了一个证书,其主体名是攻击者指定的域管理员

  8. 利用证书获取 Kerberos TGT

  9. 攻击者获得这个伪造的证书后,就可以使用像 Rubeus.exe 这样的工具
  10. Rubeus 可以利用这个证书,向域控制器发送 Kerberos 认证请求。这个过程被称为 PKINIT,是 Kerberos 协议的一个扩展,允许客户端使用证书进行身份验证

  11. 为什么能成功? 域控制器会看到这个证书,并根据证书中的主体名(Subject Name)来识别用户身份。它会认为这个请求来自一个合法的域管理员,并为其颁发一个域管理员的 Kerberos 票据(TGT)

  12. 域完全控制

  13. 一旦攻击者获得了域管理员的 TGT,就相当于获得了域管理员的密码哈希,可以伪造任何其他用户的票据(Golden Ticket),或者使用 psexecWMI 等工具,在不提供密码的情况下,以域管理员的身份执行任意命令,从而实现对整个域的完全控制