
あなたのテンプレートベースのBloodHoundターミナルコンパニオンツール

Python3 製のターミナルアプリケーションで、Neo4j 用の BloodHound データセット向けサイファーと、それらを BloodHound CE に自動インポートするスクリプトを提供します。
ターミナル

HTML レポート

HTML レポート(続き)

BloodHound は全てのペネトレーションテスターにとって欠かせないツールです。しかし、その設計に起因するいくつかの副作用があります。ここでは私が経験した最大の痛点と、このツールが解決しようとしている点を挙げます:
JSON グラフを解析するまでは、他のツールから実際に攻撃するために、グラフ結果を行単位の .txt ファイル形式で必要とします。このツールは、レッドチームとブルーチームの両方に大きな価値を提供します。
CypherHound で BloodHound データの制御を取り戻しましょう!
grep/cut/awk で扱いやすい形式の例を提供customqueries.json から 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 は Neo4j のユーザー名pwd は Neo4j のパスワードdatabase は 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テンプレート。Neo4j変数にはエイリアスを使用し、Jinjaがネスト変数としてレンダリングしようとするのを防ぐ |
params.*)プログラムはサイファーレンダリングに Jinja2 を使用します。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] }})
共通パラメータパターン
| パラメータキー | 値の例 | サイファー内での使用法 |
|---|---|---|
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 }} |
このリポジトリには、JSON ファイルから BloodHound CE UI へのクエリインポートを自動化する query-importer.py スクリプトが含まれています。また、ターミナルアプリケーション向けの YAML ファイルを query-importer.py および BloodHound CE が期待する JSON 形式に変換する bh_query_converter.py も提供されています。必要な 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"
}
]
}
完全なコマンドメニューを以下に示します:
Documented commands (use 'help -v' for verbose/'help <topic>' for details):
======================================================================================================
alias Manage aliases
clear Clear the terminal.
cls Clear the terminal.
edit Run a text editor and optionally open a file with it
export Run a query and save its results
help List available commands or provide detailed help for a specific command
history View, run, edit, save, or clear previously entered commands
list List queries by group.
macro Manage macros
report Run multiple queries and generate a HTML report
run Execute a query
run_pyscript Run a Python script file inside the console
run_script Run commands in script file that is encoded as either ASCII or UTF-8 text
search Full-text search through stored queries.
set Set a dynamic search parameter (set <TARGET> <VALUE...>)
shell Execute a command as if at the OS prompt
shortcuts List available shortcuts
show Show dynamic search parameters
unset Unset a dynamic search parameter (unset <TARGET>)
Undocumented commands:
======================
exit q quit stop
