CVE-2026-41089 — Windows Netlogon RCE (Domain Controller Takeover)
Executive Summary
CVE-2026-41089 is a critical (CVSS 9.8) stack-based buffer overflow in the Windows Netlogon RPC service (netlogon.dll, function BuildSamLogonResponse). Because every Domain Controller runs Netlogon to service authentication, any reachable DC is structurally exposed. Exploitation is 0-click, unauthenticated, low-complexity: a single malformed Netlogon RPC request yields arbitrary code execution as SYSTEM on the DC — functionally immediate Domain Admin and a fast path to forest-wide takeover.
Microsoft patched the flaw on 2026-05-12 (rating it "less likely" to be exploited) and credited its WARP team. Belgium's Centre for Cybersecurity (CCB) confirmed in-the-wild exploitation roughly two weeks later. Public root-cause analyses and PoCs have since circulated, compressing time-to-exploit. No named intrusion set is publicly attributed yet; activity is described as opportunistic.
The exploit primitive is memory corruption inside the Netlogon service, hosted in lsass.exe on Windows Server. There is no malware artifact at the moment of code execution, so the highest-fidelity defensive angle is behavioral: a DC's lsass.exe/Netlogon spawning any child process, lsass making unexpected outbound connections, or post-exploitation discovery/credential-dumping launched as SYSTEM on a DC.
lsass.exe-spawns-child IOA (Q1) as a high-severity detection today.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Fwd |
|---|---|---|---|
| Primary | Microsoft MSRC | Stack overflow in Netlogon; SYSTEM RCE; affected Server 2012–2025; patched 2026-05-12; reported by WARP | Yes |
| Primary | CVE.org / NVD | CWE-121 stack-based buffer overflow; CVSS 9.8; network vector, no privileges, no UI | Yes |
| Primary | CCB Belgium advisory | Confirmed active in-the-wild exploitation ~2 weeks post-patch; urged immediate patching | Yes |
| Secondary | Deepwatch ATI (CA-26-019) | Detection strategy: lsass/netlogon child processes, malformed RPC on 135/dynamic, crashes (7034/1000); ATT&CK T1210/T1203/T1068 | Yes |
| Secondary | Help Net Security | Component netlogon.dll; BuildSamLogonResponse root cause; 0patch micropatches for legacy; restrict Netlogon at network layer | Yes |
| Tertiary | BleepingComputer / SecurityWeek / Orca | Corroborate CVSS, port ranges, DC blast-radius framing | Partial |
Confidence: HIGH — multiple independent primary sources (MSRC + national CERT + vendor labs) corroborate. No atomic IOCs (hashes / attacker IPs / C2 domains) published as of 2026-06-09 — detection is necessarily behavioral. Offensive PoC/root-cause pages were deliberately not ingested for tradecraft (defensive scope).
Hunt Brief & Attack Chain
Working hypothesis: If an adversary exploited CVE-2026-41089 against a DC in our environment, the DC's lsass.exe (host of the Netlogon service) will exhibit behavior it never normally shows — spawning child processes, making non-AD outbound connections, or being the context for SYSTEM-level discovery and credential-dumping — preceded by anomalous inbound RPC and possibly Netlogon service instability.
Attack Chain
| # | Step | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 | Reach a DC's RPC endpoint (135 + dynamic 49152–65535) | NetworkReceiveAcceptIP4 | Inbound RPC to DCs from rare/non-Tier-0 sources (Q3) |
| 2 | Send malformed Netlogon RPC → memory corruption | Windows System/App event log | Netlogon/lsass crash 7034/7031/1000 — failed-attempt tripwire (Q4 + native) |
| 3 | Code execution as SYSTEM inside lsass/Netlogon | ProcessRollup2 | lsass.exe spawns any child process (Q1) — highest fidelity |
| 4 | Establish C2 / pull tooling | NetworkConnectIP4, PeFileWritten | lsass outbound to non-AD ports (Q8); PE written to DC (Q7) |
| 5 | Discovery: domain / trust / account enumeration | ProcessRollup2 | nltest/dsquery/net on DC as SYSTEM (Q5) |
| 6 | Credential theft: NTDS.dit / LSASS dump | ProcessRollup2 | ntdsutil / comsvcs / vssadmin patterns (Q6) |
| 7 | Impact: ransomware / persistence / account creation | Process, AD audit | Follow-on hunts (4742, 4720, DC shells — Q2) |
Hunt Hypotheses (Priority Order)
| # | Hypothesis | MITRE | Conf. | FP Risk |
|---|---|---|---|---|
| H1 | A DC's lsass.exe/Netlogon spawns a child process — definitive post-exploitation signal | T1210, T1068 | HIGH | LOW |
| H2 | lsass.exe makes outbound connection to non-AD port (C2) | T1071, T1105 | HIGH | LOW |
| H3 | NTDS.dit / LSASS credential-dumping patterns on a DC | T1003.003, T1003.001 | HIGH | LOW |
| H4 | Interactive shell / LOLBin executes on a DC | T1059, T1068 | HIGH | LOW-MED |
| H5 | SYSTEM-context AD discovery (nltest/dsquery/net) on a DC | T1482, T1087 | MED | MED |
| H6 | Netlogon service crash / unexpected restart on a DC | T1210 (tripwire) | MED | MED |
| H7 | Rare-source inbound RPC burst to a DC | T1210 | MED | HIGH |
| H8 | PE / executable written to a DC by lsass/shell context | T1105 | MED | LOW-MED |
Consolidated IOC Table
| Type | Value | Conf. | Action | Context |
|---|---|---|---|---|
| Behavior | ParentBaseFileName=lsass.exe → child | HIGH | Detect | Post-exploitation execution on DC (T1210/T1068) |
| Behavior | lsass.exe outbound to non-AD port | HIGH | Detect | C2 / tooling pull from compromised Netlogon |
| Network | Inbound RPC 135 + 49152–65535 to DC from non-Tier-0 src | MED | Hunt | Exploit delivery vector |
| Event ID | 7034 / 7031 / 1000 (Netlogon / lsass) | MED | Hunt | Failed-exploit tripwire |
| Event ID | 5805 (machine-acct auth fail), 4742 (computer acct changed) | LOW | Enrich | Anomalous machine-account / trust activity around DC |
| Component | netlogon.dll (BuildSamLogonResponse) | HIGH | Enrich | Vulnerable code path — confirm patched file version |
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk if Missing |
|---|---|---|---|
| Domain Controllers (Server 2012 – 2025) | Falcon sensor (ProcessRollup2, NetworkConnect/ReceiveAcceptIP4) | CRITICAL | Any unmonitored DC is a blind spot — confirm 100% DC coverage |
| Legacy DCs (2008 R2 / 2012 / 2012 R2, EoL) | EDR + 0patch micropatch status; network isolation | CRITICAL | No vendor patch path; highest residual risk |
| Netlogon service health | Windows System/Application event log → NG-SIEM | HIGH | Service-crash tripwire blind without log ingestion |
| RPC network path | Firewall / NDR logs for 135 + dynamic RPC range | HIGH | East-west RPC often unlogged; needs segmentation telemetry |
| AD authentication / objects | Advanced AD auditing (5805, 4742, 4624, 4662) or Falcon Identity Protection | MEDIUM | Advanced audit policy frequently not enabled by default |
ATT&CK Mapping
| Tactic | Technique ID | Technique Name | Observed Behavior |
|---|---|---|---|
| Lateral Movement | T1210 | Exploitation of Remote Services | Weaponized Netlogon RPC from internal asset to DC |
| Privilege Escalation | T1068 | Exploitation for Privilege Escalation | Netlogon hosted in SYSTEM context → instant SYSTEM on DC |
| Execution | T1203 | Exploitation for Client Execution | Memory corruption in netlogon.dll → arbitrary code |
| Command & Control | T1071 / T1105 | Application Layer / Ingress Tool Transfer | lsass-context outbound connection / payload write |
| Discovery | T1482 / T1087 | Domain Trust / Account Discovery | nltest/dsquery/net enumeration on DC as SYSTEM |
| Credential Access | T1003.003 / T1003.001 | OS Credential Dumping (NTDS / LSASS) | ntdsutil, comsvcs MiniDump, vssadmin shadow copy |
| Persistence | T1136 / T1098 | Create Account / Account Manipulation | New/modified privileged or computer accounts post-compromise |
| Impact | T1486 | Data Encrypted for Impact | Enterprise ransomware staged from DC (follow-on, out of pack scope) |
Native Audit-Log Hunts (Non-CQL)
Run these against Windows event logs directly (Event Viewer, native SIEM, or NG-SIEM Windows log source). They complement the EDR-based CQL hunts and catch attempts the sensor may not see as a process event.
| Hunt | Source / Event ID | Logic | Response |
|---|---|---|---|
| Netlogon / lsass crash tripwire | System 7034, 7031, 7036; Application 1000 (faulting module netlogon.dll/lsass.exe) | Any unexplained Netlogon stop/restart or lsass crash on a DC, esp. clustered with inbound RPC | Treat as probable failed exploit attempt → confirm patch level, capture source IP |
| Machine-account auth anomalies | Security 5805 | Spikes in 5805 on a DC immediately after suspicious network activity | Correlate source host; verify secure-channel integrity |
| Computer-account tampering | Security 4742 | Unexpected changes to DC or sensitive computer objects (SPNs, delegation, password) | Validate change ticket; investigate initiating account |
| Machine-account logons from odd sources | Security 4624, LogonType 3, account ending $ | Machine-account network logons to a DC from unusual source IPs/subnets | Pivot on source asset; check Tier-0 boundary |
| DC process creation under SYSTEM | Security 4688 (requires cmdline auditing) | Interactive shells / LOLBins created on a DC by lsass/services as SYSTEM | Escalate — DCs should not spawn ad-hoc shells |
PowerShell quick checks (run on a DC)
# Netlogon/lsass crash or restart in the last 7 days (failed-exploit tripwire) Get-WinEvent -FilterHashtable @{LogName='System'; Id=7034,7031,7036; StartTime=(Get-Date).AddDays(-7)} | Where-Object { $_.Message -match 'Netlogon' } | Format-Table TimeCreated, Id, Message -Auto # lsass application crashes (Event 1000) referencing netlogon.dll Get-WinEvent -FilterHashtable @{LogName='Application'; Id=1000; StartTime=(Get-Date).AddDays(-7)} | Where-Object { $_.Message -match 'lsass.exe|netlogon.dll' } | Format-Table TimeCreated, Message -Auto # Machine-account auth failures (5805) and computer-account changes (4742) Get-WinEvent -FilterHashtable @{LogName='Security'; Id=5805,4742; StartTime=(Get-Date).AddDays(-7)} | Format-Table TimeCreated, Id -Auto
CrowdStrike LogScale CQL Hunt Queries
Looks for: any process whose parent is lsass.exe on a DC, minus benign Windows error/EFS handlers. Accomplishes: catches the exact moment of SYSTEM code execution inside the Netlogon service — the single highest-fidelity signal for this CVE. Healthy DCs almost never show lsass as a parent.
WerFault/wermgr/efsui (Windows Error Reporting / EFS) — excluded inline. Investigate everything else.// HUNT: Netlogon/lsass child process on Domain Controller // MITRE: T1210, T1068, T1203 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 parent/child telemetry on DCs // TUNING: extend exclusions only after a 7-day DC baseline #event_simpleName=/^(Synthetic)?ProcessRollup2$/ | $falcon/helper:enrich(field=ProductType) | ProductType=/Domain Controller/ | ParentBaseFileName=/^lsass\.exe$/i | FileName!=/^(WerFault|wermgr|efsui)\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, ImageFileName, SHA256HashData], sortby=@timestamp, order=desc, limit=200)
Looks for: command interpreters and common LOLBins running on a DC. Accomplishes: a DC is an appliance — ad-hoc shells are abnormal and frequently the first hands-on-keyboard step after SYSTEM is obtained.
powershell.exe/cmd.exe. Exclude known admin parent chains and maintenance service accounts.// HUNT: Suspicious interpreter/LOLBin on Domain Controller // MITRE: T1059, T1068 | CONF: high FP: low-medium COST: low // TUNING: exclude trusted admin parent chains and maintenance accounts #event_simpleName=/^(Synthetic)?ProcessRollup2$/ | $falcon/helper:enrich(field=ProductType) | ProductType=/Domain Controller/ | FileName=/^(cmd|powershell|pwsh|wscript|cscript|mshta|rundll32|regsvr32|bitsadmin|certutil|at|schtasks)\.exe$/i | ParentBaseFileName=/^(lsass|services|svchost|wmiprvse|spoolsv)\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData], sortby=@timestamp, order=desc, limit=200)
Looks for: inbound connections to the DC RPC endpoint mapper (TCP 135) ranked by source to surface rare/new talkers. Accomplishes: highlights the delivery vector. Best run as a baselining hunt — exclude known DC/admin subnets and review outliers.
// HUNT: Rare-source inbound RPC to Domain Controllers // MITRE: T1210 | CONF: medium FP: high COST: medium // TUNING: maintain a trusted-subnet allowlist; alert on rare sources only #event_simpleName=NetworkReceiveAcceptIP4 | $falcon/helper:enrich(field=ProductType) | ProductType=/Domain Controller/ | LocalPort=135 // exclude trusted management/DC subnets (edit to your environment): | RemoteAddressIP4!=/^10\.0\.0\./ | groupBy([ComputerName, RemoteAddressIP4], function=[count(as=conn_count), min(@timestamp, as=first_seen), max(@timestamp, as=last_seen)]) | sort(conn_count, order=asc) | table([ComputerName, RemoteAddressIP4, conn_count, first_seen, last_seen], limit=200)
Looks for: SCM events showing Netlogon stopping/crashing or lsass faulting. Accomplishes: failed exploitation typically crashes Netlogon while a successful run usually does not — making crashes a valuable early-warning of probing.
EventID/provider field names to match your schema, then validate.// HUNT: Netlogon/lsass service crash or unexpected restart on DC // MITRE: T1210, T1203 (tripwire) | CONF: medium FP: medium COST: low // REQUIRES: Windows System + Application event log source in NG-SIEM // TUNING: suppress during change windows; correlate with Q3 inbound RPC bursts #repo=windows_logs | Channel=/^(System|Application)$/ | (EventID=7034 OR EventID=7031 OR EventID=7036 OR (EventID=1000 AND param2=/netlogon\.dll|lsass\.exe/i)) | (Message=/Netlogon/i OR param1=/Netlogon/i) | table([@timestamp, ComputerName, EventID, Channel, Message], sortby=@timestamp, order=desc, limit=200)
Looks for: nltest, dsquery, net group/user, trust-enumeration command lines on a DC. Accomplishes: typical hands-on-keyboard recon following DC compromise.
nltest /dclist and net commands. Exclude known automation accounts and parents.// HUNT: SYSTEM-context AD discovery on Domain Controller // MITRE: T1482, T1087, T1018 | CONF: medium FP: medium COST: low // TUNING: exclude known automation service accounts and scheduled tasks #event_simpleName=/^(Synthetic)?ProcessRollup2$/ | $falcon/helper:enrich(field=ProductType) | ProductType=/Domain Controller/ | (FileName=/^(nltest|dsquery|dsget|whoami)\.exe$/i OR (FileName=/^net1?\.exe$/i AND CommandLine=/\b(group|user|accounts|localgroup)\b/i) OR CommandLine=/(domain_trusts|trusted_domains|\/dclist|\/domain)/i) | UserName=/^(SYSTEM|.+\$)$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], sortby=@timestamp, order=desc, limit=200)
Looks for: command lines for extracting the AD database or dumping LSASS — ntdsutil IFM, comsvcs.dll MiniDump, vssadmin shadow copies, ntds.dit references. Accomplishes: detects the credential-theft objective that typically follows DC SYSTEM access.
ntdsutil maintenance. Scope to DCs and correlate with an approved change window.// HUNT: NTDS / LSASS credential dumping // MITRE: T1003.003, T1003.001 | CONF: high FP: low COST: low // TUNING: exclude approved backup service accounts and change-window activity #event_simpleName=/^(Synthetic)?ProcessRollup2$/ | (CommandLine=/ntds\.dit/i OR CommandLine=/ntdsutil.*(ifm|create full)/i OR CommandLine=/comsvcs\.dll.*(MiniDump|#24)/i OR CommandLine=/procdump.*lsass/i OR CommandLine=/vssadmin.*create.*shadow/i OR CommandLine=/reg.*save.*(sam|security|system)/i) | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData], sortby=@timestamp, order=desc, limit=200)
Looks for: new PE files written on a DC where the writing process is lsass, netlogon, or a shell/LOLBin. Accomplishes: catches tooling/payload staged on the DC after exploitation (ingress tool transfer).
TiWorker/TrustedInstaller/msiexec and patch windows.// HUNT: Executable dropped on DC by lsass/shell context // MITRE: T1105 | CONF: medium FP: low-medium COST: low // TUNING: exclude TiWorker, TrustedInstaller, msiexec and patch windows #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | $falcon/helper:enrich(field=ProductType) | ProductType=/Domain Controller/ | ContextBaseFileName=/^(lsass|netlogon|cmd|powershell|pwsh|rundll32|regsvr32|mshta)\.exe$/i | table([@timestamp, aid, ComputerName, ContextBaseFileName, TargetFileName, SHA256HashData], sortby=@timestamp, order=desc, limit=200)
Looks for: outbound connections whose initiating process is lsass.exe to ports outside the normal AD/replication set. Accomplishes: a compromised Netlogon (in lsass) reaching out for C2 is highly anomalous — lsass should only talk standard AD ports to other DCs.
// HUNT: lsass.exe anomalous outbound connection (Netlogon C2) // MITRE: T1071, T1105 | CONF: high FP: low-medium COST: low-medium // TUNING: allowlist your DC IPs as destinations; exclude standard AD ports #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^lsass\.exe$/i | !in(RemotePort, values=[88, 389, 636, 445, 3268, 3269, 53, 123, 135]) | RemoteAddressIP4!=/^(127\.|169\.254\.)/ | table([@timestamp, aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort, Protocol], sortby=@timestamp, order=desc, limit=200)
CrowdStrike Custom IOA Recommendations
| IOA Name | Field Patterns | Benign Exclusions | Deployment Path |
|---|---|---|---|
| DETECT — Netlogon/lsass spawns child (DC) | Parent Image \lsass.exe; ProductType=DC; child ≠ WerFault/wermgr/efsui | WER / EFS handlers | Custom IOA → Process Creation; Detect/Block, Critical (Q1) |
| DETECT — Shell on Domain Controller | Image cmd/powershell/pwsh/mshta; Parent lsass/services/svchost; ProductType=DC | Sanctioned admin/automation parents | Custom IOA → Process Creation; Detect, High (Q2) |
| DETECT — lsass abnormal egress | NetworkConnect; Image \lsass.exe; RemotePort not in AD set | DC-to-DC AD ports | Custom IOA → Network Connection; Detect, High (Q8) |
| HUNT — Credential dump patterns | CommandLine contains ntds.dit / comsvcs MiniDump / vssadmin shadow | Backup & AD-maintenance accounts | Scheduled Search / IOA, High (Q6) |
Machine-Readable IOC Appendix
Grouped IOC Quick-Copy
One-click plaintext blocks for loading into Falcon scheduled searches, host-triage scripts, firewall rules, or a patch-audit checklist. This CVE has no atomic IOCs — these are behavioral signatures, ports, event IDs, and affected builds, not blocklist entries.
ParentBaseFileName=lsass.exe -> any child process (on DC) lsass.exe outbound connection to non-AD port ProcessRollup2: shell/LOLBin on DC parented by lsass/services CommandLine: ntds.dit | ntdsutil ifm | comsvcs.dll MiniDump CommandLine: vssadmin create shadow | reg save sam/security/system PeFileWritten on DC by lsass/netlogon/shell context
TCP/135 # RPC endpoint mapper (exploit entry) TCP/49152-65535 # RPC dynamic port range # Restrict the above to Tier-0/admin subnets only. # Allowed lsass-to-DC ports (exclude from Q8): 88,389,636,445,3268,3269,53,123
7034 # SCM: service terminated unexpectedly (Netlogon) 7031 # SCM: service terminated, recovery action 7036 # SCM: service entered stopped/running state 1000 # Application Error (faulting module netlogon.dll / lsass.exe) 5805 # Netlogon machine-account authentication failure 4742 # Computer account was changed 4624 # Logon (Type 3, machine account '$') from unusual source
Windows Server 2012 # 0patch micropatch (EoL) Windows Server 2012 R2 # 0patch micropatch (EoL) Windows Server 2016 # MS patch 2026-05-12 Windows Server 2019 # MS patch 2026-05-12 Windows Server 2022 # MS patch 2026-05-12 Windows Server 2025 # MS patch 2026-05-12 Windows Server 2008 R2 # 0patch micropatch (EoL)
netlogon.dll # confirm patched file version on every DC BuildSamLogonResponse # vulnerable function (root cause) %SystemRoot%\System32\netlogon.dll FullSecureChannelProtection # registry value to verify = 1 ntds.dit # credential-theft target file
T1210 # Exploitation of Remote Services T1068 # Exploitation for Privilege Escalation T1203 # Exploitation for Client Execution T1071 # Application Layer Protocol (C2) T1105 # Ingress Tool Transfer T1482 # Domain Trust Discovery T1087 # Account Discovery T1003.003 / T1003.001 # OS Credential Dumping (NTDS / LSASS)
Full Machine-Readable JSON
{
"hunt_pack": "CVE-2026-41089-Netlogon",
"version": "0.2",
"generated": "2026-06-09",
"author": "HuntPack",
"cve": "CVE-2026-41089",
"cvss": 9.8,
"cwe": "CWE-121",
"patched": "2026-05-12",
"itw_confirmed": "2026-05-29",
"atomic_iocs_available": false,
"_note": "No file hashes, IPs, or C2 domains are published for this CVE. Detection is behavioral. Confirm patched netlogon.dll version per-OS against MSRC before treating a DC as remediated.",
"behavioral_indicators": [
{ "type": "process_lineage", "value": "ParentBaseFileName=lsass.exe -> child (on DC)", "confidence": "high", "action": "detect", "source": "Deepwatch CA-26-019" },
{ "type": "network", "value": "lsass.exe outbound to non-AD port", "confidence": "high", "action": "detect", "source": "derived" },
{ "type": "network", "value": "inbound RPC 135 + 49152-65535 to DC from rare source", "confidence": "medium", "action": "hunt", "source": "Deepwatch / HelpNetSecurity" },
{ "type": "event_id", "value": "7034/7031/1000 Netlogon-lsass crash", "confidence": "medium", "action": "hunt", "source": "Deepwatch / Automox" },
{ "type": "event_id", "value": "5805 / 4742 anomalies on DC", "confidence": "low", "action": "enrich", "source": "Automox" },
{ "type": "component", "value": "netlogon.dll (BuildSamLogonResponse)", "confidence": "high", "action": "enrich", "source": "MSRC" }
],
"affected": ["Windows Server 2012","2012 R2","2016","2019","2022","2025"],
"legacy_micropatch": ["Server 2008 R2","2012","2012 R2 (0patch)"],
"mitre": ["T1210","T1068","T1203","T1071","T1105","T1482","T1087","T1003.003","T1003.001"]
}
Detection Validation Gates
| Gate | Requirement | Evidence |
|---|---|---|
| 1 · Telemetry ready | Falcon sensor on 100% of DCs; ProductType enrichment resolving; (optional) Windows System/App logs in NG-SIEM for Q4 | DC inventory reconciled vs. sensor host list |
| 2 · Benign baseline | 7-day baseline of lsass children, DC shells, and lsass egress captured; allowlists built (Q2, Q3, Q7, Q8) | Documented exclusion sets per query |
| 3 · Positive tests | Validate Q1/Q5/Q6 with benign equivalents (authorized nltest /dclist, a sanctioned VSS snapshot) to confirm the pattern fires | Test run IDs / screenshots in ticket |
| 4 · Promotion | Q1, Q2, Q6, Q8 promoted to Custom IOA / scheduled alerts; remainder run as scheduled hunts with analyst review | IOA rule IDs; scheduled search schedule |
Hardening — Tiered
- Patch every DC in one maintenance window (MITRE M1051; source MSRC May 2026). Apply the CVE-2026-41089 update to all DCs (2012–2025) simultaneously — a half-patched forest is not defensible for a pre-auth DC bug. Verify
netlogon.dllversion post-patch (Playbook P1). - Legacy / EoL DCs: apply 0patch micropatches (Server 2008 R2 / 2012 / 2012 R2) and prioritize decommissioning. ⚠ best-practice — no formal benchmark for EoL OS.
- Block external exposure of DC RPC (M1037). Ensure TCP 135 and the dynamic RPC range (49152–65535) on DCs are never reachable from the internet or untrusted zones.
- Deploy the Q1 IOA (lsass-spawns-child on DC) as a Critical detect today — near-zero benign baseline.
- Restrict RPC to Tier-0 only (M1030 / M1037). Host firewall rules (Playbook P2) so DC RPC accepts connections only from other DCs and designated admin subnets. Pilot on one DC, watch for replication/auth breakage, then roll out.
- Constrain the RPC dynamic port range and apply
netsh rpc filterrules to limit interface reachability from non-admin zones (M1037). - Verify Netlogon secure-channel hardening —
FullSecureChannelProtection=1(post-Zerologon enforcement) with no vulnerable-channel allow-list entries (M1042). Defense-in-depth for the Netlogon attack surface. - Enable AD advanced auditing (M1047): subcategories behind Event IDs 5805, 4742, 4624 (machine-account), 4662, plus 4688 command-line auditing on DCs (Playbook P3).
- Tighten Tier-0 admin access (M1026 / M1018): only Tier-0 admins can reach DC management surfaces.
- Full AD tiering / Tier-0 isolation (M1030): dedicated management network for DCs, no inbound RPC from user/server VLANs, PAWs for DC administration.
- Adopt a DC security baseline: CIS Microsoft Windows Server 2022 Benchmark (DC profile) and/or Microsoft Security Baseline / DISA STIG for DCs, with drift tracking.
- Credential-exposure reduction: LAPS for local admin, gMSAs for services, regular krbtgt rotation so a single DC compromise is less catastrophic.
- Continuous attack-path monitoring of Tier-0 (AD attack-path / identity-protection tooling) to detect escalation routes before abuse.
Deployable Playbooks
# Reports the Netlogon.dll file version on every DC so you can confirm the patch. # Compare returned version against the MSRC-listed fixed build for each OS. $dcs = (Get-ADDomainController -Filter *).HostName foreach ($dc in $dcs) { try { $v = Invoke-Command -ComputerName $dc -ScriptBlock { (Get-Item "$env:SystemRoot\System32\netlogon.dll").VersionInfo.FileVersion } -ErrorAction Stop [pscustomobject]@{ DC = $dc; NetlogonDllVersion = $v } } catch { [pscustomobject]@{ DC = $dc; NetlogonDllVersion = "UNREACHABLE: $($_.Exception.Message)" } } }
# Scope the RPC endpoint mapper (TCP 135) to trusted management/DC subnets. # DO NOT pair this with a second explicit Block rule on the same port. The Windows # Filtering Platform does NOT evaluate host rules in creation order -- an explicit # Block always overrides an explicit Allow. A "block everything else" rule on TCP/135 # therefore closes RPC-EPM to your Tier-0 subnets as well, and on a DC that takes out # AD replication, DCOM, WMI, RSAT/GPMC, DFSR and print. Use a scoped Allow plus a # default-deny inbound posture instead -- the profile default does the blocking. # PILOT ON ONE NON-CRITICAL DC. Staged disabled: review, then enable deliberately. $trusted = @("10.10.0.0/24","10.10.1.0/24") # <-- replace with your Tier-0 subnets # 1. Record current state so you can roll back exactly. $before = Get-NetFirewallProfile -Name Domain | Select-Object Name, DefaultInboundAction $before | Format-Table -AutoSize # 2. Create the scoped allow rule, DISABLED. Nothing changes yet. New-NetFirewallRule -DisplayName "Restrict RPC-EPM (CVE-2026-41089)" ` -Direction Inbound -Protocol TCP -LocalPort 135 ` -RemoteAddress $trusted -Action Allow -Profile Domain -Enabled False # 3. Confirm the rule matches what you intended, THEN enable it. Get-NetFirewallRule -DisplayName "Restrict RPC-EPM (CVE-2026-41089)" | Get-NetFirewallAddressFilter # Enable-NetFirewallRule -DisplayName "Restrict RPC-EPM (CVE-2026-41089)" # 4. Only after step 3 verifies clean, set the profile default. This is what # actually blocks untrusted sources -- not a second explicit Block rule. # Set-NetFirewallProfile -Name Domain -DefaultInboundAction Block # Optional: pin the RPC dynamic port range so firewall/NDR rules stay accurate # netsh int ipv4 set dynamicport tcp start=49152 num=16384
Prerequisites: a non-critical pilot DC; your real Tier-0 CIDRs; console or iLO/DRAC access to the pilot DC in case you lose RPC to it. Reboot required: no.
Verify — run all three from a TRUSTED subnet before touching a second DC:Test-NetConnection <pilot-dc> -Port 135 must return TcpTestSucceeded : True.repadmin /replsummary must show no new failures for the pilot DC.Get-NetFirewallProfile -Name Domain | Select DefaultInboundAction confirms the posture you expect. Then repeat from an UNTRUSTED subnet and confirm 135 is refused.
Rollback:Remove-NetFirewallRule -DisplayName "Restrict RPC-EPM (CVE-2026-41089)"Set-NetFirewallProfile -Name Domain -DefaultInboundAction NotConfigured (or whatever $before recorded in step 1). If you have already lost RPC to the DC, roll back from the console or unlink the GPO from a working DC and run gpupdate /force after regaining access.
# Turn on the audit subcategories behind the native audit-log hunts. # Prefer deploying via the "Advanced Audit Policy Configuration" GPO on the DC OU. auditpol /set /subcategory:"Computer Account Management" /success:enable /failure:enable auditpol /set /subcategory:"User Account Management" /success:enable /failure:enable auditpol /set /subcategory:"Logon" /success:enable /failure:enable auditpol /set /subcategory:"Directory Service Access" /success:enable /failure:enable auditpol /set /subcategory:"Process Creation" /success:enable # Include command line in 4688 events (GPO: Administrative Templates > System > # Audit Process Creation > "Include command line in process creation events" = Enabled) reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit" ` /v ProcessCreationIncludeCmdLine_Enabled /t REG_DWORD /d 1 /f # Verify Netlogon secure-channel enforcement (post-Zerologon hardening) is ON: reg query "HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters" /v FullSecureChannelProtection
Containment Runbook
Confirm the hit (Q1/Q6/Q8). Capture: source IP of inbound RPC, child process tree, timestamps, lsass egress destinations. Pull a memory image of the DC before changes. Owner: SOC / IR. Evidence: process tree, memory image, Falcon detection ID.
Restrict inbound RPC paths to the DC (Playbook P2). If active hands-on-keyboard is confirmed, network-contain the DC via Falcon and fail over FSMO roles to a known-clean, patched DC. Block identified attacker source hosts. Owner: IR / AD team. Evidence: containment action log, FSMO transfer record.
Assume the DC is unrecoverable in place — rebuild from known-good media. Reset the DC machine account and all Tier-0 / privileged credentials. Rotate krbtgt twice. Reset DSRM password. Hunt for persistence (new accounts, GPO changes, ACL backdoors, AdminSDHolder). Reintroduce the patched DC, verify replication health, re-enable monitoring, and keep Q1–Q8 at elevated alerting for 30 days. Owner: AD team / SOC. Evidence: rebuild ticket, krbtgt rotation log, replication report.
Detection Coverage Map
| Attack-chain behavior | Primary Detection | Fallback | Known Gap |
|---|---|---|---|
| Reach DC RPC endpoint | Q3 (rare-source inbound RPC) | Firewall/NDR logs | High FP; depends on allowlist quality + inbound network telemetry |
| Memory corruption / exploit attempt | Q4 + native crash hunt | — | ⚠ Requires Windows event-log ingestion; not in base EDR. Successful exploits may not crash the service. |
| SYSTEM code execution in lsass | Q1 (lsass child) — high conf | Q2 (DC shells) | Covered. Depends on ProductType enrichment resolving DC role. |
| C2 / tool transfer | Q8 (lsass egress), Q7 (PE on DC) | DnsRequest hunts | In-memory-only C2 with no new process/file would evade |
| Discovery | Q5 (AD enum on DC) | Native 4688 | Living-off-the-land overlaps with admin tooling — FP tuning needed |
| Credential dumping | Q6 (NTDS/LSASS) | Falcon Identity Protection | Direct-syscall or novel dumping tools may miss command-line patterns |
| Persistence / impact | Native 4742/4720 hunts | Q2 | Ransomware/impact stage out of pack scope — chain to existing detections |
Hunt Summary Ticket
TITLE: Hunt — CVE-2026-41089 Windows Netlogon RCE (DC takeover)
SEVERITY: Critical (CVSS 9.8, exploited in the wild)
SCOPE: All Windows Server Domain Controllers (2012-2025); legacy via 0patch
HYPOTHESIS: Exploitation yields SYSTEM in lsass/Netlogon on a DC, producing
anomalous child processes, lsass egress, and SYSTEM-level recon/cred theft.
QUERIES RUN: Q1 lsass-child (DC) | Q2 DC shells | Q3 rare inbound RPC |
Q4 Netlogon crash | Q5 AD discovery | Q6 NTDS/LSASS dump |
Q7 PE on DC | Q8 lsass egress (+5 native audit-log hunts)
DATA SOURCES: Falcon ProcessRollup2, NetworkConnect/ReceiveAcceptIP4, PeFileWritten;
Windows System/Application/Security event logs (Q4 + native hunts)
FINDINGS: <pending analyst execution>
GAPS: Q4 needs Windows event-log ingestion; no atomic IOCs published;
successful exploit may not crash Netlogon.
ACTIONS: Patch all DCs (one window); restrict RPC to Tier-0; deploy Q1 IOA;
enable advanced auditing (P3).
OWNER: HuntPack
VERSION: v0.2 (Draft) - 2026-06-09
Changelog
table() calls carry extra parameters (e.g. sortby=), so the first pass's pattern did not reach them and they kept the silent 200-row default. Explicit limits now applied on the same tiering.table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used For | Accessed |
|---|---|---|---|
| 1 | Microsoft MSRC — CVE-2026-41089 | Authoritative vuln details, affected versions, patch | 2026-06-09 |
| 1 | CVE.org — CVE-2026-41089 | CWE-121 classification, primary record | 2026-06-09 |
| 1 | NVD — CVE-2026-41089 | CVSS 9.8 vector | 2026-06-09 |
| 1 | CCB Belgium advisory | In-the-wild exploitation confirmation | 2026-06-09 |
| 2 | Deepwatch ATI — CA-26-019 | Detection strategy, ATT&CK mapping, hunting leads | 2026-06-09 |
| 2 | Help Net Security | Root-cause component, mitigations, 0patch, indicators | 2026-06-09 |
| 2 | BleepingComputer | Corroboration of exploitation and severity | 2026-06-09 |
| 2 | SecurityWeek | Corroboration, affected versions | 2026-06-09 |
HuntPack v0.2 (Draft) · CVE-2026-41089 · Generated 2026-06-09 · Defensive use only — no exploit code, PoC, or offensive tradecraft. Validate all field names (notably Q4) and tune exclusions in your own tenant before promoting any query to alerting.