BloodHound mapeia relacionamentos do Active Directory e encontra caminhos de ataque que são invisíveis pra enumeração manual. No Forest, ele revelou uma chain por 5 grupos nested até WriteDACL no domínio. Eu nunca teria achado isso na mão. Nunca.
É assim que eu configuro, coleto dados, importo, e encontro os caminhos que importam.
Setup — BloodHound CE no Kali
BloodHound CE (Community Edition) substituiu o BloodHound antigo. Roda como container Docker com uma web UI.
Instalar e Iniciar
# Puxar e iniciar BloodHound CE
curl -L https://ghst.ly/getbhce | docker compose -f - up
# Primeira execução leva alguns minutos pra puxar imagens
# Web UI: http://localhost:8080
Primeiro Login — A Pegadinha da Senha neo4j
Na primeira execução, BloodHound CE gera uma senha admin aleatória. Ela é printada nos logs do Docker e é fácil de perder.
# Encontrar a senha inicial
docker compose logs | grep "Initial Password"
# ou cheque o scrollback dos logs pras credenciais geradas
A pegadinha que eu tomei no Active: Não consegui achar a senha na saída do terminal porque rolou pra cima. Tive que cavar nos logs do Docker. Salve na primeira vez.
Credenciais padrão são geralmente admin / <aleatório>. Você vai ser forçado a trocar a senha no primeiro login.
Verificar se Tá Rodando
Navegue até http://localhost:8080. Você deve ver a página de login do BloodHound CE. Logue com as creds iniciais e defina uma nova senha.
Coleta de Dados — bloodhound-python
bloodhound-python é o coletor Linux. Ele consulta o DC remotamente — sem necessidade de rodar nada no alvo.
O Comando Que Eu Uso Toda Vez
bloodhound-python -u 'USERNAME' -p 'PASSWORD' -ns $ip -d DOMAIN.local -c All
Detalhes das Flags
| Flag | O que faz |
|---|---|
-u | Username |
-p | Password |
-ns | Nameserver (IP do DC) — crítico, diz onde resolver DNS |
-d | Nome do domínio |
-c All | Coletar tudo — usuários, grupos, sessões, ACLs, trusts, containers, GPOs |
Saída
Cria vários arquivos JSON no diretório atual:
20260324_computers.json
20260324_domains.json
20260324_groups.json
20260324_users.json
Exemplos Reais das Minhas Boxes
# Active — creds GPP
bloodhound-python -u 'SVC_TGS' -p 'GPPstillStandingStrong2k18' -ns 10.129.3.112 -d active.htb -c All
# Forest — creds AS-REP
bloodhound-python -u 'svc-alfresco' -p 's3rvice' -ns 10.129.95.210 -d htb.local -c All
# Blackfield — creds AS-REP
bloodhound-python -u 'support' -p '#00^BlackKnight' -ns $ip -d BLACKFIELD.local -c All
Pegadinhas
-nsnão é opcional na prática. Sem ela, resolução DNS falha porque sua box Kali não sabe resolver o domínio. Sempre sete pro IP do DC.-c Allé o padrão certo. Alguns guias dizem pra usar-c DCOnlypra stealth. Pra boxes CTF e OSCP, só pegue tudo.- Nome do domínio importa. Algumas boxes usam
domain.htb, outras usamdomain.htb.local, outrasdomain.local. Pegue da saída LDAP do nmap ou da saída donxc smb. Nome de domínio errado = coleta falha silenciosamente ou retorna dados incompletos. - Se senhas têm caracteres especiais (
$,!,#), use aspas simples no bash.
Importando Dados no BloodHound CE
- Logue no BloodHound CE em
http://localhost:8080 - Clique no botão Upload (canto superior direito, ícone de seta)
- Selecione todos os arquivos JSON do bloodhound-python
- Espere a ingestão completar
É só isso. O banco de dados de grafos tá populado. Hora de consultar.
Queries Que Importam
Essas são as queries que eu realmente rodo. Em ordem.
1. Caminho Mais Curto pro Domain Admin
Essa é a primeira coisa que eu checo. Toda vez.
No BloodHound CE:
- Vá em Explore -> Pathfinding
- Nó inicial: seu usuário owned
- Nó final: DOMAIN [email protected]
- Buscar
No Forest, isso mostrou:
svc-alfresco -> Service Accounts -> Privileged IT Accounts -> Account Operators
-> GenericAll sobre Exchange Windows Permissions
-> WriteDACL sobre domínio HTB.LOCAL
Cinco grupos de profundidade. Invisível sem BloodHound.
2. Usuários Kerberoastable
MATCH (u:User) WHERE u.hasspn=true RETURN u
Ou use a query built-in “List all Kerberoastable Users” na aba Analysis.
No Active, isso mostrou que a conta Administrator tinha SPN active/CIFS:445. Isso é incomum — normalmente você faz Kerberoast em service accounts, não no Administrator real. Mas o SPN tava lá, e a senha era fraca.
3. Usuários AS-REP Roastable
MATCH (u:User) WHERE u.dontreqpreauth=true RETURN u
Ou a query built-in “List all AS-REP Roastable Users”.
Encontrei svc-alfresco no Forest e support no Blackfield assim.
4. Usuários com Direitos DCSync
MATCH p=(u)-[:MemberOf|GetChanges|GetChangesAll*1..]->(d:Domain) RETURN p
Mostra quem já pode DCSync sem nenhuma escalação de privilégios. Se você possui uma dessas contas, vá direto pro impacket-secretsdump.
5. Encontrar Principals com Direitos Perigosos
Olhe a aba Analysis pra queries pré-construídas:
- Caminho mais curto dos principals owned
- Encontrar todos os caminhos pro Domain Admins
- Usuários com direitos de local admin
- Group memberships pra um usuário específico
Entendendo o Grafo — Tipos de Edge Que Importam
Quando você vê um caminho no BloodHound, as edges (setas entre nós) te dizem que tipo de acesso você tem. Essas são as que eu realmente explorei:
GenericAll
Controle total sobre o objeto alvo. Você pode:
- Resetar a senha
- Adicionar a grupos
- Modificar atributos
- Setar um SPN nele (Kerberoasting direcionado)
No Forest, a chain de grupos do svc-alfresco deu GenericAll sobre Exchange Windows Permissions. Isso significou que eu podia me adicionar a esse grupo.
WriteDACL
Pode modificar a lista de controle de acesso do objeto alvo. Essa é a grande. WriteDACL em um objeto de domínio significa que você pode conceder qualquer permissão pra você — incluindo direitos de DCSync.
No Forest, Exchange Windows Permissions tinha WriteDACL sobre o domínio HTB.LOCAL. Depois de me adicionar a esse grupo, usei PowerView pra conceder direitos DCSync:
Add-DomainObjectAcl -TargetIdentity "DC=htb,DC=local" -PrincipalIdentity svc-alfresco -Rights DCSync
Aí impacket-secretsdump puxou todo hash do domínio.
ForceChangePassword
Pode trocar a senha do usuário alvo sem saber a atual. Feito via rpcclient:
rpcclient -U 'support%#00^BlackKnight' $ip
rpcclient $> setuserinfo2 audit2020 23 'Password@1234'
No Blackfield, support tinha ForceChangePassword sobre audit2020. Troquei a senha, usei o acesso do audit2020 à share forensic, peguei o dump do LSASS.
Outras Edges Que Valem Conhecer
| Edge | O Que Significa | Exploração |
|---|---|---|
| GenericWrite | Pode modificar atributos | Setar SPN -> Kerberoast, ou setar logon script |
| WriteOwner | Pode tomar ownership | Tomar ownership -> dar GenericAll pra você |
| AddMember | Pode adicionar usuários ao grupo | Adicionar você mesmo ou um usuário comprometido |
| ReadLAPSPassword | Pode ler senhas LAPS | Pegar a senha de local admin daquela máquina |
| AllowedToDelegate | Delegação Kerberos | Ataques de constrained/unconstrained delegation |
Caminhos de Ataque Que Eu Vi
Caminho 1: Abuso de Grupo Nested -> DCSync (Forest)
Usuário Owned -> Grupo -> Grupo -> Grupo -> GenericAll -> Grupo Alvo -> WriteDACL -> Domínio
A jogada: Se adicionar ao grupo que tem WriteDACL. Usar WriteDACL pra conceder direitos DCSync pra você. Rodar secretsdump.
Caminho 2: ForceChangePassword -> Lateral Movement (Blackfield)
Usuário Owned -> ForceChangePassword -> Usuário Alvo -> Acesso a novos recursos
A jogada: Trocar a senha do alvo. Logar como ele. Ver o que ele tem acesso que você não tinha.
Caminho 3: Kerberoasting Direto (Active)
Usuário Owned -> GetUserSPNs -> Administrator tem SPN -> Crack TGS -> Domain Admin
A jogada: BloodHound mostra quais contas de alto valor têm SPNs. Se Administrator ou outra conta DA tem um, Kerberoast nela.
Meu Workflow BloodHound
Toda box AD, mesmo processo:
- Pegar qualquer creds válidas — null session, AS-REP Roast, creds em arquivos, password spray, o que for
- Rodar bloodhound-python com
-c All - Upload dos arquivos JSON pro BloodHound CE
- Marcar seu usuário como owned — clique direito -> Mark as Owned
- Rodar pathfinding — usuário owned -> Domain Admins
- Checar queries pré-construídas — Kerberoastable, AS-REP Roastable, direitos DCSync
- Seguir o caminho que o BloodHound mostra
Passo 5 é onde a mágica acontece. BloodHound faz a travessia do grafo por toda group membership, ACL e delegação no domínio. Ele encontra caminhos que você nunca acharia manualmente.
A verdade: Eu nunca resolvi uma box AD sem o BloodHound me mostrar algo que eu perdi. No Forest, o caminho era por 5 grupos nested. No Blackfield, ele mostrou a edge ForceChangePassword. No Active, ele confirmou o SPN do Administrator. BloodHound não é opcional. É o mapa.