
Mythic के लिए क्रॉस-प्लेटफ़ॉर्म C2 एजेंट जिसमें डायनेमिक फंक्शन लोडिंग, SOCKS5 प्रॉक्सी, फ़ाइल ऑपरेशन, शेलकोड इंजेक्शन, और macOS/Windows पोस्ट-एक्सप्लॉयटेशन मॉड्यूल शामिल हैं।
Medusa एक क्रॉस-प्लेटफ़ॉर्म एजेंट है जो Python 3.8 और Python 2.7 दोनों के साथ संगत है।
Medusa को स्थापित करने के लिए, आपको एक दूरस्थ कंप्यूटर पर Mythic v3 स्थापित होना चाहिए। Mythic के लिए स्थापना निर्देश Mythic परियोजना पृष्ठ पर पाए जा सकते हैं।
Mythic स्थापना रूट से, निम्न कमांड चलाएँ:
./mythic-cli install github https://github.com/MythicAgents/Medusa.git
एक बार स्थापित होने के बाद, नया एजेंट बनाने के लिए Mythic को पुनरारंभ करें।
फ़ाइल Payload_Type/medusa/rabbitmq_config.json एक टेम्पलेट है और इसे आपके Mythic वातावरण से मेल खाना चाहिए।
RABBITMQ_PASSWORD मान पर rabbitmq_password सेट करें (आमतौर पर Mythic .env से)।rabbitmq_host सेट करें (अक्सर docker-compose सेटअप में mythic_rabbitmq, या स्थानीय बाइंड के लिए 127.0.0.1)।mythic_server_host सेट करें (अक्सर docker-compose सेटअप में mythic_server, या स्थानीय बाइंड के लिए 127.0.0.1)।बेस एजेंट और शामिल कमांड सभी बिल्ट-इन Python लाइब्रेरी का उपयोग करते हैं, इसलिए कार्य करने के लिए अतिरिक्त पैकेज की आवश्यकता नहीं है। एजेंट कमांड को थ्रेड में चलाएंगे, इसलिए लंबे समय तक चलने वाले अपलोड या डाउनलोड मुख्य एजेंट को ब्लॉक नहीं करेंगे।
Medusa एजेंट के दोनों संस्करण बिल्ट-इन लाइब्रेरी के साथ लिखे गए AES256 HMAC कार्यान्वयन का उपयोग करते हैं (यहाँ से अनुकूलित), एक मानक Python स्थापना के अलावा किसी अतिरिक्त निर्भरता की आवश्यकता को समाप्त करते हुए। इस प्रकार एजेंट को Windows, Linux और macOS होस्ट पर काम करना चाहिए। यह उल्लेखनीय है कि यह क्रिप्टो कार्यान्वयन बड़ी फ़ाइलों (स्क्रीनशॉटिंग, डाउनलोड आदि) को संभालते समय कुछ ओवरहेड प्रस्तुत करता है लेकिन यह काम करने योग्य है।
Payload_Type/Medusa/agent_code निर्देशिका के भीतर, आप py2 और py3 दोनों प्रत्ययों वाली base_agent फ़ाइलें देखेंगे। इसी प्रकार, व्यक्तिगत फ़ंक्शन फ़ाइलों के लिए भी समान फ़ाइल एक्सटेंशन देखे जा सकते हैं।
इन्हें builder.py स्क्रिप्ट द्वारा पढ़ा जाता है ताकि पहले Medusa एजेंट के सही बेस Python संस्करण का चयन किया जा सके। builder.py फिर चुने गए Python संस्करण के लिए विशिष्ट कमांड शामिल करेगा। ऐसे मामले में जहां एक कमांड में केवल .py एक्सटेंशन है, इसे डिफ़ॉल्ट रूप से उपयोग किया जाएगा, यह मानते हुए कि Py2 और Py3 संस्करणों के बीच कोई वैकल्पिक कोड की आवश्यकता नहीं है।
Medusa जॉब निष्पादन के लिए बुनियादी थ्रेडिंग का उपयोग करता है। जहां जॉब संभावित रूप से लंबे समय तक चलने वाले होते हैं, उन्हें jobkill कार्य से सिग्नल का जवाब देने के लिए 'स्टॉप चेक' के साथ कार्यान्वित किया जा सकता है। इसे नीचे दिखाए गए समान कोड स्निपेट के साथ कार्यान्वित किया जा सकता है:
if [task for task in self.taskings if task["task_id"] == task_id][0]["stopped"]:
# Some job-specific tidy up
return "Job stopped."
यह हैंडलर download, upload, watch_dir और screenshot कमांड में कार्यान्वित देखा जा सकता है।
इसके अतिरिक्त, यदि लंबे समय तक चलने वाले जॉब से निरंतर आउटपुट प्रदान करने की अपेक्षा की जाती है, तो sendTaskOutputUpdate फ़ंक्शन - बेस एजेंट में शामिल - का उपयोग कार्य पूरा होने से पहले Mythic को अपडेट करने के लिए किया जा सकता है। एक डमी फ़ंक्शन जो निरंतर आउटपुट प्रदान करता है और jobkill किया जा सकता है, नीचे देखा जा सकता है।
def dummyFunction(self, task_id):
while(True):
# Check if we've got a stop signal.
if [task for task in self.taskings if task["task_id"] == task_id][0]["stopped"]: return "Job stopped."
# Send output back to Mythic
self.sendTaskOutputUpdate(task_id, "We're still running")
time.sleep(10)
Medusa वर्तमान में दो C2 प्रोफाइल का समर्थन करता है: http (AES256 HMAC एन्क्रिप्शन के साथ और बिना दोनों) और azure_blob।
HTTP प्रोफाइल बुनियादी, गैर-गतिशील प्रोफाइल पर Mythic सर्वर पर कॉल बैक करता है। कार्यों के लिए GET अनुरोध, प्रतिक्रियाओं के साथ POST अनुरोध।
| Command | Syntax | Description |
|---|
| cat | cat path/to/file | फ़ाइल सामग्री को पढ़ें और आउटपुट करें। |
| cd | cd [.. dir] | कार्यशील निर्देशिका बदलें (एक निर्देशिका ऊपर जाने के लिए ..)। |
| cp | cp src_file_or_dir dst_file_or_dir | फ़ाइल या फ़ोल्डर को गंतव्य पर कॉपी करें। |
| cwd | cwd | कार्यशील निर्देशिका प्रिंट करें। |
| download | download [path] | लक्ष्य सिस्टम से एक फ़ाइल डाउनलोड करें। |
| download_bulk | download_bulk [path1] [path2] ... | एक कार्य में लक्ष्य सिस्टम से कई फ़ाइलें डाउनलोड करें। |
| exit | exit | कॉलबैक से बाहर निकलें। |
| env | env | पर्यावरण चर प्रिंट करें। |
| eval_code | eval_code [commands] | Python कोड निष्पादित करें और आउटपुट लौटाएँ। |
| jobkill | jobkill [task id] | लंबे समय तक चलने वाले कार्य को रोकने का संकेत भेजें। |
| jobs | jobs | लंबे समय तक चलने वाले कार्यों की सूची बनाएं, जैसे डाउनलोड। |
| list_modules | list_modules [module_name] | मेमोरी में मॉड्यूल या किसी विशिष्ट मॉड्यूल के लिए पूर्ण फ़ाइल सूची सूचीबद्ध करता है। |
| load | load command | एजेंट में एक नई क्षमता लोड करें। |
| load_module | load_module | एक ज़िप्ड Python मॉड्यूल को मेमोरी में लोड करें (यहाँ और यहाँ से अनुकूलित)। |
| load_script | load_script | एजेंट के माध्यम से एक Python स्क्रिप्ट लोड और निष्पादित करें। |
| ls | ls [. path] | [path] में फ़ाइलें और फ़ोल्डर सूचीबद्ध करें या वर्तमान कार्यशील निर्देशिका के लिए . का उपयोग करें। |
| mv | mv src_file_or_dir dst_file_or_dir | फ़ाइल या फ़ोल्डर को गंतव्य पर ले जाएँ। |
| pip_freeze | pip_freeze | प्रोग्रामेटिक रूप से सिस्टम पर स्थापित पैकेजों की सूची बनाएं। |
| pty | pty [/bin/bash] / pty self / pty fork | एक इंटरैक्टिव PTY सत्र खोलें। मोड: spawn एक PTY के साथ एक प्रोग्राम चलाता है, self लाइव एजेंट स्थिति के साथ एक इन-प्रोसेस Python REPL खोलता है, fork एजेंट को स्नैपशॉट स्थिति के साथ Python REPL में फोर्क करता है (केवल Linux/macOS)। |
| rm | rm file_or_dir | फ़ाइल या फ़ोल्डर हटाएँ। |
| shell | shell [command] | एक शेल कमांड चलाएँ जो subprocess.Popen() का उपयोग करके स्पॉन होगा। ध्यान दें कि यह कमांड पूरा होने तक प्रतीक्षा करेगा, इसलिए अपने एजेंट को ब्लॉक न करने का ध्यान रखें। |
| socks | socks start/stop [port] | Medusa एजेंट के माध्यम से SOCKS5 प्रॉक्सी प्रारंभ/बंद करें। |
| sleep | sleep [seconds] [jitter percentage] | एजेंट के कॉलबैक अंतराल को सेकंड में सेट करें। |
| unload | unload command | एजेंट से एक मौजूदा क्षमता अनलोड करें। |
| unload_module | unload_module module_name | पहले मेमोरी में लोड किए गए Python मॉड्यूल को अनलोड करें। |
| upload | upload | मशीन पर एक दूरस्थ पथ पर एक फ़ाइल अपलोड करें। |
| watch_dir | watch_dir path seconds | लक्ष्य निर्देशिका में परिवर्तनों की निगरानी करें, एक निर्दिष्ट दर पर परिवर्तनों के लिए पोलिंग करें। |
| Command | Syntax | Description |
|---|
| clipboard | clipboard | क्लिपबोर्ड की सामग्री आउटपुट करें (Objective-C API का उपयोग करता है, जैसा कि Cedric Owens यहाँ ने रेखांकित किया है। केवल macOS, केवल Python 2.7)। |
| list_apps | list_apps | macOS अनुप्रयोगों की सूची बनाएं (केवल Python 2.7, केवल macOS)। |
| list_tcc | list_tcc [path] | macOS TCC डेटाबेस में प्रविष्टियों की सूची बनाएं (फिलहाल केवल पूर्ण-डिस्क एक्सेस और Big Sur की आवश्यकता है)। |
| screenshot | screenshot | स्क्रीनशॉट लें (Objective-C API का उपयोग करता है, केवल macOS, केवल Python 2.7)। |
| spawn_jxa | spawn_jxa | एक osascript प्रक्रिया स्पॉन करें और इसमें Javascript सामग्री पाइप करें। |
| vscode_list_recent | vscode_list_recent [state_db] | VSCode के साथ हाल ही में खोली गई फ़ाइलों और फ़ोल्डरों की सूची बनाता है। |
| vscode_open_edits | vscode_open_edits [backup_dir_path] | VSCode में फ़ाइलों में किए गए असंग्रहीत परिवर्तनों की सूची बनाता है। |
| vscode_watch_edits | vscode_watch_edits [path to remote dir] [poll_interval] | असंग्रहीत संपादनों के लिए दिए गए अंतराल पर VSCode बैकअप निर्देशिका की पोलिंग करें। |
| Command | Syntax | Description |
|---|
| shinject | shinject | CreateRemoteThread का उपयोग करके लक्ष्य PID में शैलकोड इंजेक्ट करें (केवल Windows - यहाँ से अनुकूलित)। |
| load_dll | load_dll dll_path dll_export | डिस्क पर एक DLL लोड करें और एक निर्यातित फ़ंक्शन निष्पादित करें (नोट: इस DLL को पूरा होने पर एक int मान लौटाना चाहिए, उदाहरण के लिए, msfvenom-निर्मित DLL पूरा होने पर आपके एजेंट को मार डालेगा)। |
| list_dlls | list_dlls [pid] | लोड किए गए DLL की सूची प्राप्त करने के लिए स्थानीय या लक्ष्य प्रक्रिया की प्रक्रिया मेमोरी (PEB) पढ़ें (केवल Python 3) |
| ps | ps | सीमित प्रक्रिया जानकारी प्राप्त करें, जैसे PID, प्रक्रिया नाम, आर्किटेक्चर और बाइनरी पथ (केवल Python 3) |
| ps_full | ps_full | पूर्ण प्रक्रिया जानकारी प्राप्त करें, जिसमें PPID, अखंडता स्तर और कमांड लाइन शामिल है (केवल Python 3) |
| kill | kill | प्रक्रिया ID द्वारा प्रक्रिया समाप्त करें (केवल Python 3) |