
Golang में ADWS के लिए एक व्यावहारिक क्लाइंट।
Golang में ADWS के लिए एक व्यावहारिक क्लाइंट।
Sopa, ADWS प्रोटोकॉल स्टैक (MS-NNS + MC-NMF + SOAP) को लागू करता है, जो निम्नलिखित कमांड-लाइन सुविधाएँ प्रदान करता है:
query: WS-Enumeration Enumerate + Pull लूप के माध्यम से LDAP-फ़िल्टर खोज चलाता है जिसमें एट्रीब्यूट प्रोजेक्शन, स्कोप नियंत्रण (Base/OneLevel/Subtree), और पेजिनेशन होता हैget: WS-Transfer Get के माध्यम से DN द्वारा एक एकल ऑब्जेक्ट प्राप्त करता हैcreate: WS-Transfer ResourceFactory के माध्यम से ऑब्जेक्ट बनाता है (अंतर्निहित प्रकार: user, computer, group, OU, container; या IMDA AddRequest के माध्यम से YAML टेम्पलेट से कस्टम ऑब्जेक्ट)delete: WS-Transfer Delete के माध्यम से DN द्वारा किसी ऑब्जेक्ट को हटाता हैattr: WS-Transfer Put के माध्यम से किसी मौजूदा ऑब्जेक्ट पर व्यक्तिगत एट्रीब्यूट मान जोड़ता है, बदलता है, या हटाता है$ go install github.com/Macmod/sopa/cmd/sopa@latest
# Auth flags (-u, -p, -d, -k, -H, -c, ...) are omitted for brevity - see Authentication section.
# Search objects by LDAP filter
$ sopa [auth_flags] query --dc <DC> --filter '(objectClass=*)'
# Fetch a single object by DN
$ sopa [auth_flags] get --dc <DC> --dn '<DN>'
# Delete an object by DN
$ sopa [auth_flags] delete --dc <DC> --dn '<DN>'
# Edit attribute values
$ 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>
# Create objects
$ 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>
# Set / change account passwords (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>
# Translate DN <-> canonical name (MS-ADCAP)
# (this call is mostly useless but kept for completeness 😄)
$ sopa [auth_flags] translate-name --dc <DC> --offered DistinguishedName --desired CanonicalName '<DN>'
# Principal group memberships (MS-ADCAP)
$ sopa [auth_flags] groups --dc <DC> --dn '<DN>' --membership --authz
# Group members (MS-ADCAP)
$ sopa [auth_flags] members --dc <DC> --dn '<GROUP_DN>' --recursive
# Toggle optional AD feature, e.g. Recycle Bin (MS-ADCAP)
$ sopa [auth_flags] optfeature --dc <DC> --feature-id <FEATURE_GUID> --enable
# Topology info (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 service endpoint metadata (unauthenticated - auth flags not needed)
$ 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 (स्ट्रिंग, आवश्यक): कंटेनर DNrdn (स्ट्रिंग, आवश्यक): नए ऑब्जेक्ट के लिए सापेक्ष DN (जैसे 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 सभी लुकअप के लिए DC के अपने DNS सर्वर का उपयोग करे:
# Option 1: let sopa resolve everything through the DC's DNS
$ sopa query --dns 192.168.1.10 -d corp.local -u user -p pass --filter '(objectClass=user)'
जब --dc छोड़ दिया जाता है और --domain प्रदान किया जाता है, sopa SRV रिकॉर्ड क्वेरी करके स्वचालित रूप से एक DC खोजता है:
_ldap._tcp.<domain> (पहले प्रयास किया गया)
_kerberos._tcp.<domain> (फ़ॉलबैक)
उच्चतम-प्राथमिकता वाले रिकॉर्ड का लक्ष्य उपयोग किया जाता है। इसके लिए आवश्यक है कि --dns द्वारा इंगित DNS सर्वर उन SRV प्रश्नों का उत्तर दे सके - DC का अपना एकीकृत DNS सर्वर (जब मौजूद हो) ऐसा करने में सक्षम होना चाहिए।
# Option 2: provide DC explicitly without Kerberos
$ sopa info version --dc 192.168.1.10 --domain corp.local -u user -p pass
जब --dc के लिए एक IP प्रदान किया जाता है, तो IP हमेशा एक रिवर्स PTR लुकअप के माध्यम से FQDN में हल किया जाता है - ADWS एंडपॉइंट के WCF पता फ़िल्टर को प्रमाणीकरण विधि की परवाह किए बिना wsa:To हेडर में FQDN की आवश्यकता होती है।
यह PTR लुकअप भी --dns के माध्यम से जाता है, इसलिए DC पर एक सही ढंग से कॉन्फ़िगर किया गया रिवर्स ज़ोन आवश्यक है:
# Option 3: IP input - PTR lookup resolves 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 रिज़ॉल्यूशन, ADWS TCP डायल, और Kerberos KDC कनेक्शन - --dns / --dns-tcp से निर्मित एक ही रिज़ॉल्वर का उपयोग करते हैं।
sopa निम्नलिखित क्रेडेंशियल मोड का समर्थन करता है:
# Password
$ sopa --dc <DC> -d <DOMAIN> -u <USER> -p <PASS> <subcommand> [...]
# NT hash
$ sopa --dc <DC> -d <DOMAIN> -u <USER> -H <NT_HASH> <subcommand> [...]
# AES session key (Kerberos is implied)
# 32 hex chars = AES-128, 64 hex chars = AES-256
$ sopa --dc <DC> -d <DOMAIN> -u <USER> --aes-key <HEX_KEY> <subcommand> [...]
# Kerberos ccache (Kerberos is implied)
$ sopa --dc <DC> -d <DOMAIN> -u <USER> -c <CCACHE_PATH> <subcommand> [...]
# PFX certificate (Kerberos is implied / via PKINIT)
$ sopa --dc <DC> -d <DOMAIN> -u <USER> --pfx <CERT.pfx> --pfx-password <PFX_PASS> <subcommand> [...]
# PEM certificate (Kerberos is implied / via PKINIT)
$ sopa --dc <DC> -d <DOMAIN> -u <USER> --cert <CERT.pem> --key <KEY.pem> <subcommand> [...]
सभी TCP कनेक्शन (ADWS, Kerberos, DNS) को -x / --socks5 के माध्यम से SOCKS5 प्रॉक्सी के माध्यम से टनल किया जा सकता है:
# Route everything through a SOCKS5 proxy
$ sopa -x 127.0.0.1:1080 --dc dc.corp.local -d corp.local -u user -p pass query --filter '(objectClass=user)'
# Use the DC's own DNS through the proxy, then connect via proxy
$ 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)'
# Keep DNS local (e.g. DNS already reachable without proxy), only proxy TCP connections
$ 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 से भी किया जा सकता है, लेकिन यदि आप अधिक जटिल/विशिष्ट क्रियाएँ करना चाहते हैं, तो उन्हें भी देखें:
ssp पैकेज ने GSSAPI के साथ प्रमाणीकरण प्रवाह को सहजता से लागू किया।MIT लाइसेंस (MIT)
कॉपीराइट (c) 2023 Artur Henrique Marzano Gonzaga
इसके द्वारा, इस सॉफ़्टवेयर और संबंधित दस्तावेज़ फ़ाइलों (सॉफ़्टवेयर) की एक प्रति प्राप्त करने वाले किसी भी व्यक्ति को बिना किसी प्रतिबंध के, बिना किसी सीमा के सॉफ़्टवेयर में उपयोग, प्रतिलिपि, संशोधन, विलय, प्रकाशन, वितरण, उप-लाइसेंस और/या सॉफ़्टवेयर की प्रतियाँ बेचने के अधिकार सहित, निम्नलिखित शर्तों के अधीन, सॉफ़्टवेयर से निपटने की अनुमति निःशुल्क दी जाती है:
उपरोक्त कॉपीराइट सूचना और यह अनुमति सूचना सॉफ़्टवेयर की सभी प्रतियों या महत्वपूर्ण भागों में शामिल की जाएगी।
सॉफ़्टवेयर "जैसा है" प्रदान किया जाता है, बिना किसी प्रकार की वारंटी के, स्पष्ट या निहित, जिसमें व्यापारिकता, किसी विशेष उद्देश्य के लिए उपयुक्तता और उल्लंघन की वारंटी शामिल है, लेकिन इन्हीं तक सीमित नहीं है। किसी भी स्थिति में लेखक या कॉपीराइट धारक किसी भी दावे, क्षति या अन्य दायित्व के लिए उत्तरदायी नहीं होंगे, चाहे वह अनुबंध, टोर्ट या किसी अन्य कार्यवाही में हो, जो सॉफ़्टवेयर से या सॉफ़्टवेयर के उपयोग या अन्य लेन-देन से उत्पन्न होता है।
set-password: MS-ADCAP SetPassword के माध्यम से खाता पासवर्ड सेट करता हैchange-password: MS-ADCAP ChangePassword के माध्यम से खाता पासवर्ड बदलता है (पुराने पासवर्ड की आवश्यकता है)translate-name: TranslateName के माध्यम से DN और कैनोनिकल नाम प्रारूपों के बीच रूपांतरण करता हैgroups: GetADPrincipalGroupMembership / GetADPrincipalAuthorizationGroup के माध्यम से किसी प्रिंसिपल की समूह सदस्यता या प्राधिकरण समूहों को सूचीबद्ध करता हैmembers: GetADGroupMember के माध्यम से समूह सदस्यों को (वैकल्पिक रूप से पुनरावर्ती) गणना करता हैoptfeature: ChangeOptionalFeature के माध्यम से वैकल्पिक AD सुविधाओं (जैसे Recycle Bin) को टॉगल करता हैinfo: GetVersion, GetADDomain, GetADForest, GetADDomainControllers के माध्यम से टोपोलॉजी मेटाडेटा (संस्करण, डोमेन, फ़ॉरेस्ट, DC सूची) प्राप्त करता हैmex: एक अप्रमाणित WS-MetadataExchange अनुरोध के माध्यम से ADWS सेवा एंडपॉइंट मेटाडेटा प्राप्त करता है| Flag | विवरण |
|---|
--dns <host[:port]> | सभी लुकअप (SRV, PTR, फ़ॉरवर्ड) के लिए कस्टम DNS सर्वर। डिफ़ॉल्ट पोर्ट 53 है। |
--dns-tcp | DNS प्रश्नों को UDP के बजाय TCP पर भेजने के लिए बाध्य करें। तब उपयोगी जब UDP अवरुद्ध हो या SRV प्रतिक्रियाएँ बड़ी हों। |
-x / --socks5 <host:port> | सभी TCP कनेक्शनों को SOCKS5 प्रॉक्सी के माध्यम से रूट करें। जब तक --no-proxy-dns सेट न हो, DNS प्रश्न भी प्रॉक्सी के माध्यम से टनल किए जाते हैं। |
--no-proxy-dns | जब --socks5 सक्रिय हो, तो DNS को प्रॉक्सी के बजाय स्थानीय सिस्टम रिज़ॉल्वर के माध्यम से हल करें। |
--dns-timeout <duration> | DNS संचालनों के लिए टाइमआउट (डिफ़ॉल्ट 10s)। |
--tcp-timeout <duration> | TCP डायल और ADWS प्रोटोकॉल संचालनों के लिए टाइमआउट (डिफ़ॉल्ट 30s)। |