
Identifique os caminhos de ataque no BloodHound que quebram sua hierarquia de AD.
Identifique os caminhos de ataque no BloodHound que quebram sua hierarquia de AD (tiering)
ImproHound é um executável .NET independente para Windows x64 com interface gráfica. Para usar o ImproHound, você deve executar o SharpHound para coletar os dados necessários do AD. Em seguida, faça o upload dos dados para sua instalação do BloodHound. O ImproHound se conectará ao banco de dados Neo4j subjacente do BloodHound. No ImproHound, você categorizará os objetos do AD em níveis (tiers) por meio da estrutura de OUs, e o ImproHound identificará as relações do AD que permitem que objetos do AD comprometam um objeto de um nível superior (mais próximo de zero) e salvará as violações de hierarquia em um arquivo csv.
Postagem no blog sobre o ImproHound
Vídeo de demonstração do ImproHound
Apresentação do ImproHound no DEF CON Adversary Village
1. Configure seu banco de dados do BloodHound
Colete dados do BloodHound com SharpHound no seu AD
Nota: isso gerará ruído no seu AV, SIEM, etc.
Exemplo: Execute SharpHound.exe a partir do cmd, colete tudo (sim, GPOLocalGroup não está incluído em All):
SharpHound.exe --CollectionMethods All,GPOLocalGroup
Dica 1: Use o parâmetro
Domainpara coletar dados de outros domínios na floresta.
Dica 2: Para obter ainda mais dados, use The Session Loop Collection Method
Faça o upload dos seus dados do BloodHound na interface gráfica do BloodHound
Há um bug no BloodHound que às vezes faz com que o arquivo json do domínio seja ignorado ao fazer upload de um zip de dados do BloodHound. Verifique as estatísticas do banco de dados no BloodHound após o upload dos dados e certifique-se de que os objetos de domínio existam.
2. Instale o plugin APOC do Neo4j (ativa operações incríveis de grafo que precisamos)
Baixe a versão do APOC que corresponde à sua versão do Neo4j (apoc-x.x.x.x-all.jar).
Encontre a versão do APOC correspondente à sua versão do Neo4j na matriz de compatibilidade de versões.
Tente lembrar onde você instalou o Neo4j e coloque o arquivo jar do APOC em: $NEO4J_HOME/plugins/
/var/lib/neo4j/Edite neo4j.conf no seu editor de texto favorito para permitir acesso irrestrito ao APOC, substituindo a linha:
#dbms.security.procedures.unrestricted=my.extensions.example,my.procedures.*
por
dbms.security.procedures.unrestricted=apoc.*
/etc/neo4j/neo4j.conf$NEO4J_HOME/conf/neo4j.confSe você quiser executar o ImproHound em uma máquina e o BloodHound em outra, você deve permitir conexões remotas ao banco de dados Neo4j na máquina do BloodHound. Para isso, remova # da linha
#dbms.default_listen_address=0.0.0.0em .
3. Baixe e execute a versão mais recente do ImproHound.exe no Windows (x64)
Confirme que você pode fazer login no banco de dados do BloodHound com as mesmas credenciais que usa na interface gráfica do BloodHound.

Insira as credenciais do banco de dados e estabeleça uma conexão. São as mesmas credenciais que você usa na interface gráfica do BloodHound.

O ImproHound cria um rótulo 'TierX' nos nós do banco de dados do BloodHound. Se você já usou o ImproHound antes com este banco de dados do BloodHound, será perguntado se deseja continuar com a hierarquia já criada ou se deseja recomeçar.

O ImproHound oferece a opção de definir 'Hierarquia padrão' (Default tiering), que colocará Domain Admins no Nível 0, Domain Users no Nível 2, etc., ou colocar todos os objetos no Nível 2.

