Kitobni o'qish: «Идём по киберследу: Анализ защищенности Active Directory c помощью утилиты BloodHound»
Знак информационной продукции (Федеральный закон № 436-ФЗ от 29.12.2010 г.)

Редактор: Евгения Якимова
Руководитель проекта: Анна Туровская
Арт-директор: Татевик Саркисян
Корректоры: Наташа Казакова, Елена Сербина
Верстка: Белла Руссо
Все права защищены. Данная электронная книга предназначена исключительно для частного использования в личных (некоммерческих) целях. Электронная книга, ее части, фрагменты и элементы, включая текст, изображения и иное, не подлежат копированию и любому другому использованию без разрешения правообладателя. В частности, запрещено такое использование, в результате которого электронная книга, ее часть, фрагмент или элемент станут доступными ограниченному или неопределенному кругу лиц, в том числе посредством сети интернет, независимо от того, будет предоставляться доступ за плату или безвозмездно.
Копирование, воспроизведение и иное использование электронной книги, ее частей, фрагментов и элементов, выходящее за пределы частного использования в личных (некоммерческих) целях, без согласия правообладателя является незаконным и влечет уголовную, административную и гражданскую ответственность.
© Неверов Д., 2024
© Оформление. ООО «Альпина ПРО», 2025
* * *

Вступление
Утилита BloodHound – популярный инструмент для проведения оценки защищенности Active Directory. BloodHound использует графовую базу данных neo4j и язык запросов Cypher, что позволяет увидеть небезопасные связи между объектами, которые не очевидны при обычном линейном рассмотрении. В книге приводятся интерфейсы BloodHound и базы данных neo4j. Также мы знакомимся с языком запросов Cypher на реальных примерах, а в завершение рассматриваем, как можно расширить функционал BloodHound, чтобы повысить эффективность утилиты.
01. Общая информация и настройка лаборатории
Любой проект начинается со сбора и анализа информации, и проекты по наступательной безопасности не исключение. Можно сказать, что это один из самых важных этапов проекта: качество собранной информации позволит эффективно выполнить поставленные задачи и уменьшить количество потраченного времени.
В результате сбора информации мы получаем большой объем данных, который необходимо изучить и извлечь важное содержание. В линейных строковых данных не всегда можно эффективно определить связи между двумя объектами. Визуализация данных в виде графов помогает определить связь между двумя объектами и показать причину возникновения этой связи. Также графы помогают определить дальнейшие шаги при выполнении работ.
Графы можно рисовать на бумаге или в приложениях (например, visio), но при использовании этого метода могут быть упущены некоторые связи. Существуют инструменты, которые на основе полученных данных могут показать связи между объектами, даже если эти связи на первый взгляд неочевидны. Среди них Adelante1, Ping Castle2 и BloodHound3. Именно о BloodHound эта книга.
Что такое BloodHound
BloodHound состоит из трех элементов:
1. BloodHound – это одностраничное веб-приложение, написанное на Java Script; при создании приложения используется Linkurious. Для компиляции используется Electron.
2. Neo4j – база данных для хранения информации, в которой используется язык запросов Cypher.
3. SharpHound – сборщик информации из Active Directory.
BloodHound использует теорию графов, чтобы показать скрытые и часто непреднамеренные связи в среде Active Directory или Azure.
Область применения
Наступательная безопасность: специалисты по информационной безопасности могут использовать BloodHound для обнаружения очень сложных последовательностей атак, которые обычным способом невозможно быстро обнаружить.
Кроме наступательной безопасности этот инструмент может использоваться и в других областях для обеспечения безопасности, например:
● Защитники могут использовать BloodHound для выявления и устранения тех же последовательностей атак.
● Специалисты по реагированию на инциденты могут использовать BloodHound для проведения расследований и выявления причин инцидента.
● Аудиторы могут проводить проверки на соответствие стандартам безопасности.
● Утилита BloodHound будет полезна во время стратегических и тактических игр, когда любой сценарий можно визуализировать и пошагово разобрать.
Настройка лаборатории
Материал в книге подготовлен с использованием среды Windows. Для сбора дополнительной информации используются скрипты, написанные на Powershell, который установлен по умолчанию на Windows и имеет достаточный набор функций для работы с доменом, файловой системой и т. д.
Для изучения материала потребуется тестовый стенд с Active Directory, а также машина, на которой будут анализироваться данные и добавляться функционал к самому BloodHound. В книге домен называется DOMAIN.LOCAL, но это не имеет большого значения, самое главное – менять имя домена на свое при выполнении запросов.
Минимальные требования к стенду – это контроллер домена и компьютер для аналитики и разработки. Для удобства сбора информации и анализа данных машину для BloodHound можно ввести в домен. Наименование машин будет следующим:
● DC – контроллер домена, Windows Server 2019;
● COMP – рабочая станция для BloodHound, Windows 10/11.
Если мощности позволят, необходимо создать еще одну виртуальную машину и добавить ее в домен. Если мощностей нет – тогда просто создать еще один объект, компьютер:
● SERVER – просто сервер, Windows Server 2019.
Установка Active Directory
В первую очередь для установки Active Directory на сервере, который будет являться контроллером домена, необходимо поменять имя на DC и установить статический адрес.

Рис. 1.1. Установка статического адреса для контроллера домена
Запускаем Server Manager и выбираем Add roles and features. Следуем за мастером добавления новой роли. Нажимаем кнопку Next. Предложенные по умолчанию настройки нас будут устраивать, поэтому нажимаем кнопку Next до тех пор, пока не появится окно Select server roles.
Выбираем следующие роли:
● Active Directory Domain Service;
● DNS Server.

