
pyCobaltHound — это расширение скрипта Aggressor для Cobalt Strike, предназначенное для обеспечения глубокой интеграции между Cobalt Strike и Bloodhound.
pyCobaltHound — это расширение для скрипта Aggressor для Cobalt Strike, которое обеспечивает глубокую интеграцию между Cobalt Strike и Bloodhound.
pyCobaltHound помогает операторам красных команд:
BloodHound для обнаружения путей повышения привилегий, открываемых вновь собранными учётными данными.Для этого pyCobaltHound использует набор встроенных запросов. Операторы также могут добавлять/удалять собственные запросы, чтобы настроить возможности мониторинга pyCobaltHound. Это даёт им гибкость адаптировать pyCobaltHound на лету во время операций с учётом конкретных целей (пользователи, хосты и т.д.).
Для установки pyCobaltHound клонируйте этот репозиторий. Не забудьте также клонировать включённый подмодуль!
Вы можете использовать следующую команду:
git clone https://github.com/NVISOsecurity/pyCobaltHound.git --recurse-submodulesУбедитесь, что следующие зависимости правильно установлены:
PyCobalt — это Python API для Cobalt Strike. Он предоставляет множество функций Aggressor для непосредственного использования из Python.
Убедитесь, что у вас установлен Python3+. Хотя PyCobalt может работать и на macOS, и на Windows, мы тестировали его только на Linux.
Существует два способа использования библиотеки PyCobalt:
pyCobaltHound использует этот подход, устанавливая путь поиска из программы Python с помощью переменной sys.path.PyCobalt. Для этого выполните python3 setup.py install. Вам придётся изменить pycobalthound.py, чтобы он использовал установленную библиотеку вместо той, что находится во включённом репозитории.PyCobalt будет поддерживаться в будущем. Фактически последнее обновление проекта было для включения изменений, сделанных в Cobalt Strike 4.2. Однако, поскольку pyCobaltHound использует только базовые функции Aggressor для взаимодействия с Cobalt Strike и его оператором, для pyCobaltHound это не является большой проблемой.PyCobalt, используемый в этом проекте, является нашим форком. Мы не контролируем репозиторий PyCobalt.PyCobalt поставляется с некоторыми командами Script Console для управления запущенными скриптами Python. Когда вы перезагружаете скрипт Aggressor, следует сначала явно остановить скрипты Python. В противном случае они будут работать вечно, ничего не делая. Во время разработки pyCobaltHound мы заметили, что это также может привести к неопределённому поведению.
Перезагрузка pyCobaltHound может быть выполнена следующим образом:
aggressor> python-stop-all`
[pycobalt] Asking script to stop: /root/pycobalthound/pycobalthound.py
[pycobalt] Script process exited: /root/pycobalthound/pycobalthound.py
aggressor> reload example.cna`
[pycobalt] Executing script /root/pycobalthound/pycobalthound.py
Для правильной работы PyCobalt вы можете вызывать PyCobalt только в одном скрипте Aggressor. Имейте это в виду, если хотите использовать pyCobaltHound вместе с другими скриптами Aggressor, использующими PyCobalt. Наш подход заключается в том, чтобы иметь скрипт Aggressor с вызовами python() и include() для каждого инструмента на основе PyCobalt.
notify2 — это (или был) пакет для отображения уведомлений на рабочем столе в Linux. Как мы увидим позже, pyCobaltHound поддерживает несколько способов уведомления оператора. notify2 используется в Linux для отправки уведомлений демону уведомлений через D-Bus.
Чтобы включить это, установите notify2 с помощью:
pip install notify2
Использование pyCobaltHound в Cobalt Strike так же просто, как импорт скрипта Aggressor pycobalthound.cna в ваш клиент. После этого в строке меню Cobalt Strike появится меню pyCobaltHound.

Первоначальная цель pyCobaltHound заключалась в мониторинге кэша учётных данных Cobalt Strike (View > Credentials) на предмет новых записей. Это происходит путём реагирования на событие on_credentials, которое Cobalt Strike генерирует при изменениях в хранилище учётных данных.
Когда это событие происходит, pyCobaltHound:
Cobalt Strike.BloodHound.BloodHound для каждой новой сущности, используя как встроенные, так и пользовательские запросы.Поскольку всё это происходит асинхронно от основного клиента Cobalt Strike, этот процесс не должен блокировать ваш интерфейс, так что вы можете продолжать работать, пока pyCobaltHound проводит исследование в фоне.
pyCobaltHound использует отдельные кэши для каждого team-сервера, чтобы избежать проблем при использовании нескольких team-серверов.
Иногда возникают ситуации, когда вы хотите повторно исследовать определённых пользователей (или всё хранилище учётных данных). Это может быть актуально, если вы загрузили новые данные в базу данных BloodHound.
Поскольку pyCobaltHound уже должен был исследовать (и, следовательно, кэшировать) все сущности в вашем хранилище учётных данных, он не будет оценивать их на основе этих новых данных без вмешательства оператора.
Для управления тем, какие сущности кэшируются, доступны два метода.
В случаях, когда вы хотите удалить определённую сущность (или несколько) из кэша, вы можете сделать это в просмотрщике учётных данных (View > Credentials). Просто выберите целевые объекты и нажмите опцию remove from cache под пунктом меню pyCobaltHound. 
В случаях, когда вы хотите удалить все сущности из кэша, вы можете сделать это в главном меню pyCobaltHound (Cobalt Strike > pyCobaltHound > Wipe cache). Это наиболее полезно, когда вы хотите заново оценить всё хранилище учётных данных.

После удаления целей из кэша вы можете вручную запустить pyCobaltHound для повторного исследования содержимого хранилища учётных данных. Этот процесс полностью аналогичен описанному выше.
pyCobaltHound содержит функциональность для взаимодействия с существующими сессиями beacon. Она доступна в контекстном меню beacon. Обратите внимание, что эти команды могут выполняться для одного beacon или для выбранного набора beacon.

Эта функциональность особенно полезна при работе с пользователями и компьютерами, чьи учётные данные ещё не скомпрометированы, но которые фактически находятся под нашим контролем (например, потому что у нас есть beacon, работающий под их токеном сессии).
Функция Mark as owned (pyCobaltHound > Mark as owned) может использоваться для пометки beacon (или набора beacon) как захваченного в базе данных BloodHound.

Этот диалог запросит у оператора следующую информацию:
pyCobaltHound будет помечать компьютеры как захваченные только в том случае, если сессия beacon работает как локальный администратор, SYSTEM или сессия с высоким уровнем целостности под другим пользователем.Функция Investigate (pyCobaltHound > Mark as owned) может использоваться для исследования пользователей и хостов, связанных с beacon (или набором beacon).

Этот диалог запросит у оператора следующую информацию:
pyCobaltHound будет исследовать компьютеры только в том случае, если сессия beacon работает как локальный администратор, SYSTEM или сессия с высоким уровнем целостности под другим пользователем.pyCobaltHound будет исследовать все сущности без проверки уровней целостности.pyCobaltHound содержит функциональность для свободного исследования сущностей. Она находится в главном меню (Cobalt Strike > pyCobaltHound > Investigate).
Эта функциональность особенно полезна при работе с пользователями и компьютерами, чьи учётные данные не были скомпрометированы и которые не находятся под нашим контролем.

Этот диалог запросит у оператора следующую информацию:
Меню настроек pyCobaltHound находится по адресу Cobalt Strike > pyCobaltHound > Settings.

pyCobaltHound сохраняет ваши настройки на диск. Каждый раз при перезагрузке pyCobaltHound он проверяет наличие файла настроек и загружает сохранённые настройки, если находит их.
pyCobaltHound сохраняет файл настроек для каждого team-сервера, поэтому можно иметь разные настройки на разных team-серверах.
Для аутентификации в базе данных BloodHound pyCobaltHound потребуется следующая информация:
Примечание: если вы выберете постоянное сохранение настроек (для их сохранения после перезагрузки клиента/хоста), pyCobaltHound десериализует и сохранит эти учётные данные на диске.
Как обсуждалось ранее, pyCobaltHound использует кэширование, чтобы не выполнять лишнюю работу. Кэширование можно отключить в настройках. Это особенно полезно при разработке новых запросов, чтобы не приходилось постоянно управлять кэшем или очищать его.
pyCobaltHound поддерживает несколько различных способов уведомления оператора после обнаружения интересующей сущности. Эти уведомления можно отключить.
По умолчанию pyCobaltHound уведомляет оператора с помощью стандартного диалогового окна Aggressor. Эта опция может нарушить рабочий процесс оператора. Однако это метод по умолчанию, поскольку он поддерживается на всех платформах, где можно запустить клиент Cobalt Strike.

pyCobaltHound также поддерживает отображение уведомлений на рабочем столе в Linux. Это наш предпочтительный вариант, поскольку он не прерывает рабочий процесс оператора.

Во время некоторых рабочих процессов pyCobaltHound генерирует HTML-отчёт. Это решение было принято, чтобы не заваливать оператора огромными уведомлениями, если было исследовано много сущностей. Эти отчёты будут созданы в папке reports. Генерацию отчётов можно отключить.

По умолчанию pyCobaltHound синхронизирует запросы между team-серверами, используя центральный файл для всех настроек, связанных с запросами. Это означает, что запросы, которые включены, добавлены или удалены на одном team-сервере, также будут включены, добавлены или удалены из запросов, созданных другими team-серверами. Это в основном опция для удобства, и её можно отключить, что полезно в случаях, когда вы выполняете запросы, специфичные для операции, которые не применяются ко всем team-серверам, к которым вы подключены.
Когда синхронизация запросов отключена, pyCobaltHound проверяет наличие уникальных файлов запросов. Если они существуют, он загрузит их и будет использовать эти запросы в своих рабочих процессах. Если файлы не существуют, он создаст и загрузит их. Этот параметр сохраняется после перезагрузок.
Когда синхронизация запросов включена, pyCobaltHound проверяет наличие уникальных файлов запросов. Если они существуют, оператору будет предложен выбор.

У оператора есть следующие варианты:
pyCobaltHound просто удалит уникальные файлы запросов. Все пользовательские запросы будут потеряны.pyCobaltHound попытается объединить уникальные файлы запросов с общими файлами запросов. Перед объединением запроса он проверит, нет ли в общем файле запроса с таким же именем или таким же Cypher-выражением. Если возникнут конфликты слияния, оператора спросят, хочет ли он сохранить неслитые запросы. Они будут сохранены в отдельном файле. Затем уникальные файлы запросов будут удалены.pyCobaltHound просто оставит уникальные файлы запросов. Все пользовательские запросы будут сохранены, и эти файлы будут загружены снова, если синхронизация запросов будет снова отключена.pyCobaltHound в настоящее время поддерживает следующие встроенные запросы:
Управление различными запросами, которые использует pyCobaltHound, осуществляется через главное меню (Cobalt Strike > pyCobaltHound > Queries).

Диалог Update queries позволяет операторам включать/отключать определённые запросы. При использовании этого диалога оператор сначала будет спрошен, какой тип запросов он хочет обновить. Это сделано для динамической загрузки/отображения правильных запросов во время этого рабочего процесса.

После ответа на первый диалог оператору будет представлен список всех доступных запросов данного типа. Здесь они могут выбрать, какие запросы включить/отключить.

Опция типа запроса — это некрасивое обходное решение для передачи типа запроса в следующую функцию рабочего процесса, и она не должна беспокоить оператора.
Функция Add query позволяет операторам добавлять/удалять собственные запросы, чтобы настроить возможности исследования pyCobaltHound. Это даёт им гибкость адаптировать pyCobaltHound на лету во время операций с учётом конкретных целей (пользователи, хосты и т.д.).

Этот диалог запросит у оператора следующую информацию:
pyCobaltHound.pyCobaltHound. Операторы достаточно свободны в определении своих запросов. Единственные требования следующие:
pyCobaltHound динамически генерирует следующую строку Cypher на основе имён исследуемых сущностей:
WITH [account names here] AS samAccountNames UNWIND samAccountNames AS names.MATCH (x) WHERE x.name STARTS WITH names(x:User)) в зависимости от типа добавляемого запроса.pyCobaltHound ожидает, что запрос вернёт уникальный набор имён пользователей.
RETURN DISTINCT (x.name)pyCobaltHound использует для пользовательского запроса. Он будет использоваться в уведомлениях и отчётах во время рабочих процессов pyCobaltHound.
pyCobaltHound заменит на количество результатов этого запроса.Диалог Delete query позволяет операторам удалять определённые пользовательские запросы из pyCobaltHound. При использовании этого диалога оператор сначала будет спрошен, какой тип запроса он хочет удалить. Это сделано для динамической загрузки/отображения правильных запросов во время этого рабочего процесса.

После ответа на первый диалог оператору будет представлен список всех доступных запросов данного типа. Здесь они могут выбрать, какие запросы удалить.

Опция типа запроса — это некрасивое обходное решение для передачи типа запроса в следующую функцию рабочего процесса, и она не должна беспокоить оператора.
pyCobaltHound использует/вдохновляется следующими проектами: