
Cobalt Strike के External C2 विनिर्देशन के साथ उपयोग के लिए Python API
Cobalt Strike के External C2 विनिर्देश के साथ उपयोग के लिए Python फ्रेमवर्क, जैसा कि विनिर्देश में वर्णित है।
प्राथमिक डिज़ाइन लक्ष्य external c2 विनिर्देश का एक अत्यधिक मॉड्यूलर कार्यान्वयन होना है जो Cobalt Strike के लिए C2 चैनलों को आसानी से लागू करने हेतु पर्याप्त अब्स्ट्रैक्शन प्रदान करता है। आदर्श रूप से, उपयोगकर्ता को केवल एक transport मॉड्यूल, एक encoder मॉड्यूल बनाना होगा और एक नया चैनल लागू करने के लिए एक कॉन्फ़िगरेशन फ़ाइल भरनी होगी।
चालू होने से पहले आपको कई कॉन्फ़िगरेशन परिवर्तन करने होंगे। आपको निम्न की आवश्यकता होगी:
builds/client/dbox/dbox_client.py में, token को चरण 2 में उत्पन्न टोकन से बदलें।builds/server/utils/transports/transport_dbox.py में वही परिवर्तन करें जो आपने 3 में किए थे।cd builds/client/dbox && ./compile_dll.shstart_externalc2.cna स्क्रिप्ट लोड करें।cd builds/server/ && ./dbox_server.py द्वारा निष्पादित करें।वीडियो डेमो का लिंक: https://www.youtube.com/watch?v=nTRHSh_uCcA
इस परियोजना में तीन मुख्य भाग हैं:
बिल्डर निर्दिष्ट कॉन्फ़िगरेशन के आधार पर क्लाइंट और सर्वर डिप्लॉयमेंट को गतिशील रूप से बनाता है। आदर्श रूप से, क्लाइंट को एक एकल संकलित फ़ाइल जैसे dll या exe के रूप में वितरित करने में सक्षम होना चाहिए।
क्लाइंट अनिवार्य रूप से वह पेलोड है जो एंडपॉइंट पर चलता है, जिसे विनिर्देश के भीतर third-party client के रूप में संदर्भित किया जाता है। क्लाइंट का तर्क मुख्य रूप से स्थिर है:
transport का उपयोग करने के लिए आवश्यक किसी भी तैयारी को चलाएँtransport के माध्यम से बीकन से मेटाडेटा को C2 सर्वर तक पहुँचाएँtransport देखेंtransport के माध्यम से बीकन से प्रतिक्रियाएँ पहुँचाएँट्रांसपोर्ट और एन्कोडिंग तंत्र के लिए आवश्यक कॉन्फ़िगरेशन स्थिर रूप से क्लाइंट में कॉपी किए जाते हैं। ट्रांसपोर्टिंग और एन्कोडिंग तंत्र के लिए फ़ंक्शन तर्क भी उनके संबंधित मॉड्यूल से स्थिर रूप से कॉपी किए जाते हैं।
प्रोसेस इंजेक्शन तर्क बिल्डर से निर्धारित होता है।
सर्वर वह एप्लिकेशन है जो client और c2 server के बीच संचार की मध्यस्थता करता है, जिसे विनिर्देश के भीतर third-party Client Controller के रूप में संदर्भित किया जाता है। सर्वर तर्क मुख्य रूप से स्थिर है, लेकिन विकास में सहायता के लिए वर्बोज़ और डीबग आउटपुट का समर्थन करता है:
encoder मॉड्यूल के साथ स्टेगर को एन्कोड करेंtransport मॉड्यूल के साथ स्टेगर को ट्रांसपोर्ट करेंtransport के माध्यम से प्राप्त क्लाइंट से मेटाडेटा प्रतिक्रिया की प्रतीक्षा करेंencoder मॉड्यूल के साथ मेटाडेटा को डिकोड करेंtransport के माध्यम से क्लाइंट तक पहुँचाएँtransport के माध्यम से प्राप्त क्लाइंट से प्रतिक्रिया प्राप्त करेंencoder मॉड्यूल के माध्यम से प्रतिक्रिया डिकोड करेंसर्वर किस encoder और transport मॉड्यूल को आयात करता है, इसका निर्धारण config.py में संग्रहीत मानों से किया जाता है।
अप्रयुक्त transport या encoder मॉड्यूल का कोई आयात नहीं किया जाता है।
निम्न तालिकाएँ encoding और transport मॉड्यूल और क्लाइंट के बीच साझा फ़ंक्शनों का वर्णन करती हैं। साझा फ़ंक्शन अनिवार्य रूप से बिल्कुल समान कोड होते हैं।
एक बहुत महत्वपूर्ण नोट: क्लाइंट के sendData और recvData फ़ंक्शनों को भेजा गया डेटा रॉ डेटा होना चाहिए, जबकि ट्रांसपोर्ट मॉड्यूल के sendData और retrieveData फ़ंक्शनों को भेजा गया डेटा आवश्यकतानुसार पहले से एन्कोडेड या डिकोडेड होना चाहिए।
| Transport Function | क्लाइंट फ़ंक्शन | विवरण |
|---|---|---|
| prepTransport | prepTransport | ट्रांसपोर्ट तंत्र का उपयोग करने के लिए आवश्यक किसी भी पूर्व-कॉन्फ़िगरेशन को निष्पादित करता है |
| sendData | sendData | परिभाषित करता है कि डेटा ट्रांसपोर्ट तंत्र के माध्यम से कैसे भेजा जाता है |
| retrieveData | recvData | परिभाषित करता है कि ट्रांसपोर्ट तंत्र के माध्यम से डेटा कैसे प्राप्त किया जाता है |
| एन्कोडर फ़ंक्शन | क्लाइंट फ़ंक्शन | विवरण |
|---|---|---|
| encode | encode | ट्रांसपोर्ट के लिए तैयार करने हेतु रॉ डेटा पर किए गए संशोधनों को परिभाषित करता है |
| decode | decode | ट्रांसपोर्ट से प्राप्त रॉ डेटा पर किए गए संशोधनों को परिभाषित करता है ताकि इसे अपने गंतव्य तक पहुँचाया जा सके |
सबसे पहले, निर्धारित करें कि आप कौन सा ट्रांसपोर्ट और एन्कोडिंग मॉड्यूल उपयोग करना चाहते हैं। निम्नलिखित उदाहरण के लिए हम transport_gmail और encoder_b64url का उपयोग करेंगे।
इसके बाद, अपनी आवश्यकताओं के अनुरूप server/config.py को संशोधित करें, यह सुनिश्चित करते हुए कि ENCODER_MODULE और TRANSPORT_MODULE ठीक से कॉन्फ़िगर किए गए हैं और आपके इच्छित मॉड्यूल की ओर इंगित करते हैं:
EXTERNAL_C2_ADDR = "127.0.0.1"
EXTERNAL_C2_PORT = "2222"
C2_PIPE_NAME = "foobar"
C2_BLOCK_TIME = 100
C2_ARCH = "x86"
IDLE_TIME = 5
ENCODER_MODULE = "encoder_b64url"
TRANSPORT_MODULE = "transport_gmail"
verbose = False
debug = False
इसके बाद, अपने चुने हुए transport और encoder मॉड्यूल के लिए कॉन्फ़िगरेशन अनुभाग संशोधित करें।
सुनिश्चित करें कि client/mechanism/$mechanism_client.py का कॉन्फ़िगरेशन अनुभाग आपके अब तक परिभाषित किसी भी कॉन्फ़िगरेशन से मेल खाता है।
सर्वर चलाने वाली मशीन पर, निष्पादित करें:
python server.py
अधिक वर्बोज़ आउटपुट के लिए, आप चला सकते हैं:
python server.py -v
अधिक वर्बोज़ आउटपुट और डीबगिंग के लिए उपयोगी अतिरिक्त आउटपुट के लिए, आप चला सकते हैं:
python server.py -d
इसके बाद, लक्षित एंडपॉइंट पर क्लाइंट निष्पादित करें।
यदि सब कुछ काम कर गया, तो Cobalt Strike कंसोल के भीतर एक नया बीकन पंजीकृत होगा जिसके साथ आप इंटरैक्ट कर सकते हैं।
आपने यह क्यों लिखा?: इस विनिर्देश के बहुत अधिक जारी कार्यान्वयन नहीं थे, और जो जारी किए गए हैं, उनमें से या तो वे ऐसी भाषा में नहीं हैं जिससे मैं परिचित हूँ या उनमें वह मॉड्यूलरिटी और अब्स्ट्रैक्शन नहीं है जिसकी मैं तलाश कर रहा था।
Python 2 क्यों?: मैं आलसी हूँ और इसमें नए ट्रांसपोर्ट और एन्कोडिंग चैनल लागू करना आसान है।
आपका कोड बेकार है: यह एक प्रश्न नहीं है।
क्या मैं नए ट्रांसपोर्ट और/या एन्कोडर मॉड्यूल जमा कर सकता हूँ?: हाँ, कृपया! एक पुल रिक्वेस्ट सबमिट करें और मुझे समीक्षा करने में खुशी होगी।
समान अब्स्ट्रैक्शन और मॉड्यूलरिटी क्लाइंट घटक में भी लागू की जाएगी, ताकि बीकन पेलोड के लिए प्रोसेस इंजेक्शन के विभिन्न तरीकों और रोडमैप पर अन्य सुविधाओं का समर्थन किया जा सके।
वर्तमान में, इसमें बिल्डर कार्यक्षमता का अभाव है, जिसे क्लाइंट और सर्वर डिप्लॉयमेंट को गतिशील रूप से बनाने के लिए योजनाबद्ध किया गया है, लेकिन यह रोडमैप पर है।