وكيل C2 متعدد المنصات لـ Mythic، مع تحميل ديناميكي للوظائف، وبروكسي 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 الخاص بـ Mythic).rabbitmq_host إلى اسم مضيف/حاوية RabbitMQ (غالباً mythic_rabbitmq في إعدادات docker-compose، أو 127.0.0.1 للربط المحلي).mythic_server_host إلى اسم مضيف/حاوية خادم Mythic (غالباً mythic_server في إعدادات docker-compose، أو 127.0.0.1 للربط المحلي).يستخدم الوكيل الأساسي والأوامر المضمنة مكتبات Python المدمجة، لذا لا تحتاج إلى حزم إضافية لتعمل. سيقوم الوكيل بتشغيل الأوامر في خيوط (threads)، لذا فإن عمليات الرفع أو التنزيل الطويلة لن تحجب الوكيل الرئيسي.
| الأمر | الصيغة | الوصف |
|---|---|---|
| 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 | إنهاء اتصال (callback). |
| 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 |
| الأمر | الصيغة | الوصف |
|---|---|---|
| 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] | سرد الإدخالات في قاعدة بيانات TCC بنظام macOS (يتطلب وصولاً كاملاً للقرص و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 على فترات زمنية محددة للبحث عن التعديلات غير المحفوظة. |
| الأمر | الصيغة | الوصف |
|---|---|---|
| shinject | shinject | حقن كود شيل (shellcode) في PID الهدف باستخدام CreateRemoteThread (Windows فقط - مقتبس من هنا). |
| load_dll | load_dll dll_path dll_export | تحميل DLL من القرص وتنفيذ دالة مُصدَّرة (ملاحظة: يجب أن يعيد هذا الـ DLL قيمة int عند الاكتمال، فمثلاً DLL مُنشأ بواسطة msfvenom سيقتل وكيلك عند الاكتمال). |
| list_dlls | list_dlls [pid] | قراءة ذاكرة العملية (PEB) للعملية المحلية أو المستهدفة لجلب قائمة DLLs المحملة (Python 3 فقط) |
| ps | ps | الحصول على معلومات محدودة عن العمليات، مثل PID وأسماء العمليات والبنية ومسارات الملفات الثنائية (Python 3 فقط) |
| ps_full | ps_full | الحصول على معلومات كاملة عن العمليات، بما في ذلك PPID ومستوى السلامة (integrity level) وسطر الأوامر (Python 3 فقط) |
| kill | kill | إنهاء عملية بواسطة معرف العملية (Python 3 فقط) |
يستخدم كلا إصدارَي وكيل Medusa تطبيق AES256 HMAC مكتوباً بمكتبات مدمجة (مقتبس من هنا)، مما يلغي الحاجة إلى أي تبعيات إضافية تتجاوز تثبيت Python القياسي. وبناءً على ذلك، يجب أن يعمل الوكيل عبر مضيفي Windows وLinux وmacOS. ومن الجدير بالذكر أن تطبيق التشفير هذا يُدخل بعض الحمل الإضافي عند التعامل مع الملفات الكبيرة (التقاط الشاشة، التنزيلات، إلخ) لكنه قابل للاستخدام.
داخل دليل Payload_Type/Medusa/agent_code، سترى ملفات base_agent ذات لاحقتي py2 وpy3. وبالمثل، يمكن رؤية امتدادات ملفات مشابهة لملفات الوظائف الفردية أيضاً.
تتم قراءتها بواسطة سكريبت builder.py لاختيار إصدار Python الأساسي الصحيح لوكيل Medusa أولاً. ثم سيقوم builder.py بتضمين الأوامر الخاصة بإصدار Python المختار. في الحالة التي يكون فيها للأمر امتداد .py فقط، سيتم استخدامه افتراضياً، على افتراض عدم الحاجة إلى كود بديل بين إصدارَي Py2 وPy3.
يستخدم Medusa خيوطاً (threading) أساسية لتنفيذ المهام. عندما يحتمل أن تكون المهام طويلة التشغيل، يمكن تنفيذها باستخدام "فحص إيقاف" (stop check) للاستجابة لإشارة من مهمة 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 مع الردود.
| نقل ملف أو مجلد إلى الوجهة. |
| pip_freeze | pip_freeze | سرد الحزم المثبتة على النظام برمجياً. |
| pty | pty [/bin/bash] / pty self / pty fork | فتح جلسة PTY تفاعلية. الأوضاع: spawn يشغّل برنامجاً مع PTY، وself يفتح REPL بلغة Python داخل العملية مع حالة وكيل حية، وfork يفرّع الوكيل إلى REPL بلغة Python مع حالة مُلتقطة (Linux/macOS فقط). |
| rm | rm file_or_dir | حذف ملف أو مجلد. |
| shell | shell [command] | تشغيل أمر شل يتم إطلاقه باستخدام subprocess.Popen(). لاحظ أنه سينتظر اكتمال الأمر لذا كن حذراً حتى لا تحجب وكيلك. |
| socks | socks start/stop [port] | بدء/إيقاف بروكسي SOCKS5 عبر وكيل Medusa. |
| sleep | sleep [seconds] [jitter percentage] | تعيين فترة استدعاء الوكيل بالثواني. |
| unload | unload command | إلغاء تحميل قدرة موجودة من وكيل. |
| unload_module | unload_module module_name | إلغاء تحميل وحدة Python تم تحميلها مسبقاً في الذاكرة. |
| upload | upload | رفع ملف إلى مسار بعيد على الجهاز. |
| watch_dir | watch_dir path seconds | مراقبة التغييرات في الدليل الهدف، مع استطلاع التغييرات بمعدل محدد. |