Certighost — CVE-2026-54121 · AD CS Domain-Controller Impersonation

A low-privileged domain user steers the AD CS enrollment "chase" at an attacker-controlled host, is issued a certificate for a Domain Controller, and DCSyncs the krbtgt secret. Behavioral hunt pack — public PoC, no published C2 infrastructure.
Threat
Certighost (CVE-2026-54121)
Severity
PUBLIC POC
Type
Identity / AD CS privilege escalation
Access
Authenticated domain user, network access
Version
v0.1 · 2026-07-30
Author
HuntPack
Confidence
High (vendor + reporter corroborated)
01

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.

02

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.

#SourceTierWhat it contributedDecision
01Microsoft MSRC Security Update Guide (CVE-2026-54121 record)VendorCVSS 8.8, vector, CWE-285, release date 14 Jul 2026, "less likely" exploitability at publicationPrimary authority for severity and patch date
02BleepingComputer — "New Certighost PoC exploit lets attackers hijack Windows domains"Tier 1 pressFull chase mechanics, cdc/rmd, rogue SMB/LSA/LDAP, PKINIT, .ccache, Impacket secretsdump DCSync, the mitigation commands, certighost.pyRichest technical narrative; anchor source
03Help Net Security — PoC exploit released for AD CS domain-takeover flawTier 1 pressIndependent confirmation of the chase, quota role, krbtgt outcome; "no known reports of exploitation in the wild"Corroboration
04Microsoft Threat Intelligence (@MsftSecIntel)VendorResearcher testing observed, no confirmed actor exploitation; CA audit + Security events 4886/4887 guidanceSource for the native audit-log hunts
05SOC Prime — Certighost active-threat pageVendor detectionRogue listener ports 389 and 445, .pfx/.ccache artifacts, EventID 5154/5156Used for port indicators. Fidelity caveat: the fetch returned a condensed extract, not the full body — noted in the snapshot.
06Dataminr intel briefVendorTimeline, CRequestInstance::_ValidateChaseTargetIsDC, Event ID 4662 hunting tip, quota-lowering adviceUsed for hardening + native hunts
07SecurityOnline.infoPressPoC published to GitHub as certighost.py; quota-to-zero recommendation; audit CA request logs for cdc/rmdCorroboration for the filename indicator
08The CyberSec GuruPressPatch internals (certpdef.dll validation routine), affected platform list, mitigation caveatBackground only
09IT-ConnectPressPrerequisites: enterprise CA, default machine template, SMB/LDAP reachabilityUsed for the affected-surface table
10Reporter technical writeup (H0j3n / Aniq Fakhrul gist)Original researchServicing-gate behaviour, SERVER_TRUST_ACCOUNT check, exact mitigation commands, disclosure timelineDefensive 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.

03

Hunt Brief & Attack Chain

Hunt hypotheses

  1. H1 — Quota abuse: a non-provisioning user account created one or more machine accounts in the last 90 days.
  2. H2 — Chase egress: an Enterprise CA host opened SMB or LDAP to a host outside the Domain Controller set.
  3. H3 — Rogue listener: a workstation or member server is listening on 389/636 (LDAP) or serving SMB from a non-system process.
  4. H4 — Tooling: Python, certighost.py, Certipy, Rubeus or Impacket secretsdump ran on a non-admin endpoint.
  5. H5 — Credential material: .pfx or .ccache artifacts or KRB5CCNAME appear in command lines outside the PKI team's hosts.
  6. H6 — Replication abuse: a machine account authenticated from a host that is not that machine, followed by directory replication activity.
  7. H7 — Mitigation tampering: certutil -setreg policy\EditFlags or a CertSvc restart occurred outside a change window (either the mitigation being applied, or an attacker re-enabling the chase).

Attack chain

