
Async PICO Hub is a work-in-progress framework to extend Cobalt Strike with custom event monitoring and in-process Asynchronous BOFs
Async PICOs — это фреймворк для запуска долгоживущих, событийно-ориентированных Beacon Object Files внутри процесса Cobalt Strike Beacon. Он обеспечивает асинхронное выполнение, отслеживание задач, корректное завершение работы и безопасный асинхронный вывод, сочетая Crystal Palace PICOs с моделью выполнения на стороне Beacon.
В отличие от нативных асинхронных BOF в Cobalt Strike, Async PICOs выполняются в процессе Beacon и могут пробуждать Beacon для вывода результатов при наступлении событий.
Нативные асинхронные BOF в Cobalt Strike решают другую задачу. Async PICOs предназначены для длительных, событийно-ориентированных задач, которые выполняются внутри Beacon и могут безопасно передавать результаты оператору немедленно.
Подробности реализации и обоснование дизайна см. в сопроводительной статье в блоге:
https://www.nccgroup.com/research/async-picos-and-custom-beacon-wakeups-in-cobalt-strike/
Перед сборкой необходимы следующие компоненты:
Локальная копия этого репозитория
Собранная версия Crystal Palace
Visual Studio с поддержкой MSVC и CMake
Tradecraft Garden
Клонируйте репозиторий
git clone <repo-url>
cd async-pico-hub
Async PICOs полагаются на Crystal Palace для генерации PICO.
Загрузите последнюю сжатую версию Crystal Palace и соберите её в соответствии с её инструкциями. После сборки поместите бинарные файлы Crystal Palace в:
pico-tools/crystal-palace/
Ожидаемая структура должна выглядеть примерно так:
pico-tools/
└── crystal-palace/
├── src/
├── lib/
└── ...
Загрузите последнюю версию Tradecraft Garden и поместите её в
pico-tools/tradecraftgarden
Ожидаемая структура должна выглядеть примерно так:
pico-tools/
└── tradecraftgarden/
├── libtcg/
├── simple_pic/
└── ...
Убедитесь, что вы собрали libtcg и пример simple_pic, чтобы иметь возможность собрать Async PICOs.
Проект использует CMake для упрощения сборки с помощью MSVC.
В корне репозитория щёлкните правой кнопкой мыши по папке и выберите:
Open with Visual Studio
Это загрузит CMake-проект и отобразит доступные конфигурации сборки.
Доступны следующие конфигурации сборки:
x64 Debug
Собирает локальные исполняемые версии PICO и BOF для отладки.
Используйте эту конфигурацию при локальной отладке поведения или пошаговом проходе по коду в Visual Studio.
x64 Release
Собирает оптимизированные локальные исполняемые версии PICO и BOF.
Используйте эту конфигурацию для проверки поведения релизной версии вне Beacon.
x64 Release Objects
Собирает артефакты для развертывания:
Это конфигурация, используемая для создания объектов для Cobalt Strike.
После завершения сборки созданные артефакты можно найти в:
build/x64-ReleaseObject/obj/
Этот каталог содержит скомпилированные PICO и BOF, готовые к использованию.
Async PICOs требуют, чтобы Beacon использовал пользовательский sleepmask.
В вашем malleable profile включите поддержку пользовательского sleepmask перед попыткой использовать Async PICOs.
Скрипт
picos-cna/sleepmask.cnaзагружаетasync-sleepmask— минимальную эталонную реализацию, используемую для поддержки асинхронного вывода и координации пробуждения Beacon.Этот sleepmask намеренно прост и имеет ограничения, описанные в разделе Ограничения. Он предоставлен для демонстрации фреймворка и упрощения тестирования, а не как готовый production-компонент.
Если у вас уже есть пользовательский sleepmask с OPSEC-техниками, такими как манипуляция стеком или другими, см. Изменение вашего существующего sleepmask на Async Sleepmask, чтобы интегрировать поддержку Async PICO в вашу существующую реализацию.
После сборки проекта с конфигурацией x64 Release Objects загрузите скрипт Aggressor picos.cna и sleepmask.cna в Cobalt Strike:
Script Manager → Load → picos-cna/picos.cna
Script Manager → Load → picos-cna/sleepmask.cna
После загрузки Async PICOs можно управлять через команду picos.
Для запуска PICO:
picos start [path to pico] [arguments]
Например:
picos start C:\temp\MonitorTGT.pico
Или с аргументами:
picos start C:\temp\MonitorTGT.pico DOMAIN\serviceaccount
Для просмотра запущенных Async PICO:
picos
Это отображает текущие запущенные задачи и их идентификаторы.
Для остановки Async PICO:
picos stop [pico id]
Например:
picos stop 3
PICO получает сигнал остановки и корректно завершает работу после выполнения очистки.
Дополнительная информация об использовании доступна непосредственно в Cobalt Strike через встроенные меню справки для команд picos.
Подробности см. в docs/writing_custom_async_pico.md.
Подробности см. в docs/modifying_existing_sleepmask.md.
Публичная реализация намеренно проста и не содержит продвинутых методов уклонения. Она предназначена как основа для адаптации, а не как готовое решение для развертывания без изменений.
Async PICO запускаются с помощью CreateThread. Это сохраняет модель выполнения простой и понятной, но также создает поверхность для обнаружения. В публичной реализации поток начинает выполнение из памяти, не поддерживаемой образом модуля, что может быть обнаружено продуктами или эвристиками, которые проверяют стартовые адреса потоков.
Пользователям следует оценить, насколько альтернативные стратегии создания потоков или выполнения более подходят для их окружения.
Фреймворк полагается на модифицированный sleepmask для передачи асинхронного вывода обратно в Beacon и координации событий пробуждения. Включенная здесь реализация намеренно минимальна и должна быть проверена перед оперативным использованием.
Sleepmask является частью модели выполнения, а не просто удобным слоем. Любые изменения в том, как вывод ставится в очередь, извлекается или сигнализируется, должны тщательно оцениваться, чтобы избежать проблем с параллелизмом или неподдерживаемых взаимодействий с внутренними механизмами Beacon.
Публичная реализация имеет несколько практических ограничений, которые следует понимать перед её использованием.
Crystal Palace позволяет PICO использовать глобальные переменные, но публичная реализация использует простую модель общего хранилища для глобального состояния. В результате глобальные переменные не изолированы для каждого потока.
На практике это означает, что одновременный запуск нескольких Async PICO может потребовать дополнительной осторожности, если они зависят от глобальных переменных.
Async PICO зависят от модифицированного sleepmask для асинхронного вывода и координации пробуждения Beacon. Поэтому фреймворк не является полностью автономным и не может рассматриваться как готовый BOF для подстановки.
Репозиторий предназначен для демонстрации фреймворка и подхода к реализации, а не для предоставления готового production-компонента. Включенные примеры предназначены для расширения, изменения и адаптации под индивидуальные сценарии использования.