
عميل عملي لـ 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 Put$ 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.
تدعم sopa أوضاع بيانات الاعتماد التالية:
# كلمة المرور
$ sopa --dc <DC> -d <DOMAIN> -u <USER> -p <PASS> <subcommand> [...]
# تجزئة NT
$ sopa --dc <DC> -d <DOMAIN> -u <USER> -H <NT_HASH> <subcommand> [...]
# مفتاح جلسة AES (يُفترض Kerberos)
# 32 حرفًا سداسي عشري = AES-128، 64 حرفًا سداسي عشري = AES-256
$ sopa --dc <DC> -d <DOMAIN> -u <USER> --aes-key <HEX_KEY> <subcommand> [...]
# ccache Kerberos (يُفترض Kerberos)
$ sopa --dc <DC> -d <DOMAIN> -u <USER> -c <CCACHE_PATH> <subcommand> [...]
# شهادة PFX (يُفترض Kerberos / عبر PKINIT)
$ sopa --dc <DC> -d <DOMAIN> -u <USER> --pfx <CERT.pfx> --pfx-password <PFX_PASS> <subcommand> [...]
# شهادة PEM (يُفترض Kerberos / عبر PKINIT)
$ sopa --dc <DC> -d <DOMAIN> -u <USER> --cert <CERT.pem> --key <KEY.pem> <subcommand> [...]
يمكن توجيه جميع اتصالات TCP (ADWS, Kerberos, DNS) عبر وكيل SOCKS5 باستخدام -x / --socks5:
# توجيه كل شيء عبر وكيل SOCKS5
$ sopa -x 127.0.0.1:1080 --dc dc.corp.local -d corp.local -u user -p pass query --filter '(objectClass=user)'
# استخدام DNS الخاص بـ DC من خلال الوكيل، ثم الاتصال عبر الوكيل
$ sopa -x 127.0.0.1:1080 --dns 192.168.1.10 --dc 192.168.1.10 -d corp.local -u user -p pass query --filter '(objectClass=user)'
# الاحتفاظ بـ DNS محليًا (مثلاً DNS يمكن الوصول إليه بدون وكيل)، فقط توجيه اتصالات TCP
$ sopa -x 127.0.0.1:1080 --no-proxy-dns --dc dc.corp.local -d corp.local -u user -p pass query --filter '(objectClass=user)'
المساهمات مرحب بها عن طريق فتح مشكلة أو تقديم طلب سحب.
جاءت فكرة كتابة هذه الأداة من موجة من الأدوات المركزة على ADWS، بشكل أساسي لأغراض التهرب. من الناحية النظرية، كل ما يمكن فعله باستخدام هذه الأدوات يمكن فعله أيضًا باستخدام sopa، ولكن إذا كنت ترغب في تنفيذ إجراءات أكثر تعقيدًا/تحديدًا، تحقق منها أيضًا:
ترخيص MIT (MIT)
حقوق الطبع والنشر (c) 2023 Artur Henrique Marzano Gonzaga
يُمنح الإذن مجانًا لأي شخص يحصل على نسخة من هذا البرنامج وملفات التوثيق المرتبطة به (الـ "برنامج")، للتعامل مع البرنامج دون قيود، بما في ذلك دون حصر حقوق استخدام ونسخ وتعديل ودمج ونشر وتوزيع و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين يتلقون البرنامج بالقيام بذلك، وذلك مع مراعاة الشروط التالية:
يجب تضمين إشعار حقوق الطبع والنشر أعلاه وإذن الإشعار هذا في جميع النسخ أو الأجزاء الجوهرية من البرنامج.
البرنامج مُقدم "كما هو"، دون ضمان من أي نوع، صريح أو ضمني، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق والملاءمة لغرض معين وعدم الانتهاك. في أي حال من الأحوال، لا يكون المؤلفون أو أصحاب حقوق الطبع والنشر مسؤولين عن أي مطالبة أو أضرار أو مسؤولية أخرى، سواء في دعوى تعاقدية أو تقصيرية أو غير ذلك، تنشأ عن أو فيما يتعلق بالبرنامج أو استخدامه أو تعاملات أخرى مع البرنامج.
set-password: تعيين كلمة مرور حساب عبر MS-ADCAP SetPasswordchange-password: تغيير كلمة مرور حساب (يتطلب كلمة المرور القديمة) عبر MS-ADCAP ChangePasswordtranslate-name: تحويل بين تنسيق DN والاسم المتعارف عليه عبر TranslateNamegroups: عرض عضويات المجموعة أو مجموعات التفويض لكيان رئيسي عبر GetADPrincipalGroupMembership / GetADPrincipalAuthorizationGroupmembers: تعداد أعضاء المجموعة (متكرر اختياريًا) عبر GetADGroupMemberoptfeature: تشغيل/إيقاف ميزات AD الاختيارية (مثل سلة المحذوفات) عبر ChangeOptionalFeatureinfo: استرجاع بيانات تعريف الطوبولوجيا (الإصدار، المجال، الغابة، قائمة وحدات التحكم بالمجال) عبر GetVersion, GetADDomain, GetADForest, GetADDomainControllersmex: جلب بيانات نقطة نهاية خدمة ADWS عبر طلب WS-MetadataExchange غير مصادق عليه| العلم | الوصف |
|---|
--dns <host[:port]> | خادم DNS مخصص لجميع عمليات البحث (SRV, PTR, forward). المنفذ الافتراضي 53. |
--dns-tcp | فرض استعلامات DNS عبر TCP بدلاً من UDP. مفيد عندما يكون UDP محظورًا أو تكون استجابات SRV كبيرة. |
-x / --socks5 <host:port> | توجيه جميع اتصالات TCP عبر وكيل SOCKS5. يتم أيضًا توجيه استعلامات DNS عبر الوكيل ما لم يتم تعيين --no-proxy-dns. |
--no-proxy-dns | عندما يكون --socks5 نشطًا، قم بحل DNS عبر محلل النظام المحلي بدلاً من الوكيل. |
--dns-timeout <duration> | مهلة عمليات DNS (الافتراضي 10 ثوانٍ). |
--tcp-timeout <duration> | مهلة اتصال TCP وعمليات بروتوكول ADWS (الافتراضي 30 ثانية). |