黄金证书攻击
背景
在具有 ADCS 的环境里,CA 的私钥在 CA 服务器上受到 DPAPI 或硬件解决方案 (HSM/TPM) 的保护。 此外,证书被发布在 NTAuthCertificates 森林对象,该对象定义了启用 AD 身份验证的 CA 证书。
总之,证书存在于 NTAuthCertificates 中的 CA 使用其私钥签署来自请求客户端的 CSR。
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)来提取 CA 的私钥:
将私钥连同证书一起保存为 pem 格式文件,然后使用下面的 openssl 命令将其转换为 pfx 格式。
然后,我们使用工具 ForgeCert (https://github.com/GhostPack/ForgeCert) 来伪造证书,其中用户名需要是域内存在的。
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
最后,使用 Rubeus 通过证书的方式请求用户的 TGT。
这样,我们可以通过窃取的私钥来伪造证书,从而获得特权用户的 TGT。
VS 黄金票据
黄金票据,即伪造的 TGT,与黄金证书,即伪造的证书,它们之间存在着明显的相似之处。以下几点是一些相似以及对比:
1:krbtgt 密钥和 CA 私钥都是对 AD 环境的安全至关重要的密码学物件,两者都可被滥用于模仿任意用户。
2:我们可以通过 DCSync 远程提取 krbtgt 密钥,但只有在 CA 服务器上获得提升特权的代码执行才可提取 CA 私钥。。
3:krbtgt 密钥可以相对容易地轮换,而轮换 CA 私钥则要困难得多。