
pyCobaltHound Cobalt Strike के लिए एक Aggressor स्क्रिप्ट एक्सटेंशन है जिसका उद्देश्य Cobalt Strike और Bloodhound के बीच गहरा एकीकरण प्रदान करना है।
pyCobaltHound Cobalt Strike के लिए एक Aggressor स्क्रिप्ट एक्सटेंशन है जिसका उद्देश्य Cobalt Strike और Bloodhound के बीच गहन एकीकरण प्रदान करना है।
pyCobaltHound रेड टीम ऑपरेटरों की सहायता करने का प्रयास करता है:
BloodHound डेटाबेस से क्वेरी करना।इसे पूरा करने के लिए, pyCobaltHound अंतर्निहित क्वेरीज़ के एक सेट का उपयोग करता है। ऑपरेटर अपनी स्वयं की क्वेरीज़ जोड़/हटा भी सकते हैं ताकि pyCobaltHound की निगरानी क्षमताओं को ठीक से ट्यून किया जा सके। यह उन्हें अभियानों के दौरान को तुरंत अनुकूलित करने की लचीलापन प्रदान करता है, ताकि अभियान-विशिष्ट लक्ष्यों (उपयोगकर्ता, होस्ट आदि) को ध्यान में रखा जा सके।
pyCobaltHoundpyCobaltHound को स्थापित करने के लिए इस रिपॉजिटरी को क्लोन करें। शामिल सबमॉड्यूल को भी क्लोन करना न भूलें!
आप निम्नलिखित कमांड का उपयोग कर सकते हैं:
git clone https://github.com/NVISOsecurity/pyCobaltHound.git --recurse-submodulesसुनिश्चित करें कि निम्नलिखित निर्भरताएँ सही ढंग से स्थापित हैं:
PyCobalt Cobalt Strike के लिए एक Python API है। यह कई Aggressor फ़ंक्शन को सीधे Python से उपयोग करने के लिए प्रस्तुत करता है।
सुनिश्चित करें कि आपके पास Python3+ स्थापित है। जबकि PyCobalt macOS और Windows पर भी काम कर सकता है, हमने वास्तव में इसका परीक्षण केवल Linux पर किया है।
PyCobalt Python लाइब्रेरी का उपयोग करने के दो तरीके हैं:
pyCobaltHound इस दृष्टिकोण को अपनाता है, Python प्रोग्राम के अंदर sys.path वेरिएबल का उपयोग करके खोज पथ सेट करता है।PyCobalt Python लाइब्रेरी स्थापित करें। ऐसा करने के लिए, python3 setup.py install चलाएं। आपको pycobalthound.py को संशोधित करना होगा ताकि यह सुनिश्चित हो सके कि यह शामिल रिपॉजिटरी के बजाय स्थापित लाइब्रेरी का उपयोग करता है।ध्यान दें कि भविष्य में PyCobalt परियोजना के रखरखाव की कोई गारंटी नहीं है। वास्तव में, परियोजना में नवीनतम अपडेट Cobalt Strike 4.2 में किए गए परिवर्तनों को शामिल करना था। चूंकि pyCobaltHound वास्तव में Cobalt Strike और इसके ऑपरेटर के साथ इंटरफेस करने के लिए केवल बुनियादी Aggressor फ़ंक्शन का उपयोग करता है, यह pyCobaltHound के लिए कोई बड़ी समस्या नहीं है।
इस परियोजना में उपयोग किया गया PyCobalt सबमॉड्यूल हमारे द्वारा किया गया एक फोर्क है। हालाँकि, हम PyCobalt रिपॉजिटरी को नियंत्रित नहीं करते हैं।
PyCobalt चल रहे Python स्क्रिप्ट को प्रबंधित करने के लिए कुछ Script Console कमांड के साथ आता है। जब आप अपनी Aggressor स्क्रिप्ट को रीलोड करते हैं, तो आपको पहले Python स्क्रिप्ट को स्पष्ट रूप से रोक देना चाहिए। अन्यथा वे कुछ किए बिना हमेशा चलती रहेंगी। pyCobaltHound के विकास के दौरान हमने देखा कि इससे अपरिभाषित व्यवहार भी हो सकता है।
pyCobaltHound को रीलोड करना निम्नानुसार किया जा सकता है:
aggressor> python-stop-all`
[pycobalt] Asking script to stop: /root/pycobalthound/pycobalthound.py
[pycobalt] Script process exited: /root/pycobalthound/pycobalthound.py
aggressor> reload example.cna`
[pycobalt] Executing script /root/pycobalthound/pycobalthound.py
PyCobalt के ठीक से काम करने के लिए आप केवल एक Aggressor स्क्रिप्ट में PyCobalt को कॉल कर सकते हैं। यदि आप pyCobaltHound को अन्य Aggressor स्क्रिप्ट के साथ उपयोग करना चाहते हैं जो PyCobalt का उपयोग करते हैं, तो इसे ध्यान में रखें। हमारा दृष्टिकोण प्रत्येक PyCobalt आधारित टूल के लिए python() और include() के कॉल के साथ एक Aggressor स्क्रिप्ट रखना है।
notify2 Linux पर डेस्कटॉप सूचनाएं प्रदर्शित करने का एक पैकेज है (या था)। जैसा कि हम बाद में देखेंगे, pyCobaltHound ऑपरेटर को सूचित करने के कुछ तरीकों का समर्थन करता है। notify2 का उपयोग Linux पर D-Bus के माध्यम से नोटिफिकेशन डेमॉन को सूचनाएं भेजने के लिए किया जाता है।
इसे सक्षम करने के लिए, notify2 को निम्नलिखित का उपयोग करके स्थापित करने की आवश्यकता है:
pip install notify2
Cobalt Strike में pyCobaltHound का उपयोग करना उतना ही सरल है जितना कि अपने क्लाइंट में pycobalthound.cna Aggressor स्क्रिप्ट को आयात करना। एक बार यह हो जाने के बाद, आपको अपने Cobalt Strike मेन्यूबार में pyCobaltHound मेनू दिखाई देना चाहिए।

pyCobaltHound का प्रारंभिक लक्ष्य नई प्रविष्टियों के लिए Cobalt Strike के क्रेडेंशियल कैश (View > Credentials) की निगरानी करना था। यह Cobalt Strike द्वारा क्रेडेंशियल स्टोर में परिवर्तन होने पर फायर किए जाने वाले on_credentials इवेंट पर प्रतिक्रिया करके ऐसा करता है।
जब यह इवेंट फायर होता है, तो pyCobaltHound निम्नलिखित करेगा:
Cobalt Strike से प्राप्त डेटा को पार्स और मान्य करेंBloodHound डेटाबेस में मौजूद हैंBloodHound डेटाबेस से क्वेरी करेंचूंकि यह सब मुख्य Cobalt Strike क्लाइंट से अतुल्यकालिक रूप से होता है, इसलिए इस प्रक्रिया को आपके UI को अवरुद्ध नहीं करना चाहिए, ताकि आप pyCobaltHound के पृष्ठभूमि में जांच करते रहने के दौरान काम करते रह सकें।
pyCobaltHound एकाधिक टीमसर्वर का उपयोग करते समय समस्याओं को रोकने के लिए प्रति टीमसर्वर अलग-अलग कैश का उपयोग करता है।
कभी-कभी ऐसी स्थितियाँ होती हैं जहाँ आप विशिष्ट उपयोगकर्ताओं (या संपूर्ण क्रेडेंशियल स्टोर) की फिर से जांच करना चाहते हैं। ऐसा तब हो सकता है जब आपने BloodHound डेटाबेस में नया डेटा अपलोड किया हो।
चूंकि pyCobaltHound ने आपके क्रेडेंशियल स्टोर में सभी संस्थाओं की पहले ही जांच कर ली होनी चाहिए (और इसलिए कैश कर लिया है), यह कुछ ऑपरेटर हस्तक्षेप के बिना इस नए डेटा के विरुद्ध उनका मूल्यांकन नहीं करेगा।
ऑपरेटरों के लिए यह नियंत्रित करने के लिए दो विधियाँ उपलब्ध हैं कि कौन सी संस्थाएँ कैश की गई हैं।
ऐसे मामलों में जहाँ आप कैश से किसी विशिष्ट इकाई (या एकाधिक) को हटाना चाहते हैं, आप क्रेडेंशियल व्यूअर (View > Credentials) में ऐसा कर सकते हैं। बस अपने लक्ष्य(ों) का चयन करें और pyCobaltHound मेनू प्रविष्टि के तहत remove from cache विकल्प पर क्लिक करें।
ऐसे मामलों में जहाँ आप कैश से सभी संस्थाओं को हटाना चाहते हैं, आप pyCobaltHound के मुख्य मेनू (Cobalt Strike > pyCobaltHound > Wipe cache) में ऐसा कर सकते हैं। यह तब सबसे उपयोगी होता है जब आप अपने पूरे क्रेडेंशियल स्टोर का पुनर्मूल्यांकन करना चाहते हैं।

