Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
cypherhound — Sua ferramenta de terminal companheira baseada em modelos para BloodHound | Kitploit
Ferramentas/GitHubGitHub/fin3ss3g0d/cypherhound
ReconhecimentoColeta de InformaçõesTestes de PenetraçãoUtilitários e Frameworks
GitHubfin3ss3g0d/cypherhound

cypherhound

Sua ferramenta de terminal companheira baseada em modelos para BloodHound

Ver Repositório
4543631há 7 mesesRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CypherHound

logo

Uma aplicação de terminal em Python3 que contém cyphers Neo4j para conjuntos de dados do BloodHound com um script para automatizar a importação deles no BloodHound CE.

Exemplos de Saída

Terminal

demo

Relatório HTML

report summary

Relatório HTML (continuação)

details sample

Porquê?

O BloodHound é uma ferramenta essencial para todo tester de penetração. No entanto, existem alguns efeitos colaterais negativos baseados no seu design. Abordarei os maiores pontos problemáticos que experimentei e o que esta ferramenta pretende resolver:

  1. As minhas ferramentas pensam em listas - até que as minhas ferramentas analisem gráficos JSON exportados, preciso de resultados de grafos num formato linha a linha .txt para realmente atacar coisas a partir de outras ferramentas
  2. Copiar/colar resultados de grafos - isto está relacionado ao primeiro, mas precisamos realmente explicar este?
  3. Os grafos podem ser demasiado grandes para desenhar - Grandes ambientes AD, múltiplos caminhos mais curtos a serem desenhados no mesmo grafo, etc. A informação contida em qualquer grafo pode ajudar os nossos objetivos como atacante e precisamos de ser capazes de visualizar todos os dados de forma eficiente.
  4. Executar manualmente cyphers personalizados consome tempo - vamos automatizar isso :)

Esta ferramenta pode fornecer um valor significativo tanto para equipas vermelhas como azuis.

Funcionalidades

Retome o controlo dos seus dados BloodHound com o CypherHound!

  • Ler templates de cypher a partir de um ficheiro YAML
    • Definir cyphers para pesquisar com base na entrada do utilizador (específicos para utilizador, grupo e computador)
    • Cyphers com regex definido pelo utilizador
  • Exportação definida pelo utilizador de todos os resultados
    • Exemplos fornecidos em formato amigável para grep/cut/awk
    • Exportar qualquer combinação de cyphers para um relatório HTML moderno e elegante
  • Executar as mesmas consultas a partir da GUI do BloodHound CE
    • Conversor YAML -> JSON e importador automatizado de consultas para o BloodHound CE
    • Script importador de customqueries.json do BloodHound Legacy para o BloodHound CE incluído

Instalação

Certifique-se de ter o python3 instalado e execute:

python3 -m pip install -r requirements.txt

Utilização

Inicie o programa com: python3 cypherhound.py -c config.json -y queries.yaml

config.json

O programa lerá um ficheiro de configuração no formato json. Um exemplo deste ficheiro é mostrado abaixo:

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

onde:

  • user é o seu nome de utilizador Neo4j
  • pwd é a sua palavra-passe Neo4j
  • database é a sua base de dados Neo4j

Formato YAML

O programa lê consultas de um ficheiro YAML no formato abaixo. O ficheiro ad-queries.yaml foi fornecido como exemplo contendo consultas relacionadas com o Active Directory. msg_template não é necessário para consultas de caminhos mais curtos, mas estas devem retornar a variável que contém o caminho

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] }})

Uma tabela com a descrição dos pares chave/valor pode ser vista abaixo:

Parâmetros Dinâmicos no Cypher (Jinja2 params.*)

O programa usa Jinja2 para renderizar o Cypher. Defina parâmetros em tempo de execução com o comando set e faça referência a eles no YAML como {{ params.<chave> }}.

CLI

root@kitploit:~
set <chave> <valor...> # ex: set user [email protected]
unset <chave> # opcional
show # opcional

Exemplo 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] }})

Padrões Comuns de Parâmetros

Formato JSON

Este repositório fornece um script query-importer.py para automatizar a importação de consultas na interface do BloodHound CE a partir de um ficheiro JSON. O ficheiro bh_query_converter.py também foi fornecido para converter um ficheiro YAML destinado à aplicação de terminal para o formato JSON esperado pelo query-importer.py e pelo BloodHound CE. Um exemplo do formato JSON necessário pode ser visto abaixo:

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"
    }
  ]
}

Comandos

O menu completo de comandos é mostrado abaixo:

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

Integração com o BloodHound CE

custom searches

scripts/bloodhound-ce/query-importer.py

O script query-importer.py automatizará a importação de consultas na interface do BloodHound CE a partir de um ficheiro JSON. O ficheiro bh_query_converter.py também foi fornecido para converter um ficheiro YAML destinado à aplicação de terminal para o formato JSON esperado pelo query-importer.py e pelo BloodHound CE.

scripts/bloodhound-ce/bh_query_converter.py

Este script converterá um YAML destinado à aplicação de terminal num ficheiro JSON para fácil importação no BloodHound CE através do script query-importer.py. O ficheiro ad-queries.json foi fornecido como exemplo do aspeto de um ficheiro de saída e está pronto para ser utilizado pelo query-importer.py e para importar as consultas no BloodHound CE.

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

Este script lerá um ficheiro customqueries.json do BloodHound Legacy e importará todas as consultas para a nova versão do BloodHound Community Edition usando as suas credenciais da API. É fornecido para que as consultas que criou para o BloodHound Legacy possam ainda ser utilizadas com a Community Edition.

scripts/bloodhound-ce/purge-queries.py

Este script eliminará todas as consultas guardadas do BloodHound para reiniciar para importações futuras. É para o BloodHound CE.