Рис. 1.2. Выбор ролей
Далее нажимаем кнопку Next до самого конца, пока кнопка Install не станет активной, и нажимаем на нее (рис. 1.3)
После установки нажимаем на кнопку Close. В верхнем правом углу появился желтый восклицательный знак, который указывает нам, что роли требуют завершения настройки (рис. 1.4).
Нажимаем на ссылку Promote this server to a domain controller. Появляется окно с выбором, куда добавить контроллер домена. Так как у нас ничего нет, выбираем Add a new forest и вводим имя домена domain.local (рис. 1.5).
В следующем окне оставляем все по умолчанию и вводим пароль для восстановления (рис. 1.6).

Рис. 1.3. Подтверждение установки Active Directory

Рис. 1.4. Завершение установки Active Directory

Рис. 1.5. Установка имени домена

Рис. 1.6. Выбор уровня домена
Все остальные настройки оставляем без изменений и нажимаем кнопку Next до того момента, как кнопка Install станет активной. Нажимаем на нее, дожидаемся установки и перезагрузки сервера.
Теперь необходимо ввести машины COMP и SERVER в домен. Но перед этим их нужно переименовать и установить статические IP-адреса.
Совет
Рекомендуется на всех хостах отключить межсетевой экран и антивирус, чтобы они нам не мешали во время экспериментов.
Создание объектов домена
После создания домена необходимо создать несколько учетных записей:
● admin – пароль Qwerty123, установить бесконечный срок действия пароля, после создания добавить пользователя в группу доменных администраторов;
● user – пароль Qwerty123, установить бесконечный срок действия пароля;
● victim – пароль Qwerty123, установить бесконечный срок действия пароля.
Создать пользователей можно с помощью ADUC или Active Directory Module. В этом случае команды будут следующими:
# Создать пользователя admin
New-ADUser -Name"admin" -SamAccountName "admin" -UserPrincipalName "admin@domain.local" -DisplayName "admin" -GivenName "admin" -AccountPassword (ConvertTo-SecureString "Qwerty123" -AsPlainText -force) -Enabled $true -PasswordNeverExpires $true
# Создать пользователя user
New-ADUser -Name "user" -SamAccountName "user" -UserPrincipalName "user@domain.local" -DisplayName "user" -GivenName "user" -AccountPassword (ConvertTo-SecureString "Qwerty123" -AsPlainText -force) -Enabled $true -PasswordNeverExpires $true
# Создать пользователя victim
New-ADUser -Name "victim" -SamAccountName "victim" -UserPrincipalName "victim@domain.local" -DisplayName "victim" -GivenName "victim" -AccountPassword (ConvertTo-SecureString "Qwerty123" -AsPlainText -force) -Enabled $true -PasswordNeverExpires $true
# Добавить пользователя admin в группу доменных администраторов
Add-ADGroupMember -Identity "Domain Admins" -Members admin
Совет
Для наполнения домена можно воспользоваться скриптом BadBlood4, но не стоит для первых экспериментов создавать большое количество объектов. Работать с хостом
COMPбудем от имени учетной записиadmin, она входит в группу локальных администраторов как член группы доменных администраторов. В некоторых ситуациях можно использовать другие учетные записи для тестирования различных запросов.
Выполним еще несколько действий, которые позволят сделать нашу лабораторию более интересной с точки зрения запросов:
● добавим пользователя user в группу локальных администраторов на хосте COMP;
● авторизуемся на хосте SERVER от имени пользователя victim.
Совет
Добавьте пользователя
userв группу локальных администраторов на хостеCOMPдля будущих запросов.
Установка neo4j
Перед использованием BloodHound необходимо подготовить рабочую станцию (в нашем случае это будет компьютер с именем COMP): установить OpenJDK и neo4j.
Установка OpenJDK
База данных neo4j написана на языке Java, и для ее работы требуется OpenJDK. Для версии neo4j 4.4.11, которая будет использоваться на протяжении всей книги, необходимо установить OpenJDK 11. Существует два варианта установки: вручную, где потребуется прописывать все пути самостоятельно, и с помощью winget.
Внимание
Если использовать другие версии OpenJDK, при запуске neo4j возникнет ошибка с сообщением, что данная версия не поддерживается, и рекомендациями по поддерживаемым версиям.
Установка OpenJDK вручную
Для начала нужно скачать скомпилированный дистрибутив OpenJDK 11 с официального сайта5. Распакуем архив в директорию C: \Program Files\openjdk\. Теперь необходимо прописать пути в переменных окружения. В командной строке с правами локального администратора нужно выполнить sysdm.cpl, перейти во вкладку «Дополнительно» и нажать на переменные среды.

Рис. 1.7. Свойства системы
Теперь нужно создать новую системную переменную с именем JAVA_HOME и указать путь до распакованного архива (в нашем случае это C:\Program Files\openjdk\jdk-11.0.0.1).

Рис. 1.8. Переменная окружения JAVA_HOME
Также необходимо добавить созданную переменную окружения в PATH.

Рис. 1.9. Добавление в PATH
Установка OpenJDK с помощью winget
Для Windows 10 необходимо установить App Installer из магазина, а в Windows 11 winget установлен по умолчанию. Запустите консоль с правами администратора и выполните команду:
winget install ojdkbuild.openjdk.11.jdk
После установки все пути будут добавлены автоматически.
Установка neo4j
Скачать neo4j можно с официального сайта разработчика6, для изучения будем использовать бесплатную версию Community Edition. На момент подготовки книги к печати использовалась версия 4.4.11.
Внимание
Бесплатная версия neo4j позволяет создавать только одну базу. Для работы над проектом этого достаточно.
Распаковываем архив с neo4j в удобную директорию, я обычно использую C: \Tools\Neo4j\ (для удобства будем называть эту директорию $NEO4J_HOME), затем запускаем командную строку или powershell с правами администратора (потребуется для установки службы) и выполняем следующую команду:
c: \Tools\Neo4j\bin\neo4j.bat console
Если никаких ошибок не возникнет, то можно увидеть информацию об успешном запуске, как показано ниже.