अपने लक्ष्यों को कैश से हटाने के बाद, आप मैन्युअल रूप से pyCobaltHound को क्रेडेंशियल स्टोर की सामग्री की फिर से जांच करने के लिए प्रॉम्प्ट कर सकते हैं। यह बिल्कुल उपरोक्त प्रक्रिया का पालन करता है।
pyCobaltHound में मौजूदा बीकन सत्रों के साथ बातचीत करने की कार्यक्षमता शामिल है। यह बीकन संदर्भ मेनू में पाया जा सकता है। ध्यान दें कि इन कमांड को एकल बीकन या बीकन के चयन पर निष्पादित किया जा सकता है।

यह कार्यक्षमता विशेष रूप से उन उपयोगकर्ताओं और कंप्यूटरों से निपटने में उपयोगी है जिनके क्रेडेंशियल्स से समझौता नहीं किया गया है (अभी तक), लेकिन जो प्रभावी रूप से हमारे नियंत्रण में हैं (उदाहरण के लिए क्योंकि हमारे पास उनके सत्र टोकन के तहत चल रहा एक बीकन है)।
Mark as owned कार्यक्षमता (pyCobaltHound > Mark as owned) का उपयोग BloodHound डेटाबेस में एक बीकन (या बीकन के संग्रह) को owned के रूप में चिह्नित करने के लिए किया जा सकता है।

यह डायलॉग ऑपरेटर से निम्नलिखित जानकारी मांगेगा:
pyCobaltHound केवल कंप्यूटरों को owned के रूप में चिह्नित करेगा यदि बीकन सत्र स्थानीय व्यवस्थापक, SYSTEM या किसी अन्य उपयोगकर्ता के रूप में उच्च अखंडता सत्र के रूप में चल रहा है।Investigate कार्यक्षमता (pyCobaltHound > Mark as owned) का उपयोग बीकन (या बीकन के संग्रह) से संबद्ध उपयोगकर्ताओं और होस्टों की जांच करने के लिए किया जा सकता है।

