
Ваш шаблонный терминальный инструмент-компаньон для BloodHound

Терминальное приложение на Python3, содержащее cypher-запросы для наборов данных BloodHound, а также скрипт для автоматизации их импорта в BloodHound CE.
Терминал

HTML-отчёт

HTML-отчёт (продолжение)

BloodHound — незаменимый инструмент для каждого пентестера. Однако у его архитектуры есть и отрицательные стороны. Я перечислю самые большие проблемы, с которыми столкнулся, и то, как этот инструмент призван их решить:
JSON, мне нужны результаты графа в построчном формате .txt, чтобы реально атаковать с помощью других инструментовЭтот инструмент может быть полезен как для красных, так и для синих команд.
Верните контроль над своими данными BloodHound с помощью CypherHound!
grep/cut/awkcustomqueries.json из BloodHound Legacy в BloodHound CEУбедитесь, что python3 установлен, и выполните:
python3 -m pip install -r requirements.txt
Запустите программу командой: python3 cypherhound.py -c config.json -y queries.yaml
Программа читает конфигурационный файл в формате json. Пример такого файла приведён ниже:
{
"user": "neo4j",
"pwd": "password",
"database": "neo4j"
}
где:
user — ваше имя пользователя Neo4jpwd — ваш пароль Neo4jdatabase — ваша база данных Neo4jПрограмма читает запросы из YAML-файла в формате, указанном ниже. ad-queries.yaml предоставлен в качестве примера, содержащего запросы для Active Directory. msg_template не обязателен для запросов кратчайших путей, но они должны возвращать переменную, содержащую путь
queries:
- group: general
desc: List all AddKeyCredentialLink privileges for owned principals
cypher: |-
MATCH (n {owned: true})-[r:AddKeyCredentialLink]->(m)
RETURN n.name AS n_name, m.name AS m_name, labels(m) AS labels_m, labels(n) AS labels_n
ORDER BY n.name
msg_template: |-
{{ n_name }} ({{ labels_n[0] }}/{{ labels_n[1] }}) has AddKeyCredentialLink over {{ m_name }} ({{
labels_m[0] }}/{{ labels_m[1] }})
Таблица с описанием ключей/значений:
| Ключ | Описание |
|---|---|
group | Группа, к которой относится этот запрос; группы определяются пользователем, например "general" |
desc | Описание запроса |
cypher | Сам запрос в формате Neo4j |
msg_template | Шаблон Jinja2 для вывода в терминал на основе переменных cypher; используйте псевдонимы для переменных Neo4j, чтобы Jinja не пыталась обрабатывать их как вложенные переменные |
params.*)Программа использует Jinja2 для рендеринга Cypher. Определите параметры времени выполнения с помощью команды set и ссылайтесь на них в YAML как {{ params.<key> }}.
CLI
set <key> <value...> # например, set user [email protected]
unset <key> # опционально
show # опционально
Пример YAML
- group: user
desc: List all privileges for this user
cypher: |-
MATCH (n:User)-[r]->(m)
WHERE n.name =~ '((?i){{ params.user }})'
RETURN n.name AS n_name, TYPE(r) AS rel_type, labels(m) AS labels_m, m.name AS m_name
ORDER BY TYPE(r)
msg_template: |-
User {{ n_name }} has {{ rel_type }} over {{ m_name }} ({{ labels_m[0] }}/{{ labels_m[1] }})
Распространённые шаблоны параметров
| Ключ параметра | Пример значения | Использование в Cypher |
|---|---|---|
params.user | [email protected] | = {{ params.user }} |
params.user_regex | (?i)john\.doe(@example\.com)? | =~ '{{ params.user_regex }}' |
params.group | Domain [email protected] | = {{ params.group }} |
params.prefix | ACME- | STARTS WITH {{ params.prefix }} |
В этом репозитории предоставлен скрипт query-importer.py для автоматизации импорта запросов в интерфейс BloodHound CE из JSON-файла. Также предоставлен bh_query_converter.py для преобразования YAML-файла, предназначенного для терминального приложения, в формат JSON, ожидаемый query-importer.py и BloodHound CE. Пример требуемого формата JSON:
{
"queries": [
{
"name": "List all AddKeyCredentialLink privileges for owned principals",
"description": "List all AddKeyCredentialLink privileges for owned principals - General",
"query": "MATCH p=(n {owned: true})-[r:AddKeyCredentialLink]->(m)\nRETURN p\nORDER BY n.name"
},
{
"name": "List all AddKeyCredentialLink privileges for Users, Domain Users, Authenticated Users, and Everyone groups",
"description": "List all AddKeyCredentialLink privileges for Users, Domain Users, Authenticated Users, and Everyone groups - General",
"query": "MATCH p=(n:Group)-[r:AddKeyCredentialLink]->(m)\nWHERE (n.objectid =~ \"(?i)S-1-5-21-.*-513\" OR n.objectid =~ \"(?i).*-S-1-5-11\" OR n.objectid =~ \"(?i).*-S-1-1-0\" OR n.objectid =~ \"(?i).*-S-1-5-32-545\")\nRETURN p\nORDER BY n.name"
}
]
}
Полное меню команд приведено ниже: