滥用Active Directory证书服务(第4部分)
Active Directory证书服务(ADCS)中的错误配置可能给企业环境带来严重漏洞。本文将介绍如何使用Certipy利用ESC2和ESC3提权技术,这些技术滥用了过于宽松的注册权限和扩展密钥用法(EKU)配置。EKU策略定义了证书的用途,例如代码签名、客户端身份验证等。
EKU描述符示例
授权请求证书的用户可以在证书颁发机构(CA)本身和证书模板对象上定义。CA属性可以通过certsrv实用程序查看:右键单击CA > 属性 > 安全。
CA CSR描述符
“用户”模板的模板权限在证书模板控制台中显示,如下所示。
模板安全权限
ESC2
易受ESC2攻击的证书模板配置了“任何用途”EKU或没有EKU配置。指定“任何用途”EKU的模板允许攻击者创建具有任何用途的证书,例如代码签名、客户端身份验证等。此类证书可用于以原始请求证书的用户身份向Active Directory进行身份验证,并可用于签署其他证书。
易受ESC2攻击的模板满足以下条件:
- 低权限用户被授予注册权限
- 所需签名:0
- 已启用:True
- 需要管理批准:False
- 任何用途:True 或 扩展密钥用法:False
示例
假设我们已经在我们目标公司FOOBAR的内部网络中获得了立足点,并攻陷了名为bspears的用户账户。
首先,尝试使用现有模板代表域管理员请求证书。使用以下Certipy命令,我们将使用默认的“用户”模板代表用户名为administrator的域管理员请求证书。
Certipy请求证书所需的参数如下:
- u – 用户名
- p – 用户密码
- dc-ip – 域控制器IP地址
- target – 目标CA(证书颁发机构)DNS(域名系统)名称
- ca – 短CA名称
- template – 模板名称
- on-behalf-of – 指定代表另一个实体请求证书
|
|
如下图所示,此请求导致错误,并指出需要PFX。目前,我们没有可用于代表另一个用户请求证书的PFX。
但是,如果bspears可以使用配置了“任何用途”EKU的模板请求证书,我们可以使用生成的PFX代表另一个域账户请求证书。
未能获取管理员的新证书
要查找易受ESC2攻击的证书,我们可以使用Certipy枚举ADCS配置。通过指定-enabled和-vulnerable标志,我们可以告诉Certipy特别打印出已启用的易受攻击模板。
|
|
“ESC2_User”模板满足ESC2的所有条件。
ESC2_User模板
我们被攻陷的用户账户bspears是域用户组的一部分,因此被授权使用易受攻击的模板请求证书。使用以下命令,我们可以为bspears请求证书。
|
|
Certipy结果将返回请求ID或对象SID。注意这些。
有关更多信息,请参见“有效期”部分。
为bspears请求证书
现在,上述请求生成的证书可用于签署新证书。要代表域管理员请求证书,我们将使用-pfx标志并指定“bspears.pfx”文件。
|
|
注意返回的请求ID或对象SID。
为域管理员“administrator”请求证书
现在我们有了管理员账户的证书,我们可以以域管理员身份进行身份验证。
总之,由于过于宽松的证书模板配置,我们能够代表低权限用户获取证书,然后使用该证书代表域管理员账户请求证书。
ESC3
证书请求代理EKU可用于代表另一个域对象请求证书。易受ESC3攻击的模板配置了此EKU,并允许低权限用户注册。ESC3模板的要求如下:
- 低权限用户被授予注册权限
- 所需签名:0
- 已启用:True
- 需要管理批准:False
- 证书请求代理EKU
示例1
继续我们的FOOBAR场景。让我们查看Certipy输出的ESC3条件。如下图所示,“ESC3_User_1”模板满足ESC3的所有条件。
ESC3_User_1模板
我们被攻陷的用户账户bspears是域用户组的一部分,因此被授权使用易受攻击的模板请求证书。使用以下命令,我们可以为bspears请求证书。
|
|
再次,Certipy结果将返回请求ID或对象SID。注意这些。
有关更多信息,请参见“有效期”部分。
为bspears请求证书
与ESC2类似,我们现在可以使用上一步中为bspears生成的证书,通过“用户”模板代表另一个用户请求证书。如下所示,我们可以使用此模板代表域管理员请求证书。
|
|
为域管理员“administrator”请求证书
现在我们有了管理员账户的证书,我们可以以域管理员身份进行身份验证。
示例2
我们还可以使用具有指定证书请求代理的颁发要求策略的模板请求证书。
在下面的屏幕截图中,“ESC3_User_2”模板配置了授权签名要求设置为1,颁发要求策略设置为证书请求代理。
ESC3模板2
“ESC3_User_2”模板的其他关键配置如下:
- 低权限用户被授予注册权限
- 已启用:True
- 客户端身份验证:True
- 需要管理批准:False
- 所需授权签名:1
- 应用程序策略:证书请求代理
此模板的Certipy结果如下所示。
ESC3_User_2模板的Certipy结果
再次,我们将使用“ESC3_User_1”模板为bspears请求证书。
|
|
注意返回的请求ID或对象SID。
为bspears请求证书
然后,我们可以使用为bspears生成的证书,通过“ESC3_User_2”模板代表管理员账户请求证书。
|
|
注意返回的请求ID或对象SID。
为域管理员“administrator”请求证书
再次,我们有了管理员账户的证书,我们可以以域管理员身份进行身份验证。
总结
如您所见,利用ESC3的步骤与ESC2类似。每种提权技术都结合了过于宽松的注册权限和扩展密钥用法配置。但是,每种技术的易受攻击模板的条件略有不同。
在这两个示例中,我们都能够代表低权限用户获取证书,然后使用该证书代表高权限(域管理员)账户请求证书。
证书身份验证
一旦我们有了证书“administrator.pfx”,我们可以使用该证书获取目标管理员账户的凭据哈希和Kerberos票证,使用以下Certipy auth命令:
|
|
如下图所示,我们成功检索了管理员账户的TGT和NT哈希。
获取管理员凭据
现在我们可以模拟管理员!为了演示这一点,我们可以使用CrackMapExec向域控制器进行身份验证,并以域管理员身份执行命令。
|
|
使用管理员凭据执行命令
有效期
需要注意的是,证书在有效期结束前一直有效,除非证书被明确撤销。这就是为什么我们必须注意证书请求返回的请求编号/SID。
让我们看一个示例模板来演示这一点。如下图所示,模板指定了5年的有效期。
有效期
如果我们使用上述模板代表用户“DA Dan”请求证书,我们将在未来五年内拥有对DA Dan账户的访问权限,无论密码如何更改。我们还可以在到期日期之前续订证书以保持对账户的访问权限——这意味着这种技术不仅是一种方便的特权提升技术,还可以作为一种持久化手段。
预防和检测
那么,您可以采取哪些措施来预防和检测此类攻击?以下是一些步骤:
- 确保模板权限尽可能严格。仅授予必要的组/用户注册权限。
- 审查环境中的所有CA,并从所有不必要的组中删除“请求证书”权限(注册权限)。这将防止不必要的低权限组通过证书模板进行注册。
- 清点您的证书模板,并确定所有已启用的模板是否当前正在使用。禁用所有不必要的模板。
- 限制环境中允许的证书身份验证形式。
监控
监控用户的证书注册事件可以允许您检测账户何时请求证书以及CA何时颁发证书。通过监控这些事件,管理员可以警告异常行为,并撤销看起来恶意或可疑的证书。一些有用的事件ID如下:
- 4886 – 请求证书
- 4887 – 证书已颁发
- 4768 – 请求Kerberos票证(TGT)
资源
- SpecterOps白皮书:https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf
- SpecterOps博客文章:https://posts.specterops.io/certified-pre-owned-d95910965cd2
- Microsoft PKI防御指南:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn786443(v=ws.11)
- PKIAudit:https://github.com/GhostPack/PSPKIAudit
- PKINITtools:https://github.com/dirkjanm/PKINITtools
- PyWhisker:https://github.com/ShutdownRepo/pywhisker
- Certi:https://github.com/zer1t0/certi
- Impacket:https://github.com/fortra/Impacket
- Certipy:https://github.com/ly4k/Certipy
- Certify:https://github.com/GhostPack/Certify
阅读本系列更多内容:
- 滥用Active Directory证书服务(第1部分)
- 滥用Active Directory证书服务(第2部分)
- 滥用Active Directory证书服务(第3部分)
- 检测ADCS特权提升