Someone left the master key to your kingdom under a doormat made entirely of zeroes
CVE-2020-1472 — universally known as Zerologon — is a cryptographic flaw in Microsoft's Netlogon Remote Protocol (MS-NRPC). The AES-CFB8 implementation uses a fixed, all-zero initialization vector (IV), which means an unauthenticated attacker on the network can send ~256 specially crafted Netlogon authentication attempts to a domain controller and, on average within seconds, reset that DC's machine account password to a known empty value. From there, the attacker performs a DCSync to harvest every credential in the domain — including krbtgt. Affected: every supported Windows Server version running the DC role — Server 2008 R2, 2012, 2012 R2, 2016, 2019, and their Server Core variants. Patched in the August 2020 Patch Tuesday with enforcement mode enabled by default in February 2021.
The user-supplied metadata for this CVE is incorrect. The provided vector (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N, 5.5 MEDIUM) belongs to a different vulnerability. Microsoft and NVD both scored Zerologon at 10.0 CRITICAL with vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H. That score is completely justified: the attack is network-based, requires no authentication, no user interaction, has low complexity, and the blast radius crosses every security boundary in an AD environment. Six years post-disclosure, this CVE still appears in ransomware kill chains (Ryuk, Conti, Cuba, LockBit playbooks) and APT campaigns (Mercury/MuddyWater, TA505). CISA issued Emergency Directive 20-04 specifically for this vulnerability — one of the few CVEs to ever receive that treatment. The EPSS score of 0.97+ (97th+ percentile) confirms that exploitation probability remains among the highest of any CVE in the catalog.
5 steps from start to impact.
Network access to a domain controller
- TCP network path to the target DC on RPC ports (135 + dynamic high ports)
- DCs should never be exposed to the internet — Shodan/Censys data shows <0.1% of DCs have port 445/135 externally reachable
- Requires internal network position, implying post-initial-access in most scenarios
Zerologon authentication bypass via MS-NRPC
dirkjanm/CVE-2020-1472, risksense/zerologon, or built into Mimikatz lsadump::zerologon and Impacket zerologon_tester.py). The tool sends Netlogon authentication requests with an all-zero client credential. Due to the broken AES-CFB8 IV, roughly 1 in 256 attempts succeeds, typically within 2–3 seconds. On success, the DC's machine account password is set to an empty string.- Unpatched domain controller (missing KB4565349 / KB4571694 or equivalent, AND enforcement mode not enabled)
- Patch has been available for over 6 years
- February 2021 enforcement mode update blocks non-secure RPC by default — even partially patched DCs are protected
DCSync to harvest all domain credentials
secretsdump.py or Mimikatz lsadump::dcsync. This replicates the entire Active Directory database (NTDS.dit), yielding every user hash including krbtgt, Domain Admin accounts, and service accounts.- Successful Zerologon exploitation from Step 2
- None — this step is deterministic once Step 2 succeeds
Golden Ticket and full domain compromise
krbtgt hash, the attacker forges a Golden Ticket granting Domain Admin or Enterprise Admin access to every resource in the AD forest. The attacker now controls all domain-joined systems, can access any file share, deploy ransomware via Group Policy, extract secrets from DPAPI, and persist indefinitely until krbtgt is rotated twice.- krbtgt NTLM hash from Step 3
- None — standard post-exploitation, fully automated in tools like Cobalt Strike, Impacket, Rubeus
Lateral movement and ransomware deployment
- Domain Admin or equivalent from Step 4
- Endpoint Detection and Response (EDR) may catch lateral movement tools
- Network segmentation may slow propagation but cannot prevent it once DA is achieved
The supporting signals.
| In-the-Wild Status | Massively exploited. Used in Ryuk, Conti, Cuba, LockBit ransomware campaigns. APT groups including Mercury/MuddyWater (Iran) and TA505 have deployed it. CISA issued Emergency Directive 20-04 — one of very few CVEs to receive this treatment. |
|---|---|
| PoC / Exploit Availability | Weaponized exploits are public and trivial to use: dirkjanm/CVE-2020-1472, risksense/zerologon, VoidSec/CVE-2020-1472. Also built into Mimikatz (lsadump::zerologon) and Impacket (zerologon_tester.py). Metasploit module available. |
| EPSS Score | 0.97+ (97th+ percentile) — among the highest exploitation probability scores in the entire CVE catalog. |
| CISA KEV Status | Listed. Added to the Known Exploited Vulnerabilities catalog. Due date for federal agencies was set in 2020. Flagged as used in ransomware campaigns. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — 10.0 CRITICAL. Network attack vector, no privileges, no interaction, scope change (compromise crosses AD trust boundaries). Note: the user-supplied vector (5.5/MEDIUM) is *incorrect* for this CVE. |
| Affected Versions | All Windows Server versions running the Domain Controller role: Server 2008 R2 SP1, 2012, 2012 R2, 2016, 2019 (including Server Core). Windows Server 2003 and 2008 non-R2 are also vulnerable but received no patch (EOL). |
| Fixed Versions | Phase 1: August 11, 2020 Patch Tuesday (KB4565349 for Server 2019, KB4571694 for Server 2016, etc.). Phase 2: February 9, 2021 — enforcement mode enabled by default. Both phases required for full protection. |
| Scanning / Exposure Data | Shodan and Censys show <0.1% of DCs with Netlogon/RPC directly internet-exposed. However, internal exposure is near-universal — every domain-joined host can reach its DC. Qualys, Tenable, and Rapid7 all have authenticated checks for the missing patch and enforcement mode registry key. |
| Disclosure Date | 2020-08-11 (patch), 2020-09-11 (Secura whitepaper by Tom Tervoort detailing the cryptographic flaw and exploitation method). |
| Researcher | Tom Tervoort, Secura (Netherlands). Published the whitepaper *'Zerologon: Unauthenticated domain controller compromise by subverting Netlogon cryptography'*. |
noisgate verdict.
The single most decisive factor is role identity — the vulnerable component IS the domain controller, and a successful exploit yields unauthenticated domain takeover in seconds with publicly weaponized tools. No friction point — including the 'requires internal network access' prerequisite — can override a floor set by a vulnerability that exists exclusively in the identity-plane component controlling every host in the fleet.
Why this verdict
- Role multiplier: The affected component is *by definition* a domain controller — 100% of vulnerable installs occupy the highest-value identity role. A successful chain ends in full AD forest compromise (DA → Golden Ticket → every host). This sets a CRITICAL floor that no friction analysis can breach.
- Weaponization saturation: Public, reliable, one-click exploits exist in Mimikatz, Impacket, Metasploit, and dozens of standalone GitHub repos. The attack completes in under 5 seconds with zero authentication. There is no skill barrier.
- Confirmed mass exploitation: KEV-listed, CISA Emergency Directive, documented use in Ryuk, Conti, Cuba, LockBit ransomware campaigns and nation-state APT operations (Mercury, TA505). EPSS 97th+ percentile confirms ongoing exploitation probability.
- Scope change in CVSS is literal: Compromise of one DC cascades to every domain-joined host, every user credential, every Group Policy object, and every trust relationship in the forest. The blast radius is fleet-scale by design.
- Internal network prerequisite is not meaningful friction: Every domain-joined workstation, server, and VPN client has network access to at least one DC. An attacker who lands anywhere on the internal network (phishing, VPN compromise, supply chain) can immediately pivot to Zerologon. This prerequisite filters out only pure external attackers with zero foothold — a population that already has cheaper targets.
Why not higher?
This is already the maximum score of 10.0 CRITICAL. There is no higher severity bucket. The vulnerability represents the theoretical ceiling of impact: unauthenticated, low-complexity, scope-changing, full-confidentiality/integrity/availability destruction of the enterprise identity plane.
Why not lower?
Downgrading below CRITICAL would require evidence that the domain controller role is somehow low-value or that the attack chain has meaningful friction. Neither is true. The DC is the canonical high-value target in every Windows enterprise, the exploit is trivially reliable, and the blast radius is every host in the domain. The 'requires internal network' prerequisite does not constitute meaningful friction because internal network access to DCs is the *default state* for every domain-joined machine. Additionally, active KEV listing and confirmed ransomware campaign usage independently mandate maximum urgency.
What to do — in priority order.
- Verify enforcement mode is active on ALL domain controllers immediately — Check the registry key
HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\FullSecureChannelProtectionis set to1on every DC. The February 2021 update enables this by default, but manual overrides or GPO misconfigurations can disable it. This is the single most important compensating control — deploy within 3 days per noisgate mitigation SLA for CRITICAL. - Block Netlogon RPC from non-DC and non-domain-member sources — Use Windows Firewall or network ACLs to restrict inbound Netlogon/RPC (TCP 135 + dynamic range) on DCs to only known domain controllers and legitimate domain members. This limits the attacker population that can reach the vulnerable service. Deploy within 3 days.
- Enable Microsoft Defender for Identity Zerologon detection — MDI has a specific alert for 'Suspected Netlogon privilege elevation attempt (CVE-2020-1472)'. Ensure this is enabled and routed to your SOC with HIGH priority. If you don't run MDI, deploy IDS signatures (Snort SID 55703, Suricata ET rules) on DC network segments.
- Monitor for DCSync from non-DC sources — Alert on Windows Security Event ID 4662 with properties
DS-Replication-Get-ChangesandDS-Replication-Get-Changes-Allwhere the source is not a domain controller. This catches the post-exploitation step even if the initial exploit is missed. - Audit for EOL domain controllers — Windows Server 2003 and 2008 (non-R2) are vulnerable and will never receive a patch. If any of these are still running as DCs, decommission them immediately — they are permanent Zerologon targets.
- Network segmentation alone — while it may slow an attacker, every domain-joined host needs RPC access to DCs by design. You cannot firewall DCs away from their own members without breaking Active Directory functionality.
- Disabling the Netlogon service — this will break domain authentication, group policy processing, and DNS registration for all domain members. It is not a viable mitigation.
- Certificate-based authentication only — Zerologon attacks the machine account channel, not user authentication. Smart cards and certificate-based user logon do not protect the Netlogon protocol.
- Monitoring alone without patching — detection gives you a chance to respond, but the exploit completes in seconds. By the time an alert fires and a human triages it, the attacker may already have performed DCSync and obtained the krbtgt hash.
Crowdsourced verification payload.
Run this script on each domain controller with Domain Admin or local admin privileges. It checks both the patch level (August 2020 KB) and the enforcement mode registry key. Example: powershell -ExecutionPolicy Bypass -File .\Check-Zerologon.ps1
#Requires -RunAsAdministrator
<#
Check-Zerologon.ps1
Checks whether this domain controller is protected against CVE-2020-1472 (Zerologon).
Outputs: VULNERABLE / PATCHED / UNKNOWN
Exit codes: 1 = VULNERABLE, 0 = PATCHED, 2 = UNKNOWN
#>
$ErrorActionPreference = 'Stop'
$status = 'UNKNOWN'
$exitCode = 2
$findings = @()
try {
# Check 1: Is this even a domain controller?
$os = Get-WmiObject Win32_OperatingSystem
$isDC = (Get-WmiObject Win32_ComputerSystem).DomainRole -ge 4
if (-not $isDC) {
Write-Host "INFO: This host is NOT a domain controller. Zerologon is only exploitable on DCs."
Write-Host "PATCHED"
exit 0
}
$findings += "Host is a Domain Controller: YES"
# Check 2: Look for August 2020+ cumulative update
$hotfixes = Get-HotFix | Sort-Object InstalledOn -Descending -ErrorAction SilentlyContinue
# Key KBs for Zerologon Phase 1 (August 2020)
$phase1KBs = @('KB4565349','KB4571694','KB4571702','KB4571703','KB4571723','KB4571729','KB4571736')
$foundPhase1 = $false
foreach ($kb in $phase1KBs) {
if ($hotfixes.HotFixID -contains $kb) {
$foundPhase1 = $true
$findings += "Phase 1 patch found: $kb"
break
}
}
# Also check if any cumulative update post-August 2020 is present
$recentPatches = $hotfixes | Where-Object { $_.InstalledOn -gt [datetime]'2020-08-11' }
if ($recentPatches.Count -gt 0 -and -not $foundPhase1) {
$findings += "Post-August-2020 updates found ($(($recentPatches | Select-Object -First 3).HotFixID -join ', '))"
$foundPhase1 = $true
}
# Check 3: Enforcement mode registry key
$regPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters'
$enforcementValue = $null
try {
$enforcementValue = (Get-ItemProperty -Path $regPath -Name 'FullSecureChannelProtection' -ErrorAction Stop).FullSecureChannelProtection
} catch {
$findings += "FullSecureChannelProtection registry key: NOT FOUND (may rely on Feb 2021 default)"
}
if ($enforcementValue -eq 1) {
$findings += "FullSecureChannelProtection: ENABLED (enforcement mode ON)"
} elseif ($enforcementValue -eq 0) {
$findings += "FullSecureChannelProtection: DISABLED (enforcement mode OFF - DANGEROUS)"
}
# Check 4: Determine verdict
if ($enforcementValue -eq 0) {
# Enforcement explicitly disabled - vulnerable even if patched
$status = 'VULNERABLE'
$exitCode = 1
$findings += 'REASON: Enforcement mode is explicitly DISABLED via registry. This DC is exploitable.'
} elseif ($foundPhase1 -and ($enforcementValue -eq 1 -or $enforcementValue -eq $null)) {
# Patched and enforcement not explicitly disabled (Feb 2021 default applies)
$status = 'PATCHED'
$exitCode = 0
} elseif (-not $foundPhase1) {
$status = 'VULNERABLE'
$exitCode = 1
$findings += 'REASON: No August 2020 or later cumulative update detected.'
} else {
$status = 'UNKNOWN'
$exitCode = 2
}
} catch {
$findings += "Error during check: $($_.Exception.Message)"
$status = 'UNKNOWN'
$exitCode = 2
}
Write-Host ''
Write-Host '=== CVE-2020-1472 (Zerologon) Check ===' -ForegroundColor Cyan
foreach ($f in $findings) { Write-Host " $f" }
Write-Host ''
Write-Host $status -ForegroundColor $(if ($status -eq 'VULNERABLE') {'Red'} elseif ($status -eq 'PATCHED') {'Green'} else {'Yellow'})
exit $exitCodeIf you remember one thing.
FullSecureChannelProtection = 1 in the registry, and decommission any Server 2003/2008 DCs that cannot be patched. If any DC returns VULNERABLE, escalate to your CISO immediately — you are one phishing email away from full domain compromise.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.