Рис. 1.10. Первый запуск neo4j
Остановить neo4j можно сочетанием клавиш CTRL + z.
Лучше создать службу, которая будет автоматически запускать neo4j после перезагрузки хоста. Для этого необходимо выполнить следующие команды с правами локального администратора:
C: \Tools\Neo4j\bin\neo4j.bat install-service
C: \Tools\Neo4j\bin\neo4j.bat start
Первая команда установит службу, а вторая ее запустит.

Рис. 1.11. Создание и запуск службы
Проверить статус службы можно с помощью команды:
c: \Tools\Neo4j\bin\neo4j.bat status

Рис. 1.12. Проверка статуса
Смена пароля
После успешного запуска neo4j требует сменить пароль, установленный по умолчанию. Для этого запускаем браузер, переходим по адресу http://localhost:7474 и вводим логин neo4j и пароль neo4j.

Рис. 1.13. Первый запуск браузера neo4j
Выполнив первую аутентификацию, neo4j попросит сменить пароль для пользователя neo4j.

Рис. 1.14. Форма смены пароля
На данном этапе больше никаких действий не потребуется, и мы переходим к заключительной части настройки лаборатории.
Установка BloodHound
Для установки BloodHound не требуется сложных действий. Скачаем необходимую версию (на момент подготовки книги к печати 4.3.1) с официального GitHub7.
Внимание
Более новая версия BloodHound может потребовать новую версию neo4j.
Разархивируем загруженный архив, перейдем в директорию с полученными из архива файлами и запустим bloodhound.exe. После запуска приложения появится приглашение для ввода пароля.

Рис. 1.15. Форма аутентификации BloodHound
Можно установить флаг Save Password, чтобы не вводить пароль каждый раз.
02. Знакомство с SharpHound, BloodHound и neo4j
Как говорилось ранее, утилита BloodHound состоит из трех частей: непосредственно сама BloodHound, сборщик данных SharpHound и база данных neo4j. В этой части книги мы рассмотрим интерфейсы этих приложений.
SharpHound
SharpHound – это консольное приложение, написанное на C#. SharpHound собирает информацию об объектах домена через запросы LDAP, а также информацию с хостов, такую как членство в локальных группах и сессиях.
Скачать SharpHound можно на официальном GitHub8. Разные версии SharpHound генерируют разные форматы данных в JSON, которые BloodHound не всегда принимает. Для BloodHound версии 4.3.1 подойдет SharpHound 1.1.0 или 1.1.1.
Информация
В исходных кодах BloodHound тоже есть SharpHound, он находится в директории
Collectors.Внимание
Стоит упомянуть, что антивирусные решения считают SharpHound вредоносной утилитой.
SharpHound имеет большое количество настроек, которые помогают более гибко собирать информацию с домена и рабочих станций. Не будем останавливаться на всех параметрах запуска утилиты – у нее есть понятная справка, которую можно получить, выполнив команду:
SharpHound.exe -h
В интернете можно найти различные подсказки по методам запуска и некоторую дополнительную информацию по запросам Cypher. Одна из таких подсказок представлена на рисунке 2.19.
Для последующего изучения нам потребуются данные из домена. Поэтому в нашей лаборатории запустим SharpHound на хосте COMP от имени доменной учетной записи admin, которая входит в группу доменных администраторов. Это позволит собрать всю полезную информацию из домена и хостов (рис. 2.2).
SharpHound -c All

Рис. 2.1. Подсказка по SharpHound

Рис. 2.2. Результат сбора информации
Внимание
Обновленные операционные системы не позволяют получить информацию о сессиях пользователей (HasSession) и членстве в локальных группах (CanRDP или AdminTo) без прав локального администратора.
К собранной информации вернемся позже, а сейчас рассмотрим интерфейс BloodHound.
Интерфейс BloodHound
После прохождения аутентификации открывается основное окно. Пока данных нет, оно пустое; после загрузки данных BloodHound выполняет запрос, который показывает, какие пользователи входят в группу доменных администраторов.
Интерфейс BloodHound интуитивно понятен. Весь его функционал представлен в одном окне.

Рис. 2.3. Основное окно BloodHound
В левом верхнем углу располагаются форма поиска и информационные вкладки, в правом верхнем углу – меню для настройки интерфейса, загрузки и выгрузки данных. В правом нижнем углу – работа с масштабом, внизу по центру окна располагается форма Raw Query для Cypher-запросов.
Основное поле
В основном поле отображается или узел, или граф на основании запроса Cypher. Узлы можно перемещать по полю. Само поле, узлы и связи имеют контекстное меню, которое можно вызвать правой клавишей мыши.
Форма поиска

Рис. 2.4. Форма поиска
Форма поиска состоит из следующих элементов:
● Дополнительная информация (More Info)
● Поле поиска узлов
● Поиск путей (Pathfinding)
● Возврат (Back)
● Фильтрация типов связей (Filter Edge Types)
Дополнительная информация (More Info)
Этот объект является основным полем для получения информации о свойствах и некоторых связях узлов. При нажатии на кнопку More Info выпадает поле, состоящее из трех элементов.

Рис. 2.5. Вкладка «Дополнительная информация»
Database Info
Вкладка содержит статистические данные по количеству объектов в базе данных, а также некоторые инструменты для работы с базой данных (рис. 2.6).

Рис. 2.6. Статистика по узлам и связям
Ниже статистики находятся элементы для управления данными.

Рис. 2.7. Управление данными
Кратко рассмотрим эти элементы и их функционал:
● Refresh Database Stats – после загрузки данных или добавления информации через запросы Cypher статистика может быть неверной, эта кнопка обновляет статистические данные.
● Warm Up Database – по описанию от разработчиков, при нажатии этой кнопки данные из базы переносятся в оперативную память, что позволяет увеличить скорость работы с ними.
● Clear Sessions – при нажатии этой кнопки удаляются все связи HasSession. Эта функция бывает полезной перед загрузкой новых данных о сессиях пользователей.
● Clear Database – при нажатии этой кнопки удаляются все узлы и связи между ними.
Замечание
Интересно, что при очистке базы данных в браузере neo4j остаются ссылки на свойства объектов и названия связей.
Информация об узле (Node Info)
В этой вкладке отображаются свойства узла. Кроме того, в ней выполняются некоторые Cypher-запросы, которые предоставляют статистические данные, например, для пользователей и компьютеров выдается информация о сессиях или коротких путях до узлов высокой ценности.

Рис. 2.8. Информация об узле
Разные типы узлов содержат разную информацию. Так, например, групповые политики содержат информацию, к каким пользователям или компьютерам они применяются, а у пользователей и компьютеров отображается информация о правах на другие объекты или правах, связанных с боковым перемещением (рис. 2.9).

Рис. 2.9. Информация о группах и правах
Очень полезна информация о входящих и исходящих правах (ACL) на другие объекты, которые могут быть использованы во время работ.

Рис. 2.10. Входящие и исходящие ACL
Анализ (Analysis)
Вкладка Анализ (Analysis) содержит встроенные в BloodHound полезные запросы, с которых можно начать исследовать инфраструктуру Active Directory (рис. 2.11).

Рис. 2.11. Список встроенных запросов
Информация
Встроенные запросы находятся в файле
PrebuildQueries.jsonв директорииsrc\components\SearchContainer\Tabs.
Ниже находится раздел для добавления собственных Cypher-запросов, который содержит форму для их создания, а также список созданных запросов, разделенный по категориям.

Рис. 2.12. Раздел создания собственных запросов
При нажатии на кнопку в виде карандаша появляется форма для добавления запросов (рис. 2.13).
При переходе к полю выбора категории запроса можно создать собственную категорию или выбрать из существующих.
Информация
Файл
customqueries.jsonс собственными запросами находится в домашней директории пользователя, запустившего BloodHound, с путем\AppData\Roaming\bloodhound\.

Рис. 2.13. Форма добавления собственных запросов
Информация
При вызове формы добавления собственных графов файл создается автоматически, если он еще не создан.
Мы еще вернемся к созданию собственных запросов.
Поле поиска
Следующий элемент – форма поиска узлов. Если начинать вводить буквы, BloodHound предлагает различные варианты. Также форма поиска показывает различные типы меток – они дают возможность видеть, к какому типу принадлежит узел. Функция полезна для поиска узлов по ключевым словам.
Внимание
По умолчанию поиск по ключевому слову ограничивается 10 узлами. Изменить количество узлов можно в Raw Query, если в настройках включен Query Debug Mode.
Кроме имени для поиска можно использовать свойство objectid.
Форма Поиск путей (Pathfinding)
Функция позволяет строить короткие пути. При нажатии на иконку появляется еще одна форма поиска, в первой строке указывается начальный узел, во второй – конечный (рис. 2.14).
Работает аналогично полю поиска, при нажатии стрелки формируется Cypher-запрос с построением коротких путей от первого узла до конечного.

Рис. 2.14. Форма поиска путей
Информация
BloodHound создает Cypher-запрос со всеми связями, указанными в файле
AppContainer.jsx, и с учетом фильтра связей.
Возврат (Back)
Кнопка в виде стрелки влево возвращает предыдущий граф, но без возврата самого запроса в Raw Query.
Фильтр связей (Filter Edge Types)
При нажатии на кнопку в виде воронки появляется новое окно с перечнем доступных связей, при снятии галки связь убирается из запроса при использовании формы Поиск путей (Pathfinding). Каждая группа имеет кнопки включения всех связей (две галки) и отключения всех связей (ластик).

Рис. 2.15. Фильтр связей
Внимание
Фильтр работает только с функцией Поиск путей (Pathfinding).
Меню
Меню состоит из следующих элементов:
● Обновление графа (Refresh)
● Экспорт графа (Export Graph)
● Импорт графа (Import Graph)
● Загрузка данных
● Статус загрузки (View Upload Status)
● Изменение отображения графа (Change Layout Type)
● Настройки
● Информация о программе (About)

Рис. 2.16. Меню
Обновление графа (Refresh)
Нажатие на эту кнопку позволяет вернуть граф в исходное состояние, которое было получено при выполнении запроса.
Экспорт графа (Export Graph)
Кнопка в виде стрелки вверх позволяет экспортировать граф. BloodHound поддерживает два формата – в виде картинки PNG или в формате JSON.
Данный функционал полезен для вставки картинки в отчет, а JSON-файл можно передать для анализа графа.
Импорт графа (Import Graph)
Кнопка в виде стрелки вниз позволяет загрузить ранее сохраненный граф в виде JSON-файла, в результате чего будет отрисован граф, созданный ранее.
Информация
Импортировать граф можно даже в пустую базу или в базу с другими данными.
Загрузка данных (Upload Data)
При нажатии на кнопку в виде стрелки вверх в круге появляется окно, в котором указываются файлы, сгенерированные SharpHound. Обычно SharpHound формирует ZIP-архив, в котором находятся файлы, разделенные по классу объектов домена.
BloodHound автоматически распаковывает архив и преобразовывает JSON в Cypher-запросы, тем самым загружая данные.
Статус загрузки (View Upload Status)
Кнопка в виде списка показывает статус загрузки данных. При нажатии на кнопку Clear Finished статус удаляется.
Изменение отображения графа (Change Layout Type)
Иконка в виде графика позволяет изменять отображение графа. BloodHound предоставляет два вида отображения – Направленное (Directed) и Иерархическое (Hierarchical) (рис. 2.17–2.18).
Изменение типа позволяет лучше рассмотреть граф, и в некоторых случаях BloodHound выстраивает красивые цепочки.