Esta é a página onde você categorizará os objetos do AD em níveis. A janela exibe a estrutura de OUs. Cada objeto do AD possui um valor de nível que pode ser aumentado e diminuído com as setas.
Definir filhos para o nível
Se você selecionar um domínio ou um container do AD, pode clicar em 'Definir filhos para o nível' (Set children to tier) para definir todos os filhos (recursivamente) para o nível do domínio/container fornecido.
Definir membros para o nível
Se você selecionar um grupo, pode clicar em 'Definir membros para o nível' (Set members to tier) para definir todos os membros (recursivamente) para o nível do grupo fornecido.
Definir nível para GPOs
Se você clicar em 'Definir nível para GPOs' (Set tier for GPOs), cada GPO terá seu nível definido para o nível da OU de maior nível (mais próximo de zero) à qual a GPO está vinculada. GPOs não vinculadas a uma OU não terão seu nível alterado.
Obter violações de hierarquia
Encontre todas as relações no banco de dados do BloodHound onde um objeto do AD tem controle sobre um objeto do AD de um nível superior (mais próximo de zero).
Dois arquivos CSV são gerados como saída:
adobjects-[timestamp].csv: Todos os objetos do AD e em qual nível estão.
tiering-violations-[timestamp].csv: As violações de hierarquia.
Exemplo de registros no CSV de violações:
O primeiro registro é uma conta de serviço do Nível 1 com permissão para alterar a senha de uma conta de usuário do Nível 0. A relação é herdada. Infelizmente, nem sempre é possível visualizar de onde a relação é herdada nos dados do BloodHound, mas você pode verificar manualmente inspecionando as permissões no objeto do AD de destino em Usuários e Computadores. O segundo registro é um grupo com permissão para editar uma GPO, que provavelmente está vinculada à OU que contém servidores do Nível 0, já que é uma GPO do Nível 0.
Você pode consultar todos os tipos de relações e como são exploradas aqui.
Se você descobrir que um objeto está em um nível muito alto (mais próximo de zero), deve corrigi-lo no ImproHound e depois verificar se há violações com este objeto como ORIGEM. Se um objeto está em um nível muito baixo (mais próximo do infinito), deve corrigi-lo no ImproHound e verificar se há violações com o objeto como ALVO.
Excluir hierarquia
Todos os rótulos de níveis e nós criados pelo ImproHound no banco de dados do BloodHound serão excluídos.
É importante hierarquizar os objetos do AD corretamente. Se você definir um DC e um usuário comum de baixos privilégios como objetos do Nível 0, o ImproHound não encontrará que o acesso administrativo do usuário ao DC é uma violação de hierarquia. O mesmo caso se você adicionar os dois ao Nível 2.
Computadores são hierarquizados de acordo com o quão crítico seria se o computador fosse comprometido.
Usuários são hierarquizados de acordo com os computadores nos quais podem fazer logon e com os objetos do AD sobre os quais têm controle. Um exemplo de permissão de controle poderia ser um usuário com direitos para editar GPOs vinculadas a servidores do Nível 1, o que tornaria o usuário um objeto do Nível 1.
Um grupo pertence ao nível mais baixo (mais próximo do infinito) de seus membros, a menos que o grupo tenha membros problemáticos, por exemplo, um usuário comum como membro de Domain Admins.
Exemplos: Domain Users é um grupo do Nível 2, mesmo que seus usuários do Nível 0 sejam membros do grupo, porque não é a associação ao Domain Users que dá privilégios aos usuários. Por outro lado, o grupo Domain Admins é um grupo do Nível 0 porque a associação a este grupo torna os usuários muito privilegiados. Cloneable Domain Controllers não possui privilégios de AD que eu saiba, mas deve conter apenas objetos do Nível 0, ou seja, DCs, então é um grupo do Nível 0.
Um container pertence ao nível mais alto (mais próximo de zero) de seus objetos filhos, ou superior.
Exemplo: Você tem todos os usuários dos Níveis 0, 1 e 2 no container Users. Um usuário com permissão de Controle Total no container Users seria capaz de comprometer todos os usuários, incluindo os do Nível 0 (exceto alguns que são protegidos, mas isso não é importante para o exemplo), então o container Users deve ser um objeto do Nível 0.
O nível de uma GPO é determinado pelo nível das OUs às quais está vinculada. A GPO pertence ao nível mais alto (mais próximo de zero) das OUs às quais está vinculada. Use o botão 'Definir nível para GPOs' para garantir que todas as GPOs sigam este princípio.
Exemplo: Um usuário com permissão para editar uma GPO vinculada a uma OU do Nível 1 seria capaz de controlar a associação ao grupo Administradores em todos os servidores sob a OU do Nível 1, modificando a GPO.
neo4j.confReinicie o Neo4j
systemctl restart neo4jnet stop neo4j && net start neo4j (PowerShell: net stop neo4j; net start neo4j)| SourceTier | SourceType | SourceName | SourceDistinguishedname | Relation | IsInherited | TargetTier | TargetType | TargetName | TargetDistinguishedname |
|---|
| Tier1 | User | [email protected] | CN=svc-monitor,CN=Users,DC=hot,DC=local | ForceChangePassword | True | Tier0 | User | [email protected] | CN=T0_JBK,CN=Users,DC=hot,DC=local |
| Tier2 | Group | [email protected] | CN=Wrk-Admins,CN=Groups,DC=hot,DC=local | GenericWrite | Tier0 | GPO | [email protected] | CN={6AC1786C-016F-11D2-945F-00C04fB984F9},CN=Policies,CN=System,DC=hot,DC=local |