Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Strumenti/GitHubGitHub/fin3ss3g0d/cypherhound
RicognizioneRaccolta InformazioniPenetration TestingUtilità e Framework
GitHubfin3ss3g0d/cypherhound

cypherhound

Il tuo strumento compagno da terminale per BloodHound basato su modelli

Vedi Repository
45436317 mesi faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CypherHound

logo

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.

Esempi di Output

Terminale

demo

Report HTML

report summary

Report HTML (continua)

details sample

Perché?

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:

  1. I miei strumenti pensano in liste - finché i miei strumenti non analizzano i grafici JSON esportati, ho bisogno di risultati dei grafici in formato .txt riga per riga per attaccare effettivamente le cose da altri strumenti
  2. Copiare/incollare i risultati dei grafici - questo si ricollega al primo ma abbiamo davvero bisogno di spiegare questo?
  3. I grafici possono essere troppo grandi da disegnare - Grandi ambienti AD, più percorsi più brevi disegnati sullo stesso grafico, ecc. Le informazioni contenute in qualsiasi grafico possono aiutare i nostri obiettivi come attaccanti e dobbiamo essere in grado di visualizzare tutti i dati in modo efficiente.
  4. Eseguire manualmente cypher personalizzati richiede tempo - automatizziamolo :)

Questo strumento può fornire un valore significativo sia per i team red che blue.

Funzionalità

Riprendi il controllo dei tuoi dati BloodHound con CypherHound!

  • Legge template cypher da un file YAML
    • Imposta cypher per la ricerca basata sull'input utente (specifici per utente, gruppo e computer)
    • Cypher regex definiti dall'utente
  • Esportazione definita dall'utente di tutti i risultati
    • Esempi forniti in formato compatibile con grep/cut/awk
    • Esporta qualsiasi combinazione di cypher in un report HTML moderno ed elegante
  • Esegui le stesse query dall'interfaccia di BloodHound CE
    • Convertitore YAML -> JSON e importatore automatico di query di BloodHound CE
    • Incluso script per importare customqueries.json di BloodHound Legacy in BloodHound CE

Installazione

Assicurati di avere python3 installato ed esegui:

python3 -m pip install -r requirements.txt

Utilizzo

Avvia il programma con: python3 cypherhound.py -c config.json -y queries.yaml

config.json

Il programma leggerà un file di configurazione in formato json. Un esempio di questo file è mostrato di seguito:

root@kitploit:~
{
    "user": "neo4j",
    "pwd": "password",
    "database": "neo4j"
}

dove:

  • user è il tuo nome utente di Neo4j
  • pwd è la tua password di Neo4j
  • database è il tuo database Neo4j

Formato YAML

Il 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

root@kitploit:~
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:

Parametri dinamici in Cypher (Jinja2 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

root@kitploit:~
set <key> <value...> # e.g., set user [email protected]
unset <key> # optional
show # optional

Esempio YAML

root@kitploit:~
- 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

Formato JSON

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:

root@kitploit:~
{
  "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"
    }
  ]
}

Comandi

Il menu completo dei comandi è mostrato qui sotto:

root@kitploit:~
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

Integrazione con BloodHound CE

custom searches

scripts/bloodhound-ce/query-importer.py

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.

scripts/bloodhound-ce/bh_query_converter.py

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.

scripts/bloodhound-ce/legacy-query-importer.py

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.

scripts/bloodhound-ce/purge-queries.py

Questo script eliminerà tutte le query salvate da BloodHound per resettarle per importazioni future. È per BloodHound CE.

scripts/bloodhound-ce/add-owned.py

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:

  • Un file .txt riga per riga contenente nomi di nodi nel formato BloodHound
    • Per utenti: [email protected]
    • Per gruppi: [email protected]
    • Per computer: COMPUTER.DOMAIN.LOCAL
  • Il tuo file di configurazione in formato json contenente il tuo nome utente Neo4j, password e database (esempio mostrato sopra)

Lo script ha le seguenti opzioni:

root@kitploit:~
  -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

Integrazione con BloodHound Query Library

scripts/bhql/query-importer.py (BloodHound Query Library Importer)

Questo script importa le query salvate di SpecterOps BloodHoundQueryLibrary in BloodHound Community Edition utilizzando l'API di BloodHound CE.

  • Supporta il caricamento di query da:
    • Un file locale Queries.json / Queries.zip
    • Un URL per Queries.json / Queries.zip
    • Gli artefatti della versione più recente ufficiale pubblicati da SpecterOps
  • Filtra opzionalmente le query per piattaforme (senza distinzione maiuscole/minuscole)
  • Invia ogni query a BloodHound CE come query salvata (/api/v2/saved-queries)
  • Include logica di riprova per la limitazione della frequenza API (HTTP 429) utilizzando Retry-After quando presente

SpecterOps pubblica Queries.json e Queries.zip come artefatti di rilascio (non archiviati nel repository). Gli URL di download dell'ultima versione sono:

  • https://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.json
  • https://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.zip

Utilizzo (file locale)

root@kitploit:~
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)

root@kitploit:~
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)

root@kitploit:~
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)

root@kitploit:~
# 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).

Script di supporto

scripts/helpers/format_yaml_queries.py

Riformatta un YAML di query BloodHound esistente in modo che:

  • le colonne RETURN con punti vengano aliasate (foo.bar → foo_bar, labels(x) → labels_x[0])
  • i template dei messaggi vengano riscritti per utilizzare gli alias
  • Cypher sia stampato in modo ordinato (una clausola principale per riga)
  • le stringhe lunghe siano scalari letterali a blocco (|) e avvolte a 100 caratteri

Integrazione con DPAT

Se non vedi la funzionalità cypherhound integrata nel repository originale DPAT, accedi al mio fork di DPAT che la conterrà.

scripts/DPAT/parse-memberships.py

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:

  1. L'export grezzo dall'applicazione terminale che recupera tutte le appartenenze a gruppi degli utenti
  2. Un file NTDS.dit con righe nel seguente formato: dominio\utente:RID:LMhash:NTLMhash:::

Utilizzo

root@kitploit:~
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

scripts/DPAT/parse-kerberoastable.py

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

root@kitploit:~
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

Note importanti

  • Il programma è configurato per utilizzare il database Neo4j predefinito e URI
  • Realizzato per versioni uguali o successive a BloodHound 4.3.1, alcuni archi non funzioneranno per versioni precedenti

Una parola sulla sponsorizzazione

Il 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!

Obiettivi futuri

  • Aggiungere cypher per gli archi Azure
  • Continuare ad aggiungere cypher quando BloodHound rilascia aggiornamenti
  • Continuare ad aggiungere cypher

Problemi e supporto

Per favore sii descrittivo con qualsiasi problema decida di aprire e, se possibile, fornisci output (se applicabile).

Scarica lo strumento
Chiave
Descrizione
groupIl gruppo a cui appartiene questa query, i gruppi sono definiti dall'utente, ad esempio "general"
descLa descrizione della query
cypherLa query stessa in formato Neo4j
msg_templateTemplate 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 parametroValore esempioUtilizzo in Cypher
params.user[email protected]= {{ params.user }}
params.user_regex(?i)john\.doe(@example\.com)?=~ '{{ params.user_regex }}'
params.groupDomain [email protected]= {{ params.group }}
params.prefixACME-STARTS WITH {{ params.prefix }}