Рис. 2.17. Направленное отображение графа

Рис. 2.18. Иерархическое отображение графа
Настройки (Settings)
При нажатии на кнопку Настройки появляется окно с настройками, их немного.

Рис. 2.19. Окно с настройкам
Кратко рассмотрим представленные настройки.
Порог свертывания узлов (Collapse Threshold). В BloodHound есть механизм, который группирует узлы, имеющие одинаковую связь (только одну) с другим узлом. Это позволяет уменьшить нагрузку на отображение графа, но при этом можно упустить какой-то узел. Применяется к Группам (Group), Контейнерам (Container) и Подразделениям (OU). Данный параметр имеет числовое значение, по умолчанию это 5, что означает – если будет пять узлов или больше, то они объединятся в одну группу. В этой группе появится значок количества объектов внутри группы. Значение 0 отключает эту функцию.
Отображение названия связи (Edge Lable Display) – режим отображения названия связи.
Отображение названия узла (Node Lable Display) – режим отображения названия узла.
Режим отображения узлов и связей может иметь следующие варианты:
● Пороговое отображение (Threshold Display) – название появляется или исчезает при изменении масштаба графа.
● Всегда показывать (Always Display) – название всегда отображается.
● Никогда не показывать (Never Display) – название никогда не отображается.
Вне зависимости от выбранного режима отображения название появится при наведении курсора мыши на узел.
Режим отладки запросов (Query Debug Node) – при включении данной опции все запросы отображаются в Raw Query. Это удобный вариант для обучения или отладки запросов Cypher.
Режим низкой детализации (Low Detail Mode) полезен для слабых машин, так как требует меньше ресурсов для отрисовки узлов. Узлы будут представлять собой только цветные круги.
Темный режим (Dark Mode) включает темный режим интерфейса.
Информация о программе (About)
Кнопка Информация о программе показывает окно с информацией о разработчиках и типе лицензии данной программы (рис. 2.20).

Рис. 2.20. Информация о программе
Масштабирование (Zoom)

Рис. 2.21. Управление масштабом
Тут все просто: плюс увеличивает масштаб графа, минус – уменьшает, а кнопка в виде дома возвращает масштаб в исходное состояние. При этом если узлы перемещались, то они не будут возвращены в исходное состояние, в отличие от действия кнопки Обновление графа (Refresh).
Совет
Колесо мыши также можно использовать для изменения масштаба графа.
Запросы Cypher (Raw Query)
Данная форма позволяет вводить собственные запросы Cypher или отлаживать существующие. Не поддерживает многострочные запросы, в результате чего все многострочные запросы будут преобразованы в одну строку.
Управление узлом (Node Options)
При нажатии правой клавишей мыши на узле появится окно управления данным узлом.

Рис. 2.22. Окно управления узлом
Данное окно содержит несколько интересных функций, которые могут пригодиться во время выполнения работ. Поэтому кратко их рассмотрим.
Установить в качестве начального узла (Set as Starting Node) – при выборе этого варианта в Форме поиска появится имя выбранного узла.
Установить в качестве конечного узла (Set as Ending Node) – при выборе этого варианта откроется форма Поиск путей (Pathfinding) и в конечном узле появится имя выбранного узла.
Построить короткие пути до узла (Shortest Paths to Here) – позволяет получить все короткие пути до выбранного узла.
Построить короткие пути от скомпрометированных узлов до указанного узла (Shortest Paths to Here from Owned) – данный вариант позволяет получить короткие пути от всех скомпрометированных узлов (у которых свойство owned имеет значение TRUE) до выбранного узла.
Изменить свойства узла (Edit Node) – нажатие на эту кнопку открывает окно, позволяющее изменять существующие свойства или добавлять новые.

Рис. 2.23. Форма изменения свойств узла
Пометить узел как скомпрометированный (Mark as Owned) – устанавливает свойству узла owned значение TRUE. Кроме изменения свойства owned на узле в правом нижнем углу появится значок в виде черепа. Если в свойстве owned уже установлено значение TRUE, тогда вариантом будет Снять метку со скомпрометированного узла (Unmark as Owned) и при нажатии на эту кнопку свойству owned узла будет назначено значение FALSE.
Пометить узел как имеющий высокую ценность (Mark as High Value) – функционал похож на предыдущий, устанавливает свойство узла highvalue в значение TRUE. После установки значения в правом верхнем углу узла появится значок в виде бриллианта. Если в свойстве highvalue уже установлено значение TRUE, тогда вариантом будет Снять метку высокой ценности с узла (Unmark as Owned) и при нажатии на эту кнопку свойству highvalue узла будет назначено значение FALSE.
Удалить узел (Delete Node) – функция удаления выбранного узла.
Совет
Если при построении графа у нас получится прохождение через узел, который нам недоступен или мы не имеем на него никаких прав, то лучше не удалять его, а помечать как
blacklistedи исключать из запроса. Данный способ будет рассмотрен в книге дальше.
Управление связью (Edge Options)
При нажатии правой клавишей мыши на связь между двумя узлами появляется окно управления данной связью.

