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

FlagO que faz
-uUsername
-pPassword
-nsNameserver (IP do DC) — crítico, diz onde resolver DNS
-dNome do domínio
-c AllColetar 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

  • -ns nã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 DCOnly pra stealth. Pra boxes CTF e OSCP, só pegue tudo.
  • Nome do domínio importa. Algumas boxes usam domain.htb, outras usam domain.htb.local, outras domain.local. Pegue da saída LDAP do nmap ou da saída do nxc 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

  1. Logue no BloodHound CE em http://localhost:8080
  2. Clique no botão Upload (canto superior direito, ícone de seta)
  3. Selecione todos os arquivos JSON do bloodhound-python
  4. 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

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

EdgeO Que SignificaExploração
GenericWritePode modificar atributosSetar SPN -> Kerberoast, ou setar logon script
WriteOwnerPode tomar ownershipTomar ownership -> dar GenericAll pra você
AddMemberPode adicionar usuários ao grupoAdicionar você mesmo ou um usuário comprometido
ReadLAPSPasswordPode ler senhas LAPSPegar a senha de local admin daquela máquina
AllowedToDelegateDelegação KerberosAtaques 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:

  1. Pegar qualquer creds válidas — null session, AS-REP Roast, creds em arquivos, password spray, o que for
  2. Rodar bloodhound-python com -c All
  3. Upload dos arquivos JSON pro BloodHound CE
  4. Marcar seu usuário como owned — clique direito -> Mark as Owned
  5. Rodar pathfinding — usuário owned -> Domain Admins
  6. Checar queries pré-construídas — Kerberoastable, AS-REP Roastable, direitos DCSync
  7. 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.