
Votre outil compagnon de terminal basé sur des modèles pour BloodHound

Une application terminal Python3 qui contient des cyphers Neo4j pour les ensembles de données BloodHound, avec un script pour automatiser leur importation dans BloodHound CE.
Terminal

Rapport HTML

Rapport HTML (suite)

BloodHound est un outil incontournable pour tout testeur d'intrusion. Cependant, sa conception présente certains inconvénients. Je vais couvrir les principaux points douloureux que j'ai rencontrés et ce que cet outil vise à résoudre :
JSON exportés, j'ai besoin des résultats de graphe au format ligne par ligne .txt pour réellement attaquer à partir d'autres outilsCet outil peut apporter une valeur significative tant pour les équipes rouges que bleues.
Reprenez le contrôle de vos données BloodHound avec CypherHound !
grep/cut/awkcustomqueries.json BloodHound Legacy vers BloodHound CE inclusAssurez-vous d'avoir python3 installé et exécutez :
python3 -m pip install -r requirements.txt
Démarrez le programme avec : python3 cypherhound.py -c config.json -y queries.yaml
Le programme lit un fichier de configuration au format json. Un exemple de ce fichier est présenté ci-dessous :
{
"user": "neo4j",
"pwd": "password",
"database": "neo4j"
}
où :
user est votre nom d'utilisateur Neo4jpwd est votre mot de passe Neo4jdatabase est votre base de données Neo4jLe programme lit les requêtes à partir d'un fichier YAML au format ci-dessous. ad-queries.yaml est fourni comme exemple contenant des requêtes liées à Active Directory. msg_template n'est pas requis pour les requêtes de chemins les plus courts, mais elles doivent renvoyer la variable contenant le chemin.
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] }})
Un tableau détaillant les paires clé/valeur est présenté ci-dessous :
| Clé | Description |
|---|---|
group | Le groupe auquel cette requête appartient ; les groupes sont définis par l'utilisateur, p. ex. "general" |
desc | La description de la requête |
cypher | La requête elle-même au format Neo4j |
msg_template | Template Jinja2 pour la sortie terminal basé sur les variables cypher, utilisez des alias pour les variables Neo4j afin d'éviter que Jinja tente de les interpréter comme des variables imbriquées |
params.*)Le programme utilise Jinja2 pour interpréter les cyphers. Définissez des paramètres d'exécution avec la commande set et référencez-les dans le YAML comme {{ params.<key> }}.
CLI
set <key> <value...> # p. ex. set user [email protected]
unset <key> # optionnel
show # optionnel
Exemple 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] }})
Modèles de paramètres courants
| Clé param | Exemple de valeur | Utilisation dans le 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 }} |
Ce dépôt fournit un script query-importer.py pour automatiser l'importation des requêtes dans l'interface BloodHound CE à partir d'un fichier JSON. bh_query_converter.py est également fourni pour convertir un fichier YAML destiné à l'application terminale vers le format JSON attendu par query-importer.py et BloodHound CE. Un exemple du format JSON requis est présenté ci-dessous :