Certighost — CVE-2026-54121 · AD CS Domain-Controller Impersonation
Executive Summary
The attacker objective is the krbtgt secret, and the path to it runs through your Certification Authority rather than through a Domain Controller. Certighost (CVE-2026-54121, CVSS 8.8, CWE-285 improper authorization) lets any account that can log into the domain obtain a CA-signed certificate that authenticates as a Domain Controller. From there the attacker uses PKINIT to get Kerberos credentials for that DC account, and because DC accounts hold directory replication rights, runs DCSync to pull krbtgt. That is full domain compromise starting from an ordinary user.
The vulnerable behaviour is an optional AD CS enrollment fallback the reporters call a chase. During enrollment the CA may perform a second directory lookup on another host, and the requester gets to name that host through two certificate request attributes: cdc (Client DC — which server the CA contacts) and rmd (Remote Domain — which principal the CA looks up). Before the July 2026 update, the CA never checked that the cdc host was actually a Domain Controller. An attacker stands up rogue SMB/LSA and LDAP services, points cdc at them, and the CA accepts whatever identity data comes back.
The reason the rogue endpoint clears the CA's authentication checks at all is the default ms-DS-MachineAccountQuota of 10: a machine account created by an ordinary user is a valid domain principal, so it can satisfy the checks the CA needs to proceed even though it is not the DC being impersonated. Microsoft shipped the fix on 14 July 2026 (a validation routine that confirms the chase target really is a DC object with a matching DNS name and the SERVER_TRUST_ACCOUNT flag). Researchers H0j3n and Aniq Fakhrul published full technical details and a working certighost.py PoC on 24 July 2026.
Highest-value defensive angle
There is no published C2 infrastructure, no malware family and no attributed actor — so an IOC-first response buys you nothing here. The leverage is in three places, in this order: (1) patch every Enterprise CA; (2) set ms-DS-MachineAccountQuota to 0, which removes the primitive the whole chain is built on; (3) alert on the CA talking SMB/LDAP to anything that is not a Domain Controller, which is the single most specific signal this attack produces and which stays useful even after patching, because it also catches other AD CS relay abuse.
Defender priority: a CA server initiating an outbound SMB (445) or LDAP (389) connection to a host that is not on your Domain Controller list is the detection to build first. It is low-volume, it is the exact mechanic of the chase, and unlike a hash or a domain it cannot be changed by rotating infrastructure.
Source Review & Web Hunter Notes
Ten sources were fetched and snapshotted to Certighost-CVE-2026-54121-ADCS-Hunt-sources/ on 2026-07-30. Every atomic indicator this pack ships is traceable to one of them; everything else is behavioral by design.
| # | Source | Tier | What it contributed | Decision |
|---|---|---|---|---|
| 01 | Microsoft MSRC Security Update Guide (CVE-2026-54121 record) | Vendor | CVSS 8.8, vector, CWE-285, release date 14 Jul 2026, "less likely" exploitability at publication | Primary authority for severity and patch date |
| 02 | BleepingComputer — "New Certighost PoC exploit lets attackers hijack Windows domains" | Tier 1 press | Full chase mechanics, cdc/rmd, rogue SMB/LSA/LDAP, PKINIT, .ccache, Impacket secretsdump DCSync, the mitigation commands, certighost.py | Richest technical narrative; anchor source |
| 03 | Help Net Security — PoC exploit released for AD CS domain-takeover flaw | Tier 1 press | Independent confirmation of the chase, quota role, krbtgt outcome; "no known reports of exploitation in the wild" | Corroboration |
| 04 | Microsoft Threat Intelligence (@MsftSecIntel) | Vendor | Researcher testing observed, no confirmed actor exploitation; CA audit + Security events 4886/4887 guidance | Source for the native audit-log hunts |
| 05 | SOC Prime — Certighost active-threat page | Vendor detection | Rogue listener ports 389 and 445, .pfx/.ccache artifacts, EventID 5154/5156 | Used for port indicators. Fidelity caveat: the fetch returned a condensed extract, not the full body — noted in the snapshot. |
| 06 | Dataminr intel brief | Vendor | Timeline, CRequestInstance::_ValidateChaseTargetIsDC, Event ID 4662 hunting tip, quota-lowering advice | Used for hardening + native hunts |
| 07 | SecurityOnline.info | Press | PoC published to GitHub as certighost.py; quota-to-zero recommendation; audit CA request logs for cdc/rmd | Corroboration for the filename indicator |
| 08 | The CyberSec Guru | Press | Patch internals (certpdef.dll validation routine), affected platform list, mitigation caveat | Background only |
| 09 | IT-Connect | Press | Prerequisites: enterprise CA, default machine template, SMB/LDAP reachability | Used for the affected-surface table |
| 10 | Reporter technical writeup (H0j3n / Aniq Fakhrul gist) | Original research | Servicing-gate behaviour, SERVER_TRUST_ACCOUNT check, exact mitigation commands, disclosure timeline | Defensive facts only — no offensive code carried into this pack |
Dropped source: the DarkReading article on this flaw returned HTTP 403 to an unauthenticated fetch. Because no snapshot could be saved, it is not cited anywhere in this pack and contributed nothing to it.
Injection check: every fetched page was treated as untrusted data. None of the ten snapshots contained text attempting to direct an automated agent (no "fetch this other URL for the real IOCs", no claimed prior authorisation, no instructions to run commands). Nothing was dropped for that reason.
Hunt Brief & Attack Chain
Hunt hypotheses
- H1 — Quota abuse: a non-provisioning user account created one or more machine accounts in the last 90 days.
- H2 — Chase egress: an Enterprise CA host opened SMB or LDAP to a host outside the Domain Controller set.
- H3 — Rogue listener: a workstation or member server is listening on 389/636 (LDAP) or serving SMB from a non-system process.
- H4 — Tooling: Python,
certighost.py, Certipy, Rubeus or Impacketsecretsdumpran on a non-admin endpoint. - H5 — Credential material:
.pfxor.ccacheartifacts orKRB5CCNAMEappear in command lines outside the PKI team's hosts. - H6 — Replication abuse: a machine account authenticated from a host that is not that machine, followed by directory replication activity.
- H7 — Mitigation tampering:
certutil -setreg policy\EditFlagsor a CertSvc restart occurred outside a change window (either the mitigation being applied, or an attacker re-enabling the chase).
Attack chain
| Step | Attacker action | Artifact you can see | Hunt |
|---|---|---|---|
| 1 | Authenticate as any domain user | Ordinary logon; no anomaly by itself | — |
| 2 | Create a machine account under the default ms-DS-MachineAccountQuota (10) | New computer object; creator is a non-provisioning user; Security 4741 on the DC | Q1, Q10, N1 |
| 3 | Stand up rogue SMB/LSA and LDAP services on a controlled host | Listener on 389/636/445 from a non-system process on a non-DC | Q3, N4 |
| 4 | Submit a certificate request carrying attacker-chosen cdc and rmd attributes | CA request log entry with unusual request attributes; Security 4886/4887 on the CA | N2, N3 |
| 5 | CA performs the chase: SMB + LDAP out to the attacker host | Outbound 445/389 from the CA to a non-DC | Q2, Q9 |
| 6 | CA issues a certificate carrying the target DC's identity | Certificate issued for a DC account to a requester that is not that DC | N3 |
| 7 | PKINIT with the certificate; TGT saved to .ccache; NT hash recovered | Python/PoC execution; .pfx/.ccache/KRB5CCNAME in command lines; 4768 with certificate info | Q4, Q8, N5 |
| 8 | DCSync (DsGetNCChanges) as the DC account to extract krbtgt | Replication request from a non-DC principal; Security 4662 with the replication GUIDs | Q5, Q7, N6 |
Timing: steps 2 through 8 complete in minutes in the published PoC. Treat any single confirmed hit on Q2 or Q3 as an incident, not as a hunting lead.
Consolidated IOC Table
IOC honesty note. This is a vulnerability-plus-public-PoC pack. No vendor has published C2 domains, IP addresses or file hashes for Certighost, and none are invented here. The table below is deliberately short; the detection value lives in sections 7 and 8. Anything you would normally expect as an atomic indicator appears as a clearly labelled REPLACE_WITH_ placeholder for you to fill from your own environment.
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| Filename | certighost.py | High | hunt | Public PoC script name, cited by BleepingComputer, SOC Prime and SecurityOnline. Trivially renameable — treat as a hunt string, never as a block. |
| Port | 389 | Medium | hunt | LDAP. Rogue chase listener port, and the CA's outbound chase port. Only meaningful in combination with a non-DC peer. |
| Port | 445 | Medium | hunt | SMB/LSA. Same reasoning as 389. |
| Request attribute | cdc | High | hunt | Not an atomic IOC — a certificate request attribute. Present in CA request logs when the chase is invoked. |
| Request attribute | rmd | High | hunt | As above; names the principal the CA resolves on the attacker's host. |
| Registry / policy | EDITF_ENABLECHASECLIENTDC | High | enrich | The EditFlags bit that enables the vulnerable fallback. Its state is a configuration fact, not a compromise indicator. |
| Artifact ext. | .pfx / .ccache | Medium | hunt | PoC output: the issued certificate and the resulting Kerberos ticket cache. |
| SHA256 | REPLACE_WITH_POC_SCRIPT_SHA256 | N/A | — | No hash has been published by any source in this pack. Compute it yourself if you retrieve the PoC for validation, then fill this in. |
| IPv4 / hostname | REPLACE_WITH_ROGUE_CHASE_HOST | N/A | — | Populate from the cdc value in any CA request log entry you find suspicious. |
Affected Surface & Telemetry Matrix
| Surface | Exposure | Telemetry | Priority | Gap risk |
|---|---|---|---|---|
| Enterprise Certification Authority (AD CS) | Directly vulnerable pre-July-2026. Windows Server 2012 through 2025 including Server Core; Windows 10 1607/1809. | Falcon NetworkConnectIP4, ProcessRollup2; Windows Security 4886/4887; CA request log (certutil view) | Critical | CA request-attribute logging is off by default — 4887 will not show cdc/rmd unless CA auditing is enabled |
| Domain Controllers | Impersonation target; DCSync victim | Falcon UserLogon; Windows Security 4741, 4662, 4768 | Critical | 4662 is high-volume; needs a property-GUID filter to be usable |
| Standard workstations / member servers | Attacker launch point: machine-account creation and rogue LDAP/SMB listeners | Falcon NetworkListenIP4, ProcessRollup2 | High | NetworkListenIP4 coverage varies by sensor policy; confirm it is enabled before trusting Q3 |
| Certificate templates | Default machine/computer template is sufficient for the attack | AD object auditing on the PKI container | High | Template ACL changes are rarely audited |
Domain policy — ms-DS-MachineAccountQuota | Default of 10 is the enabling primitive | Domain object read; 5136 on the domain NC | High | Often left at default because "nothing uses it" — which is exactly why it is safe to zero |
| Falcon Identity Protection (AD event stream) | Best source for machine-account creation attribution | ActiveDirectoryAccountCreated and siblings | Medium | Requires an Identity Protection licence; field naming is tenant/schema dependent |
ATT&CK Mapping
| Tactic | Technique | Behavior in this chain | Query / control |
|---|---|---|---|
| Persistence | T1136.002 — Create Account: Domain Account | Machine account created under the default quota | Q1, Q10 / quota = 0 |
| Credential Access | T1649 — Steal or Forge Authentication Certificates | CA issues a certificate carrying DC identity via the chase | Q2, Q9 / July 2026 update |
| Privilege Escalation | T1068 — Exploitation for Privilege Escalation | Improper authorization in the AD CS chase path | Patch; EditFlags mitigation |
| Credential Access | T1558 — Steal or Forge Kerberos Tickets | PKINIT with the forged certificate; TGT written to a ticket cache | Q4, Q7, Q8 |
| Credential Access | T1003.006 — OS Credential Dumping: DCSync | DsGetNCChanges as the impersonated DC to extract krbtgt | Q5, N6 |
| Collection / Discovery | T1087.002 — Account Discovery: Domain Account | LDAP enumeration to pick a DC account to target | Q3 (listener side), N4 |
| Defense Evasion | T1562.001 — Impair Defenses: Disable or Modify Tools | Re-enabling the chase flag or restarting CertSvc to undo the mitigation | Q6 |
| Lateral Movement | T1550.003 — Use Alternate Authentication Material: Pass the Ticket | Reuse of the .ccache TGT against the DC | Q7, Q8 |
Native Audit-Log Hunts (non-CQL)
These run on Windows event data and CA logs. Several of them are the only way to see the request attributes themselves, because EDR network telemetry shows the chase connection but not the cdc value that caused it.
| ID | Where | What to look for | Why it matters |
|---|---|---|---|
| N1 | DC Security log | 4741 (computer account created) where the Subject is not a provisioning service account or a Tier-0 admin | Step 2 of the chain. In most domains, legitimate 4741 events come from a handful of known identities. |
| N2 | CA Security log | 4886 (certificate services received a request) and 4887 (request approved and certificate issued) — correlate a burst on a single requester | Microsoft's own guidance for this CVE. Requires Certification Services auditing to be enabled first (see playbook 3). |
| N3 | CA request database | Request rows whose attributes contain cdc or rmd; and any certificate issued to a requester whose SAN or subject is a Domain Controller account the requester does not own | The most specific artifact that exists. A certificate for DC01$ requested by WKSTN42$ is unambiguous. |
| N4 | Windows Filtering Platform | 5154 (listen permitted) / 5156 (connection permitted) on ports 389, 636 or 445 from a non-server, non-DC host | Catches the rogue listener even where EDR listen telemetry is thin. |
| N5 | DC Security log | 4768 TGT requests where certificate information is populated, for a machine account, from a client address that is not that machine | The PKINIT step. Certificate issuer/serial fields on 4768 let you tie the TGT back to the fraudulent certificate. |
| N6 | DC Security log | 4662 where the Object Type is domainDNS and the accessed properties include the directory-replication control-access rights, and the Subject is not a Domain Controller | DCSync. Filter to the replication property GUIDs or this event will drown you. |
| N7 | Domain naming context | 5136 on the domain object where the modified attribute is ms-DS-MachineAccountQuota | Detects someone quietly restoring the quota after you set it to 0. |
| N8 | CA host | Registry value EditFlags under the CA policy key — confirm the EDITF_ENABLECHASECLIENTDC bit state on every CA | Configuration audit, not detection. Run it fleet-wide and record the result. |
CrowdStrike LogScale CQL Hunt Queries
No in-query time filters. Every query below sets its intended window as a // LOOKBACK: comment and relies on the console time picker. That is deliberate — a @timestamp comparison against a function call is rejected by the CQL parser and would break the query on line 1.
Looks for: computer objects (SAM names ending in $) created by identities that are not your join/provisioning accounts. This is step 2 of the chain and the only step that is hard for the attacker to avoid. FP: autopilot/Intune/SCCM/MDT join identities, VDI provisioning, and staff who legitimately domain-join their own builds — enumerate them once and pin the exclusion list.
// HUNT: Certighost step 2 - machine account created under the default ms-DS-MachineAccountQuota // MITRE: T1136.002 | CONF: medium FP: medium COST: low | REQUIRES: Falcon Identity Protection (AD event stream) // LOOKBACK: 90d - set the window in the console time picker, not in the query // ⚠ validate in tenant: ActiveDirectoryAccountCreated is a Falcon Identity Protection event; its // ⚠ validate in tenant: field naming is schema-version dependent - confirm SamAccountName / // ⚠ validate in tenant: AccountDomain / UserName exist on a sample row before scheduling this. #event_simpleName=/^ActiveDirectoryAccountCreated$/ | SamAccountName=/\$$/ // TUNING: replace this list with YOUR provisioning identities before running - untuned this returns every normal domain join | UserName!=/^(svc-join|sccm|mdt|intune|autopilot|vdi-provision)/i | groupBy([UserName, AccountDomain, SamAccountName, ComputerName], function=count(as=Created), limit=500) | sort(Created, order=desc, limit=200)
Looks for: the chase itself — the CA process stack reaching out on LDAP/SMB/Global Catalog ports to an address that is not one of your Domain Controllers. This is the highest-fidelity signal in the pack and it survives infrastructure rotation. FP: a CA legitimately talks to DCs and to its own CDP/AIA publishing share constantly, so the query is worthless until both the CA host list and the DC subnet exclusion are filled in.
// HUNT: Certighost step 5 - AD CS "chase" egress from the Certification Authority to a host that is not a DC // MITRE: T1649 | CONF: high FP: medium COST: medium | REQUIRES: NetworkConnectIP4 from CA hosts // LOOKBACK: 30d - set the window in the console time picker #event_simpleName=/^NetworkConnectIP4$/ | ContextBaseFileName=/^(certsrv\.exe|lsass\.exe|svchost\.exe)$/i | in(RemotePort, values=[389, 445, 636, 3268, 3269]) // TUNING: 1) narrow ComputerName to YOUR Enterprise CA hosts. 2) exclude every Domain Controller subnet. // TUNING: both placeholders below are mandatory - untuned this returns all normal CA-to-DC traffic. | ComputerName=/^REPLACE_WITH_CA_HOSTNAME_PREFIX/i | !cidr(RemoteAddressIP4, subnet=["10.10.10.0/24", "10.10.20.0/24"]) | groupBy([ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], function=count(as=Conns), limit=500) | sort(Conns, order=desc, limit=200)
Looks for: the attacker's fake directory. LDAP (389/636) listening anywhere other than a Domain Controller is abnormal in almost every estate, and SMB served by something that is not the kernel/System process is abnormal everywhere. FP: ADAM/AD LDS instances, LDAP-based appliances and some backup agents bind 389 on member servers — baseline once, then exclude by process name.
// HUNT: Certighost step 3 - rogue LDAP/SMB/LSA listener used as the chase endpoint // MITRE: T1087.002 | CONF: high FP: medium COST: low | REQUIRES: NetworkListenIP4 (confirm it is enabled in sensor policy) // LOOKBACK: 30d - set the window in the console time picker #event_simpleName=/^NetworkListenIP4$/ | in(LocalPort, values=[389, 445, 636]) | ContextBaseFileName!=/^(System|lsass\.exe|ntoskrnl\.exe|dfsrs\.exe)$/i // TUNING: exclude Domain Controllers and any sanctioned AD LDS / LDAP appliance hosts by ComputerName, // TUNING: and exclude python only if you genuinely run an LDAP service on Python somewhere. | groupBy([ComputerName, aid, ContextBaseFileName, LocalPort, LocalAddressIP4], function=count(as=Listens), limit=500) | sort(Listens, order=desc, limit=200)
Looks for: the published PoC by script basename or by the string appearing in a Python command line. Matching is on FileName (the basename) so there is no path separator inside the regex. FP: effectively only your own red team.
// HUNT: Certighost PoC tooling execution (certighost.py or a python interpreter invoking it) // MITRE: T1649 | CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // LOOKBACK: 90d - set the window in the console time picker #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(certighost(\.py)?|python3?(\.exe)?|pythonw\.exe)$/i | CommandLine=/(certighost|cve.2026.54121)/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData]) | sort(@timestamp, order=desc, limit=200)
Looks for: step 8 — the payoff. Impacket secretsdump, -just-dc style replication flags, ntlmrelayx, addcomputer and mimikatz DCSync invocations. FP: essentially none outside sanctioned testing; treat a hit on a production endpoint as an incident.
// HUNT: Certighost step 8 - DCSync / replication tooling after DC impersonation // MITRE: T1003.006 | CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // LOOKBACK: 90d - set the window in the console time picker #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | CommandLine=/(secretsdump|just.dc.ntlm|just.dc\b|ntlmrelayx|addcomputer|dcsync|drsuapi)/i | table([@timestamp, ComputerName, UserName, UserSid, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=200)
Looks for: the vendor-documented mitigation command, and its reversal. Run this both to confirm your mitigation actually landed on every CA and to catch an attacker turning the chase back on. FP: your own PKI admins applying the mitigation — which is exactly the traffic you want to see, so tune by change-window rather than by suppressing the rule.
// HUNT: EDITF_ENABLECHASECLIENTDC policy-flag change or CertSvc restart on a CA host // MITRE: T1562.001 | CONF: medium FP: medium COST: low | REQUIRES: ProcessRollup2 // LOOKBACK: 90d - set the window in the console time picker #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(certutil\.exe|sc\.exe|net\.exe|powershell\.exe|pwsh\.exe)$/i | CommandLine=/(EDITF_ENABLECHASECLIENTDC|setreg\s+policy.EditFlags|(Restart|Stop|Start).Service\s+CertSvc)/i // TUNING: expected during patch/mitigation windows - correlate UserName against your PKI change record // TUNING: rather than excluding hosts, and alert only on runs outside an approved window. | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=200)
Looks for: the consequence of PKINIT with a forged DC certificate — a machine account (SAM name ending in $) authenticating over the network from an endpoint that is not that machine. FP: very high by nature; machine accounts do network logons constantly. Use it as a stack-rank/outlier pass on the specific DC account names you care about, not as an alerting rule.
// HUNT: Certighost step 7 - machine (DC) account authenticating from an unexpected endpoint // MITRE: T1550.003 | CONF: medium FP: high COST: medium | REQUIRES: UserLogon // LOOKBACK: 14d - set the window in the console time picker; keep this one narrow #event_simpleName=/^UserLogon$/ | UserName=/\$$/ | LogonType=3 // TUNING: mandatory - restrict UserName to your Domain Controller accounts, then verify each // TUNING: ComputerName in the results IS that DC. Any other host in the list is the finding. | UserName=/^REPLACE_WITH_DC_ACCOUNT_PREFIX/i | groupBy([UserName, ComputerName, aid, UserSid, LogonType], function=count(as=Logons), limit=500) | sort(Logons, order=asc, limit=200)
Looks for: the PoC's own outputs and the wider AD CS abuse toolset — .pfx, .ccache, KRB5CCNAME, Certipy, Certify, Rubeus asktgt. FP: PKI operators and developers handle .pfx files routinely; scope to non-PKI hosts or require a second signal from Q1/Q3.
// HUNT: certificate/ticket artifacts and AD CS abuse tooling on an endpoint // MITRE: T1558 | CONF: medium FP: medium COST: low | REQUIRES: ProcessRollup2 // LOOKBACK: 90d - set the window in the console time picker #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | CommandLine=/(KRB5CCNAME|\.ccache|\.pfx|certipy|Certify\.exe|Rubeus|asktgt|getTGT)/i // TUNING: exclude your PKI administration jump hosts and code-signing build agents, which touch // TUNING: .pfx files as normal business - everything else on this list deserves a look. | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=200)
Looks for: steps 2 and 3 on the same sensor. Either behaviour alone has an innocent explanation; together on one endpoint they are the Certighost setup and essentially nothing else. FP: low — a provisioning server that both joins machines and runs an LDAP service would need excluding, which is a short list.
// HUNT: Certighost setup correlation - machine-account creation AND a rogue directory listener on one aid // MITRE: T1136.002 | CONF: high FP: low COST: medium | REQUIRES: Identity Protection + NetworkListenIP4 // LOOKBACK: 30d - set the window in the console time picker // ⚠ validate in tenant: ActiveDirectoryAccountCreated is a Falcon Identity Protection event - // ⚠ validate in tenant: confirm it is present in your repo before relying on this correlation. #event_simpleName=/ActiveDirectoryAccountCreated|NetworkListenIP4/ | selfJoinFilter(field=[aid], where=[ {#event_simpleName=/ActiveDirectoryAccountCreated/}, {#event_simpleName=/NetworkListenIP4/} ]) | in(LocalPort, values=[389, 445, 636]) | groupBy([aid, ComputerName], function=[count(as=Events), collect([UserName, SamAccountName, LocalPort, ContextBaseFileName])], limit=200) | sort(Events, order=desc, limit=100)
Looks for: the same event as Q1 but framed as a baseline — who creates computer objects in this domain, how often, and when each identity was first and last seen doing it. Run this once to build the exclusion list that Q1 needs, then keep it as a monthly review. FP: the whole point is that most rows are legitimate; the finding is a creator with a recent FirstSeen and a low count.
// HUNT: baseline of machine-account creators - builds the exclusion list Q1 depends on // MITRE: T1136.002 | CONF: medium FP: medium COST: low | REQUIRES: Falcon Identity Protection (AD event stream) // LOOKBACK: 365d - set the window in the console time picker // ⚠ validate in tenant: ActiveDirectoryAccountCreated is a Falcon Identity Protection event and its // ⚠ validate in tenant: field naming is schema-version dependent - check a sample row first. #event_simpleName=/^ActiveDirectoryAccountCreated$/ | SamAccountName=/\$$/ // TUNING: this query is expected to be noisy - it is a baseline, not an alert. Promote only the // TUNING: identities with a FirstSeen inside the last 30 days and a Creations count in single digits. | groupBy([UserName, AccountDomain], function=[count(as=Creations), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen), collect(SamAccountName)], limit=500) | sort(FirstSeen, order=desc, limit=200)
Custom IOA Recommendations
| IOA name | Rule type | Pattern | Exclusions | Action |
|---|---|---|---|---|
| Certighost — PoC script execution | Process Creation | Image filename matches certighost; or command line contains certighost | Sanctioned red-team hosts | Detect + Block (high severity) |
| Certighost — DCSync tooling | Process Creation | Command line contains secretsdump, ntlmrelayx, addcomputer, or a just-dc replication flag | Approved pentest window, by host | Block (critical) |
| Certighost — chase flag tampering | Process Creation | Image filename certutil.exe with command line containing EDITF_ENABLECHASECLIENTDC | PKI change window (monitor, do not exclude) | Detect (medium) |
| Certighost — rogue directory listener | Network Listen | Local port 389 or 636 on a host not in the Domain Controller group, initiated by a non-system process | AD LDS hosts, LDAP appliances | Detect (high) |
| Certighost — ticket cache handling | Process Creation | Command line contains KRB5CCNAME or a .ccache path | Linux-interop admin tooling, if any | Detect (medium) |
Deployment path: Falcon console → Endpoint security → Custom IOA rule groups → create a group scoped to a host group containing your CAs and Domain Controllers first, run it in Monitor mode for 7 days, then widen to the full estate and promote the first two rules to Block.
Do not build an IOA on the .pfx extension alone. It is common in legitimate PKI and code-signing work and will generate more noise than the entire rest of this pack combined.
Machine-Readable IOC Appendix
Four quick-copy blocks. The CSV is deliberately thin — see the honesty note in section 4. The behavioral and audit blocks are where the operational value is.
type,value,action,severity,expiration,description,tags # Certighost is a vulnerability + public-PoC pack. No vendor has published C2 domains, # IP addresses or file hashes, and none are invented here. The three rows below are the # only atomic indicators that appear verbatim in a saved source snapshot; everything # else in this pack is behavioral. Falcon IOC Management natively imports sha256/sha1/ # md5/domain/ipv4/ipv6 - the filename and port rows are hunt-list entries for your SIEM. filename,certighost.py,hunt,high,2027-01-30,Certighost AD CS PoC exploit script,campaign:Certighost port,389,hunt,medium,2026-10-30,LDAP - rogue chase listener and CA chase egress,campaign:Certighost port,445,hunt,medium,2026-10-30,SMB and LSA - rogue chase listener and CA chase egress,campaign:Certighost sha256,REPLACE_WITH_POC_SCRIPT_SHA256,detect,high,2027-01-30,Hash of the PoC as retrieved in your own validation,campaign:Certighost ipv4,REPLACE_WITH_ROGUE_CHASE_HOST_IP,hunt,high,2026-10-30,Host named in an observed cdc request attribute,campaign:Certighost domain,REPLACE_WITH_ROGUE_CHASE_HOSTNAME,hunt,high,2026-10-30,Hostname named in an observed cdc request attribute,campaign:Certighost
BEHAVIOR-01 Machine account created by an identity outside the provisioning set BEHAVIOR-02 CA host opens SMB (445) or LDAP (389/636/3268) to an address that is not a DC BEHAVIOR-03 LDAP listener (389 or 636) on a host that is not a Domain Controller BEHAVIOR-04 SMB served from a process other than System on a workstation BEHAVIOR-05 Certificate request carrying the cdc and rmd request attributes BEHAVIOR-06 Certificate issued whose subject is a DC account, to a requester that is not that DC BEHAVIOR-07 PKINIT TGT request for a machine account from a client address that is not that machine BEHAVIOR-08 Directory replication (DsGetNCChanges) requested by a non-DC principal BEHAVIOR-09 .pfx or .ccache path, or KRB5CCNAME, in a command line on a non-PKI host BEHAVIOR-10 EditFlags policy change or CertSvc service restart outside a change window BEHAVIOR-11 ms-DS-MachineAccountQuota modified on the domain object
certighost.py public PoC script (renameable - hunt string, not a block) aniqfakhrul/CVE-2026-54121 public PoC repository name cited across sources secretsdump Impacket module used for the DCSync step in the published chain ntlmrelayx Impacket relay tooling, same family addcomputer Impacket module for machine-account creation certipy third-party AD CS abuse toolkit (same attack class) Certify.exe .NET AD CS abuse tool (same attack class) Rubeus / asktgt Kerberos ticket request tooling used after certificate issuance cdc certificate request attribute - names the chase target host rmd certificate request attribute - names the principal to resolve .pfx issued certificate written by the PoC .ccache Kerberos credential cache written by the PoC KRB5CCNAME environment variable pointing at the ticket cache
# 1. Inventory every Enterprise CA in the forest
Get-ADObject -Filter "objectClass -eq 'pKIEnrollmentService'" -SearchBase ("CN=Enrollment Services,CN=Public Key Services,CN=Services," + (Get-ADRootDSE).configurationNamingContext) -Properties dNSHostName | Select-Object Name,dNSHostName
# 2. Confirm the July 2026 update is installed on each CA (run per CA host)
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 15 HotFixID,InstalledOn
# 3. Read the CA policy EditFlags value (chase state) on each CA host
certutil -getreg policy\EditFlags
# 4. Read the domain machine-account quota
Get-ADObject -Identity (Get-ADDomain).DistinguishedName -Properties "ms-DS-MachineAccountQuota" | Select-Object -ExpandProperty "ms-DS-MachineAccountQuota"
# 5. List computer objects created in the last 90 days and who owns them
Get-ADComputer -Filter "whenCreated -gt '$((Get-Date).AddDays(-90).ToString('yyyy-MM-dd'))'" -Properties whenCreated,nTSecurityDescriptor | Select-Object Name,whenCreated,@{n='Owner';e={$_.nTSecurityDescriptor.Owner}}
# 6. Confirm Certification Services auditing is on (needed for events 4886/4887)
certutil -getreg CA\AuditFilter
Detection Validation Gates
Gate 1 — Telemetry ready
NetworkConnectIP4is flowing from every Enterprise CA host (check: any result at all for the CA hostnames in the last 24h).NetworkListenIP4is enabled in the sensor policy applied to workstations — Q3 and Q9 silently return nothing if it is not.- Falcon Identity Protection AD events are present, or Q1/Q9/Q10 must be replaced with the 4741-based native hunt N1.
- Certification Services auditing is enabled on the CA, or N2/N3 cannot run.
Gate 2 — Benign baseline
- Run Q10 over 365 days and record the full set of legitimate machine-account creators. Paste that set into Q1's exclusion regex.
- Run Q2 with only the CA-host filter applied (no CIDR exclusion) and record the DC addresses that appear. Those become the exclusion list.
- Run Q3 across the estate and record every host that legitimately listens on 389/636. Expect Domain Controllers and possibly an AD LDS host; anything else is a finding before you even get to Certighost.
Gate 3 — Positive tests (lab only)
- On an isolated lab domain, create a computer account with an ordinary user and confirm Q1 and N1 both fire.
- Bind a listener on 389 on a lab workstation and confirm Q3 fires and 5154 is logged.
- Run
certutil -getreg policy\EditFlagsand confirm Q6's pattern does not match a read (only-setregshould).
Gate 4 — Promotion
- Promote Q2 and Q4 to scheduled searches with alerting once Gate 2 is complete. Q4 needs no tuning.
- Q5 goes straight to alerting — it has no benign baseline in a normal estate.
- Q7 and Q10 stay as analyst-run hunts. Do not schedule them.
Do not promote Q1 before Gate 2. Untuned it returns every domain join in the estate, and an alert that fires on normal provisioning gets muted within a week — taking the one signal that catches step 2 with it.
Hardening — Tiered
- Apply the July 14 2026 security update to every server running an Enterprise Certification Authority. M1051 Update Software. This is the fix; everything else on this page is defence in depth. Microsoft's update adds a validation routine that confirms the chase target is a real DC object with a matching DNS name and the SERVER_TRUST_ACCOUNT flag. Authority: Microsoft MSRC advisory for CVE-2026-54121.
- If you cannot patch immediately, disable the chase fallback with the EditFlags policy change and a CertSvc restart (playbook 1). M1042 Disable or Remove Feature or Program. The reporters describe this as an optional fallback rather than code on every request, but they also state it is a temporary measure that has not been fully tested in production, so patch regardless. Authority: reporter writeup + BleepingComputer, both cited in section 18.
- Set
ms-DS-MachineAccountQuotato 0 (playbook 2) and delegate machine-account creation to your provisioning accounts explicitly. M1018 User Account Management. This removes the primitive the entire chain depends on and mitigates a long list of other AD attacks at the same time. Authority: CIS Microsoft Windows Server Benchmark, Domain Controller / account-management section; Microsoft AD security best practices. - Enable Certification Services auditing on every CA so 4886/4887 exist at all (playbook 3). M1047 Audit. Without it, section 7's most specific hunts have no data to run against. Authority: Microsoft Threat Intelligence guidance for this CVE; CIS Windows Server Benchmark audit-policy section; NIST SP 800-92 log management.
- Treat CAs as Tier 0. M1026 Privileged Account Management. Same administrative boundary, same jump-host requirement and same logging as a Domain Controller. A CA that can be reached from a user VLAN is a domain-takeover device. Authority: Microsoft privileged-access / tier model guidance; CIS Windows Server Benchmark administrative-account controls.
- Restrict CA egress. M1030 Network Segmentation · M1037 Filter Network Traffic. A CA needs LDAP/SMB to Domain Controllers and to its publishing share. Firewall rules that deny 389/445/636 from the CA to everything else convert Q2's detection into a prevention (playbook 5). Authority: NIST SP 800-41 firewall guidance; CIS Windows Server Benchmark host-firewall section.
- Audit certificate template enrollment permissions. M1018 User Account Management. Remove Domain Users and Domain Computers from enroll rights on any template that is not genuinely needed by everyone, and remove "Supply in request" subject flags from templates that do not require them. Authority: Microsoft AD CS security guidance.
- Deploy the section 9 IOAs in monitor mode, then promote the PoC and DCSync rules to block. M1040 Behavior Prevention on Endpoint. Authority: CrowdStrike custom IOA deployment guidance.
- Monitor
ms-DS-MachineAccountQuotafor change (native hunt N7). M1047 Audit. Setting it to 0 is worthless if it is quietly restored. Authority: NIST SP 800-92; CIS Windows Server Benchmark audit-policy section.
- Rotate krbtgt twice if any hunt in this pack produces a confirmed finding, with the vendor-recommended interval between rotations. M1027 Password Policies. A single rotation leaves the previous key valid. Authority: Microsoft krbtgt reset guidance; NIST SP 800-63B credential lifecycle.
- Move to a two-tier PKI with an offline root, and reduce the number of issuing CAs to the minimum. M1030 Network Segmentation. Every additional Enterprise CA is another host with this class of exposure. Authority: Microsoft PKI design guidance; NIST SP 800-57 Part 3 PKI key management.
- Adopt strong certificate mapping across the estate so certificate-to-account binding does not rely on weak implicit mapping, and enforce it in full-enforcement mode. M1032 Multi-factor Authentication · M1047 Audit. Authority: Microsoft strong certificate mapping (KB5014754) guidance.
- Build a PKI review cadence: quarterly template ACL review, CA egress rule review, and a check that CA auditing is still enabled after every CA rebuild or patch cycle. M1047 Audit. Authority: CIS Windows Server Benchmark; NIST SP 800-53 CM-6 configuration settings.
- Add AD CS abuse to purple-team scope so the detections in section 8 get exercised rather than assumed. Authority: NIST SP 800-115 security assessment.
Deployable Playbooks
Playbook 1 — Disable the AD CS chase fallback (temporary mitigation, per CA host)
# Run elevated ON EACH ENTERPRISE CA. This is the vendor/reporter-documented workaround # for organisations that cannot install the July 2026 update immediately. # It is a TEMPORARY measure: the reporters state it has not been fully tested in production, # and it may interrupt legitimate cross-DC enrollment workflows. Patch as the real fix. # 1. Record the current state first, so you can prove what changed and roll back. certutil -getreg policy\EditFlags # 2. Clear the EDITF_ENABLECHASECLIENTDC bit. certutil -setreg policy\EditFlags -EDITF_ENABLECHASECLIENTDC # 3. Restart the Certification Authority service for the change to take effect. Restart-Service CertSvc -Force # 4. Confirm the bit is gone and the service came back healthy. certutil -getreg policy\EditFlags Get-Service CertSvc | Select-Object Name,Status,StartType # 5. Smoke-test enrollment from a normal client before you walk away. certutil -pulse
Playbook 2 — Remove the machine-account creation primitive
# Run once per domain, from a Tier 0 admin workstation with the AD PowerShell module.
# 1. Record the current value.
$dn = (Get-ADDomain).DistinguishedName
Get-ADObject -Identity $dn -Properties "ms-DS-MachineAccountQuota" | Select-Object -ExpandProperty "ms-DS-MachineAccountQuota"
# 2. Set it to zero. Ordinary users can no longer create computer objects.
Set-ADDomain -Identity $dn -Replace @{"ms-DS-MachineAccountQuota"="0"}
# 3. Verify.
Get-ADObject -Identity $dn -Properties "ms-DS-MachineAccountQuota" | Select-Object -ExpandProperty "ms-DS-MachineAccountQuota"
# 4. BEFORE step 2 in production: confirm your join workflow does not rely on the quota.
# Grant the provisioning identity an explicit delegation on the target OU instead, using
# the AD Delegation of Control wizard: "Create, delete and manage computer accounts".
# Autopilot / Intune / SCCM OSD / MDT all support a delegated join account.
# 5. Alert on any future change to this attribute (native hunt N7 - event 5136 on the domain object).
Playbook 3 — Turn on Certification Services auditing (enables 4886 / 4887)
# Run elevated ON EACH CA. Without this, the CA request/issue events Microsoft points at # for this CVE are simply not generated, and native hunts N2 and N3 have no source data. # 1. Enable the CA's own audit filter (all categories). certutil -setreg CA\AuditFilter 127 Restart-Service CertSvc -Force # 2. Enable the matching Windows audit subcategory. auditpol /set /subcategory:"Certification Services" /success:enable /failure:enable # 3. Verify both halves. certutil -getreg CA\AuditFilter auditpol /get /subcategory:"Certification Services" # 4. Confirm events are landing. Get-WinEvent -LogName Security -MaxEvents 50 -FilterXPath "*[System[(EventID=4886 or EventID=4887)]]" | Select-Object TimeCreated,Id
Playbook 4 — Review CA request rows for chase attributes
# Run ON THE CA. The request database is the only place the cdc / rmd attributes are visible. # 1. Dump recent request rows with their attributes. certutil -view -restrict "RequestID>0" -out "RequestID,RequesterName,Request.SubmittedWhen,Request.DispositionMessage,Request.RequestAttributes" # 2. Scan that output for request attributes containing cdc or rmd, and for any request whose # issued subject is a Domain Controller account but whose RequesterName is not that DC. # Both are direct evidence of the Certighost pattern. # 3. Any hit: capture the RequestID, the RequesterName, the cdc host value and the issued # certificate serial, then revoke that certificate and go to section 14. certutil -revoke REPLACE_WITH_CERT_SERIAL 4
Playbook 5 — Restrict CA egress (converts detection into prevention)
# Windows Firewall outbound rules on the CA host. Adjust the DC address list to your estate.
# Rationale: a CA legitimately needs LDAP/SMB to Domain Controllers and to its CDP/AIA
# publishing share. Denying those ports to everything else removes the chase primitive
# regardless of patch state.
$dcs = @("10.10.10.11","10.10.10.12") # REPLACE_WITH your Domain Controller addresses
New-NetFirewallRule -DisplayName "CA egress LDAP-SMB to DCs only (allow)" -Direction Outbound -Action Allow -Protocol TCP -RemotePort 389,445,636,3268,3269 -RemoteAddress $dcs
New-NetFirewallRule -DisplayName "CA egress LDAP-SMB block all others" -Direction Outbound -Action Block -Protocol TCP -RemotePort 389,445,636,3268,3269
# Verify, then watch Q2 for 48h - it should now return nothing at all.
Get-NetFirewallRule -DisplayName "CA egress*" | Select-Object DisplayName,Enabled,Action
Containment Runbook
| Phase | Actions | Owner | Evidence to capture |
|---|---|---|---|
| 1 · Triage (0–1h) | Confirm the hit is real: pull the CA request row behind the connection (playbook 4). Identify the cdc host and the requester. Determine whether a certificate was actually issued. | SOC L2 | CA request row, RequestID, RequesterName, issued serial, Falcon detection ID |
| 2 · Contain (1–4h) | Network-contain the attacker-controlled host and the requesting endpoint in Falcon. Revoke the fraudulently issued certificate. Disable the machine account the attacker created. Apply playbook 1 on every CA if not already patched. | SOC L3 + PKI owner | Containment timestamps, revocation confirmation, disabled account SID |
| 3 · Scope (4–24h) | Run Q2 and Q5 across the full estate over 90 days. Review every 4886/4887 pair on every CA for the same pattern. Check 4662 for replication requests from non-DC principals. Determine whether DCSync succeeded. | IR lead | Query exports, 4662 hits, list of accounts whose secrets were replicated |
| 4 · Eradicate (24–72h) | If DCSync succeeded: assume full domain compromise. Rotate krbtgt twice with the recommended interval. Rotate all Tier 0 credentials and any service account whose secret was replicated. Rebuild the attacker-controlled host. | AD owner + IR lead | Rotation records, credential inventory, rebuild ticket |
| 5 · Harden (72h+) | Patch every CA. Set the machine-account quota to 0. Apply playbook 5 egress restrictions. Enable CA auditing everywhere. Deploy the section 9 IOAs in block mode. | Platform + SOC engineering | Patch report per CA, quota value, firewall rule export, IOA group config |
| 6 · Review (1–2 weeks) | Post-incident review focused on why the CA was reachable and why the quota was at default. Add AD CS abuse to the purple-team backlog. Re-run Gate 2 baselines. | Security leadership | PIR document, updated baselines, purple-team ticket |
krbtgt rotation is not optional if DCSync succeeded. The krbtgt secret is the master key for Kerberos in the domain; an attacker holding it can forge tickets for any principal indefinitely, and no amount of endpoint remediation touches that. Two rotations, with the vendor-recommended gap, is the minimum.
Detection Coverage Map
| Technique | Chain behavior | CQL | IOA / native | Coverage |
|---|---|---|---|---|
| T1136.002 | Machine account created under the default quota | Q1, Q9, Q10 | N1, N7 | Good |
| T1649 | CA chase egress to a non-DC host | Q2 | IOA 4, N4 | Good |
| T1087.002 | Rogue LDAP/SMB listener serving fake directory data | Q3, Q9 | IOA 4, N4 | Good |
| T1649 | Certificate request carrying cdc / rmd attributes | — | N2, N3 | GAP — no EDR telemetry exposes certificate request attributes. Only the CA request database and 4886/4887 can see this, and only if CA auditing is enabled. |
| T1649 | Certificate issued for a DC account to a non-DC requester | — | N3 | GAP — same reason. This is the single most conclusive artifact and it lives entirely outside EDR. |
| T1558 | PKINIT TGT request with the forged certificate | Q7, Q8 | N5 | Partial — Q7 is inference from logon patterns; 4768 with certificate fields is the authoritative view. |
| T1003.006 | DCSync to extract krbtgt | Q5 | IOA 2, N6 | Partial — tooling-name detection is strong, but a custom DRSUAPI client with no recognisable command line would be missed by Q5 and caught only by N6. |
| T1562.001 | Chase flag re-enabled / CertSvc restarted | Q6 | IOA 3, N8 | Good |
| T1550.003 | Reuse of the .ccache ticket | Q8 | IOA 5 | Partial — command-line only; ticket reuse by an in-memory tool leaves no such artifact. |
Named coverage gaps
- Certificate request attributes are invisible to EDR. Two of the eight chain steps can only be seen in the CA's own logs. If Certification Services auditing is off, those steps are entirely undetected. Playbook 3 is therefore a detection prerequisite, not hardening.
- No atomic infrastructure exists. There is nothing to block. A tenant that responds to this pack by importing the CSV and stopping has done essentially nothing.
- Identity Protection dependency. Q1, Q9 and Q10 need the Falcon Identity Protection AD event stream. Without that licence, fall back to native hunt N1 on 4741.
NetworkListenIP4coverage. Listen telemetry is not always enabled in workstation sensor policies. Verify before relying on Q3.
Validation gates (see section 11 for the full detail): telemetry readiness on the four sources above, a 365-day benign baseline from Q10 and a DC-address baseline from Q2, lab-only positive tests for Q1/Q3/Q6, and a promotion rule that puts Q2/Q4/Q5 on alerting while Q7 and Q10 stay as analyst-run hunts. Q1 must not be promoted before its exclusion list is built.
Hunt Summary Ticket
TITLE: Certighost (CVE-2026-54121) - AD CS chase abuse leading to DC impersonation and DCSync
SEVERITY: High - CVSS 8.8, public PoC since 2026-07-24, patched 2026-07-14, no confirmed ITW exploitation
SCOPE: All Enterprise Certification Authorities, all Domain Controllers, all domain-joined
endpoints capable of creating machine accounts (i.e. every one of them, at the default quota)
HYPOTHESIS: A low-privileged domain account created a machine account, stood up rogue SMB/LSA and LDAP
services, submitted a certificate request with attacker-controlled cdc and rmd attributes,
received a certificate authenticating as a Domain Controller, used PKINIT to obtain Kerberos
credentials for that DC, and ran DCSync to extract the krbtgt secret.
QUERIES: Q1 machine account created by a non-provisioning user
Q2 CA chases SMB/LDAP out to a non-DC host [highest fidelity]
Q3 rogue LDAP/SMB listener on a non-DC host
Q4 certighost.py / python PoC execution
Q5 DCSync / Impacket replication tooling
Q6 EditFlags or CertSvc tampering
Q7 machine-account network logon from the wrong host
Q8 .pfx / .ccache / KRB5CCNAME artifacts
Q9 correlation - account creation AND listener on one aid
Q10 baseline of machine-account creators
N1-N8 native audit-log hunts (4741, 4886/4887, CA request db, 5154/5156, 4768, 4662, 5136)
DO FIRST: 1. Confirm the July 2026 update is on every Enterprise CA. Patch any that are not.
2. Set ms-DS-MachineAccountQuota to 0 and delegate joins explicitly.
3. Enable Certification Services auditing on every CA (playbook 3) - without it,
the two most conclusive detection points do not exist.
4. Run Q2 with the CA-host filter applied and baseline the DC addresses it returns.
FINDINGS: [ ] Unpatched CAs: ____
[ ] Machine-account quota value: ____
[ ] CA auditing enabled (Y/N): ____
[ ] Q2 hits after tuning: ____
[ ] Suspicious cdc/rmd requests: ____
[ ] DCSync evidence (4662): ____
GAPS: Certificate request attributes and issued-certificate subjects are invisible to EDR -
CA request logs are the only source. No atomic C2 indicators exist for this threat.
Q1/Q9/Q10 require Falcon Identity Protection; fall back to N1 without it.
ACTIONS: Patch CAs - zero the machine-account quota - enable CA auditing - restrict CA egress to
DCs only - deploy the section 9 IOAs - rotate krbtgt twice if DCSync is confirmed.
OWNER: SOC detection engineering (queries) / PKI platform owner (CA patching and auditing) /
AD owner (quota, delegation, krbtgt rotation)
VERSION: v0.1 - 2026-07-30
Changelog
References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| Vendor | Microsoft MSRC — CVE-2026-54121 Security Update Guide | Severity, CVSS vector, CWE, patch date, exploitability assessment | 2026-07-30 |
| Vendor | Microsoft Threat Intelligence (@MsftSecIntel) | Exploitation status, CA auditing guidance, events 4886/4887 | 2026-07-30 |
| Tier 1 press | BleepingComputer — New Certighost PoC exploit lets attackers hijack Windows domains | Chase mechanics, cdc/rmd, rogue services, PKINIT, DCSync, mitigation commands, certighost.py | 2026-07-30 |
| Tier 1 press | Help Net Security — PoC exploit released for critical AD CS domain-takeover flaw | Independent confirmation of the chain, quota role, ITW status | 2026-07-30 |
| Vendor detection | SOC Prime — Certighost active-threat page | Listener ports 389/445, .pfx and .ccache artifacts, EventID 5154/5156 | 2026-07-30 |
| Vendor | Dataminr — Certighost intel brief | Timeline, patch internals, 4662 hunting tip, quota guidance | 2026-07-30 |
| Press | SecurityOnline.info — Certighost PoC now public | PoC filename corroboration, quota-to-zero and CA-egress recommendations | 2026-07-30 |
| Press | The CyberSec Guru — CertiGhost: AD CS flaw enables domain takeover | Patch validation routine, affected platform list | 2026-07-30 |
| Press | IT-Connect — A standard AD account is enough to impersonate a Domain Controller | Attack prerequisites, affected systems | 2026-07-30 |
| Original research | H0j3n / Aniq Fakhrul — Certighost technical writeup (public gist, linked from the sources above) | Servicing-gate behaviour, SERVER_TRUST_ACCOUNT validation, mitigation commands, disclosure timeline. Defensive facts only. | 2026-07-30 |
| Dropped | DarkReading — Certighost coverage | Returned HTTP 403 to an unauthenticated fetch; no snapshot could be saved, so it is cited for nothing in this pack | 2026-07-30 |
Every cited source above was captured as plain text into Certighost-CVE-2026-54121-ADCS-Hunt-sources/ alongside this file. The three atomic indicators in section 10's CSV each appear verbatim in at least one of those snapshots.