
استطلاع Active Directory وتدقيق أمني للقراءة فقط عبر ADWS (net.tcp/9389)، بلغة Go
adit هي أداة استطلاع لـ Active Directory وأداة تدقيق أمني للقراءة فقط، تعمل كملف تنفيذي واحد (single-binary) وتتواصل مع وحدة تحكم المجال (Domain Controller) عبر ADWS (Active Directory Web Services، TCP/9389) بدلاً من LDAP.
adit هو المدخل الأفقي إلى المنجم — الطريق الهادئ للدخول. إن الاستعلام عن AD عبر ADWS بدلاً من LDAP/389 يعني أن حركة المرور تكون مؤطرة بصيغة WCF net.tcp، وSOAP بصيغة XML ثنائية عبر منفذ غير شائع، لذا يكون من غير المرجح بكثير أن تخضع للفحص أو التصفية أو التوقيع مقارنةً بـ LDAP الكلاسيكي — مع إرجاع نفس بيانات الدليل. تُنفّذ adit حزمة بروتوكول ADWS الكاملة بلغة Go، دون أي تبعيات وقت تشغيل خارجية.
┌────────────┐ net.tcp/9389 ┌──────────────┐
│ adit │ ───────────────▶ │ ADWS on DC │ ──▶ local LDAP
│ (Linux) │ NMF · NNS · │ (port 9389) │
│ │ NBFSE · SOAP └──────────────┘
└────────────┘
adit أداة دفاعية/تدقيقية وللتقييم المصرّح به. لا تشغّلها إلا ضد الأدلة التي لديك تصريح بتقييمها.
| القدرة | التفاصيل |
|---|---|
| النقل | ADWS عبر WCF net.tcp (TCP/9389) — تأطير MC-NMF، ومصافحة MS-NNS، وXML ثنائي MC-NBFS/NBFSE، وSOAP الخاص بـ WS-Enumeration/WS-Transfer |
| المصادقة | NTLMv2 (sign + seal) وKerberos (ccache / keytab / password؛ RFC 4121 sealed GSS) |
| جامعات الاستطلاع | 31 وحدة (انظر أدناه) → CSV لكل وحدة |
| إعداد التقارير | مصنّف XLSX متعدد الأوراق منسّق + لوحة تحكم HTML قائمة بذاتها (بحث/فرز، شارات خطورة، scroll-spy) |
| التدقيق الأمني | 30 قاعدة للقراءة فقط (بما فيها ADCS ESC1–4/9) → JSON مرتّب حسب الخطورة، يظهر أيضًا في لوحة التحكم |
| الوكيل / مضيف العبور | HTTP CONNECT، وSOCKS5/5h، وSOCKS4/4a (مع مصادقة الوكيل + DNS عن بُعد) |
| الترقيم | ترقيم WS-Enumeration Pull من جانب الخادم، بحجم صفحة قابل للتكوين |
| التقارير دون اتصال | إعادة بناء XLSX/HTML من ملفات CSV المجمّعة سابقًا، دون الحاجة إلى DC |
| التبعيات | Go خالص؛ لا مكتبة LDAP، ولا .NET، ولا خدمات خارجية |
forest، domain، trusts، sites، subnets، schemahistory، dcs،
users، userspns، groups، computers، computerspns، ous، gpos،
gplinks، passwordpolicy، fgpp، dnszones، dnsrecords، kerberoastable،
asreproastable، krbtgt، adcs، cas، laps، protectedgroups،
groupmembers، gmsa، dmsa، printers، bitlocker
تُعلِّم adcs الحالات ESC1–ESC4/ESC9؛ وتُبلِّغ laps عن من يمكنه قراءة كل كلمة مرور؛
وتدقّق protectedgroups حسابات Protected Users. شغّل adit -list-modules للحصول على
القائمة الحالية.
يشغّل -audit 30 قاعدة للقراءة فقط. تحمل النتائج معرّف قاعدة وخطورة وكائنات
متأثرة وأدلة وإجراء معالجة، وتُكتب إلى Adit-Audit.json (وعند
دمجها مع -collect، قسم "Audit Findings" يتصدّر
لوحة التحكم). لا يقرأ المحرك قيم السمات السرية أبدًا (LAPS / gMSA /
BitLocker)، رغم أن جامعات الاستطلاع تستطيع ذلك.
| القاعدة | الخطورة | ما الذي تُنبّه إليه |
|---|---|---|
| AD-DOM-010 | حرجة | حقوق DCSync (المزامنة) محتفظ بها بواسطة كيان غير Tier-0 |
| AD-ACL-001/005/006/007/011–016 | حرجة | تحكّم خطير (GenericAll/Write، WriteDACL/Owner، ForceChangePassword، Write SPN / KeyCredentialLink / member / AllowedToAct) على كائن ذي امتيازات |
| AD-SDH-001/002 | حرجة | تحكّم / مالك غير متوقع لـ AdminSDHolder |
| AD-CS-001 | حرجة–متوسطة | ESC1 — قالب الشهادة يسمح بموضوع يقدّمه المسجّل |
| AD-CS-002 | حرجة–متوسطة | ESC2 — قالب شهادة Any-Purpose / بدون EKU |
| AD-CS-003 | عالية–متوسطة | ESC3 — قالب Certificate Request Agent |
| AD-CS-004 | عالية | ESC4 — تحكّم وصول ضعيف على قالب شهادة |
| AD-CS-009 | عالية | ESC9 — قالب الشهادة يفتقر إلى امتداد الأمان |
| AD-CS-005 | حرجة/عالية | ESC5 — تحكّم خطير بكائن PKI (NTAuthCertificates، مخزن CA، كائن CA) |
| AD-CS-006 | معلوماتية | AD CS موجود — تحتاج ESC6/ESC7/ESC8 إلى تحقّق على مستوى المضيف (غير قابل للملاحظة عبر ADWS) |
| AD-DOM-008 | عالية | تشفير كلمات المرور القابل للعكس مُفعّل على مستوى النطاق |
| AD-USR-001 | عالية | المصادقة المسبقة لـ Kerberos معطّلة (قابل لـ AS-REP roasting) |
| AD-USR-009 | عالية | الحساب يستخدم تشفير DES فقط |
| AD-CMP-006 | عالية | تفويض غير مقيّد على جهاز غير DC |
| AD-KCL-001 | عالية | Key Credential (بيانات اعتماد ظلّية) على حساب ذي امتيازات |
| AD-KRB-001 | عالية | كلمة مرور krbtgt قديمة |
| AD-DOM-005 | متوسطة | حصة حسابات الأجهزة > 0 (أي مستخدم يمكنه ضمّ أجهزة) |
| AD-USR-002 | متوسطة | حساب خدمة قابل لـ Kerberoasting (عالية إذا كان ذا امتيازات) |
| AD-USR-005 | متوسطة | PASSWD_NOTREQD مُفعّل |
| AD-USR-006 | متوسطة | كلمة مرور حساب ذي امتيازات لا تنتهي صلاحيتها أبدًا |
| AD-USR-011 | متوسطة | كلمة مرور حساب ذي امتيازات قديمة |
| AD-CMP-008 | متوسطة | تفويض مقيّد قائم على الموارد مُهيّأ |
| AD-CMP-012 | متوسطة | نظام تشغيل قديم / غير مدعوم |
| AD-GRP-009 | متوسطة | كيان أمان أجنبي في مجموعة ذات امتيازات |
| AD-GRP-020 | متوسطة | عضوية مخفية ذات امتيازات عبر primaryGroupID |
| AD-TRU-001/003 | عالية/متوسطة | علاقة ثقة بدون تصفية SID / مع سجل SID |
| AD-DNS-003/004 | متوسطة/منخفضة | سجل WPAD / ISATAP موجود |
| AD-CMP-011 | منخفضة | حساب جهاز قديم |
| AD-INT-005 | عالية | sIDHistory يحتوي على SID ذي امتيازات |
| AD-USR-020 | عالية | كلمة مرور قابلة للاسترداد مخزّنة في userPassword / unixUserPassword |
| AD-USR-021 | عالية | كلمة مرور محتملة متروكة في description / info / comment (استدلالي) |
| AD-DOM-012 | عالية/متوسطة | Everyone / Anonymous / Authenticated Users في Pre-Windows 2000 Compatible Access |
العتبات قابلة للضبط: -krbtgt-max-age، -priv-pwd-max-age، -stale-days.
ملاحظة ADCS: يتم تقييم ESC1–ESC5 وESC9 من كائنات AD عبر ADWS. أما ESC6 (
EDITF_ATTRIBUTESUBJECTALTNAME2) وESC7 (قوائم ACL لأدوار CA) وESC8 (التسجيل عبر الويب / NTLM relay) فتعيش في سجل المضيف الخاص بـ CA / نقاط نهاية HTTP ولا يمكن ملاحظتها عبر ADWS — تُشيرAD-CS-006إلى وجود CA حتى يمكن التحقّق منها على المضيف (مثلًا باستخدام Certipy).
يتطلب Go 1.26+. لا توجد تبعيات بناء أخرى.
# Build the binary
go build -o adit ./cmd/adit
./adit -version
# …or run without installing
go run ./cmd/adit -h
# Cross-compile release archives for linux/windows/darwin (amd64+arm64) into dist/
bash scripts/build-release.sh
يجب أن يكون -fqdn هو الاسم المؤهل بالكامل (FQDN) الحقيقي لوحدة التحكم بالمجال (DC) (وليس عنوان IP الخاص بها): إذ تتم مطابقة ترويسة To الخاصة بـ ADWS SOAP مع نقطة النهاية بواسطة AddressFilter الخاص بـ WCF. اعثر عليه باستخدام، على سبيل المثال، nslookup -type=SRV _ldap._tcp.dc._msdcs.<domain> <dc-ip>.
adit -dc <host> -fqdn <dc-fqdn> -d <DOMAIN> -u <user> -p <pass> [flags]
# RootDSE handshake only (verifies auth + the full protocol stack)
adit -dc 10.0.0.10 -fqdn dc01.example.local -d EXAMPLE.LOCAL -u user -p 'pass'
# Run every collector -> ./report/CSV-Files/*.csv + Adit-Report.{xlsx,html}
adit -dc 10.0.0.10 -fqdn dc01.example.local -d EXAMPLE.LOCAL -u user -p 'pass' \
-collect all -o ./report
# A subset of collectors
adit -dc 10.0.0.10 -fqdn dc01.example.local -d EXAMPLE.LOCAL -u user -p 'pass' \
-collect users,groups,computers,kerberoastable
# Audit only -> Adit-Audit.json
adit -dc 10.0.0.10 -fqdn dc01.example.local -d EXAMPLE.LOCAL -u user -p 'pass' -audit