
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:
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
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"
}
]
}
Il menu completo dei comandi è mostrato qui sotto:
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

Lo script query-importer.py automatizza 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.
Questo script convertirà un YAML destinato all'applicazione terminale in un file JSON per una facile importazione in BloodHound CE tramite lo script query-importer.py. ad-queries.json è fornito come esempio di come appare un file di output ed è pronto per query-importer.py e per importare le query in BloodHound CE.
Questo script leggerà un file customqueries.json da BloodHound Legacy e importerà tutte le query nella nuova versione di BloodHound Community Edition con le tue credenziali API. È fornito in modo che le query che hai creato per BloodHound Legacy possano ancora essere utilizzate con Community Edition.
Questo script eliminerà tutte le query salvate da BloodHound per resettarle per importazioni future. È per BloodHound CE.
Questo script leggerà un elenco di nomi di nodi da un file .txt e li segnerà come posseduti (owned) o di alto valore (high-value) nel database.
Utilizzo
Per utilizzare lo script, devi avere due file pronti:
.txt riga per riga contenente nomi di nodi nel formato BloodHound
[email protected][email protected]COMPUTER.DOMAIN.LOCALjson contenente il tuo nome utente Neo4j, password e database (esempio mostrato sopra)Lo script ha le seguenti opzioni:
-h, --help show this help message and exit
-c CONFIG, --config CONFIG
Config file
-l LIST, --list LIST List of node names
-o, --owned Set target nodes as owned
-v, --high-value Set target nodes as high-value
Devi specificare almeno -o o -v
Questo script importa le query salvate di SpecterOps BloodHoundQueryLibrary in BloodHound Community Edition utilizzando l'API di BloodHound CE.
Queries.json / Queries.zipQueries.json / Queries.zippiattaforme (senza distinzione maiuscole/minuscole)/api/v2/saved-queries)429) utilizzando Retry-After quando presenteSpecterOps pubblica
Queries.jsoneQueries.zipcome artefatti di rilascio (non archiviati nel repository). Gli URL di download dell'ultima versione sono:
https://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.jsonhttps://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.zip
Utilizzo (file locale)
python3 scripts/bhql/query-importer.py \
--token-id "<TOKEN_ID>" \
--token-key "<TOKEN_KEY>" \
--queries-file "/path/to/Queries.json" \
--base-url "http://127.0.0.1:8080"
Utilizzo (URL diretto)
python3 scripts/bhql/query-importer.py \
--token-id "<TOKEN_ID>" \
--token-key "<TOKEN_KEY>" \
--queries-url "https://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.json" \
--base-url "http://127.0.0.1:8080"
Utilizzo (auto: ultima versione)
python3 scripts/bhql/query-importer.py \
--token-id "<TOKEN_ID>" \
--token-key "<TOKEN_KEY>" \
--bhql-latest \
--base-url "http://127.0.0.1:8080"
Importazione filtrata per piattaforma (esempi)
# Only import queries that support Active Directory
python3 scripts/bhql/query-importer.py \
--token-id "<TOKEN_ID>" \
--token-key "<TOKEN_KEY>" \
--bhql-latest \
--platforms "Active Directory" \
--base-url "http://127.0.0.1:8080"
# Import queries for multiple platforms (any match)
python3 scripts/bhql/query-importer.py \
--token-id "<TOKEN_ID>" \
--token-key "<TOKEN_KEY>" \
--bhql-latest \
--platforms "Active Directory" "Azure" \
--base-url "http://127.0.0.1:8080"
Suggerimento: puoi creare un token in BloodHound CE e utilizzare qui il suo Token ID/Key. Se vuoi "ricominciare da capo" prima di importare, usa lo script di pulizia incluso (vedi
scripts/bloodhound-ce/purge-queries.py).
Riformatta un YAML di query BloodHound esistente in modo che:
Se non vedi la funzionalità cypherhound integrata nel repository originale DPAT, accedi al mio fork di DPAT che la conterrà.
Questo script analizzerà un export grezzo dall'applicazione terminale, specificamente il cypher per elencare tutte le appartenenze a gruppi degli utenti come esempio di come può essere analizzato l'output di questo strumento. Passerai questo export come parametro allo script, un file NTDS.dit e una directory di output. Produrrà quindi file .txt nella directory di output per ogni nome di gruppo con voci in formato DOMINIO\UTENTE, compatibile con DPAT. Passerai quindi questa directory con l'argomento -g a DPAT, permettendo all'operatore di produrre statistiche specifiche per gruppo per ogni gruppo in un dominio.
Per utilizzare lo script, devi avere due file pronti:
NTDS.dit con righe nel seguente formato: dominio\utente:RID:LMhash:NTLMhash:::Utilizzo
usage: parse-memberships.py [-m MEMBERSHIPS_FILE] [-d DOMAIN] [-n NTDS_FILE] [-o OUTPUT_DIR] [--netbios NETBIOS] [--encoding ENCODING]
[--debug] [--no-index] [-h]
Map users to groups from memberships file and match against NTDS dump.
options:
-m, --memberships-file MEMBERSHIPS_FILE
Path to memberships file (BloodHound-style lines) (default: None)
-d, --domain DOMAIN FQDN domain (e.g., EXAMPLE.COM) used in the membership regex (default: None)
-n, --ntds-file NTDS_FILE
Path to NTDS dump (DOMAIN\user:hash or pwdump-style) (default: None)
-o, --output-dir OUTPUT_DIR
Directory to write per-group output files (default: None)
--netbios NETBIOS NETBIOS/short domain to prefix when NTDS lines lack a domain (pwdump) (default: None)
--encoding ENCODING Encoding for input files (default: cp1252)
--debug Enable verbose debug output (default: False)
--no-index Name group files after the group instead of numbered files (unsafe chars replaced) (default: False)
-h, --help Show this help message and exit
Questo script analizzerà l'export grezzo per elencare tutti gli utenti kerberoastable, abbinerà gli utenti con le voci in un NTDS.dit e produrrà un file di output contenente tutte le voci hash degli utenti kerberoastable dal dump. Passerai quindi questo file di output a DPAT con il flag -kz per fornire statistiche sugli account kerberoastable craccati.
Utilizzo
usage: parse-kerberoastable.py [-k KERB_FILE] [-n NTDS_FILE] [-d DOMAIN] [-o OUTPUT] [--encoding ENCODING] [--debug] [-h]
Match kerberoastable usernames against an NTDS.dit dump file
options:
-k, --kerb-file KERB_FILE
Path to Kerberoast output file (default: None)
-n, --ntds-file NTDS_FILE
Path to NTDS dump file (default: None)
-d, --domain DOMAIN Domain (e.g., EXAMPLE.COM) for regex matching (default: None)
-o, --output OUTPUT Path to write matches (default: None)
--encoding ENCODING File encoding to use when reading input files (default: cp1252)
--debug Enable verbose debug output (default: False)
-h, --help Show this help message and exit
Neo4j predefinito e URIBloodHound 4.3.1, alcuni archi non funzioneranno per versioni precedentiIl 15 luglio 2023 ho deciso di apportare alcune modifiche al progetto. Dopo questa data, questo progetto sarà sempre mantenuto una versione indietro rispetto alla versione privata per gli sponsor. Assicurati di sponsorizzarmi per avere accesso agli ultimi cypher, funzionalità e correzioni di bug. Sponsorizzandomi in questo tier, avrai anche accesso a repository privati aggiuntivi che non ho rilasciato al pubblico!
AzurePer favore sii descrittivo con qualsiasi problema decida di aprire e, se possibile, fornisci output (se applicabile).
| 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 |
| 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 }} |