Рис. 2.24. Окно управления связью
В этом окне всего два варианта.
Подсказка (Help) – позволяет получить информацию как о самой связи, так и об ее эксплуатации.
● Вкладка General – показывает краткое описание связи и ее возможности.
● Вкладка Abuse – показывает примеры эксплуатации.
● Вкладка OpSec – описывает, как можно обнаружить эксплуатацию связи.
● Вкладка References – предоставляет различные ссылки по данной связи.

Рис. 2.25. Окно подсказки
Удалить связь (Delete Edge) – позволяет удалить выбранную связь между двумя узлами.
Совет
Как и с удалением узла, связь можно пометить как blacklisted и исключить из запроса.
Управление графом (Graph Options)
Если кликнуть правой клавишей мыши на пустом месте основного поля, то появится окно управления графом.

Рис. 2.26. Окно управления графом
Некоторые кнопки мы уже рассматривали в разделе Меню, поэтому рассмотрим только новые.
При нажатии Добавить узел (Add Node) появляется форма, в которой можно указать имя узла и его тип. Все остальные свойства узла будут указываться при вызове Изменить свойства узла (Edit Node) в контекстном меню узла.

Рис. 2.27. Форма добавления нового узла
Разные типы узла требуют своего формата. Если он не соответствует, будет выведена ошибка. Так, например, тип узла User требует, чтобы в имени был знак @, который разделяет имя пользователя и домен.
Информация
Тип узла берется из файла
AddNodeModal.jsx, расположенного вsrc\components\Modals.
При нажатии на Добавить связь (Add Edge) появляется форма, позволяющая добавить связь между двумя узлами. Аналогично с поиском при вводе имени или objectid, будут предложены различные варианты.

Рис. 2.28. Форма добавления связи между двумя узлами
Данный функционал может быть полезен при обнаружении связей, которые утилита BloodHound по каким-то причинам не смогла определить.
Информация
Названия связей берутся из файла
AddEdgeModal.jsx, расположенного вsrc\components\Modals.
Обновить запрос (Refresh Query) – заставляет BloodHound заново выполнить запрос.
Список узлов
Завершим раздел полезной функцией. Если граф очень большой, можно вывести список узлов, нажав пробел, в результате появится окно со списком (рис. 2.29).

Рис. 2.29. Список узлов
Список узлов поддерживает поиск и при вводе букв будет фильтровать данные, но, в отличие от формы поиска, не поддерживает поиск по objectid.
Рядом с каждым именем есть иконка, обозначающая метку узла. В колонке Collapse Info показывается, в какую группу собраны узлы.
Чтобы закрыть список узлов, нужно повторно нажать на пробел.
База данных neo4j
Neo4j – это графовая база данных. Ее модель проста и основана на узлах и связях.
Модель описывается следующим образом:
● Каждый узел может иметь различные связи с другими узлами.
● Каждая связь может переходить от одного узла к другому или к тому же узлу.
● Каждая связь может иметь или не иметь направление.
● Узлы и связи могут иметь свойства, а каждое свойство имеет имя и значение.
Версия neo4j Community Edition имеет очень ограниченный функционал, и из него мы будем использовать только создание резервных копий и восстановление данных из резервных копий.
Работать с информацией из базы данных можно с помощью браузера neo4j, консольного приложения cypher-shell, расположенного в директории $NEO4J_HOME/bin, или с помощью API.
Если необходимо подробнее изучить сам neo4j, то лучше обратиться к специальной литературе, мы же используем возможности языка запросов Cypher.
Интерфейс браузера neo4j
BloodHound выводит результаты запросов в виде графа или отдельных узлов. Свойства узлов можно увидеть во вкладке Node Info, а просмотр свойств связей вообще недоступен. Браузер neo4j в этом плане более гибкий, можно выводить информацию в различных видах. В основном мы будем использовать графы и таблицы.
После смены пароля мы оставили браузер neo4j, теперь стоит к нему вернуться и рассмотреть более детально.

Рис. 2.30. Браузер neo4j
Меню
Слева располагается меню, при нажатии на любой элемент раскрывается дополнительное поле.
Меню достаточно простое и не имеет сложных элементов. Мы рассмотрим только Информацию о базе данных (Database), Избранные запросы (Favorites) и Настройки браузера (Browser Settings), которые могут оказаться полезными. В большинстве случаев с остальными элементами вряд ли придется столкнуться во время использования.

Рис. 2.31. Меню браузера neo4j
Информацию о базе данных (Database)
Первый раздел – Информация о базе данных (Database) – содержит информацию о базе данных и о том, какие элементы входят в нее.
● Используемая база данных (Use database). Как говорилось ранее, в версии community edition есть всего одна база neo4j кроме system.
● Метки узлов (Node Labels) – этот пункт показывает, какие в базе есть метки. Каждая метка интерактивная, можно нажать на любую метку и получить результат. Вывод ограничен 25 узлами.
● Типы связей (Relationship Types) – аналогично с метками, показывает, какие связи есть в базе данных, и тоже интерактивно.
● Названия свойств (Property Keys) – показывает, какие свойства есть у узлов и связей.
● Подключение от имени какой учетной записи (Connected as) – в нашем случае у нас одна учетная запись с именем neo4j без определения ролей.
● DMBS – информация о СУБД.
Избранные запросы (Favorites)
Раздел Избранные запросы (Favorites) позволяет сохранять запросы, которые затем можно использовать. К сожалению, в браузере neo4j есть функция экспорта запросов, но нет импорта. Как добавить и использовать этот функционал, мы рассмотрим дальше.
Настройки браузера (Browser Settings)
Раздел Настройки браузера (Browser Settings) содержит несколько подразделов, которые позволяют сделать работу с браузером удобнее.
Интерфейс пользователя (User Interface)