StepAttacker actionArtifact you can seeHunt
1Authenticate as any domain userOrdinary logon; no anomaly by itself
2Create a machine account under the default ms-DS-MachineAccountQuota (10)New computer object; creator is a non-provisioning user; Security 4741 on the DCQ1, Q10, N1
3Stand up rogue SMB/LSA and LDAP services on a controlled hostListener on 389/636/445 from a non-system process on a non-DCQ3, N4
4Submit a certificate request carrying attacker-chosen cdc and rmd attributesCA request log entry with unusual request attributes; Security 4886/4887 on the CAN2, N3
5CA performs the chase: SMB + LDAP out to the attacker hostOutbound 445/389 from the CA to a non-DCQ2, Q9
6CA issues a certificate carrying the target DC's identityCertificate issued for a DC account to a requester that is not that DCN3
7PKINIT with the certificate; TGT saved to .ccache; NT hash recoveredPython/PoC execution; .pfx/.ccache/KRB5CCNAME in command lines; 4768 with certificate infoQ4, Q8, N5
8DCSync (DsGetNCChanges) as the DC account to extract krbtgtReplication request from a non-DC principal; Security 4662 with the replication GUIDsQ5, 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.

04

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.

TypeValueConfidenceActionContext
Filenamecertighost.pyHighhuntPublic PoC script name, cited by BleepingComputer, SOC Prime and SecurityOnline. Trivially renameable — treat as a hunt string, never as a block.
Port389MediumhuntLDAP. Rogue chase listener port, and the CA's outbound chase port. Only meaningful in combination with a non-DC peer.
Port445MediumhuntSMB/LSA. Same reasoning as 389.
Request attributecdcHighhuntNot an atomic IOC — a certificate request attribute. Present in CA request logs when the chase is invoked.
Request attributermdHighhuntAs above; names the principal the CA resolves on the attacker's host.
Registry / policyEDITF_ENABLECHASECLIENTDCHighenrichThe EditFlags bit that enables the vulnerable fallback. Its state is a configuration fact, not a compromise indicator.
Artifact ext..pfx / .ccacheMediumhuntPoC output: the issued certificate and the resulting Kerberos ticket cache.
SHA256REPLACE_WITH_POC_SCRIPT_SHA256N/ANo 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 / hostnameREPLACE_WITH_ROGUE_CHASE_HOSTN/APopulate from the cdc value in any CA request log entry you find suspicious.
05

Affected Surface & Telemetry Matrix

SurfaceExposureTelemetryPriorityGap 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)CriticalCA request-attribute logging is off by default — 4887 will not show cdc/rmd unless CA auditing is enabled
Domain ControllersImpersonation target; DCSync victimFalcon UserLogon; Windows Security 4741, 4662, 4768Critical4662 is high-volume; needs a property-GUID filter to be usable
Standard workstations / member serversAttacker launch point: machine-account creation and rogue LDAP/SMB listenersFalcon NetworkListenIP4, ProcessRollup2HighNetworkListenIP4 coverage varies by sensor policy; confirm it is enabled before trusting Q3
Certificate templatesDefault machine/computer template is sufficient for the attackAD object auditing on the PKI containerHighTemplate ACL changes are rarely audited
Domain policy — ms-DS-MachineAccountQuotaDefault of 10 is the enabling primitiveDomain object read; 5136 on the domain NCHighOften 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 attributionActiveDirectoryAccountCreated and siblingsMediumRequires an Identity Protection licence; field naming is tenant/schema dependent
06

ATT&CK Mapping

TacticTechniqueBehavior in this chainQuery / control
PersistenceT1136.002 — Create Account: Domain AccountMachine account created under the default quotaQ1, Q10 / quota = 0
Credential AccessT1649 — Steal or Forge Authentication CertificatesCA issues a certificate carrying DC identity via the chaseQ2, Q9 / July 2026 update
Privilege EscalationT1068 — Exploitation for Privilege EscalationImproper authorization in the AD CS chase pathPatch; EditFlags mitigation
Credential AccessT1558 — Steal or Forge Kerberos TicketsPKINIT with the forged certificate; TGT written to a ticket cacheQ4, Q7, Q8
Credential AccessT1003.006 — OS Credential Dumping: DCSyncDsGetNCChanges as the impersonated DC to extract krbtgtQ5, N6
Collection / DiscoveryT1087.002 — Account Discovery: Domain AccountLDAP enumeration to pick a DC account to targetQ3 (listener side), N4
Defense EvasionT1562.001 — Impair Defenses: Disable or Modify ToolsRe-enabling the chase flag or restarting CertSvc to undo the mitigationQ6
Lateral MovementT1550.003 — Use Alternate Authentication Material: Pass the TicketReuse of the .ccache TGT against the DCQ7, Q8
07

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.