यह डायलॉग ऑपरेटर से निम्नलिखित जानकारी मांगेगा:
pyCobaltHound केवल कंप्यूटरों की जांच करेगा यदि बीकन सत्र स्थानीय व्यवस्थापक, SYSTEM या किसी अन्य उपयोगकर्ता के रूप में उच्च अखंडता सत्र के रूप में चल रहा है।pyCobaltHound अखंडता स्तरों की जांच किए बिना सभी संस्थाओं की जांच करेगा।pyCobaltHound में स्वतंत्र रूप से संस्थाओं की जांच करने की कार्यक्षमता शामिल है। यह मुख्य मेनू (Cobalt Strike > pyCobaltHound > Investigate) में पाया जा सकता है।
यह कार्यक्षमता विशेष रूप से उन उपयोगकर्ताओं और कंप्यूटरों से निपटने में उपयोगी है जिनके क्रेडेंशियल से समझौता नहीं किया गया है और जो हमारे नियंत्रण में नहीं हैं।

यह डायलॉग ऑपरेटर से निम्नलिखित जानकारी मांगेगा:
pyCobaltHound का सेटिंग्स मेनू Cobalt Strike > pyCobaltHound > Settings के अंतर्गत पाया जा सकता है।

pyCobaltHound आपकी सेटिंग्स को डिस्क पर सहेजेगा। हर बार जब pyCobaltHound को रीलोड किया जाता है, तो यह सेटिंग्स फ़ाइल के अस्तित्व की जांच करेगा और यदि यह एक पाता है तो सहेजी गई सेटिंग्स को लोड करेगा।
pyCobaltHound प्रति टीमसर्वर एक सेटिंग्स फ़ाइल सहेजता है, इसलिए विभिन्न टीमसर्वरों पर अलग-अलग सेटिंग्स रखना संभव है।
BloodHound डेटाबेस में प्रमाणीकरण करने के लिए, pyCobaltHound को निम्नलिखित जानकारी की आवश्यकता होगी:
नोट: यदि आप अपनी सेटिंग्स को स्थायी रूप से सहेजना चुनते हैं (उन्हें क्लाइंट/होस्ट रीबूट में संरक्षित करने के लिए) pyCobaltHound इन क्रेडेंशियल्स को डिस्क पर डी-सीरियलाइज़ और संग्रहीत करेगा।
जैसा कि पहले चर्चा की गई, pyCobaltHound यह सुनिश्चित करने के लिए कैशिंग का उपयोग करता है कि यह अनावश्यक कार्य न करे। इस कैशिंग को सेटिंग्स में अक्षम किया जा सकता है। यह ज्यादातर नई क्वेरीज़ विकसित करते समय उपयोगी होता है ताकि आपको लगातार कैश का प्रबंधन/मिटाना न पड़े।
pyCobaltHound एक बार जब यह रुचि की कोई इकाई की पहचान कर लेता है, तो ऑपरेटर को सूचित करने के कुछ अलग-अलग तरीकों का समर्थन करता है। इन सूचनाओं को अक्षम करना संभव है।
डिफ़ॉल्ट रूप से, pyCobaltHound डिफ़ॉल्ट Aggressor मैसेजबॉक्स का उपयोग करके ऑपरेटर को सूचित करेगा। यह विकल्प ऑपरेटर के वर्कफ़्लो को कर सकता है। हालाँकि, यह डिफ़ॉल्ट विधि है क्योंकि यह प्रत्येक प्लेटफ़ॉर्म पर समर्थित है जहाँ आप Cobalt Strike क्लाइंट चला सकते हैं।

pyCobaltHound Linux पर डेस्कटॉप सूचनाएं प्रदर्शित करने का भी समर्थन करता है। यह हमारा पसंदीदा विकल्प है क्योंकि यह ऑपरेटर के वर्कफ़्लो को बाधित नहीं करता है।

अपने कुछ वर्कफ़्लो के दौरान, pyCobaltHound एक HTML रिपोर्ट उत्पन्न करेगा। यह डिज़ाइन विकल्प ऑपरेटर को बड़ी संख्या में संस्थाओं की जांच किए जाने पर विशाल सूचनाओं से स्पैम करने से बचने के लिए बनाया गया था। ये रिपोर्ट reports फ़ोल्डर में उत्पन्न की जाएंगी। रिपोर्ट जनरेशन को अक्षम करना संभव है।

