
Этот проект является «мостом» между sleep и языком python. Он позволяет управлять teamserver Cobalt Strike через python без необходимости использования стандартного GUI-клиента. ПРИМЕЧАНИЕ: Этот проект находится в стадии BETA. Цель — предоставить площадку для тестирования, и это никоим образом не официально поддерживаемая функция. Возможно, в будущем это может быть добавлено в основной продукт.
Этот проект — «мост» между языками Sleep и Python. Он позволяет управлять teamserver Cobalt Strike через Python без необходимости в стандартном GUI-клиенте.
ПРИМЕЧАНИЕ: этот проект находится в стадии BETA. Цель — предоставить полигон для тестирования, и это никоим образом не является официально поддерживаемой функцией. Возможно, в будущем это может быть добавлено в основной продукт.
Проект вдохновлён работой @BinaryFaultline и @Mcgigglez16 в проекте https://github.com/emcghee/PayloadAutomation. Я хочу выразить вам обоим особую благодарность!!
Сердце этого моста — реализация на Python «безголового» клиента Cobalt Strike. Это достигается использованием консоли Aggressor Script, предоставляемой agscript, в качестве движка. Agscript позволяет взаимодействовать с Cobalt Strike без GUI (https://www.cobaltstrike.com/aggressor-script/index.html). «Мост» работает за счёт использования вспомогательных функций Python в sleepy.py для генерации необходимых Sleep-команд, ожидаемых консолью agscript. Вместо написания Sleep-функций striker.py предоставляет вспомогательные функции, которые абстрагируют Sleep и позволяют использовать Python.
Поскольку этот проект вдохновлён 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, сохранённые на teamserver. Данные всегда есть, но могут быть представлены не так, как вам хотелось бы. Это пример трекера журналов, который использует HTML-таблицу данных для быстрого просмотра журналов Beacon.
beaconlogtracker.py — это скрипт, который подключается к teamserver, каждые 30 секунд извлекает текущие журналы Beacon, сохраняет их в <code>beaconlogs.json` и отображает в HTML-таблице данных с возможностью поиска и сортировки.
Журналы Beacon всегда сохраняются в каталог logs, но это альтернативный способ отслеживать журналы в памяти с помощью альтернативного просмотрщика. Если teamserver будет перезапущен, журналы в памяти будут потеряны, и вам придётся обращаться к журналам, хранящимся в каталоге logs на teamserver. Этот скрипт поддерживает журналы в памяти синхронизированными с файлом beaconlogs.json. Так у вас появится быстрый и простой способ визуализировать все данные, не копаясь в каталоге logs, даже если Cobalt Strike будет перезапущен.
Запустите скрипт, подключив его к вашему teamserver для синхронизации журналов каждые 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

Возможность программного создания пейлоадов без необходимости использования GUI Cobalt Strike — это функция, которую часто запрашивают операторы red team. Исходный проект делал это с помощью генератора пейлоадов. Это было отлично, но есть одна уникальная проблема. Aggressor предоставляет несколько хуков, влияющих на то, как создаётся пейлоад. Эти хуки используются различными наборами (например, artifact kit, sleep mask kit или UDRL kit). Обычно они используются при загрузке aggressor-скрипта через GUI. Этот проект был расширен, чтобы разрешить загрузку внешних скриптов. Без этого использование этих хуков пейлоадов было бы затруднительно. Этот код можно легко расширить для передачи пейлоадов внешним функциям, чтобы добавить собственную обфускацию, встроить их в пользовательский загрузчик или выполнить любые другие модификации.
Скрипт генератора пейлоадов подключается к teamserver, загружает дополнительные скрипты и создаёт пейлоады.
python3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrikeВ этом примере перечислены шаги по добавлению Arsenal kit, в котором включены наборы 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Обычно при использовании GUI внешние скрипты могут использовать aggressor-функцию println для вывода информации в консоль скриптов, что полезно для обратной связи или отладки. При использовании payloadgenerator.py вывод println теряется, и единственная доступная опция — функция elog. При использовании elog для просмотра информации в журнале событий необходим GUI.
Продолжая пример использования «с внешним набором», обновите файл /path/to/sleep_python_bridge/payload_scripts/arsenal_kit.cna и замените два вхождения println на elog. С этим изменением всё журналирование arsenal kit теперь будет доступно в журнале событий GUI.
Загрузка внешних скриптов требуется не всегда, за исключением скриптов модификации пейлоадов, которые включают хуки пейлоадов (например, наборы artifact, sleep mask и udrl). Если вы загружаете скрипты из GUI Cobalt Strike, пейлоады будут учитывать эти скрипты из GUI, но не из agscript-клиента (это разные клиенты). Вы должны добавить скрипты и вспомогательные файлы в каталог payload_scripts.
payloadgenerator.py автоматически загрузит любой .cna-скрипт, расположенный на верхнем уровне каталога payload_scripts. Любой .cna-скрипт, расположенный в подкаталоге, загружен не будет.
Пример структуры каталога с Arsenal Kit.
$ 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

Это бета-код, который отображает beacon в виде ориентированного графа.
Скрипт обновляет файл output/data/beacons.json
Запустите веб-сервер и откройте http://localhost:8000/beacons.html
Использование:
python3 beacongrapher.py 127.0.0.1 50050 grapher password /path/to/cobaltstrike
Это создаст файл beacons.json, используемый JavaScript-графопостроителем.
Запустите веб-сервер из каталога output/html
python3 -m http.server 8000
Подключитесь к http://localhost:8000/beacons.html
| Элемент | Описание |
|---|
| sleep_python_bridge | Библиотека, которая позволяет Python взаимодействовать с 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-граф для отображения Beacon |