Рис. 2.32. Интерфейс пользователя
Интерфейс пользователя (User Interface) позволяет:
● изменить тему внешнего вида;
● объединить некоторые символы в один (Code font ligatures) – это касается только стрелок направления связи;
● включить редактор нескольких запросов (Enable multi statement query editor) – браузер neo4j поддерживает выполнение нескольких запросов, которые разделяются точкой с запятой. Отключение этой функции не позволит выполнять такие запросы.
Предпочтения (Preferences)

Рис. 2.33. Предпочтения
Данный раздел содержит две настройки:
● Первоначальная команда для выполнения (Initial command to execute) – команда, которая будет выполняться при запуске браузера neo4j. Команды начинаются с двоеточия. Например, можно вызывать историю команд :history или подсказку по командам :help.
● Таймаут подключения в миллисекундах (Connection timeout (ms)) – определяет, сколько времени браузер будет ожидать при подключении к базе данных.
Рамки с результатами (Result Frames)

Рис. 2.34. Рамки с результатами
В результате запроса Cypher в браузере neo4j создается отдельная рамка со строкой запроса и результатом. Данный раздел определяет следующие параметры:
● Максимальное количество рамок с результатами (Maximum number of result frames) – задает количество новых рамок с запросами, при превышении которого старые будут удаляться.
● Максимальная длина истории (Max history length) – задает количество запросов в истории, после чего они будут затираться. Историю можно вызвать командой :history.
Визуализация графа (Graph Visualization)

Рис. 2.35. Настройки визуализации графа
В данном разделе определяются настройки визуализации графа:
● Количество узлов при отображении графа (Initial Node Display) – определяет максимальное количество узлов при отображении графа.
● Максимальное количество соседей (Max neighbours from vis interaction) – определяет максимальное количество соседних узлов для одного узла.
● Максимальное количество строк для просмотра (Result view max rows) – максимальное количество строк в результате для просмотра в режиме таблицы или текста.
● Максимальное количество полей (Max record fields) – максимальная длина возвращаемого списка. Если длина списка будет превышена, будут выданы только первые записи, а остальные будут отброшены.
● Связи результирующих узлов (Connect result nodes) – отображает все связи между узлами, полученными в результате запроса, даже те, которые не были запрошены.
● Показывать подсказку использования масштабирования (Show zoom interactions hint) – при включенном параметре, если граф получается большим, всплывает окно с подсказкой, как можно пользоваться масштабированием.
Настройки можно посмотреть с помощью команды :config.

Рис. 2.36. Результат выполнения команды :config
Кроме того, с помощью этой команды можно изменять значения параметров. Например, чтобы увеличить количество записей в истории, нужно выполнить следующую команду:
:config maxHistory:50
Рабочая область
Справа от меню расположена рабочая область, которая состоит из двух элементов:
● главная строка запроса;
● рамки выполненных запросов (рис. 2.37).

Рис. 2.37. Рабочая область
Главная строка запроса

Рис. 2.38. Главная строка запроса
Главная строка запроса состоит из следующих элементов:
● Поле ввода запросов или команд (поддерживает многострочные запросы, для перехода на новую строку используется сочетание клавиш Shift + Enter).
● Кнопка Выполнить (Run) предназначена для выполнения запроса или команды. То же самое можно сделать клавишами Enter или CTRL + Enter для многострочных запросов.
● Кнопка Полноэкранный режим (Fullscreen) разворачивает строку запроса в полноэкранный режим.
● Кнопка Очистить (Clear) очищает строку запроса.
Пролистывать предыдущие запросы можно с помощью стрелок вверх и вниз, для многострочных запросов – в сочетании с клавишей Shift.
Получить историю можно с помощью команды :history.

Рис. 2.39. Вызов истории выполненных запросов
Данная команда покажет последние 30 запросов, данный параметр определяется в настройке Max history length. Нажатие на любой из запросов вставит его в главное окно запросов.
Рамки (Frame)
Каждый выполненный запрос в главной строке запроса открывает отдельную область. По умолчанию neo4j открывает 15 таких областей, но их количество может быть изменено в параметре Maximum number of result frames. Команда :clear удалит все рамки из рабочей области.

Рис. 2.40. Рамка с результатами запроса
Элементы управления рамкой
В правом верхнем углу расположены элементы управления рамкой:

Рис. 2.41. Элементы управления рамкой
● Кнопка Закрепить наверху (Pin at top) позволяет закрепить рамку под основной строкой запроса, все последующие запросы будут располагаться под ней.
● Кнопка Свернуть (Collapse) сворачивает рамку, оставляя только строку запроса.
● Кнопка Полноэкранный режим (Fullscreen) разворачивает рамку на все окно браузера.
● Кнопка Закрыть (Close) закрывает текущую рамку.
Строка запроса

Рис. 2.42. Строка запроса в рамке
Строка запроса работает так же, как и основная. Позволяет работать с графом, не запуская новую рамку.
Следующая кнопка Сохранить как Избранное (Save as Favorite) позволяет добавить запрос в избранные.
Прежде чем это сделать, лучше добавить перед командой комментарий с кратким описанием того, что она делает, выполнить ее и после уже добавлять в избранные.

