这是针对 CVE-2026-54121(又称 Certighost)的概念验证工具的一个可用 fork。 原始研究与 PoC 由 @H0j3n 和 @aniqfakhrul 完成,详细分析见:
此 fork 修复了 SAN 处理问题——该问题会阻止 PKINIT 在遵循所请求 SAN 的 CA 上成功;强化了 --target-san 的解析;并重新设计了计算机账户的处理方式,使其不再耗尽 ms-DS-MachineAccountQuota。
以 root 身份执行,因为伪造的 LDAP 和 SMB 服务需要特权端口 389 和 445。
sudo python3 certighost.py -d playground.local -u lowpriv -p 'Password1234' --dc-ip 192.168.1.10
成功完成后,目标证书(.pfx)和 Kerberos 缓存(.ccache)会写入当前工作目录。
CERTIGHOST$,在首次运行时创建),或使用通过 --computer-name 指定的账户。cdc 属性(通过 --listener 指定;如省略则自动检测),以及携带目标 DC DNS 名称的 rmd 属性。.ccache 和 NT 哈希。原始版本在生成证书 SAN 时,同时将 CSR 的 subjectAltName 扩展和 SAN:dns= 请求属性设置为伪造计算机的主机名,而不是目标 DC 的 FQDN。因此,在遵循所请求 SAN 的 CA 上,所颁发的证书携带的是伪造账户的 dNSHostName,导致 PKINIT 将其映射到错误的主体并以如下错误失败:
KDC_ERR_CLIENT_NAME_MISMATCH(Reserved for PKINIT)
现在 SAN 使用目标 DC 的 dNSHostName(rmd_value / target_dns),这正是 PKINIT 将计算机账户映射到的主体。所颁发的证书现在呈现 DNS:<dc>.<domain>,且 AS-REQ 以 DC 身份完成。
--target-san--target-san 现在接受 MEEREEN、MEEREEN$ 或 FQDN meereen.essos.local(通过 sAMAccountName 或 dNSHostName 匹配),而不再仅限于短名称 NAME 形式。
原始版本在每次运行时都会创建一个全新的随机 GHOST********$ 账户。由于通过 ms-DS-MachineAccountQuota 创建的计算机账户归域管理员所有(而非创建者),低权限用户无法删除它们,因此重复运行会因大量孤立账户而迅速耗尽配额(默认为 10)。
此 fork 复用单个稳定账户(CERTIGHOST$,仅在其不存在时创建),因此配额不会增长,多次运行之间也无需清理。
首次创建该账户时,脚本会打印一条警告,提示该账户会保留在 AD 中:
[!] WARNING: computer account CERTIGHOST$ was created and is left in AD.
该账户将保留以供后续运行复用。若要彻底删除它,请使用域管理员(对象所有者)执行:
Get-ADComputer CERTIGHOST | Remove-ADComputer -Confirm:$false
impacketcryptography, pyasn1, asn1crypto, pycryptodomex仅用于授权的安全测试和教育目的。请仅对您拥有明确测试许可的系统使用本工具。