
عميل عملي لـ ADWS في Golang.
عميل عملي لـ ADWS بلغة Golang.
تقوم أداة sopa بتنفيذ مكدس بروتوكول ADWS (MS-NNS + MC-NMF + SOAP)، وتوفر الميزات التالية عبر سطر الأوامر:
query: ينفذ عمليات بحث بمرشحات LDAP عبر حلقة Enumerate + Pull من WS-Enumeration مع إسقاط السمات، والتحكم في النطاق (Base/OneLevel/Subtree)، والترقيمget: يجلب كائنًا واحدًا بواسطة DN عبر WS-Transfer Getcreate: ينشئ كائنات عبر ResourceFactory من WS-Transfer (أنواع مدمجة: مستخدم، حاسب، مجموعة، وحدة تنظيمية، حاوية؛ أو كائنات مخصصة من قالب YAML عبر AddRequest من IMDA)delete: يحذف كائنًا بواسطة DN عبر WS-Transfer Deleteattr: يضيف أو يستبدل أو يزيل قيم سمات فردية على كائن موجود عبر WS-Transfer Putset-password: تعيين كلمة مرور حساب عبر MS-ADCAP SetPasswordchange-password: تغيير كلمة مرور حساب (يتطلب كلمة المرور القديمة) عبر MS-ADCAP ChangePasswordtranslate-name: تحويل بين تنسيق DN والاسم المتعارف عليه عبر TranslateNamegroups: عرض عضويات المجموعة أو مجموعات التفويض لكيان رئيسي عبر GetADPrincipalGroupMembership / GetADPrincipalAuthorizationGroupmembers: تعداد أعضاء المجموعة (متكرر اختياريًا) عبر GetADGroupMemberoptfeature: تشغيل/إيقاف ميزات AD الاختيارية (مثل سلة المحذوفات) عبر ChangeOptionalFeatureinfo: استرجاع بيانات تعريف الطوبولوجيا (الإصدار، المجال، الغابة، قائمة وحدات التحكم بالمجال) عبر GetVersion, GetADDomain, GetADForest, GetADDomainControllersmex: جلب بيانات نقطة نهاية خدمة ADWS عبر طلب WS-MetadataExchange غير مصادق عليه$ go install github.com/Macmod/sopa/cmd/sopa@latest
# تم حذف خيارات المصادقة (-u, -p, -d, -k, -H, -c, ...) للاختصار - انظر قسم المصادقة.
# البحث عن كائنات بواسطة مرشح LDAP
$ sopa [auth_flags] query --dc <DC> --filter '(objectClass=*)'
# جلب كائن واحد بواسطة DN
$ sopa [auth_flags] get --dc <DC> --dn '<DN>'
# حذف كائن بواسطة DN
$ sopa [auth_flags] delete --dc <DC> --dn '<DN>'
# تحرير قيم السمات
$ sopa [auth_flags] attr add --dc <DC> --dn '<DN>' --attr <ATTR> --value <VALUE>
$ sopa [auth_flags] attr replace --dc <DC> --dn '<DN>' --attr <ATTR> --value <VALUE>
$ sopa [auth_flags] attr delete --dc <DC> --dn '<DN>' --attr <ATTR>
# إنشاء كائنات
$ sopa [auth_flags] create user --dc <DC> --name <CN> --pass <INITIAL_PASS>
$ sopa [auth_flags] create computer --dc <DC> --name <CN>
$ sopa [auth_flags] create group --dc <DC> --name <CN> --type GlobalSecurity
$ sopa [auth_flags] create ou --dc <DC> --name <CN>
$ sopa [auth_flags] create container --dc <DC> --name <CN>
$ sopa [auth_flags] create custom --dc <DC> --template <TEMPLATE.yaml>
# تعيين / تغيير كلمات مرور الحسابات (MS-ADCAP)
$ sopa [auth_flags] set-password --dc <DC> --dn '<DN>' --new <NEW_PASS>
$ sopa [auth_flags] change-password --dc <DC> --dn '<DN>' --old <OLD_PASS> --new <NEW_PASS>
# تحويل بين DN والاسم المتعارف عليه (MS-ADCAP)
# (هذه الدعوة غير مفيدة في الغالب ولكنها محفوظة للاكتمال 😄)
$ sopa [auth_flags] translate-name --dc <DC> --offered DistinguishedName --desired CanonicalName '<DN>'
# عضويات مجموعة لكيان رئيسي (MS-ADCAP)
$ sopa [auth_flags] groups --dc <DC> --dn '<DN>' --membership --authz
# أعضاء المجموعة (MS-ADCAP)
$ sopa [auth_flags] members --dc <DC> --dn '<GROUP_DN>' --recursive
# تشغيل/إيقاف ميزة AD اختيارية، مثل سلة المحذوفات (MS-ADCAP)
$ sopa [auth_flags] optfeature --dc <DC> --feature-id <FEATURE_GUID> --enable
# معلومات الطوبولوجيا (MS-ADCAP)
$ sopa [auth_flags] info version --dc <DC>
$ sopa [auth_flags] info domain --dc <DC>
$ sopa [auth_flags] info forest --dc <DC>
$ sopa [auth_flags] info dcs --dc <DC>
# بيانات نقطة نهاية خدمة ADWS (غير مصادق عليه - لا حاجة لخيارات المصادقة)
$ sopa mex --dc <DC>
قم بتشغيل sopa بدون أمر فرعي لفتح صدفة تفاعلية. تعيد استخدام اتصال واحد لجميع الأوامر وتوفر إكمال التبويب.
$ sopa --dc <DC> -u <USER> -p <PASS> -d <DOMAIN>
sopa v1.1.0
Connected dc.corp.local domain=corp.local user=Administrator
Type 'help' for commands or 'exit' to quit.
[corp.local]> query --filter '(objectClass=user)' --attrs sAMAccountName
[corp.local]> get --dn 'CN=Administrator,CN=Users,DC=corp,DC=local'
[corp.local]> exit
استخدم exit أو quit أو Ctrl-D لمغادرة الصدفة.
مثال على القالب: examples/custom-create.example.yaml
مخطط القالب (YAML):
parentDN (سلسلة، مطلوب): DN الحاويةrdn (سلسلة، مطلوب): الاسم النسبي (RDN) للكائن الجديد (مثل CN=Foo)attributes (قائمة، مطلوب): كل عنصر يحتوي على:
name (سلسلة، مطلوب): اسم السمة (cn أو addata:cn)type (سلسلة، اختياري): string|int|bool|base64|hex (أو xsd:* صريحة)، الافتراضي stringvalue (سلسلة) أو values (قائمة سلاسل)ملاحظات:
ad:relativeDistinguishedName أو ad:container-hierarchy-parent في القالب (سيتم حقنها تلقائيًا).hex إلى xsd:base64Binary.value: "".يقبل --dc اسم FQDN أو عنوان IP أو يمكن حذفه.
نظرًا لأن اسم مضيف DC قد لا يكون متاحًا من DNS الافتراضي للشبكة، يوصى بشدة دائمًا بتمرير --dns <DC-IP> بحيث تستخدم sopa خادم DNS الخاص بـ DC لجميع عمليات البحث:
# الخيار 1: دع sopa يحل كل شيء عبر DNS الخاص بـ DC
$ sopa query --dns 192.168.1.10 -d corp.local -u user -p pass --filter '(objectClass=user)'
عندما يتم حذف --dc وتوفير --domain، تكتشف sopa DC تلقائيًا عن طريق الاستعلام عن سجلات SRV:
_ldap._tcp.<domain> (يحاول أولاً)
_kerberos._tcp.<domain> (بديل)
يتم استخدام الهدف من السجل ذي الأولوية الأعلى. يتطلب ذلك أن يتمكن خادم DNS المشار إليه بواسطة --dns من الإجابة على استعلامات SRV تلك - يجب أن يكون خادم DNS المتكامل الخاص بـ DC (عند وجوده) قادرًا على ذلك.
# الخيار 2: توفير DC صريح بدون Kerberos
$ sopa info version --dc 192.168.1.10 --domain corp.local -u user -p pass
عندما يتم توفير IP لـ --dc، يتم دائمًا حل IP إلى اسم FQDN عبر بحث PTR عكسي - يتطلب مرشح عنوان WCF لنقطة نهاية ADWS اسم FQDN في رأس wsa:To بغض النظر عن طريقة المصادقة.
يتم هذا البحث PTR أيضًا عبر --dns، لذلك يلزم وجود منطقة عكسية مهيأة بشكل صحيح على DC:
# الخيار 3: إدخال IP - بحث PTR يحل 192.168.1.10 -> dc.corp.local
$ sopa info version --dc 192.168.1.10 --dns 192.168.1.10 --domain corp.local -u user -p pass
جميع عمليات DNS في المكدس - اكتشاف DC، تحليل PTR، اتصال TCP لـ ADWS، واتصالات KDC الخاصة بـ Kerberos - تستخدم نفس المحلل المبني من --dns / --dns-tcp.