IDWhereWhat to look forWhy it matters
N1DC Security log4741 (computer account created) where the Subject is not a provisioning service account or a Tier-0 adminStep 2 of the chain. In most domains, legitimate 4741 events come from a handful of known identities.
N2CA Security log4886 (certificate services received a request) and 4887 (request approved and certificate issued) — correlate a burst on a single requesterMicrosoft's own guidance for this CVE. Requires Certification Services auditing to be enabled first (see playbook 3).
N3CA request databaseRequest 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 ownThe most specific artifact that exists. A certificate for DC01$ requested by WKSTN42$ is unambiguous.
N4Windows Filtering Platform5154 (listen permitted) / 5156 (connection permitted) on ports 389, 636 or 445 from a non-server, non-DC hostCatches the rogue listener even where EDR listen telemetry is thin.
N5DC Security log4768 TGT requests where certificate information is populated, for a machine account, from a client address that is not that machineThe PKINIT step. Certificate issuer/serial fields on 4768 let you tie the TGT back to the fraudulent certificate.
N6DC Security log4662 where the Object Type is domainDNS and the accessed properties include the directory-replication control-access rights, and the Subject is not a Domain ControllerDCSync. Filter to the replication property GUIDs or this event will drown you.
N7Domain naming context5136 on the domain object where the modified attribute is ms-DS-MachineAccountQuotaDetects someone quietly restoring the quota after you set it to 0.
N8CA hostRegistry value EditFlags under the CA policy key — confirm the EDITF_ENABLECHASECLIENTDC bit state on every CAConfiguration audit, not detection. Run it fleet-wide and record the result.
08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.

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.

Q1 · Machine account created by a non-provisioning user (quota abuse)
CONF MEDFP MEDCOST LOW

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)
Q2 · CA server chases SMB/LDAP out to a non-Domain-Controller host
CONF HIGHFP MEDCOST MED

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)
Q3 · Rogue LDAP / SMB listener on a host that should not have one
CONF HIGHFP MEDCOST LOW

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)
Q4 · Certighost PoC / Python exploit execution
CONF HIGHFP LOWCOST LOW

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)
Q5 · DCSync / Impacket credential-replication tooling
CONF HIGHFP LOWCOST LOW

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)
Q6 · EditFlags / CertSvc tampering (mitigation applied or reversed)
CONF MEDFP MEDCOST LOW

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)
Q7 · Machine-account network logon from a host that is not that machine
CONF MEDFP HIGHCOST MED

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)
Q8 · Certificate and Kerberos credential-material artifacts
CONF MEDFP MEDCOST LOW

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)
Q9 · Correlation — same host creates a machine account and opens a directory-service port
CONF HIGHFP LOWCOST MED

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)
Q10 · Rare-entity baseline — first-time machine-account creators
CONF MEDFP MEDCOST LOW

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)
09

Custom IOA Recommendations

IOA nameRule typePatternExclusionsAction
Certighost — PoC script executionProcess CreationImage filename matches certighost; or command line contains certighostSanctioned red-team hostsDetect + Block (high severity)
Certighost — DCSync toolingProcess CreationCommand line contains secretsdump, ntlmrelayx, addcomputer, or a just-dc replication flagApproved pentest window, by hostBlock (critical)
Certighost — chase flag tamperingProcess CreationImage filename certutil.exe with command line containing EDITF_ENABLECHASECLIENTDCPKI change window (monitor, do not exclude)Detect (medium)
Certighost — rogue directory listenerNetwork ListenLocal port 389 or 636 on a host not in the Domain Controller group, initiated by a non-system processAD LDS hosts, LDAP appliancesDetect (high)
Certighost — ticket cache handlingProcess CreationCommand line contains KRB5CCNAME or a .ccache pathLinux-interop admin tooling, if anyDetect (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.

10

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.

Falcon IOC Management CSVbulk import
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
Behavioral Signaturesthe real detection surface
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
Named Tooling & Artifactshunt strings
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
Patch & Configuration Auditrun this today
# 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
11

Detection Validation Gates

Gate 1 — Telemetry ready

  • NetworkConnectIP4 is flowing from every Enterprise CA host (check: any result at all for the CA hostnames in the last 24h).
  • NetworkListenIP4 is 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\EditFlags and confirm Q6's pattern does not match a read (only -setreg should).

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.

12

Hardening — Tiered

Immediate (0–48h)
  • 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-MachineAccountQuota to 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.
Near term (2–4 weeks)
  • 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-MachineAccountQuota for 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.
Strategic (1–2 quarters)
  • 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.
13

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
14

Containment Runbook

PhaseActionsOwnerEvidence 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 L2CA 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 ownerContainment 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 leadQuery 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 leadRotation 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 engineeringPatch 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 leadershipPIR 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.

15

Detection Coverage Map

TechniqueChain behaviorCQLIOA / nativeCoverage
T1136.002Machine account created under the default quotaQ1, Q9, Q10N1, N7Good
T1649CA chase egress to a non-DC hostQ2IOA 4, N4Good
T1087.002Rogue LDAP/SMB listener serving fake directory dataQ3, Q9IOA 4, N4Good
T1649Certificate request carrying cdc / rmd attributesN2, N3GAP — 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.
T1649Certificate issued for a DC account to a non-DC requesterN3GAP — same reason. This is the single most conclusive artifact and it lives entirely outside EDR.
T1558PKINIT TGT request with the forged certificateQ7, Q8N5Partial — Q7 is inference from logon patterns; 4768 with certificate fields is the authoritative view.
T1003.006DCSync to extract krbtgtQ5IOA 2, N6Partial — 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.001Chase flag re-enabled / CertSvc restartedQ6IOA 3, N8Good
T1550.003Reuse of the .ccache ticketQ8IOA 5Partial — 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.
  • NetworkListenIP4 coverage. 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.

16

Hunt Summary Ticket

Copy into your case management system
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
17

Changelog

v0.12026-07-30Initial pack. Ten sources researched and snapshotted. Ten CQL hunt queries, eight native audit-log hunts, five custom IOA recommendations, five deployable playbooks, tiered hardening and a six-phase containment runbook. Built deliberately as a behavioral pack: three atomic indicators ship (one PoC filename, two ports), each traceable to a saved source snapshot, and every other atomic slot is a labelled placeholder because no vendor has published C2 infrastructure for this threat.
18

References

TierSourceUsed forAccessed
VendorMicrosoft MSRC — CVE-2026-54121 Security Update GuideSeverity, CVSS vector, CWE, patch date, exploitability assessment2026-07-30
VendorMicrosoft Threat Intelligence (@MsftSecIntel)Exploitation status, CA auditing guidance, events 4886/48872026-07-30
Tier 1 pressBleepingComputer — New Certighost PoC exploit lets attackers hijack Windows domainsChase mechanics, cdc/rmd, rogue services, PKINIT, DCSync, mitigation commands, certighost.py2026-07-30
Tier 1 pressHelp Net Security — PoC exploit released for critical AD CS domain-takeover flawIndependent confirmation of the chain, quota role, ITW status2026-07-30
Vendor detectionSOC Prime — Certighost active-threat pageListener ports 389/445, .pfx and .ccache artifacts, EventID 5154/51562026-07-30
VendorDataminr — Certighost intel briefTimeline, patch internals, 4662 hunting tip, quota guidance2026-07-30
PressSecurityOnline.info — Certighost PoC now publicPoC filename corroboration, quota-to-zero and CA-egress recommendations2026-07-30
PressThe CyberSec Guru — CertiGhost: AD CS flaw enables domain takeoverPatch validation routine, affected platform list2026-07-30
PressIT-Connect — A standard AD account is enough to impersonate a Domain ControllerAttack prerequisites, affected systems2026-07-30
Original researchH0j3n / 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
DroppedDarkReading — Certighost coverageReturned HTTP 403 to an unauthenticated fetch; no snapshot could be saved, so it is cited for nothing in this pack2026-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.