IPv6 DNS takeover: whoever answers the Solicit first
Every Windows box asks the local link for a DNS server over DHCPv6, and nothing in that exchange authenticates the answer. Whoever replies first owns name resolution, then the WPAD lookup, then your NTLM. Here's the switch hygiene and the four Windows settings that close it, with the audits that tell you what will break before you enforce.
01 The Big PictureFor leadership · no jargon
Okay, so IPv6 DNS takeover, or "unauthorised DHCPv6 server" as the reports tend to file it. I've taken over the DNS of several client networks with this now, and the part that still bothers me is how little it takes. No exploit, no credentials, no phished laptop: a port on the internal network, four packets, and every Windows machine that answers me starts resolving names through my laptop.
Picture a new starter on their first morning, standing in the office shouting "who do I ask for phone numbers?" The first person to reply becomes the switchboard for everything they do that day, and nobody checks a badge first, because the protocol was never built to. Windows has been asking that question out loud since Vista, on networks where nobody ever configured an answer, so anyone who can plug in gets to be the switchboard.
That matters because this is where authentication begins. Once the attacker is the resolver, they answer the lookup Windows does to find its proxy settings, the victim connects to them, and, being helpful, authenticates first. That authentication can be relayed into a domain controller, so anyone with a wall port can usually turn it into valid domain user credentials, and on a poorly configured estate, more than that. Nothing to patch, because nothing is broken: every device involved behaves exactly as designed. The fix is housekeeping in two halves, stop the switch handing out answers it shouldn't, and take away the authentication the attack lives on. The switch work is minutes per port once the reconnaissance is done, and the Windows work is four settings with an audit step in front of each one. The auditing is where the fortnight goes, not the fixing.
02 Technical BreakdownFor engineers
DHCPv6 exists so IPv6 hosts can be told configuration they can't derive themselves, and DNS resolvers are the important half of that. The exchange is four messages:
client anything listening
| SOLICIT -> ff02::1:2 / udp 547 |
| <--------------------------- ADVERTISE / udp 546
| REQUEST -> ff02::1:2 |
| <--------------------------- REPLYSolicitation goes to the all-DHCP-relay-agents-and-servers multicast group: link-local, unrouted, UDP 546 on the client and 547 on the server. Four packets start to finish, and nothing in them is authenticated.
The options themselves are old and boring. Option 23 carries the recursive name server list and option 24 the domain search list, both specified in RFC 3646 back in 2003. Two other routes deliver the same information, and neither is verified either: DHCPv4 option 6 (RFC 2132), and the RDNSS and DNSSL options carried inside a router advertisement (RFC 8106, which updates RFC 6106). On a Windows estate the DHCPv6 route is the one that matters, because Windows prefers a DHCPv6-supplied resolver over anything an RA told it. Insinuator's lab work on the Windows 10 Creators Update found exactly that ordering, and it matches what RFC 8106 says should happen. On a mixed estate the RA door is the one to worry about, since Linux, macOS and most appliances accept a rogue RDNSS even where Windows wouldn't.
Nothing in that exchange authenticates the server. RFC 8415's security considerations say it plainly: DHCP "lacks end-to-end encryption between clients and servers", so hijacking is a design property rather than a bug, and the attack it names first is a malicious server "providing incorrect configuration information to the client" to mount a man-in-the-middle against "some service (such as DNS or NTP)". RFC 3646 had already predicted this exact finding three years earlier: the DNS option "may be used by an intruder DHCP server to cause DHCP clients to send DNS queries to an intruder DNS recursive name server". Its recommended mitigation was client-side authentication before installing a resolver list, which twenty-odd years later is still a SHOULD nobody implements. RFC 8415's only defined authentication protocol exists to protect the Reconfigure message, not the answer to a Solicit.
Two Windows defaults finish the job. IPv6 is enabled and preferred out of the box on everything since Vista, which Microsoft's own guidance states in as many words ("By default, Windows favors IPv6 global unicast addresses over IPv4 addresses", KB 929852), and the DHCPv6 client runs whether or not anyone deployed IPv6. You can see the preference on any host:
netsh interface ipv6 show prefixpolicies Default output has ::/0 (global IPv6) at precedence 40 and ::ffff:0:0/96 (IPv4-mapped) at 35. Higher wins, so IPv6 does, and the box will take DNS configuration over IPv6 without being asked twice.
The setting everyone reaches for, DisabledComponents = 0x20 ("prefer IPv4 over IPv6"), does not stop this. It flips those two precedences, which decides which address family you pick once a name has resolved, not which DNS server's answer you get. If the attacker's resolver answers faster than yours, prefer-IPv4 changes what you do with the reply, not who you asked. RFC 9099 disposes of the "we don't run IPv6" defence in one sentence: "it is possible even in an 'IPv4-only' network to attack L2-adjacent victims via their IPv6 link-local address or via a global IPv6 address when the attacker provides rogue RAs or a rogue DHCPv6 service."
The tooling is public, mature and small. mitm6, published by Fox-IT in 2018, sits on the interface, answers Solicit messages with a link-local address and itself as the resolver, and answers DNS selectively so normal traffic keeps working and nobody opens a ticket. It reads the FQDN option in the Solicit, which means it learns the hostname it is answering for. What the victim sees afterwards is one extra address and a new gateway:
# before, a Windows 10 box on an "IPv4-only" network
Link-local IPv6 Address . . . . . : fe80::2527:53eb:9abd:8df2%15(Preferred)
IPv4 Address. . . . . . . . . . . : 192.168.13.129(Preferred)
DNS Servers . . . . . . . . . . . : 9.9.9.9
# after, once the attacker answered the Solicit
Link-local IPv6 Address . . . . . : fe80::9900:1%15(Preferred) <- attacker's lease
Link-local IPv6 Address . . . . . : fe80::2527:53eb:9abd:8df2%15(Preferred)
IPv4 Address. . . . . . . . . . . : 192.168.13.129(Preferred)
Default Gateway . . . . . . . . . : fe80::b49f:39ff:fe37:9cd6%15 <- attackerNote what didn't change: the IPv4 address, the lease, your DHCP server, all untouched. One extra IPv6 address, and from that moment the box resolves names through a machine that isn't yours. That second line-local address is the whole footprint.
Then the second phase. Windows still looks up wpad when it wants to discover a proxy, and if the attacker is the resolver, the attacker gets to answer that lookup. The victim connects to the attacker's WPAD listener and authenticates to it in the enterprise's own name, and ntlmrelayx relays that authentication into LDAP, LDAPS or SMB. Practitioner write-ups of this chain describe the common endgame as relay into LDAPS plus abuse of resource-based constrained delegation on a target computer, which is a polite way of saying rights you were never supposed to have. The relay half is well understood; what unlocks it is the DNS half. No WPAD answer, no authentication. And the network reverts by itself when you stop: Fox-IT tuned the lease and lifetime values so the bad configuration ages out in minutes rather than days, which is why this doesn't have to wreck a client's week.
Two honest limits before the fixes. RA Guard is not a complete answer on its own: it is ingress-only, it needs TCAM support in hardware, it sees nothing in tunnelled IPv6 traffic, and it does not stop the extension-header bypass that RFC 9099 flags and somebody has already tooled. And nothing on the endpoint writes a neat "IPv6 takeover happened" event, so the detection surface is the network plus a configuration baseline you actually collect.
03 Affected
Any Windows estate on a flat layer 2 segment, which is most of them. Workstations and servers both, since the DHCPv6 client is on by default and the attacker only needs one machine to answer. No IPv6 deployment is required on your side, and no credentials on theirs.
The attacker needs layer 2 adjacency. DHCPv6 is link-local and isn't routed, so this is a plugged-in-the-building attack rather than an internet one: an unused wall port, a meeting room drop, a compromised workstation, or a contractor's laptop on a "trusted" VLAN.
Two things make it worse than it needs to be. Networks that never deployed IPv6 have no legitimate DHCPv6 server, so there is nothing to race and no baseline to compare against. And where the estate does run router advertisements, Linux, macOS and most appliances will accept a rogue RDNSS answer even where Windows wouldn't. In my experience this is the cheapest route there is from plain network access to domain user credentials, and it belongs ahead of anything that needs a CVE number on the fix list.
04 Detection
Before changing anything, work out who is already talking on the segment and what your hosts are configured to trust. From a mirrored port or a capture box on the VLAN you're about to touch, run it for a week:
tcpdump -i eth0 -n 'icmp6 or udp port 547'Count two things: router advertisements (ICMPv6 type 134) and DHCPv6 Advertise messages, which are message type 2 in the first byte of the payload. Every source you can't account for is either an unmanaged router or this finding, and you want to know which before you attach a policy.
Wireshark equivalent if you prefer looking at it: icmpv6 || dhcpv6, or dhcpv6.msgtype == 2 for Advertise messages alone. One lab gotcha worth knowing before you blame the tooling: on some virtual switches the attacker never sees the Solicit at all. Windows sends it to the all-DHCP-agents multicast group and joins that group via MLD, so if your hypervisor's virtual switch handles MLDv2 properly, the attacker's box isn't in the group and sees nothing until mitm6's own router advertisement jogs the victim into asking again.
If you run an IDS, Fox-IT published Snort and Suricata signatures for the tool in 2018 and they still read as a good starting point:
# Snort / Suricata, FOX-SRT mitm6 signatures
alert udp fe80::/12 [546,547] -> fe80::/12 [546,547] (
msg:"FOX-SRT - Policy - DHCPv6 advertise"; content:"|02|"; offset:48; depth:1;
threshold:type limit, track by_src, count 1, seconds 3600;
classtype:policy-violation; sid:21002327; rev:2;)
alert udp ::/0 53 -> any any (
msg:"FOX-SRT - Suspicious - WPAD DNS reponse over IPv6"; byte_test:1,&,0x7F,2;
byte_test:2,>,0,6; content:"|00 04|wpad"; nocase; fast_pattern;
threshold: type limit, track by_src, count 1, seconds 1800;
classtype:attempted-admin; priority:1; sid:21002330; rev:1;)The first rule is "any DHCPv6 Advertise on the link". Where the only legitimate DHCPv6 servers live in the data centre and don't share a broadcast domain with laptops, that rule should be silent. If it isn't, someone is answering.
On the host side, the check is one line any helpdesk can run, and it's the symptom people notice first:
ipconfig /all | findstr /i "DNS Servers"
Get-DnsClientServerAddress -AddressFamily IPv6An IPv6 resolver nobody configured is the tell, and it survives in the config until the lifetime expires. Windows doesn't log any of this natively, there is no event waiting in a log to alert on, so the endpoint half of detection is a scheduled collection of every adapter's resolvers rather than a hunt in an event log.
On the switch, find out what's already applied and where:
show ipv6 nd raguard policy
show ipv6 dhcp guard policyBoth list the policy and every interface or VLAN it's attached to. On an estate nobody has hardened, expect an empty answer, which is also your evidence for the finding.
05 Remediation
01 1. Map the segment before you touch it
The blast radius of the switch work is "this VLAN loses its IPv6 configuration", so the reconnaissance isn't optional. From the capture above, list every source of an RA or a DHCPv6 Advertise you can't explain. Then answer one question per VLAN: which physical port or trunk carries your real DHCPv6 server or relay?
That last question bites people, because the guards block replies forwarded by relay agents as well as servers. In a routed design the relay's ingress port has to be trusted, or every client on the far side of it loses its answers. Trust is a list, not a default.
While you're mapping, check for two things that quietly defeat the plan. Tunnelled or transition IPv6 traffic, which RA Guard does not see at all. And the platform ipv6 acl icmp optimize neighbor-discovery command, which on IOS XE makes RA Guard impossible to configure (you get an error, not a warning). If port-channels are in the path, read your platform's restrictions first: the IOS XE RA Guard and DHCPv6 Guard modules document no support on EtherChannel and its port members, while the Catalyst first-hop-security guide documents attaching policies to a Layer 2 EtherChannel. That's a platform question, not a rule of nature.
02 2. Turn on RA Guard and DHCPv6 Guard
Two policies, host-facing. Build them, attach them to one pilot port, and leave the rest alone until that port has been watched for a day.
ipv6 nd raguard policy HOST
device-role host
!
ipv6 dhcp guard policy CLIENT
device-role client
!
interface GigabitEthernet1/0/10
description access port, pilot
ipv6 nd raguard attach-policy HOST
ipv6 dhcp guard attach-policy CLIENT device-role host means nothing behind this port may send a router advertisement. device-role client means nothing behind it may answer a Solicit. The naming reads backwards on first pass: the role describes what you refuse to accept from the device plugged in there.
Then the trusted side, which is where the outage risk lives:
ipv6 dhcp guard policy SERVER
trusted-port
!
interface GigabitEthernet1/0/1
description uplink to the DHCPv6 relay
ipv6 dhcp guard attach-policy SERVER trusted-port disables all DHCP guard policing for that policy, and exactly one class of port deserves it. Get this backwards in either direction and you either leave the hole open (a host port marked trusted) or drop the legitimate answers and take the segment down. The second one is worse, because it arrives as an outage rather than a finding.
Neither feature stops the extension-header bypass, and RA Guard is ingress-only and needs TCAM support in hardware, so treat this as one layer rather than the answer. Send the drops to whoever reads them: a guard drop is either a misconfigured host or somebody testing you, and RFC 9099's recommendation is to run DHCPv6-Shield and actually analyse the messages it produces, which is the part everyone skips.
03 3. Turn WPAD off
This is the setting that removes the domain compromise, and it needs two registry values, not one. Local equivalent first; on a domain, push it as two GPO preferences, one for the computer and one for the user.
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp" /v DisableWpad /t REG_DWORD /d 1 /f
reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoDetect /t REG_DWORD /d 0 /f DisableWpad = 1 is machine-wide; AutoDetect = 0 is per-user and is what turns off "Automatically detect settings" under proxy setup. Most published fixes only give you one of the two, which is why the WPAD leg keeps working after people believe they closed it. Two reboots before it is fully effective.
Check what depends on it before you flip it, because this is the control that generates tickets:
netsh winhttp show proxy
nslookup wpad The second command is the important one. If wpad resolves, something is publishing it (usually a record in your own DNS zone), and the clients will find it. Remember the discovery order too: WinHTTP tries DHCP option 252, then DNS, then falls back to direct access. Check the DHCP scope for 252, and if users genuinely depend on a PAC file, they need an explicit proxy setting in the same change window.
04 4. Turn off LLMNR, NBT-NS and mDNS
The fallback name resolution protocols that keep credential conversations alive when DNS says no. One policy for LLMNR, and no reboot required since it lives inside the DNS Client service:
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient" /v EnableMulticast /t REG_DWORD /d 0 /f GPO path: Computer Configuration -> Administrative Templates -> Network -> DNS Client -> "Turn off multicast name resolution" = Enabled. 0 is off. Use the GPO on a domain rather than per-host edits, and expect the value on every machine. mDNS (UDP 5353) is worth disabling at the same time on Windows 11 and Server 2022 estates.
NBT-NS has no single switch, because it's a per-adapter value, so it's a loop:
$regkey = "HKLM:SYSTEM\CurrentControlSet\services\NetBT\Parameters\Interfaces"
Get-ChildItem $regkey | ForEach-Object {
Set-ItemProperty -Path "$regkey\$($_.pschildname)" -Name NetbiosOptions -Value 2 -Verbose
} NetbiosOptions: 0 = follow DHCP (which usually ends up enabled), 1 = enabled, 2 = disabled. Every new dock, USB ethernet adapter or VPN interface gets its own fresh key with its own default, so re-run this on a schedule or the setting drifts back and you get the "I turned this off last year" conversation.
Pilot it on one ring of OUs with a capture running for a week first:
tcpdump -i any 'udp port 5355 or udp port 137 or udp port 5353'What you're looking for is names being resolved this way that DNS cannot answer: legacy line-of-business apps, older multifunction printers, some remote support tooling. Keep the rollback scoped per OU so you can give one back without unwinding the lot.
05 5. Audit, then enforce LDAP signing
Turn the detailed events on first, and leave them on for a couple of weeks. This is the step that saves you.
Reg Add HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics /v "16 LDAP Interface Events" /t REG_DWORD /d 2Enables per-bind LDAP logging on the DC. Event 2887 is logged at summary level every 24 hours even without this; 2889 is the per-client version, and that's the one you can act on.
Get-WinEvent -LogName "Directory Service" -MaxEvents 500 | Where-Object Id -eq 2889 | Select-Object TimeCreated,MessageOne line per unsigned or plaintext simple bind, with the client IP and the account. The usual casualties are multifunction printers doing scan-to-email, older VPN appliances, and Linux or Mac clients with ancient LDAP config. Fix those first, then enforce.
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' -Name LDAPServerIntegrity -PropertyType DWORD -Value 2 -Force 2 = require signing, which makes the DC reject unsigned SASL binds and plaintext simple binds. Audit first, enforce second, never the other way round. Windows Server 2025 and later enable signing by default for new AD deployments, and Server 2025 adds a newer "LDAP server signing requirements Enforcement" policy alongside this one, so check which your DCs are reading.
06 6. Channel binding: audit, then enforce
Two steps rather than one, because the first is the audit.
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' -Name LdapEnforceChannelBinding -PropertyType DWORD -Value 1 -Force 1 = enabled when supported: clients that can present a channel binding token now must, clients that can't keep working while you collect the evidence. Events 3039, 3040 and 3041 land in the Directory Service log. Takes effect immediately, no reboot.
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' -Name LdapEnforceChannelBinding -Value 2 2 = enabled always: every client must present a CBT, and this is the value that breaks things, so it goes last, after the audit events go quiet. The semantics are worth memorising, because 0 is the default on anything unpatched and 0 means no channel binding validation at all.
07 7. SMB signing and EPA
Check the current state, then find out what's talking to you before you enforce anything.
Get-SmbServerConfiguration | Select-Object RequireSecuritySignature,EnableSecuritySignature
Get-SmbClientConfiguration | Select-Object RequireSecuritySignature,EnableSecuritySignatureServer side is inbound signing, client side is outbound. Windows 11 24H2 Enterprise, Pro and Education already require both, and Server 2025 requires it outbound.
What breaks: third-party SMB servers and appliances that don't support signing, which fail with STATUS_INVALID_SIGNATURE (0xc000a000) or get blocked on guest access. Microsoft's own position is that disabling signing is not the workaround.
Since September 2025 there is an audit value for exactly this problem (AuditClientDoesNotSupportSigning, CVE-2025-55234, KB5066913) which lets you inventory the incompatible devices before enforcing. The value name was published incorrectly and corrected in December 2025, so read the KB rather than a blog quoting the old name.
08 8. EPA on AD CS
UI and one config file rather than a one-liner: enable Extended Protection for Authentication on Certificate Authority Web Enrollment and Certificate Enrollment Web Service with Required, the strictest setting, then set the matching extendedProtectionPolicy to Always in the CES web.config under %windir%\systemdata\CES\_CES_Kerberos\. Details in KB5005413.
What breaks: any enrolment client that can't do channel binding is denied once you're on the strict setting, so test the enrolment path from every client type you actually have, including the non-Windows ones nobody remembers.
09 9. Roll it out in this order
Work in this order, because each step has a larger blast radius than the last and the audits need time to produce data: switch guards on a pilot port, then WPAD, then LLMNR and NBT-NS on one OU ring, then LDAP signing, then channel binding, then SMB signing, then AD CS. All of it is reversible in minutes, which is why the rollback section below is short.
And please don't take the shortcut of disabling IPv6 wholesale (DisabledComponents = 0xFF). Microsoft's guidance is that IPv6 is a mandatory component they neither recommend removing nor test with removed. It doesn't fix the finding either: your Windows boxes stop asking, but the printers, appliances and Linux hosts on the same segment keep asking, so you've spent a change window on a workaround instead of a control.
06 Verification
Prove the guards are attached and doing their job:
show ipv6 nd raguard policy
show ipv6 dhcp guard policy Both should list the pilot port and, after rollout, every access port. RA Guard drops can be spanned, so you can watch a drop happen rather than infer it, and debug ipv6 snooping raguard gives per-interface detail when you need to prove a specific port is refusing RAs.
Prove the hosts have let go of the rogue answer:
ipconfig /all | findstr /i "DNS Servers"
Get-DnsClientServerAddress -AddressFamily IPv6
ipconfig /release6
ipconfig /renew6A host keeps a rogue resolver until its lease or lifetime expires, so flush it rather than waiting. After the change, only your resolvers should appear, on every adapter.
Prove the LDAP values landed on every DC, not just the one you remembered:
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' | Select-Object LDAPServerIntegrity,LdapEnforceChannelBinding Expect 2 and 2 once both are enforced. An unsigned simple bind from a Linux box should now fail; if it succeeds, that DC isn't enforcing.
ldapsearch -x -H ldap://dc01.domain.local -D 'DOMAIN\testuser' -w 'P@ssw0rd' -b 'DC=domain,DC=local' sAMAccountName=testuserPoint this at every DC with your own test account and expect a failure. A result here means the DC you hit is still accepting unsigned simple binds.
And the real test, scoped so you don't black-hole a production segment:
sudo mitm6 -i eth0 -d example.local -hw ws-042.example.local -hw answers a single host and -d scopes the spoofed answers to your domain, which is the difference between a controlled test and an incident. Run it from a lab VLAN with a mirror port and expect either nothing reaching the victim or the guard dropping it. That result, not a screenshot of a switch config, is what belongs in the remediation evidence.
Then baseline it: collect the configured IPv6 DNS servers per host on a schedule and alert on any resolver that isn't yours. That is the check that catches the next attempt, the misconfigured router, and whatever somebody plugged in on Tuesday.
07 Rollback
Detach the switch policies per port or per VLAN, leaving the policy objects in place so you can reattach the moment you have found the device you blocked:
interface GigabitEthernet1/0/10
no ipv6 nd raguard attach-policy HOST
no ipv6 dhcp guard attach-policy CLIENT If the outage is on the trusted side, the fix is a trusted-port policy on that port rather than removing the guard from everywhere.
Drop the LDAP controls back to audit rather than off, and treat that as temporary:
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' -Name LdapEnforceChannelBinding -Value 1Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' -Name LDAPServerIntegrity -Value 1 1 on channel binding is "when supported", the audit setting. 1 on signing is None, which is a genuinely open state: an unsigned DC accepts the coercion traffic you just spent a fortnight removing, so treat it as a stopwatch rather than a resting place.
Take WPAD and LLMNR back per item and per OU if something genuinely depends on them, never fleet-wide:
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp" /v DisableWpad /t REG_DWORD /d 0 /f
reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoDetect /t REG_DWORD /d 1 /freg add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient" /v EnableMulticast /t REG_DWORD /d 1 /fAnd NetBIOS, per adapter, only where there's a confirmed dependency:
Set-ItemProperty -Path "HKLM:SYSTEM\CurrentControlSet\services\NetBT\Parameters\Interfaces\<adapter-GUID>" -Name NetbiosOptions -Value 1Re-enable where the application actually needs it, not as a blanket just-in-case. If something in the estate can't live without broadcast name resolution, that's a remediation item of its own, not a reason to leave the whole estate exposed.
08 References
- RFC 8415: Dynamic Host Configuration Protocol for IPv6 (DHCPv6) (the missing authentication, §22)
- RFC 3646: DNS configuration options for DHCPv6 (the intruder-server warning, §6)
- RFC 8106: IPv6 router advertisement options for DNS configuration (RDNSS, DNSSL) (the risk, §7.1)
- RFC 7610: DHCPv6-Shield, protecting against rogue DHCPv6 servers (BCP 199)
- RFC 6105: IPv6 router advertisement guard (and its problem statement, RFC 6104)
- RFC 9099: operational security considerations for IPv6 networks (the "IPv4-only network" line, §2.4)
- Microsoft KB 929852: guidance for configuring IPv6 in Windows for advanced users
- Insinuator: RDNSS support in the Windows 10 Creators Update (the resolver ordering)
- Fox-IT: mitm6, compromising IPv4 networks via IPv6
- dirkjanm/mitm6 (the tool, and its
-d,-hwand--no-raoptions) - mitm6 issue #11: the before/after
ipconfig /alland the MLDv2 note - mitm6 issue #14: troubleshooting with
dhcpv6 || icmpv6 - FOX-SRT: mitm6 IDS signatures (Snort / Suricata)
- shadowy-pycoder/ndpspoof: RA and RDNSS spoofing, RA Guard evasion
- Syslifters pentesting handbook: IPv6 MitM
- Attack Paths: mitm6, IPv6 SLAAC and NTLM relay to domain admin
- "Does preferring IPv4 over IPv6 stop the famed mitm6 attack?" (the
0x20argument) - Microsoft Learn: manage LDAP signing using Group Policy (events 2887 and 2889)
- Microsoft KB4520412: LDAP channel binding and LDAP signing requirements (CBT events 3039 to 3041)
- Microsoft KB4034879: the
LdapEnforceChannelBindingregistry entry - Microsoft Learn: control SMB signing behavior
- Microsoft KB5066913: audit events for SMB server signing and EPA (CVE-2025-55234, and the December 2025 name correction)
- Microsoft KB5005413: mitigating NTLM relay attacks on AD CS
- Project Black: disabling WPAD via GPO, both registry keys
- Microsoft Q&A: WinHTTP proxy autodiscovery order (DHCP option 252, then DNS, then direct)
- CISA Eviction Strategies Tool CM0053: disabling LLMNR
- Ahmed Bayoumy: disabling legacy name resolution in Active Directory (GPO paths, the pilot ring and the packet-capture pre-checks)
- Cisco: IPv6 DHCPv6 Guard configuration
- Cisco: IPv6 RA Guard configuration and restrictions
- Cisco: IPv6 First Hop Security (the policy model both guards live in)
If you've hit a variation of this on your own estate, or something here doesn't match what you're seeing, corrections and edge cases are always welcome :)
exit(0);
Ship the fix. Prove it’s closed.
If this runbook doesn’t fit your stack, send the CVE — an operator writes a verified path, usually within a business day. Or contribute your own and get co-authored credit.