
استطلاع Active Directory وتدقيق أمني للقراءة فقط عبر ADWS (net.tcp/9389)، بلغة Go
adit هي أداة استطلاع Active Directory وتدقيق أمني للقراءة فقط، ثنائية واحدة، تتحدث إلى Domain Controller عبر ADWS (Active Directory Web Services, TCP/9389) بدلاً من LDAP.
adit هو المدخل الأفقي إلى المنجم — الطريق الهادئ للدخول. الاستعلام عن AD عبر ADWS بدلاً من LDAP/389 يعني أن حركة المرور مُؤطَّرة بـ WCF net.tcp، وSOAP بصيغة binary-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، MC-NBFS/NBFSE binary XML، WS-Enumeration/WS-Transfer SOAP |
| المصادقة | NTLMv2 (sign + seal) وKerberos (ccache / keytab / password؛ RFC 4121 sealed GSS) |
| جامعات الاستطلاع | 31 وحدة (انظر أدناه) → CSV لكل وحدة |
| التقارير | مصنف XLSX متعدد الأوراق منسّق + لوحة تحكم HTML قائمة بذاتها (بحث/فرز، شارات الخطورة، scroll-spy) |
| التدقيق الأمني | 27 قاعدة للقراءة فقط (بما فيها 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 (adcs) على ESC1–ESC4/ESC9؛ ويُبلِّغ laps عن من يمكنه قراءة كل كلمة مرور؛ ويُدقِّق protectedgroups على Protected Users. شغّل adit -list-modules للقائمة الحالية.
يشغّل -audit 27 قاعدة للقراءة فقط. تحمل النتائج معرّف القاعدة، والخطورة، والكائنات المتأثرة، والأدلة، والمعالجة، وتُكتب إلى 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 pre-auth معطّل (قابل لـ AS-REP roast) |
| AD-USR-009 | عالية | الحساب يستخدم تشفير DES فقط |
| AD-CMP-006 | عالية | تفويض غير مقيّد على جهاز غير DC |
| AD-KCL-001 | عالية | Key Credential (shadow credential) على حساب مميّز |
| AD-KRB-001 | عالية | كلمة مرور krbtgt قديمة |
| AD-DOM-005 | متوسطة | حصة حساب الجهاز > 0 (أي مستخدم يمكنه ضم أجهزة) |
| AD-USR-002 | متوسطة | حساب خدمة قابل لـ Kerberoast (عالية إذا كان مميّزاً) |
| 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 مميّز |
العتبات قابلة للضبط: -krbtgt-max-age، -priv-pwd-max-age، -stale-days.
ملاحظة ADCS: تُقيَّم ESC1–ESC5 وESC9 من كائنات AD عبر ADWS. أما ESC6 (
EDITF_ATTRIBUTESUBJECTALTNAME2)، وESC7 (ACLs دور 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 الخاص به): يُطابَق ترويسة ADWS SOAP To مع نقطة النهاية بواسطة 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
# Recon + audit: findings lead the XLSX + HTML dashboard
adit -dc 10.0.0.10 -fqdn dc01.example.local -d EXAMPLE.LOCAL -u user -p 'pass' \
-collect all -audit -o ./report
# Password (synthesises a krb5.conf from the domain + DC if none is present)
adit -dc 10.0.0.10 -fqdn dc01.example.local -d EXAMPLE.LOCAL -u user -p 'pass' -auth kerberos
# Existing ticket cache
KRB5CCNAME=/tmp/krb5cc_1000 adit -dc 10.0.0.10 -fqdn dc01.example.local \
-d EXAMPLE.LOCAL -u user -auth kerberos -ccache /tmp/krb5cc_1000
ADWS هي خدمة ويب لكنها ليست HTTP — فهي تسير على TCP خام على المنفذ 9389 — ومع ذلك لا يزال الوكيل يمرّر تدفق TCP هذا. حيثما يسمح البروتوكول (SOCKS5/4a، HTTP CONNECT) يُحلّ اسم DC عند الوكيل، لذا يعمل اسم داخلي فقط.