
Il tuo strumento compagno da terminale per BloodHound basato su modelli

Un'applicazione terminale Python3 che contiene cypher Neo4j per i set di dati di BloodHound con uno script per automatizzare l'importazione in BloodHound CE.
Terminale

Report HTML

Report HTML (continua)

BloodHound è uno strumento fondamentale per ogni penetration tester. Tuttavia, ci sono alcuni effetti collaterali negativi basati sul suo design. Coprirò i maggiori punti critici che ho sperimentato e ciò che questo strumento mira a risolvere:
JSON esportati, ho bisogno di risultati dei grafici in formato .txt riga per riga per attaccare effettivamente le cose da altri strumentiQuesto strumento può fornire un valore significativo sia per i team red che blue.
Riprendi il controllo dei tuoi dati BloodHound con CypherHound!
grep/cut/awkcustomqueries.json di BloodHound Legacy in BloodHound CEAssicurati di avere python3 installato ed esegui:
python3 -m pip install -r requirements.txt
Avvia il programma con: python3 cypherhound.py -c config.json -y queries.yaml
Il programma leggerà un file di configurazione in formato json. Un esempio di questo file è mostrato di seguito:
{
"user": "neo4j",
"pwd": "password",
"database": "neo4j"
}
dove:
user è il tuo nome utente di Neo4jpwd è la tua password di Neo4jdatabase è il tuo database Neo4jIl programma legge le query da un file YAML nel formato seguente. ad-queries.yaml è fornito come esempio contenente query relative ad Active Directory. msg_template non è richiesto per le query sui percorsi più brevi, ma queste devono restituire la variabile contenente il percorso
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] }})
Una tabella con la suddivisione delle coppie chiave/valore è visibile qui sotto:
| Chiave | Descrizione |
|---|---|
group | Il gruppo a cui appartiene questa query, i gruppi sono definiti dall'utente, ad esempio "general" |
desc | La descrizione della query |
cypher | La query stessa in formato Neo4j |
msg_template | Template Jinja2 per l'output del terminale basato sulle variabili cypher, usa alias per le variabili Neo4j per evitare che Jinja tenti di renderizzarle come variabili annidate |
params.*)Il programma utilizza Jinja2 per renderizzare Cypher. Definisci i parametri in esecuzione con il comando set e referenziali in YAML come {{ params.<key> }}.
CLI
set <key> <value...> # e.g., set user [email protected]
unset <key> # optional
show # optional
Esempio 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] }})
Pattern di parametri comuni
| Chiave parametro | Valore esempio | Utilizzo in 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 }} |
Questo repository fornisce uno script query-importer.py per automatizzare l'importazione delle query nell'interfaccia di BloodHound CE da un file JSON. È inoltre fornito bh_query_converter.py per convertire un file YAML destinato all'applicazione terminale nel formato JSON atteso da query-importer.py e BloodHound CE. Un esempio del formato JSON richiesto è visibile qui sotto:
{
"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"
}
]
}