# 黄金证书攻击

### **背景**

在具有 ADCS 的环境里，CA 的私钥在 CA 服务器上受到 DPAPI 或硬件解决方案 (HSM/TPM) 的保护。 此外，证书被发布在 **NTAuthCertificates** 森林对象，该对象定义了启用 AD 身份验证的 CA 证书。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/Ms1Zfgture7qCqug-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/Ms1Zfgture7qCqug-image.png)

总之，证书存在于 NTAuthCertificates 中的 CA 使用其私钥签署来自请求客户端的 CSR。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/R9ODUOQVTJhIhj5p-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/R9ODUOQVTJhIhj5p-image.png)

CA 私钥的安全性至关重要，如果私钥不受 TPM 或 HSM 等硬件解决方案的保护，则密钥将使用 **DPAPI** 加密并存储在 **CA 服务器的文件系统**中。如果攻击者能够对 CA 服务器实现提升特权下的代码执行，他们可以使用 **Mimikatz** 或 **SharpDPAPI** 等工具提取任何不受硬件保护的 CA 证书的私钥。因为用于签署已颁发证书的唯一密钥物件是 **CA 的私钥**，如果攻击者窃取这样的密钥，他们可以伪造能够进行身份认证的证书，这些伪造的证书可以用于域中的任何主体，并且只要 CA 证书有效，证书就会一直有效。此外，由于这些证书不是正常颁发过程的产物，因此 CA 不知道它们的创建，所以伪造的证书不能被撤销。

另外，在大型组织中，AD CS 服务可能被安装在**单独的服务器**上，而不是域控制器上。并且通常CA 服务器没有得到域控制器那样的高度安全性重视。因此，虽然只有域管理员可以访问与管理域控制器，但服务器管理员等权限略低一些的角色却可以访问 CA。虽然这可以看作是一种特权提升，但也是域持久化的一种方法。

### **利用**

在我们的靶场里，Med-factory 域存在 ADCS 服务。因此，在 CA 上，也就是 Dc03 上，使用工具 **SharpDPAPI** ([https://github.com/GhostPack/SharpDPAPI](https://github.com/GhostPack/SharpDPAPI))来提取 CA 的私钥：

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/gU5XIxhJ9lepbTIA-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/gU5XIxhJ9lepbTIA-image.png)

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/76EW2FwBNt3Kr4mk-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/76EW2FwBNt3Kr4mk-image.png)

将**私钥连同证书**一起保存为 **pem** 格式文件，然后使用下面的 **openssl** 命令将其转换为 **pfx** 格式。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/Q9XFFgFLMkXIQCd2-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/Q9XFFgFLMkXIQCd2-image.png)

然后，我们使用工具 ForgeCert ([https://github.com/GhostPack/ForgeCert](https://github.com/GhostPack/ForgeCert)) 来伪造证书，其中用户名需要是域内存在的。

```powershell
ForgeCert.exe --CaCertPath C:\windows\tasks\cert.pfx --CaCertPassword 123123 --Subject "CN=User" --SubjectAltName "administrator@med-factory.local" --NewCertPath c:\windows\tasks\fake.pfx --NewCertPassword 123123
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/BuhZZuizzDrzbP9s-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/BuhZZuizzDrzbP9s-image.png)

最后，使用 Rubeus 通过证书的方式请求用户的 TGT。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/EuGPUdQROGEhGtMZ-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/EuGPUdQROGEhGtMZ-image.png)

这样，我们可以通过窃取的私钥来伪造证书，从而获得特权用户的 TGT。

### **VS 黄金票据**

**黄金票据**，即伪造的 TGT，与**黄金证书**，即伪造的证书，它们之间存在着明显的相似之处。以下几点是一些相似以及对比：

1：krbtgt 密钥和 CA 私钥都是对 AD 环境的安全至关重要的密码学物件，两者都可被滥用于模仿任意用户。

2：我们可以通过 DCSync 远程提取 krbtgt 密钥，但只有在 CA 服务器上获得**提升特权的代码执行**才可提取 CA 私钥。。

3：**krbtgt 密钥**可以相对容易地轮换，而轮换 **CA 私钥**则要困难得多。