GraphStrike — это набор инструментов, который позволяет HTTPS Beacon от Cobalt Strike использовать Microsoft Graph API для связи C2. Весь трафик Beacon будет передаваться через два файла, созданные на сайте SharePoint атакующего, и все коммуникации от Beacon будут направляться на https://graph.microsoft.com:
GraphStrike включает в себя провизионер для создания необходимых ресурсов Azure для Cobalt Strike HTTPS через Graph API:
GraphStrike не создает платных ресурсов в Azure, поэтому использование GraphStrike или его провизионера не влечет дополнительных затрат.
Зачем?
Была опубликована информация об угрозах, касающаяся нескольких различных APT, использующих Microsoft Graph API и другие сервисы Microsoft для наступательных кампаний:
Злоумышленники продолжают использовать легитимные сервисы в нелегитимных целях. Использование домена с высоким рейтингом, такого как graph.microsoft.com, для связи C2 чрезвычайно эффективно и желательно, но часто сложно и трудоемко. Большинство C2-фреймворков не поддерживают методы получения или ротации токенов доступа, что не позволяет им использовать Graph API. Это может затруднить для красных команд воспроизведение этих техник и лишает защитников возможности наблюдать и разрабатывать сигнатуры для такого рода активности. GraphStrike стремится облегчить это бремя и предоставить надежный и повторяемый процесс использования Microsoft Graph API, сохраняя при этом знакомство и надежность пользовательского опыта Cobalt Strike.
Это External C2?
Технически нет. Ранее создав настоящий External C2 с использованием Graph API (который отправлял трафик Beacon в виде сообщений Microsoft Teams), бремя разработки, поддержки и интеграции пользовательского импланта, соответствующего спецификации External C2 и выполняющего задачу, слишком знакомо. GraphStrike вместо этого использует открытый User Defined Reflective Loader(UDRL) под названием AceLdr от Кайла Эйвери (адаптированный как 'GraphLdr' в этом проекте) для перехвата вызовов библиотеки WinINet, которые обычно делает Beacon, и манипулирования ими по мере необходимости для использования Graph API. Нет никакого пользовательского импланта или дополнительного процесса, о котором стоит говорить, просто процесс Beacon с парой перехваченных Windows API. На стороне сервера есть программа на Python3, которая переводит трафик Cobalt Strike Team Server в трафик Graph API и обратно.
Возможности
GraphStrike поддерживает почти все обычные действия Cobalt Strike, включая:
Использование Proxychains через SOCKS-прокси Cobalt Strike (хотя это очень медленно...)
Загрузка/выгрузка больших файлов
BOFs, execute-assembly и т.д.
Это также включает интеграцию GraphStrike команд sleep, exit и remove для согласования времени сна GraphStrike Server с Beacon, а также удаление файлов в SharePoint при выходе или удалении Beacon.
GraphStrike также включает все функции и возможности оригинального AceLdr, а также некоторые дополнительные API для использования подделки стека вызовов.
Требования
GraphStrike требует следующего перед началом работы:
Клиент Microsoft Azure с назначенной лицензией SharePoint/O365 и созданным сайтом. Стандартный сайт подойдет.
Учетная запись Azure с правами глобального администратора в этом клиенте.
Python 3.8-3.11Примечание №4 (и дополнительные зависимости, которые будут установлены в процессе настройки)
Правила брандмауэра
Убедитесь, что каждая машина, на которой запущен клиент Cobalt Strike, может подключаться к машине Cobalt Strike team server на портах 443 и 5000.
Настройка
Обратите внимание на следующее перед началом процесса настройки:
1. Некоторые компоненты используют относительные пути для поиска других ресурсов. Пожалуйста, переходите в каталоги, как указано ниже. 2. Профиль Cobalt Strike можно редактировать ТОЛЬКО ДО шага 5 в процессе настройки нижеПримечание №1.
На машине, которая будет запускать Cobalt Strike team server:
Клонируйте репозиторий.
Из каталога репозитория выполните sudo setup/install_dependencies.sh для установки необходимых системных зависимостей.
Выполните python3 -m venv virtual, а затем source virtual/bin/activate для создания и входа в виртуальное окружение.
Перейдите в каталог setup и выполните pip3 install -r requirements.txt.
Запустите ./provisioner.py new и завершите процесс настройки.
Запустите Cobalt Strike team server, используя graphstrike.profile в качестве изменяемого профиля C2.
Запустите экземпляр клиента Cobalt Strike (это можно сделать на клиентской машине или на машине TS и затем завершить его) и создайте HTTPS-прослушиватель Cobalt Strike на порту 443 с graph.microsoft.com в полях HTTPS Hosts и HTTPS Host(Stager).
Вернитесь в основной каталог репозитория и запустите GraphStrike Server с помощью ./GraphStrike.py.
На ВСЕХ машинах, которые будут запускать клиент Cobalt Strike:
Скопируйте каталог GraphStrike/client с машины TS на клиентскую машину. Это должно быть сделано ТОЛЬКО ПОСЛЕ завершения провизионирования!
Импортируйте GraphStrike.cna в Cobalt Strike через Script Manager.
Создайте полезные нагрузки Cobalt Strike, будь то сырой шелл-код или скомпилированные артефакты с помощью Artifact Kit или альтернативного фреймворка генерации полезных нагрузок. Пользователи Artifact Kit смотрите ниже!
Профит.
Пользователи Artifact Kit
Из-за размера GraphLdr пользователям Artifact Kit потребуется перекомпилировать его с конкретными параметрами, чтобы GraphStrike был совместим с полезными нагрузками, созданными Artifact Kit. В частности, поля 'Stage Size' и 'RDLL Size' должны быть указаны для использования размера RDLL 100K. Ниже приведены два примера рабочего синтаксиса:
На машине, на которой запущены TS + GraphStrike Server:
Остановите GraphStrike server
Вернитесь в каталог setup и выполните ./provisioner.py delete для удаления созданных ресурсов Azure.
Примечания
В произвольном порядке приведены несколько советов и наблюдений, которые помогут использовать GraphStrike в полной мере.
Включенный в GraphStrike профиль очень минималистичен; это сделано намеренно. Изменение любых СУЩЕСТВУЮЩИХ полей в профиле может/сломает GraphStrike! Вы должны иметь возможность добавлять дополнительный язык/поведение профиля в другие разделы, которые еще не определены (например, настроить имя канала, поведение инъекции и т.д.). Любые правки профиля ДОЛЖНЫ быть сделаны ДО запуска провизионера!
Приложение Azure, используемое для связи C2 как Beacon, так и GraphStrike Server, имеет ограничение скорости 1200 запросов в минуту. GraphStrike Server использует 120 запросов в минуту в качестве базового уровня для функционирования. Чем меньше время сна Beacon, тем больше запросов он будет делать; кроме того, каждый Beacon, созданный с помощью GraphStrike, будет использовать часть этого лимита в 1200 запросов в минуту. Работа в интерактивном режиме с одним Beacon возможна, но работа в интерактивном режиме с более чем одним Beacon, вероятно, нет. Если вы столкнулись с проблемами ограничения скорости, рассмотрите возможность увеличения времени сна ваших Beacon, уменьшения количества работающих Beacon или и то, и другое.
Хотя время сна GraphStrike Server изменяется для каждого Beacon в соответствии с выданными командами сна, это на самом деле означает, что GraphStrike Server будет спать указанное время перед проверкой наличия задач у TS. Это НЕ означает, что Beacon немедленно получит и обработает задачи, как только они будут получены от TS сервером GraphStrike. Beacon будет спать указанное время перед обращением к SharePoint для получения задач TS, но из-за асинхронной природы C2 это не будет синхронизировано с моментом загрузки этих задач сервером GraphStrike.
Если Beacon умирает без корректного завершения (антивирус, сбой и т.д.), Beacon будет казаться все еще обращающимся к TS, и факт его смерти станет очевиден только после того, как вы отдадите ему команду. На самом деле к TS подключается / создает видимость, что Beacon все еще обращается, сервер GraphStrike, поэтому это не отражает состояние Beacon. Такова природа асинхронного C2.
GraphStrike работает по модели 1:1:1; 1 сайт SharePoint связан с 1 сервером GraphStrike, который связан с 1 TS. У вас возникнут проблемы, если вы попытаетесь подключить два сервера TS/GraphStrike к одному сайту SharePoint. Вы, конечно, можете подключить несколько клиентов Cobalt Strike к одному серверу TS / GraphStrike, каждому клиенту просто нужна копия папки 'client', созданной в процессе провизионирования.
Существует известная проблема относительно совместимости утилиты az, используемой GraphStrike, и Python 3.12.
Я рекомендую вам ознакомиться с документацией AceLdr, так как все примечания из этого проекта применимы и здесь.
Ограничения
В GraphStrike существуют следующие ограничения:
Поддерживаются только x64 Beacon.
Staged Beacon не поддерживаются.
GraphStrike совместим только с библиотекой WinINet; новая опция библиотеки WinHTTP для Beacon не поддерживается.
Нет поддержки отправки команды сна через контекстное меню Beacon. Используйте параметр командной строки для сна Beacon.
GraphStrike поддерживается только на Linux-экземплярах Cobalt Strike. Поддержка Windows, безусловно, возможна для реализации и на самом деле сводится к изменению некоторых путей в файлах Python и скрипте Aggressor.
Благодарности
GraphStrike был бы невозможен без вклада следующих лиц:
Майк Сондерс, Кори Оверстрит, Крис Трансер и Джастин Палк из команды Red Siege, которые любезно протестировали GraphStrike и выявили множество проблем, исправленных до релиза.