
Sua ferramenta de terminal companheira baseada em modelos para BloodHound

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.
Terminal

Relatório HTML

Relatório HTML (continuação)

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:
JSON exportados, preciso de resultados de grafos num formato linha a linha .txt para realmente atacar coisas a partir de outras ferramentasEsta ferramenta pode fornecer um valor significativo tanto para equipas vermelhas como azuis.
Retome o controlo dos seus dados BloodHound com o CypherHound!
grep/cut/awkcustomqueries.json do BloodHound Legacy para o BloodHound CE incluídoCertifique-se de ter o python3 instalado e execute:
python3 -m pip install -r requirements.txt
Inicie o programa com: python3 cypherhound.py -c config.json -y queries.yaml
O programa lerá um ficheiro de configuração no formato json. Um exemplo deste ficheiro é mostrado abaixo:
{
"user": "neo4j",
"pwd": "password",
"database": "neo4j"
}
onde:
user é o seu nome de utilizador Neo4jpwd é a sua palavra-passe Neo4jdatabase é a sua base de dados Neo4jO 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
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:
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
set <chave> <valor...> # ex: set user [email protected]
unset <chave> # opcional
show # opcional
Exemplo 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] }})
Padrões Comuns de Parâmetros
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:
{
"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"
}
]
}
O menu completo de comandos é mostrado abaixo:
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

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.
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.
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.
Este script eliminará todas as consultas guardadas do BloodHound para reiniciar para importações futuras. É para o BloodHound CE.
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:
.txt linha a linha contendo nomes de nós no formato BloodHound
[email protected][email protected]COMPUTER.DOMAIN.LOCALjson contendo o seu nome de utilizador, palavra-passe e base de dados Neo4j (exemplo mostrado acima)O script tem as seguintes opções:
-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
Este script importa as consultas guardadas da SpecterOps BloodHoundQueryLibrary para o BloodHound Community Edition usando a API do BloodHound CE.
Queries.json / Queries.zipQueries.json / Queries.zipplatforms (não sensível a maiúsculas/minúsculas)/api/v2/saved-queries)429) usando Retry-After quando presenteA SpecterOps publica
Queries.jsoneQueries.zipcomo 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.jsonhttps://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.zip
Utilização (ficheiro local)
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)
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)
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)
# 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).
Reformata um YAML de consultas do BloodHound existente para que:
Se não vir a funcionalidade do cypherhound integrada no repositório original do DPAT, aceda ao meu fork do DPAT que a terá.
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:
NTDS.dit com linhas no seguinte formato: dominio\utilizador:RID:LMhash:NTLMhash:::Utilização
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
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
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
URI padrão do Neo4jBloodHound 4.3.1, certas arestas não funcionarão para versões anterioresNo 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!
AzurePor favor, seja descritivo com quaisquer problemas que decida abrir e, se possível, forneça saída (se aplicável).
| Chave |
|---|
| Descrição |
|---|
group | O grupo a que esta consulta pertence, os grupos são definidos pelo utilizador, ex: "general" |
desc | A descrição da consulta |
cypher | A consulta em si no formato Neo4j |
msg_template | Template 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âmetro | Exemplo de valor | Uso no 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 }} |