marcgoam/CVE-2026-54121-CertiGhost
GitHub: marcgoam/CVE-2026-54121-CertiGhost
针对 AD CS 域控冒充漏洞 CVE-2026-54121 的概念验证工具 Fork 版,修复了 SAN 处理和计算机账户配额耗尽问题以实现稳定的 PKINIT 攻击链。
Stars: 0 | Forks: 0
# CVE-2026-54121 (Certighost) - 修复版 Fork
一个针对 CVE-2026-54121(又名 _Certighost_)的概念验证工具的可用 Fork 版本。
由 **[@H0j3n](https://gist.github.com/H0j3n)** 和 **[@aniqfakhrul](https://github.com/aniqfakhrul/CVE-2026-54121)** 进行的原始研究和 PoC 详细分析位于:
- https://gist.github.com/H0j3n/a5ef2609b5f2944ac2390a191a534c26。
此 Fork 修复了 SAN 处理问题,该问题曾导致 PKINIT 在响应所请求 SAN 的 CA 上无法成功;增强了 `--target-san` 解析的健壮性;并重构了计算机账户处理逻辑,使其不再耗尽 `ms-DS-MachineAccountQuota`。
## 用法
由于恶意的 LDAP 和 SMB 服务需要使用特权端口 389 和 445,请以 root 身份执行。
```
sudo python3 certighost.py -d playground.local -u lowpriv -p 'Password1234' --dc-ip 192.168.1.10
```
成功完成后,目标证书 (`.pfx`) 和 Kerberos 缓存 (`.ccache`) 将被写入当前工作目录。
## 此脚本的功能
1. 复用单个稳定的计算机账户(首次运行时创建的 `CERTIGHOST$`),或使用通过 `--computer-name` 指定的账户。
2. 启动两个恶意监听器:一个位于端口 445 的 SMB/LSA 服务器和一个位于端口 389 的 LDAP 服务器。
3. 以该计算机账户身份发送证书请求,嵌入指向受控 IP(通过 `--listener` 指定;如省略则自动检测)的自定义 `cdc` 属性,以及包含目标 DC 的 DNS 名称的 `rmd` 属性。
4. CA 回连到恶意的 LSA/LDAP 监听器。它们以创建的账户身份进行验证(通过 Netlogon 在真实的 DC 上进行验证),并使用目标 DC 的身份(sAMAccountName、SID、dNSHostName)来响应 CA 的查询。
5. CA 颁发属于该 DC 的有效证书。
6. 脚本使用 DC 的 pfx 执行 PKINIT,以请求 `.ccache` 和 NT hash。
## 此 Fork 中的更改
### 1. SAN 修复(使 PKINIT 成功)
原版在构建证书 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:.`,并且 AS-REQ 会以 DC 的身份完成闭环。
### 2. 健壮的 `--target-san`
`--target-san` 现在接受 `MEEREEN`、`MEEREEN$` 或 FQDN `meereen.essos.local` 中的任何一种(通过 `sAMAccountName` 或 `dNSHostName` 匹配),而不仅仅是简短的 `NAME` 形式。
### 3. 计算机账户复用(不再耗尽 MAQ)
原版在每次运行时都会创建一个全新的随机 `GHOST********$` 账户。由于通过 `ms-DS-MachineAccountQuota` 创建的计算机账户**由 Domain Admins 拥有**(而非创建者),低权限用户**无法删除它们**,因此反复运行会因产生孤立的账户而迅速耗尽配额(默认为 10)。
此 Fork 复用单个稳定的账户(`CERTIGHOST$`,仅在不存在时才创建),因此配额永远不会增加,且运行之间无需进行任何清理。
### 4. 残留账户警告
当首次创建账户时,脚本会打印一条警告,指出它已被留在 AD 中:
```
[!] WARNING: computer account CERTIGHOST$ was created and is left in AD.
```
该账户将被保留,以便在后续运行中复用。要将其完全删除,请使用 Domain Admin(对象所有者)将其删除:
```
Get-ADComputer CERTIGHOST | Remove-ADComputer -Confirm:$false
```
## 环境要求
- Python 3
- `impacket`
- `cryptography`, `pyasn1`, `asn1crypto`, `pycryptodomex`
## 参考
- https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-54121
- https://gist.github.com/H0j3n/a5ef2609b5f2944ac2390a191a534c26
- https://github.com/aniqfakhrul/CVE-2026-54121 (原始 PoC)
## 免责声明
仅供授权的安全测试和教育目的使用。请仅针对您已获得明确测试许可的系统使用。
标签:AD CS, log2timeline, PKINIT, Python, SamuraiWTF, Windows 域安全, 工控安全, 无后门, 逆向工具