AD CS Certificate Theft

从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

这是来自 https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf 精彩研究中关于窃取章节的简要摘要

我可以使用证书做什么

在查看如何窃取证书之前,您可以了解一些关于证书用途的信息:

# Powershell
$CertPath = "C:\path\to\cert.pfx"
$CertPass = "P@ssw0rd"
$Cert = New-Object
System.Security.Cryptography.X509Certificates.X509Certificate2 @($CertPath, $CertPass)
$Cert.EnhancedKeyUsageList

# cmd
certutil.exe -dump -v cert.pfx

使用加密API导出证书 – THEFT1

交互式桌面会话中,提取用户或计算机证书以及私钥,特别是如果私钥是可导出的,可以很容易地完成。这可以通过导航到certmgr.msc中的证书,在其上右键单击,然后选择所有任务 → 导出来生成一个受密码保护的 .pfx 文件来实现。

对于编程方法,可以使用诸如PowerShell的ExportPfxCertificate cmdlet或项目,如TheWover的CertStealer C#项目。这些工具利用Microsoft CryptoAPI (CAPI) 或 Cryptography API: Next Generation (CNG) 与证书存储进行交互。这些API提供一系列加密服务,包括证书存储和身份验证所需的服务。

然而,如果私钥被设置为不可导出,CAPI和CNG通常会阻止提取这样的证书。为了绕过这一限制,可以使用像Mimikatz这样的工具。Mimikatz提供了crypto::capicrypto::cng命令来修补相应的API,允许导出私钥。具体来说,crypto::capi修补了当前进程中的CAPI,而crypto::cng则针对lsass.exe的内存进行修补。

通过DPAPI窃取用户证书 – THEFT2

有关DPAPI的更多信息,请参阅:

pageDPAPI - Extracting Passwords

在Windows中,证书私钥受DPAPI保护。重要的是要认识到用户和计算机私钥的存储位置是不同的,并且文件结构取决于操作系统所使用的加密API。SharpDPAPI是一个工具,可以在解密DPAPI blobs时自动处理这些差异。

用户证书主要存储在注册表中的HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates下,但有些证书也可以在目录%APPDATA%\Microsoft\SystemCertificates\My\Certificates中找到。这些证书的私钥通常存储在%APPDATA%\Microsoft\Crypto\RSA\User SID\中,用于CAPI密钥,以及%APPDATA%\Microsoft\Crypto\Keys\中,用于CNG密钥。

提取证书及其关联的私钥,该过程涉及:

  1. 从用户存储中选择目标证书并检索其密钥存储名称。

  2. 定位所需的DPAPI主密钥以解密相应的私钥。

  3. 通过使用明文DPAPI主密钥解密私钥

获取明文DPAPI主密钥,可以使用以下方法:

# With mimikatz, when running in the user's context
dpapi::masterkey /in:"C:\PATH\TO\KEY" /rpc

# With mimikatz, if the user's password is known
dpapi::masterkey /in:"C:\PATH\TO\KEY" /sid:accountSid /password:PASS

为了简化主密钥文件和私钥文件的解密过程,来自SharpDPAPIcertificates命令非常有用。它接受/pvk/mkfile/password{GUID}:KEY作为参数,用于解密私钥和关联证书,随后生成一个.pem文件。

# Decrypting using SharpDPAPI
SharpDPAPI.exe certificates /mkfile:C:\temp\mkeys.txt

# Converting .pem to .pfx
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx

通过DPAPI窃取机器证书 - THEFT3

Windows在注册表中存储的机器证书位于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates,相关的私钥位于 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys(对于CAPI)和 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys(对于CNG),这些证书使用机器的DPAPI主密钥进行加密。这些密钥无法使用域的DPAPI备份密钥解密;而是需要使用只有SYSTEM用户可以访问的 DPAPI_SYSTEM LSA secret

可以通过在 Mimikatz 中执行 lsadump::secrets 命令来手动解密,提取DPAPI_SYSTEM LSA secret,然后使用该密钥解密机器主密钥。另外,也可以在修补CAPI/CNG后使用Mimikatz的 crypto::certificates /export /systemstore:LOCAL_MACHINE 命令。

SharpDPAPI 提供了更自动化的方法,其 certificates 命令。当使用 /machine 标志并具有提升的权限时,它会升级到SYSTEM,转储DPAPI_SYSTEM LSA secret,使用它来解密机器DPAPI主密钥,然后使用这些明文密钥作为查找表来解密任何机器证书私钥。

查找证书文件 - THEFT4

有时可以直接在文件系统中找到证书,例如在文件共享或下载文件夹中。针对Windows环境最常见的证书文件类型是 .pfx.p12 文件。虽然不太常见,但也会出现扩展名为 .pkcs12.pem 的文件。其他值得注意的与证书相关的文件扩展名包括:

  • .key 用于私钥,

  • .crt/.cer 用于仅包含证书的文件,

  • .csr 用于证书签名请求,不包含证书或私钥,

  • .jks/.keystore/.keys 用于Java密钥库,可能包含Java应用程序使用的证书和私钥。

可以使用PowerShell或命令提示符搜索这些文件,查找上述扩展名。

如果找到受密码保护的PKCS#12证书文件,并且想要提取哈希值,可以使用 pfx2john.py,可在 fossies.org 获取。随后,可以使用JohnTheRipper尝试破解密码。

# Example command to search for certificate files in PowerShell
Get-ChildItem -Recurse -Path C:\Users\ -Include *.pfx, *.p12, *.pkcs12, *.pem, *.key, *.crt, *.cer, *.csr, *.jks, *.keystore, *.keys

# Example command to use pfx2john.py for extracting a hash from a PKCS#12 file
pfx2john.py certificate.pfx > hash.txt

# Command to crack the hash with JohnTheRipper
john --wordlist=passwords.txt hash.txt

通过PKINIT进行NTLM凭证窃取 - THEFT5

提供的内容解释了通过PKINIT进行NTLM凭证窃取的方法,具体是通过标记为THEFT5的窃取方法。以下是使用被动语态重新解释的内容,其中适用的情况下进行了匿名化和总结:

为了支持不支持Kerberos身份验证的应用程序的NTLM身份验证[MS-NLMP],KDC被设计为在特权属性证书(PAC)中返回用户的NTLM单向函数(OWF),特别是在使用PKCA时的PAC_CREDENTIAL_INFO缓冲区中。因此,如果一个帐户通过PKINIT进行身份验证并获得票据授予票据(TGT),则会自动提供一种机制,使当前主机能够从TGT中提取NTLM哈希以支持传统的身份验证协议。该过程涉及解密PAC_CREDENTIAL_DATA结构,这本质上是NTLM明文的NDR序列化描述。

提到了名为Kekeo的实用工具,可在https://github.com/gentilkiwi/kekeo获取包含此特定数据的TGT,从而方便检索用户的NTLM。用于此目的的命令如下:

tgt::pac /caname:generic-DC-CA /subject:genericUser /castore:current_user /domain:domain.local

此外,值得注意的是,Kekeo可以处理受智能卡保护的证书,只要可以检索到PIN码,参考https://github.com/CCob/PinSwipe。相同的功能也被指出由Rubeus支持,可在https://github.com/GhostPack/Rubeus找到。

这一解释概括了通过PKINIT进行NTLM凭据窃取的过程和工具,重点是通过使用PKINIT获得的TGT检索NTLM哈希,并促进此过程的实用工具。

从零开始学习AWS黑客技术,成为专家 htARTE (HackTricks AWS Red Team Expert)

支持HackTricks的其他方式:

最后更新于