scripts/bloodhound-ce/add-owned.py

Este script lerá uma lista de nomes de nós a partir de um ficheiro .txt e marcá-los-á como owned (possuídos) ou high-value (alto valor) na base de dados.

Utilização

Para usar o script, deve ter dois ficheiros prontos:

  • Um ficheiro .txt linha a linha contendo nomes de nós no formato BloodHound
    • Para utilizadores: [email protected]
    • Para grupos: [email protected]
    • Para computadores: COMPUTER.DOMAIN.LOCAL
  • O seu ficheiro de configuração no formato json contendo o seu nome de utilizador, palavra-passe e base de dados Neo4j (exemplo mostrado acima)

O script tem as seguintes opções:

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

Necessita de especificar pelo menos -o ou -v

Integração com a BloodHound Query Library

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

Este script importa as consultas guardadas da SpecterOps BloodHoundQueryLibrary para o BloodHound Community Edition usando a API do BloodHound CE.

  • Suporta o carregamento de consultas a partir de:
    • Um ficheiro local Queries.json / Queries.zip
    • Um URL para Queries.json / Queries.zip
    • Os artefactos oficiais da última versão publicados pela SpecterOps
  • Opcionalmente filtra consultas por platforms (não sensível a maiúsculas/minúsculas)
  • Submete cada consulta ao BloodHound CE como uma consulta guardada (/api/v2/saved-queries)
  • Inclui lógica de repetição para limitação de taxa da API (HTTP 429) usando Retry-After quando presente

A SpecterOps publica Queries.json e Queries.zip como artefactos de versão (não armazenados no repositório). Os URLs de download da última versão são:

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

Utilização (ficheiro local)

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"

Utilização (URL direto)

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"

Utilização (automático: última versão)

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"

Importação filtrada por plataforma (exemplos)

root@kitploit:~
# Importar apenas consultas que suportam 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"

# Importar consultas para múltiplas plataformas (qualquer correspondência)
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"

Dica: Pode criar um token no BloodHound CE e usar o seu Token ID/Key aqui. Se quiser "começar de novo" antes de importar, use o script de limpeza incluído (veja scripts/bloodhound-ce/purge-queries.py).

Scripts Auxiliares

scripts/helpers/format_yaml_queries.py

Reformata um YAML de consultas do BloodHound existente para que:

  • as colunas de RETURN com pontos sejam renomeadas (foo.bar → foo_bar, labels(x) → labels_x[0])
  • os templates de mensagem sejam reescritos para usar os aliases
  • o Cypher seja impresso de forma elegante (uma cláusula principal por linha)
  • strings longas sejam blocos escalares literais (|) e quebradas a 100 caracteres

Integração com DPAT

Se não vir a funcionalidade do cypherhound integrada no repositório original do DPAT, aceda ao meu fork do DPAT que a terá.

scripts/DPAT/parse-memberships.py

Este script analisará uma exportação bruta da aplicação de terminal, especificamente o cypher para listar todas as associações de grupo de utilizadores, como exemplo de como a saída desta ferramenta pode ser analisada. Passará esta exportação como parâmetro para o script, juntamente com um ficheiro NTDS.dit e um diretório de saída. Em seguida, produzirá ficheiros .txt no diretório de saída para cada nome de grupo com entradas no formato DOMINIO\UTILIZADOR, compatível com o DPAT. Depois, passará este diretório com o argumento de linha de comandos -g para o DPAT, permitindo ao operador produzir estatísticas específicas de grupo para cada grupo num domínio.

Para usar o script, deve ter dois ficheiros prontos:

  1. A exportação bruta da aplicação de terminal que recupera todas as associações de grupo de utilizadores
  2. Um ficheiro NTDS.dit com linhas no seguinte formato: dominio\utilizador:RID:LMhash:NTLMhash:::

Utilização

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

Este script analisará a exportação bruta para listar todos os utilizadores kerberoastable, associará os utilizadores a entradas num NTDS.dit e produzirá um ficheiro de saída contendo todas as entradas de hash de utilizadores kerberoastable do dump. Depois, passará este ficheiro de saída para o DPAT com a flag -kz para fornecer estatísticas de contas kerberoastable crackeadas.

Utilização

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

Notas Importantes

  • O programa está configurado para usar a base de dados e URI padrão do Neo4j
  • Construído para versões iguais ou superiores ao BloodHound 4.3.1, certas arestas não funcionarão para versões anteriores

Uma Palavra Sobre Patrocínio

No dia 15 de julho de 2023, decidi fazer algumas alterações ao projeto. Após esta data, este projeto será sempre mantido uma versão atrás da versão privada para patrocinadores. Certifique-se de me patrocinar para aceder aos cyphers, funcionalidades e correções de bugs mais recentes. Ao patrocinar-me neste nível, também terá acesso a repositórios privados adicionais que ainda não publiquei ao público!

Objetivos Futuros

  • Adicionar cyphers para arestas do Azure
  • Continuar a adicionar cyphers quando o BloodHound lançar atualizações
  • Continuar a adicionar cyphers

Problemas e Suporte

Por favor, seja descritivo com quaisquer problemas que decida abrir e, se possível, forneça saída (se aplicável).

Baixar ferramenta
Chave
Descrição
groupO grupo a que esta consulta pertence, os grupos são definidos pelo utilizador, ex: "general"
descA descrição da consulta
cypherA consulta em si no formato Neo4j
msg_templateTemplate Jinja2 para a saída do terminal baseado nas variáveis do cypher, use aliases para as variáveis do Neo4j para evitar que o Jinja tente renderizar como variáveis aninhadas
Chave do parâmetroExemplo de valorUso no 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 }}