
Pre-Auth-PoC für CVE-2026-41089 Netlogon-CLDAP-Stack-Überlauf über UDP/389, der einen LSASS-Absturz/DC-Neustart auslöst. Enthält Exploit-Skript, Root-Cause-Analyse, Erkennung und Anleitung zur Mitigation.
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Windows Netlogon Remote Code Execution über CLDAP-Stack-Pufferüberlauf
Ein einzelnes UDP-Paket an Port 389 lässt einen 528-Byte-Stack-Puffer in LSASS auf jedem nicht gepatchten Windows-Domänencontroller überlaufen. LSASS stürzt ab. Der DC startet in etwa 60 Sekunden neu. Keine Anmeldedaten erforderlich.
| Angriffsvektor | UDP 389 (CLDAP), Pre-Auth, ohne Anmeldedaten |
| Auswirkung | LSASS-Absturz, DC-Neustart, potenzielle RCE |
| CWE | CWE-121 (Stack-basierter Pufferüberlauf) |
| CVSS-Vektor | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Veröffentlicht | 12. Mai 2026 von Microsoft |
python3 poc.py 10.0.50.21 corp.local
Der PoC sendet zunächst einen normalen Ping, dann einen Overflow-Ping mit einem 130 Zeichen langen Benutzernamen und prüft anschließend, ob der DC überlebt hat. Insgesamt etwa 10 Sekunden.
Windows Server-Versionen, die als Domänencontroller fungieren:
| Serverversion | Behoben in |
|---|---|
| 2012 / 2012 R2 | Nur-ESU-Patches |
| 2016 | 10.0.14393.9140 |
| 2019 | 10.0.17763.8755 |
| 2022 | 10.0.20348.5074 |
| 2022 23H2 | 10.0.25398.2330 |
| 2025 | 10.0.26100.32772 |
NlGetLocalPingResponse reserviert einen 528-Byte-Stack-Puffer und
übergibt ihn an BuildSamLogonResponse. Diese Funktion ruft
NetpLogonPutUnicodeString auf, um Servername, Domänenname, GUIDs
und den vom Angreifer kontrollierten Benutzernamen in den Puffer
zu schreiben.
Der Fehler: NetpLogonPutUnicodeString erhält eine maximale Länge in
Bytes, liest sie jedoch als WCHAR-Anzahl. Jede über diesen Pfad
geschriebene Zeichenkette benötigt die doppelte erwartete Größe. Das
Feld „User“ im CLDAP-Filter (bis zu 130 WCHARs, 260 Bytes auf der
Leitung) schiebt die kombinierte Schreiboperation über die
528-Byte-Grenze hinaus.
I_NetLogonLdapLookupEx
-> NlGetLocalPingResponse // 528-byte stack buffer
-> LogonRequestHandler
-> BuildSamLogonResponse
-> NetpLogonPutUnicodeString // byte/WCHAR size confusion
python3 poc.py <target_ip> <domain_name> [options]
| Flag | Beschreibung | Standard |
|---|---|---|
-l | Benutzername-Länge in Zeichen | 130 |
-t | UDP-Empfangs-Timeout (Sekunden) | 5 |
-d | Verzögerung zwischen Überlauf und Erreichbarkeitsprüfung (Sekunden) | 3 |
# Connectivity test (short username, no overflow)
python3 poc.py 10.0.50.21 corp.local
# Default overflow attempt
python3 poc.py 10.0.50.21 corp.local -l 130
# Larger payload, longer timeout for slow networks
python3 poc.py 10.0.50.21 corp.local -l 200 -t 10
Python 3.8+. Keine Drittanbieter-Pakete.
Der Überlauf verursacht eine DoS (LSASS-Absturz, DC-Neustart). Stack-Korruption könnte RCE ermöglichen, aber dieser PoC bleibt bei DoS.
Netzwerk. Achte auf CLDAP-Suchanfragen mit einem „User“-Filterattribut, das länger als 20–30 Zeichen ist. Normale DC-Locator-Pings verwenden kurze Dienstkontonamen.
Host. Achte auf LSASS-Abstürze im Zusammenhang mit netlogon.dll (Event-ID 1000). Aktiviere die Netlogon-Debugprotokollierung:
nltest /dbflag:0x2080ffff
mov edx, 0x40 halbiert die maximale
Benutzernamenlänge)Rechtliches. Dieser Code dient der autorisierten Sicherheitsforschung und -schulung. Teste nur Systeme, die dir gehören oder für die du eine schriftliche Testgenehmigung hast. Unbefugter Zugriff auf Computersysteme verstößt gegen den CFAA und entsprechende Gesetze in den meisten Rechtsordnungen.