डिफ़ॉल्ट रूप से, pyCobaltHound सभी क्वेरी-संबंधित सेटिंग्स के लिए एक केंद्रीय फ़ाइल का उपयोग करके टीमसर्वरों में क्वेरीज़ को सिंक्रनाइज़ करेगा। इसका मतलब है कि एक टीमसर्वर पर सक्षम, जोड़ी या हटाई गई क्वेरीज़ अन्य टीमसर्वरों द्वारा की गई क्वेरीज़ में भी सक्षम, जोड़ी, हटाई जाएंगी। यह ज्यादातर एक सुविधा विकल्प है और इसे अक्षम किया जा सकता है, जो उन मामलों में उपयोगी है जहाँ आप अभियान-विशिष्ट क्वेरीज़ चला रहे हैं जो उन सभी टीमसर्वरों पर लागू नहीं होती हैं जिनसे आप जुड़े हैं।
जब क्वेरी सिंक्रनाइज़ेशन अक्षम होता है, pyCobaltHound अद्वितीय क्वेरी फ़ाइलों के अस्तित्व की जांच करेगा। यदि ये मौजूद हैं, तो यह उन्हें लोड करेगा और अपने वर्कफ़्लो के दौरान इन क्वेरीज़ का उपयोग करेगा। यदि फ़ाइलें मौजूद नहीं हैं, तो यह उन्हें बनाएगा और लोड करेगा। यह सेटिंग रीलोड के माध्यम से बनी रहेगी।
जब क्वेरी सिंक्रनाइज़ेशन सक्षम होता है, pyCobaltHound अद्वितीय क्वेरी फ़ाइलों के अस्तित्व की जांच करेगा। यदि ये मौजूद हैं, तो ऑपरेटर को एक विकल्प के लिए संकेत दिया जाएगा।

ऑपरेटर के पास निम्नलिखित विकल्प हैं:
pyCobaltHound बस अद्वितीय क्वेरी फ़ाइलों को हटा देगा। सभी कस्टम क्वेरीज़ खो जाएंगी।pyCobaltHound अद्वितीय क्वेरी फ़ाइलों को सामान्य क्वेरी फ़ाइलों में मर्ज करने का प्रयास करेगा। क्वेरी मर्ज करने से पहले, यह जांच करेगा कि सामान्य फ़ाइल में उसी नाम या उसी साइफर स्टेटमेंट वाली कोई क्वेरी तो नहीं है। यदि कोई मर्ज विरोध होता है, तो ऑपरेटर से पूछा जाएगा कि क्या वे गैर-मर्ज की गई क्वेरीज़ को रखना चाहते हैं। उन्हें एक अलग फ़ाइल में सहेजा जाएगा। फिर अद्वितीय क्वेरी फ़ाइलों को हटा दिया जाएगा।pyCobaltHound बस अद्वितीय क्वेरी फ़ाइलों को छोड़ देगा। सभी कस्टम क्वेरीज़ संरक्षित रहेंगी और यदि क्वेरी सिंक्रनाइज़ेशन फिर से अक्षम किया जाता है तो फ़ाइलें फिर से लोड की जाएंगी।pyCobaltHound वर्तमान में निम्नलिखित अंतर्निहित क्वेरीज़ का समर्थन करता है:
pyCobaltHound द्वारा उपयोग की जाने वाली विभिन्न क्वेरीज़ का प्रबंधन मुख्य मेनू (Cobalt Strike > pyCobaltHound > Queries) के माध्यम से किया जा सकता है।

Update queries डायलॉग ऑपरेटरों को विशिष्ट क्वेरीज़ को सक्षम/अक्षम करने की अनुमति देता है। इस डायलॉग का उपयोग करते समय, ऑपरेटर से पहले पूछा जाएगा कि वे किस प्रकार की क्वेरीज़ को अपडेट करना चाहते हैं। ऐसा इस वर्कफ़्लो के दौरान सही क्वेरीज़ को गतिशील रूप से रेंडर/लोड करने के लिए किया जाता है।