Рис. 2.43. Добавление запроса в избранное
Заключительный элемент поля запроса – кнопка Экспорт (Exports) – позволяет экспортировать результаты запроса в другие типы файлов. Варианты экспорта зависят от выбора вывода информации:
● граф – в виде картинки в формате SVG или PNG;
● таблица, текст, код – в текстовом виде в формате JSON или CSV.
Формат вывода информации
Слева от поля вывода располагаются варианты отображения информации.
● Граф (Graph) – визуальное построение графа с узлами и связями.
● Таблица (Table) – табличное представление данных при запросе свойств узлов и связей или в виде форматированного JSON при запросе графа.
● Текст (Text) – представление данных в неформатированном виде.
● Код (Code) – представление данных в виде HTTP-запроса и ответа в формате JSON.

Рис. 2.44. Формат вывода результатов
В большинстве случаев браузер neo4j автоматически выбирает режим между графом и текстом.
Поле вывода

Рис. 2.45. Поле вывода информации
Поле для непосредственного вывода информации в виде графа или текста. Справа находится выпадающая информационная панель, которая предоставляет общую информацию о графе или о свойствах узлов и связей.
Общая информация о графе показывает перечень узлов с метками и связей с типами, а также общее количество узлов и связей. При нажатии на метку или тип связи появляется контекстное меню, в котором можно изменить цвет, размер и подпись к узлу или связи.

Рис. 2.46. Изменение внешнего вида узла
Масштабирование
При выводе информации в виде графа в правом нижнем углу появляется управление масштабированием графа со следующими функциями:
● увеличение;
● уменьшение;
● выравнивание и отцентровка всего графа.

Рис. 2.47. Управление масштабом графа
Установка плагинов
Neo4j имеет большое количество различных плагинов, которые позволяют улучшить работу с запросами. В книге используется только базовый APOC, поэтому рассмотрим установку плагинов на его примере.
Зайдем на официальный GitHub neo4j с плагинами10 и скачаем двоичный jar-файл apoc-4.4.0.1-all.jar. Поместим его в папку $NEO4J_HOME/plugins. В моем случае это C: \Tools\Neo4j\plugins.
Информация
Поскольку APOC использует внутренние API neo4j, необходимо использовать правильную версию APOC для вашей установки neo4j. APOC использует согласованную схему управления версиями:
<neo4j-версия>.<apoc>версия. Завершающая часть номера версии<apoc>будет увеличиваться с каждым новым выпуском APOC.
Если сейчас мы перезагрузим neo4j и попытаемся воспользоваться процедурами из плагина, то получим ошибку.

Рис. 2.48. Ошибка некорректной настройки процедур
Чтобы исправить ее, нужно открыть файл конфигурации $NEO4J_HOME/conf/neo4j.conf на редактирование. Убрать комментарий со строки dbms.directories.plugins=plugins, затем найти строку dbms.security.procedures.unrestricted=…, после нее добавить строку dbms.security.procedures.unrestricted=algo.*, apoc.* и перезапустить службу:
C: \Tools\Neo4j\bin\neo4j.bat restart
В дальнейшем мы столкнемся с процедурами из этого плагина, а пока перейдем к другой теме.
Создание резервных копий и восстановление
Создание резервных копий полезно при переносе базы данных с одного компьютера на другой или при сохранении результатов проекта для будущих исследований. При дальнейшем изучении книги мы будем несколько раз обращаться к резервным копиям.
Чтобы создать резервную копию, нам необходимо остановить базу данных. Для этого перейдем в директорию $NEO4J_HOME/bin и выполним команду:
.\neo4j.bat stop
Если neo4j запущен в режиме консоли, то можно нажать Сtrl+С или просто закрыть окно.
Теперь создадим резервную копию текущей базы данных, указав имя базы данных neo4j и путь до файла резервной копии:
.\neo4j-admin.bat dump -database="neo4j" -to="c: \tools\neo4j.dump"
После успешного завершения создания резервной копии запустим neo4j:
.\neo4j.bat start

Рис. 2.49. Создание резервной копии
Процедура восстановления похожа на создание копий, изменяется только команда с dump на load. Останавливаем neo4j:
.\neo4j.bat stop
Выполняем команду восстановления данных из дампа, указав полный путь до файла дампа, созданного ранее:
.\neo4j-admin.bat load -database="neo4j" -from="c: \tools\neo4j.dump" -force
Стоит обратить внимание на использование ключа -force: в случае его отсутствия neo4j сообщит, что база данных neo4j уже существует.

Рис. 2.50. Сообщение об ошибке
После успешного восстановления из резервной копии запустим neo4j:
.\neo4j.bat start

Рис. 2.51. Успешное восстановление данных
03. Дрессируем собаку. Язык запросов Cypher
SharpHound, BloodHound и neo4j – это инструменты для сбора, хранения и визуализации информации. Основная магия – это язык запросов Cypher. В интернете можно найти уже готовые запросы и использовать их, но в дополнение к этому хорошо бы разбираться, как они работают, и уметь разрабатывать их самому. В этом разделе мы рассмотрим основные принципы построения запросов и синтаксис языка запросов Cypher.
ВниманиеДанный раздел содержит только необходимую для работы с BloodHound информацию. Для более глубокого изучения языка запросов Cypher стоит обратиться к официальной документации11.
Обычно результаты запросов представляются в виде графов, что удобно для обнаружения связей между объектами. В некоторых случаях данные могут представляться в виде таблиц, что удобно для анализа данных. В BloodHound объекты домена являются вершинами (узлами) графа, а отношения (связи) между этими объектами – ребрами. Также в neo4j узлы графа маркируются меткой (label) по общему принципу. Это позволяет делать выборку только из необходимой группы объектов. Названия связей определяются по типу (type).
Совет
Так как некоторые части зависят от других и на первом этапе могут быть не очень понятными, то рекомендую прочитать этот раздел от начала до конца, а потом вернуться уже с пониманием некоторых моментов.
Bepul matn qismi tugad.