
هذا المشروع هو 'جسر' بين sleep ولغة بايثون. يسمح بالتحكم في خادم فريق Cobalt Strike من خلال بايثون دون الحاجة إلى عميل الواجهة الرسومية القياسي. ملاحظة: هذا المشروع في مرحلة تجريبية جدًا. الهدف هو توفير بيئة للاختبار وليس ميزة مدعومة رسميًا بأي حال. ربما يمكن إضافة هذا في المستقبل إلى المنتج الأساسي.
هذا المشروع هو 'جسر' بين لغة sleep ولغة python. يسمح بالتحكم في خادم الفريق (teamserver) الخاص بـ Cobalt Strike عبر python دون الحاجة إلى عميل الواجهة الرسومية القياسي.
ملاحظة: هذا المشروع في مرحلة تجريبية (BETA) إلى حد كبير. الهدف هو توفير بيئة للتجربة والاختبار وهو ليس ميزة مدعومة رسميًا بأي حال من الأحوال. ربما يمكن إضافة هذا في المستقبل إلى المنتج الأساسي.
استوحى هذا المشروع من العمل الذي قام به @BinaryFaultline و @Mcgigglez16 في المشروع https://github.com/emcghee/PayloadAutomation. أود أن أقدم شكرًا خاصًا لكما!!
يتمثل جوهر هذا الجسر في تنفيذ بايثون لعميل Cobalt Strike بدون واجهة رسومية (headless). يتم تحقيق ذلك باستخدام وحدة تحكم Aggressor Script المقدمة من agscript كمحرك. تتيح agscript التفاعل بدون واجهة رسومية مع Cobalt Strike (https://www.cobaltstrike.com/aggressor-script/index.html). يعمل 'الجسر' باستخدام دوال مساعدة بلغة بايثون في sleepy.py لتوليد أوامر sleep اللازمة التي تتوقعها وحدة تحكم agscript. بدلاً من كتابة دوال sleep، توفر striker.py دوال مساعدة تجرّد sleep وتتيح استخدام بايثون.
نظرًا لأن مشروع PayloadAutomation كان مصدر الإلهام، فقد بدأ بالكثير من الكود نفسه، لكنني أردت تقليصه لاستخدام المكونات اللازمة للعمل كغلاف لـ agscript.
قد تكون الأمثلة في هذا المشروع أسهل طريقة للفهم، ويتمثل ذلك في السكربت example.py
#!/usr/local/bin/python3
## Import the bridge
from sleep_python_bridge.striker import CSConnector
from argparse import ArgumentParser
from pprint import pp, pprint
###################
## Argparse
def parseArguments():
parser = ArgumentParser()
parser.add_argument('host', help='The teamserver host.')
parser.add_argument('port', help='The teamserver port.')
parser.add_argument('username', help='The desired username.')
parser.add_argument('password', help='The teamserver password.')
parser.add_argument('path', help="Directory to CobaltStrike")
args = parser.parse_args()
return args
## Let's go
def main(args):
cs_host = args.host
cs_port = args.port
cs_user = args.username
cs_pass = args.password
cs_directory = args.path
## Connect to server
print(f"[*] Connecting to teamserver: {cs_host}")
with CSConnector(
cs_host=cs_host,
cs_port=cs_port,
cs_user=cs_user,
cs_pass=cs_pass,
cs_directory=cs_directory) as cs:
# Perform some actions
#
# Get beacon metadata - i.e., x beacons() from the script console
beacons = cs.get_beacons()
print("BEACONS")
pprint(beacons)
# Get list of listners - i.e., x listeners_stageless() from the script console
listeners = cs.get_listeners_stageless()
print("LISTENERS")
pprint(listeners)
if __name__ == "__main__":
args = parseArguments()
main(args)
قم باستدعاء السكربت
python3 example.py 127.0.0.1 50050 example password /path/to/cobaltstrike

سجلات الـ beacon متاحة في وقت التشغيل على خادم الفريق (teamserver) أو عبر ملفات سجلات الـ beacon المحفوظة على الخادم. البيانات موجودة دائمًا، ولكن قد لا يتم عرضها بالطريقة التي تريدها. هذا مثال على متتبع سجلات يستخدم شبكة بيانات HTML لعرض سجلات الـ beacon بسرعة.
beaconlogtracker.py هو سكربت يتصل بخادم الفريق، ويستخرج سجلات الـ beacon قيد التشغيل كل 30 ثانية، ويحفظها في <code>beaconlogs.json` ويعرضها في شبكة بيانات HTML قابلة للبحث والفرز.
تُحفظ سجلات الـ beacon دائمًا في دليل logs، لكن هذه طريقة بديلة لتتبع السجلات الموجودة في الذاكرة باستخدام عارض بديل. إذا تمت إعادة تشغيل خادم الفريق، تُفقد السجلات الموجودة في الذاكرة، ويجب عليك الرجوع إلى السجلات المخزنة في دليل logs على خادم الفريق. يحافظ هذا السكربت على مزامنة السجلات الموجودة في الذاكرة مع الملف beaconlogs.json. بهذه الطريقة لديك طريقة سريعة وسهلة لتصور جميع البيانات دون البحث في دليل logs حتى إذا تمت إعادة تشغيل Cobalt Strike.
ابدأ السكربت من خلال جعله يتصل بخادم الفريق لديك لمزامنة السجلات كل 30 ثانية
الاستخدام:
python3 beaconlogtracker.py 127.0.0.1 50050 logtracker password /path/to/cobaltstrike
سيؤدي ذلك إلى إبقاء beaconlogs.json متزامنًا مع سجلات الـ beacon المحفوظة وقيد التشغيل. تتم المزامنة كل 30 ثانية
شغّل خادم ويب من دليل output/html
python3 -m http.server 8000
اتصل بـ http://localhost:8000/beaconlogs.html

من الميزات التي يطلبها مشغلو الفرق الحمراء (red team) غالبًا القدرة على إنشاء الحمولات برمجيًا دون الحاجة إلى واجهة Cobalt Strike الرسومية. قام المشروع المرجعي بذلك عبر مولّد حمولات. كان ذلك رائعًا، لكن هناك تحدٍ فريد. توفر Aggressor عدة خطافات (hooks) للتأثير على كيفية بناء الحمولة. تُستخدم هذه الخطافات بواسطة الحزم المختلفة (أي artifact kit و sleep mask kit و UDRL kit). تُستخدم عادةً عن طريق تحميل سكربت aggressor عبر الواجهة الرسومية. تم توسيع هذا المشروع للسماح بتحميل السكربتات الخارجية. بدون ذلك، سيكون استخدام خطافات الحمولات هذه صعبًا. يمكن بسهولة توسيع هذا الكود لتمرير الحمولات إلى دوال خارجية لإضافة إخفاء مخصص (obfuscation)، أو تضمينها في أداة تحميل مخصصة، أو أي تعديل آخر.
يتصل سكربت مولّد الحمولات بخادم الفريق، ويحمّل السكربتات الإضافية، وينشئ الحمولات.
python3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrikeسيعرض هذا المثال خطوات إضافة حزمة Arsenal التي تتضمن تفعيل حزمتي artifact و sleep mask.
cp -r /path/to/arsenal_kit/dist/* /path/to/sleep_python_bridge/payload_scriptspython3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrikeعادةً عند استخدام الواجهة الرسومية، يمكن للسكربتات الخارجية استخدام دالة aggressor المعروفة باسم println لإخراج المعلومات إلى وحدة تحكم السكربتات (Script Console)، وهو أمر مفيد للتغذية الراجعة أو تصحيح الأخطاء. عند استخدام payloadgenerator.py، يُفقد إخراج println والخيار الوحيد المتاح هو دالة elog. عند استخدام elog، تحتاج إلى الواجهة الرسومية لعرض المعلومات في سجل الأحداث (Event Log).
استكمالًا لمثال الاستخدام 'مع حزمة خارجية'، دعنا نحدّث ملف /path/to/sleep_python_bridge/payload_scripts/arsenal_kit.cna ونغيّر الموضعين اللذين يظهر فيهما println إلى elog. مع هذا التغيير، ستتوفر جميع سجلات حزمة arsenal الآن في سجل الأحداث بالواجهة الرسومية.
تحميل السكربتات الخارجية ليس مطلوبًا دائمًا باستثناء سكربتات تعديل الحمولات التي تتضمن خطافات حمولات (أي حزم artifact و sleep mask و udrl). إذا قمت بتحميل السكربتات من واجهة Cobalt Strike الرسومية، فستلتزم الحمولات بهذه السكربتات من الواجهة الرسومية فقط وليس من عميل agscript (فهذان عميلان مختلفان). يجب إضافة السكربتات والملفات الداعمة إلى دليل payload_scripts.
سيقوم payloadgenerator.py تلقائيًا بتحميل أي سكربت .cna موجود في المستوى الأعلى من دليل payload_scripts. أما أي سكربت .cna موجود في دليل فرعي فلن يتم تحميله.
مثال على بنية الدليل مع حزمة Arsenal.
$ ls -1R ./payload_scripts
./payload_scripts:
arsenal_kit.cna
artifact
sleepmask
./payload_scripts/artifact:
artifact32big.dll
artifact32big.exe
artifact32.dll
artifact32.exe
artifact32svcbig.exe
artifact32svc.exe
artifact64big.exe
artifact64big.x64.dll
artifact64.exe
artifact64svcbig.exe
artifact64svc.exe
artifact64.x64.dll
artifact.cna
./payload_scripts/sleepmask:
sleepmask.cna
sleepmask_pivot.x64.o
sleepmask_pivot.x86.o
sleepmask.x64.o
sleepmask.x86.o
بفضل تحديث حديث قدمه @mgeeky، يدعم سكربت payloadgenerator.py الآن وسائط إضافية لدعم معاملات دالة artifact_payload الجديدة المضافة في الإصدار 4.8. مع هذه الوسائط، لديك الآن تحكم أكبر في الحمولات التي يتم توليدها.
$ python3 payloadgenerator.py --help
------------------------
Beacon Payload Generator
------------------------
usage: payloadgenerator.py [-h] [-o path] [-l name] [-a arch] [-t types] [-e exit] [-c method] host port username password path
positional arguments:
host The teamserver host.
port The teamserver port.
username The desired username.
password The teamserver password.
path Directory to CobaltStrike
optional arguments:
-h, --help show this help message and exit
optional parameters:
-o path, --payload-path path
Where to save generated payloads. Default: output/payloads/
-l name, --listener name
Specify listener name to get payloads for. Default: payloads for all listeners will be produced
-a arch, --arch arch Specify payload architecture. Choices: x86, x64. Default: payloads for both are generated
-t types, --payload-types types
Comma separated list of payload types to generate keyed by file extensions. Choices: exe,dll,svc.exe,bin,ps1,py,vbs or use 'all' to compile all at once.
Default: exe,dll,bin
-e exit, --exit exit Payload exit method. Choices: thread, process. Default: process
-c method, --call-method method
System call method. Choices: indirect, direct, none. Default: <empty> (backwards compatible with Cobalt pre 4.8)
$python3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike -o /share/payloads/ -c indirect -a x64
------------------------
Beacon Payload Generator
------------------------
[*] Connecting to teamserver: 127.0.0.1
Loading cna scripts from ./payload_scripts
Scripts
-------
arsenal_kit.cna
console.cna
[*] Creating stageless payloads for listener: http1
[*] Creating http1.x64.exe
[*] Creating http1.x64.dll
[*] Creating http1.x64.bin
$python3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike -o /share/payloads/ -c indirect -a x64 -t exe
------------------------
Beacon Payload Generator
------------------------
[*] Connecting to teamserver: 127.0.0.1
Loading cna scripts from ./payload_scripts
Scripts
-------
arsenal_kit.cna
console.cna
[*] Creating stageless payloads for listener: http1
[*] Creating http1.x64.exe
$python3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike -o /share/payloads/
------------------------
Beacon Payload Generator
------------------------
[*] Connecting to teamserver: 127.0.0.1
Loading cna scripts from ./payload_scripts
Scripts
-------
arsenal_kit.cna
console.cna
[*] Creating stageless payloads for listener: http1
[*] Creating http1.x86.exe
[*] Creating http1.x86.dll
[*] Creating http1.x86.bin
[*] Creating http1.x64.exe
[*] Creating http1.x64.dll
[*] Creating http1.x64.bin

هذا كود تجريبي (beta) يعرض الـ beacons في رسم بياني موجّه.
يقوم السكربت بتحديث الملف output/data/beacons.json
شغّل خادم ويب وافتح http://localhost:8000/beacons.html
الاستخدام:
python3 beacongrapher.py 127.0.0.1 50050 grapher password /path/to/cobaltstrike
سيؤدي ذلك إلى إنشاء ملف beacons.json المستخدم بواسطة الراسم البياني المكتوب بلغة الجافاسكربت.
شغّل خادم ويب من دليل output/html
python3 -m http.server 8000
| العنصر | الوصف |
|---|
| sleep_python_bridge | المكتبة التي تتيح لبايثون التفاعل مع Cobalt Strike |
| output/html | مسار عارضات بيانات HTML |
| output/html/data | مسار بيانات json المستخدمة بواسطة عارض البيانات |
| output/payloads | مسار الحمولات المحفوظة (يُستخدم بواسطة مولّد الحمولات) |
| payload_scripts | مسار السكربتات الخارجية التي سيتم تحميلها بواسطة payloadgenerator.py |
| beaconlogtracker.py | تنفيذ لمتتبع سجلات الـ beacon يستخدم شبكة بيانات HTML لعرض سجلات الـ beacon |
| payloadgenerator.py | تنفيذ لمولّد حمولات beacon ينشئ حمولات لكل مستمع (listener) |
| beacongrapher.py | تنفيذ لمتعقب رسومي للـ beacon يستخدم رسمًا بيانيًا موجّهًا بتقنية HTML/JavaScript للـ beacons |