पहले डायलॉग का उत्तर देने के बाद, ऑपरेटर को उस प्रकार की सभी उपलब्ध क्वेरीज़ की एक सूची प्रस्तुत की जाएगी। यहाँ वे चुन सकते हैं कि वे किन क्वेरीज़ को सक्षम/अक्षम करना चाहते हैं।

क्वेरी प्रकार का विकल्प वर्कफ़्लो में अगले फ़ंक्शन को क्वेरी प्रकार पास करने के लिए एक बदसूरत वर्कअराउंड है और ऑपरेटर के लिए चिंता का विषय नहीं है।
Add query कार्यक्षमता ऑपरेटरों को pyCobaltHound की जांच क्षमताओं को ठीक करने के लिए अपनी स्वयं की क्वेरीज़ जोड़ने/हटाने की अनुमति देती है। यह उन्हें अभियानों के दौरान pyCobaltHound को तुरंत अनुकूलित करने की लचीलापन प्रदान करती है, ताकि अभियान-विशिष्ट लक्ष्यों (उपयोगकर्ता, होस्ट आदि) को ध्यान में रखा जा सके।

यह डायलॉग ऑपरेटर से निम्नलिखित जानकारी मांगेगा:
pyCobaltHound के वर्कफ़्लो के दौरान विभिन्न मेनू और रिपोर्ट में किया जाएगा।pyCobaltHound को निष्पादित करने की आवश्यकता है। ऑपरेटर अपनी क्वेरीज़ को परिभाषित करने के लिए काफी स्वतंत्र हैं। केवल निम्नलिखित आवश्यकताएं हैं:
pyCobaltHound गतिशील रूप से निम्नलिखित Cypher स्ट्रिंग उत्पन्न करता है जो उन इकाई नामों पर आधारित है जिनकी वह जांच कर रहा है:
WITH [account names here] AS samAccountNames UNWIND samAccountNames AS names.MATCH (x) WHERE x.name STARTS WITH names(x:User)) की अनुशंसा करता हूँ।pyCobaltHound अपेक्षा करता है कि क्वेरी उपयोगकर्ता नामों का एक विशिष्ट सेट लौटाए।
RETURN DISTINCT (x.name) के साथ समाप्त करें।pyCobaltHound कस्टम क्वेरी के लिए उपयोग करता है। इसका उपयोग pyCobaltHound के वर्कफ़्लो के दौरान सूचनाओं और रिपोर्ट में किया जाएगा।
pyCobaltHound इस क्वेरी के परिणामों की संख्या से बदल देगा।Delete query डायलॉग ऑपरेटरों को pyCobaltHound से विशिष्ट कस्टम क्वेरीज़ हटाने की अनुमति देता है। इस डायलॉग का उपयोग करते समय, ऑपरेटर से पहले पूछा जाएगा कि वे किस प्रकार की क्वेरी को हटाना चाहते हैं। ऐसा इस वर्कफ़्लो के दौरान सही क्वेरीज़ को गतिशील रूप से रेंडर/लोड करने के लिए किया जाता है।

पहले डायलॉग का उत्तर देने के बाद, ऑपरेटर को उस प्रकार की सभी उपलब्ध क्वेरीज़ की एक सूची प्रस्तुत की जाएगी। यहाँ वे चुन सकते हैं कि वे किन क्वेरीज़ को हटाना चाहते हैं।

क्वेरी प्रकार का विकल्प वर्कफ़्लो में अगले फ़ंक्शन को क्वेरी प्रकार पास करने के लिए एक बदसूरत वर्कअराउंड है और ऑपरेटर के लिए चिंता का विषय नहीं है।
pyCobaltHound निम्नलिखित से उपयोग/प्रेरणा लेता है: