
Сборщик данных Active Directory на основе TUI, который принимает объекты LDAP, выполняет удаленный сбор RPC/SMB/HTTP и генерирует дампы, совместимые с BloodHound CE, для анализа путей атак.
TUI для сбора данных Active Directory.
Основные цели этого проекта:
Flashingestor реализует 3 основных отдельных шага: LDAP Ingestion, Remote Collection и Conversion, в отличие от других сборщиков, которые выполняют указанные методы за один шаг:
Ingest (Ctrl+l) — собирает необработанные данные атрибутов объектов из LDAP и сохраняет их в output/ldap во временные файлы msgpack. Запросы можно настраивать в config.yaml.
Remote (Ctrl+r) — читает эти промежуточные файлы в память, вычисляет список компьютеров для сбора и выполняет серию RPC/SMB/HTTP-запросов для получения соответствующей удалённой информации для объектов Computer и EnterpriseCA, которая сохраняется в output/remote.
Convert (Ctrl+s) — читает промежуточные файлы в память, объединяет информацию из этапов сбора и удалённого сбора и генерирует дамп, совместимый с Bloodhound, в output/bloodhound — этот шаг полностью выполняется офлайн.
Дополнительные технические детали и идеи можно найти в нашем 📖 Wiki.
$ git clone https://github.com/Macmod/flashingestor
$ cd flashingestor
# Только сборка:
$ go build ./cmd/flashingestor
# Установка исполняемого файла в $GOBIN или $GOPATH/bin:
$ go install ./cmd/flashingestor
[!NOTE] Вы также можете использовать предварительно собранные бинарные файлы из Релизов.
Сначала аутентифицируйтесь одним из следующих способов:
# Анонимно
# [Требуется dSHeuristics = 0000002 в объекте DirectoryServices
# и может иметь ограниченную видимость из-за отсутствия ACE на чтение]
$ ./flashingestor -u '@<DOMAIN>' -p '' [...]
# Пользователь + Пароль
$ ./flashingestor -u <USER>@<DOMAIN> -p <PASSWORD> [-k] [...]
# Пользователь + NTHash
$ ./flashingestor -u <USER>@<DOMAIN> -H <NTHASH> [-k] [...]
# Пользователь + PFX
$ ./flashingestor -u <USER>@<DOMAIN> --pfx <PFXPATH> [--pfx-password <PFXPASS>] [-k] [...]
# Пользователь + PEM
$ ./flashingestor -u <USER>@<DOMAIN> --cert <PEMPATH> --key <KEYPATH> [-k] [...]
# Пользователь + AESKey
$ ./flashingestor -u <USER>@<DOMAIN> --aes-key <AESKEY> -k [...]
# Пользователь + Ticket
$ ./flashingestor -u <USER>@<DOMAIN> --ccache /path/to/ticket.ccache -k [...]
или
$ KRB5CCNAME=/path/to/ticket.ccache ./flashingestor -u <USER>@<DOMAIN> -k [...]
Затем выполните нужные шаги. Для сбора только через LDAP (DCOnly за исключением GPOLocalGroup и CertServices) достаточно нажать Ctrl+l, проверить успешность сбора, а затем нажать Ctrl+s для создания финального дампа.
Рекомендуется указывать --dc и --dns при запуске flashingestor. Если не указать --dc, flashingestor попытается найти его с помощью SRV/A-запросов, что может задержать начальный шаг Ingest.
Необходимо указать --dns, если ваш стандартный DNS-сервер не знает о домене — если используется AD-интегрированный DNS, просто укажите --dns на DC, который его обслуживает. Кроме того, вне зависимости от --dc, если вы хотите выполнить шаг Remote Collection и ваш DNS-сервер не знает о компьютерах в домене, необходимо указать --dns для запросов.
[!TIP] В средах с несколькими DC также можно использовать утилиту
dcprobeдля измерения задержки до всех DC и поиска хорошего кандидата для сбора:$ go build ./cmd/dcprobe $ ./dcprobe --dns 192.168.88.6 -d creta.local -r 10
Если файл конфигурации отсутствует в текущем каталоге как config.yaml или по пути, указанному через --config, будут использованы параметры по умолчанию (такие же, как в предоставленном config.yaml) — они жёстко прописаны в config/fallback.go. Дополнительную информацию см. в Файле конфигурации.
Рекомендуется использовать --log для указания выходного файла для логов (на случай, если потребуется их просмотреть после закрытия TUI) и -vv для отображения отладочных сообщений, так как это может помочь в устранении возможных проблем. Полный список аргументов командной строки см. в Аргументах командной строки.
[!NOTE] Запросы по умолчанию в предоставленном
config.yamlразработаны с учётом информации, необходимой для конвертации в Bloodhound. Вы можете настроить запросы или атрибуты вconfig.yaml, но лучше избегать удаления необходимых атрибутов и изменения смысла фильтров поиска.
Если recurse_trusts установлен в true, он рекурсивно соберёт данные из всех доверенных доменов, используя исходные учётные данные, предоставленные для сбора.
Если search_forest установлен в true, он соберёт данные из доменов, входящих в тот же лес, что и исходный домен, из раздела Configuration — дополнительные запросы не потребуются, так как это уже часть плана сбора по умолчанию. Оба параметра могут быть установлены одновременно, и flashingestor соберёт данные из любого обнаруженного домена только один раз (либо через доверие, либо через текущий лес).
Если включён recurse_trusts и recurse_feasible_only также установлен в true, он попытается собрать данные из доверенного домена только если доверие:
Это означает, что односторонние доверия (только исходящие) не будут обрабатываться, и, за исключением первого уровня доверий, пути сбора останавливаются на нетранзитивных довериях — если B доверяет A нетранзитивно, A всё ещё может аутентифицироваться в B; но если C также доверяет B нетранзитивно, A не может аутентифицироваться в C.
[!IMPORTANT]
recurse_trusts/search_forestбудут выполнять аутентификацию в LDAP обнаруженных доменов только с указанными учётными данными из исходного домена, когда предоставленные учётные данные — этообычный парольилиNT-хэш; использование TGT для получения реферального билета для этой цели теоретически возможно, но ещё не реализовано в библиотекеadauth.
Промежуточные цепочки из Macmod/ldapx также могут использоваться непосредственно с flashingestor для обфускации LDAP-запросов на этапе сбора с помощью опций -f (--ldapx-filter), -a (--ldapx-attrs) и -b (--ldapx-basedn). При использовании -vv необработанные запросы до и после обфускации также будут отображаться в логе.
Если вы планируете запускать шаг удалённого сбора, проверьте включённые methods — они примерно соответствуют методам, предлагаемым SharpHound, и могут использоваться для включения конкретных видов сбора через RPC или HTTP.
Аргументы --remote-* можно использовать для указания отдельных учётных данных для удалённого сбора. Если они не указаны, flashingestor попытается использовать те же учётные данные, что и для пользователя в стандартных аргументах сбора (--user, --password и т.д.).
Для удалённого сбора также можно использовать локального администратора, указав, например, --remote-user Administrator@., но эффективность этого подхода будет зависеть от того, является ли учётная запись встроенным администратором, а также от значений ключей реестра FilterAdministratorToken / LocalAccountTokenFilterPolicy. Подробнее об этом поведении см. в статье Pass-the-Hash Is Dead: Long Live LocalAccountTokenFilterPolicy
Опции compress_output и cleanup_after_compression помогают уменьшить использование дискового пространства. После загрузки финального дампа в Bloodhound вы можете безопасно удалить файлы из output/ldap и output/remote вручную, если они не нужны, но их можно сохранить для поиска важной информации без повторного полного сбора.
[!TIP] Основное назначение файлов
msgpackв папкахoutput/ldapиoutput/remote— служить промежуточным форматом для разделения ответственности за весь процесс, но эти файлы также можно использовать как источник информации, преобразовав их в JSON — так вам не придётся просматривать необработанные атрибуты объектов или результаты удалённого сбора:$ go build ./cmd/ingest2json $ ./ingest2json output/ldap/YOURDOMAIN/SelectedFile.msgpack -o output.jsonУдобным способом просмотра этих файлов может быть использование JQ/FX или вашего любимого языка программирования 🙂
Вклад приветствуется: вы можете открыть issue или отправить pull request.
Большое спасибо SpecterOps за BloodHound, SharpHound / SharpHoundCommon и dirkjanm за BloodHound.py, которые были основными источниками для этого инструмента.
Спасибо rtpt-erikgeiser и RedTeamPentesting за adauth, а также p0dalirius за winacl — обе очень полезные библиотеки.
Спасибо oiweiwei за go-msrpc, так как его библиотека позволила реализовать методы удалённого сбора на основе RPC.
Protected Users или если NTLM-аутентификация заблокирована настройками безопасности) или с сертификатами (которые под капотом используют PKINIT), удалённый сбор не будет пытаться аутентифицироваться на компьютерах доменов, отличных от домена пользователя. Это также относится к методу GPOLocalGroup, который в таких случаях не будет пытаться читать файлы GPO с DC других доменов, даже если в собранных данных есть несколько доменов.SmbInfo для типа Computer всё ещё является базовой реализацией (только проверки реестра).HttpEnrollmentEndpoints работает только с предоставленным именем пользователя и паролем.AllowedToDelegateTo / ServicePrincipalNames всё ещё является базовой реализацией.Почти все свойства, реализованные в SharpHound, поддерживаются, но между этим инструментом и SharpHound есть много архитектурных различий, поэтому не ожидайте точного совпадения вывода с официальной реализацией (за исключением возможных ошибок). Ключевые различия могут возникать особенно в более сложных реализациях, таких как удалённый сбор через RPC и сбор, связанный с эксплуатацией CA/сертификатов.
Тайм-ауты в основном статичны — реализация SharpHound использует адаптивный тайм-аут (довольно умно!), но у меня ещё не было времени его изучить. При необходимости настройте тайм-ауты с помощью опций --timeout, --computer-timeout и --method-timeout (в config/config.go указаны другие тайм-ауты, специфичные для операций).
Тесты в настоящее время не реализованы, и я тестировал только небольшое подмножество функций вручную.
Лицензия MIT (MIT)
Copyright (c) 2023 Artur Henrique Marzano Gonzaga
Настоящим безвозмездно предоставляется разрешение любому лицу, получившему копию этого программного обеспечения и связанных файлов документации ("Программное обеспечение"), на использование Программного обеспечения без ограничений, включая, без ограничений, права на использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование и/или продажу копий Программного обеспечения, а также разрешение лицам, которым предоставляется Программное обеспечение, делать это при соблюдении следующих условий:
Вышеуказанное уведомление об авторских правах и это разрешение должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ОПРЕДЕЛЁННОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КОЕМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ПРЕТЕНЗИЯМ, УБЫТКАМ ИЛИ ДРУГИМ ОБЯЗАТЕЛЬСТВАМ, БУДЬ ТО В ДЕЙСТВИЯХ ДОГОВОРА, ДЕЛИКТА ИЛИ ИНЫМ ОБРАЗОМ, ВОЗНИКШИМ ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ЕГО ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.