BloodHound

O BloodHound é uma ferramenta de código aberto que pode ser usada por invasores e defensores para analisar a segurança do Domínio. A ferramenta recebe uma grande quantidade de dados coletados do domínio. Ele usa a teoria dos grafos para representar visualmente o relacionamento e identificar caminhos de ataque de Domínio que seriam difíceis ou mesmo impossíveis de detectar com a enumeração tradicional.

Os dados a serem utilizados pelo BloodHound são coletados usando o ingeridor SharpHound, que está disponível em PowerShell e C#. Uma porta Python pode ser clonada do repositório GitHub ou instalada diretamente por meio do gerenciador de pacotes pip.

Várias formas de controle de objeto-a-objeto (ou seja, maneiras que um usuário específico pode ser aproveitado para assumir outro usuário ou computador, etc).

Executando o Neo4J + Bloodhound

Neo4J

Após executar o comando abaixo, será aberto um servidor web em http://localhost:7474.

DICA: Atualmente as credenciais padrões para acessar o Neo4j via web é root:root ou neo4j:neo4j

neo4j start

Caso receba erro informando que não foi possível dar um start no Neo4j, execute o comando abaixo e depois tente novamente.

sudo mkdir /usr/share/neo4j/logs

BloodHound

Após executar o comando abaixo, será aberto uma janela do BloodHound.

./BloodHound

Coletando Dados com SharpHound

A SharpHound gera vários arquivos JSON em um arquivo zip por padrão e contém os seguintes dados em uma enumeração completa.

  • Local Group Membership

  • AD Group Membership

  • Session Data

  • Domain Trust

  • ACL's

  • AD Objects

  • Containers

Após gerar o arquivo zip, é preciso transferi-lo para o Linux e depois importá-lo para o BloodHound, clicando no botão Import Graph (canto direito da janela). Em alguns casos esse import não funciona, então é necessário clicar e arrastar o arquivo zip para dentro do Bloodhound. Logo após poderá ver o desenho do AD, mapeando informações úteis.

Um ponto importante a ser citado aqui é que, mesmo utilizando parâmentro -c All (para retornar tudo), não irá retornar as GPO's, então esse tem que ser feito de maneira separada

SharpHound.exe

.\SharpHound.exe -c all --zipfilename <output_file>

SharpHound.ps1

powershell -ep bypass
Import-Module .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod all -ZipFileName <output_file>

Executando BloodHound.py

A versão do Python é mais lenta que as versões desenvolvidas em PowerShell e C#, porém irá recuperará quase a mesma quantidade de dados. A ferramenta não cria um arquivo zip, mas grava arquivos JSON individuais que podem ser compactados e importados por conta própria para a GUI do BloodHound.

A principal diferença dessa versão, é que não é preciso transferir o SharpHound para o host Windows, pois o todo o trabalho é feito remotamente, por isso é preciso ter as devidas credenciais.

Instalação

Para ser executado, este requer o kit de ferramentas do impacket, ldap3 e dnspython. A ferramenta pode ser instalada via pip digitando o seguinte comando:

pip install bloodhound

Caso prefira, podemos também clona o seu repositório git e então instalar com o seguinte comando:

python setup.py install

DICA: Caso receba o erro ImportError: cannot import name PyAsn1UnicodeDecodeError, execute o seguinte comando para corrigir: sudo pip install -U pyasn

Se você estiver executando a partir de um Linux e não de um host do domínio, você precisará editar seu arquivo /etc/resolv.conf, comentando a linha onde contém o nameserver e adicionando a seguinte linha no final do arquivo:

nameserver <ip>

Execução

Caso for executar em um host que não está associado ao domínio, devemos especificar o FQDN do controlador de domínio, bem como o servidor do Catálogo Global (CG). Utilize o parâmetro -c All para pegar o máximo de informações possível durante a coleta.

bloodhound-python -dc <dc.domain.local> -gc <dc.domain.local> -d <domain.local> -c All -u <user> -p <pass>
bloodhound-python -u <user> -p <pass> -ns <ip> -d <dc.domain.local> -c all

DBCreator.py

Script do BloodHound-Tools que pode ser usado para criar um conjunto de dados aleatórios para testar os recursos do BloodHound.

Instalação

git clone https://github.com/BloodHoundAD/BloodHound-Tools.git
cd BloodHound-Tools
sudo pip3 install -r requirements.txt 

Ao terminar a instalação, execute o Neo4j e o BloodHound

Relacionamentos

Segue abaixo os principais relacionamentos entros os Nodes (Nós), que podem ser usuários, computadores, grupos, GPO's, etc:

  • MemberOf = Um nó (usuário, grupo ou computador) é membro de um segundo nó (grupo)

  • AdminTo = Um nó (usuário, grupo ou computador) tem direitos de administrador local em um segundo nó (computador)

  • HasSession = Um nó (usuário) tem uma sessão em um segundo nó (computador)

  • TrustedBy = Um nó (domínio) é confiável para um segundo nó (Domínio)

Pesquisas na aba Node Info

Inbound Control Right = Controle sobre o objeto em questão (ACE)

Outboun Control Right = O objeto em questão tem controle sobre os demais objetos (ACE)

Caso queira utilizar filtros, siga a seguinte abaixo. Dessa forma não só terá uma busca mais precisa, como também pode contar com o auto-complete (limitado a uma certa quantidade de registros, porém pode ajudar).

domain:<DOMAIN.LOCAL>
user:<user>
group:<group>
computer:computer
gpo:<gpo>

Para exibir o nome do domínio, o nível funcional e as informações sobre o número de objetos, membros estrangeiros (usuários com direitos de acesso de outros Domínios ou Florestas), confianças de domínio e ACLs.

<DOMAIN.LOCAL>

Detalhes sobre um determinado grupo de usuários. No exemplo abaixo, estamos filtrando por Domain Users, pois neste grupo estão todos os usuários do AD, então um pequeno erro de configuração pode ter um grande efeito na segurança do Domínio. Altere a pesquisa abaixo de acordo com o grupo que deseja pesquisar.

DOMAIN USER@<DOMAIN.LOCAL>

Informações sobre uma determinada GPO.

<GPO>@<DOMAIN.LOCAL>

Pesquisas na aba Analysis

Em Analysis, podemos encontrar diverses queries já prontas e abaixo segue as principais pesquisas que podemos fazer:

  • Find Principals with DCSync Rights = Encontre contas que possam realizar o ataque DCSync

  • Users with Foreign Domain Group Membership = Encontre usuários que pertencem a grupos em outros domínios. Isso pode ajudar a montar ataques de confiança cruzada.

  • Groups with Foreign Domain Group Membership = Encontre grupos que fazem parte de grupos em outros domínios. Isso pode ajudar a montar ataques de confiança cruzada.

  • Map Domain Trusts = Encontre todas as relações de confiança com o domínio atual.

  • Shortest Paths to Unconstrained Delegation Systems = Encontre o caminho mais curto para hosts com delegação irrestrita.

  • Shortest Paths from Kerberoastable Users = Mostre o caminho mais curto para os administradores de domínio selecionando todos os usuários em uma lista suspensa que pode estar sujeita a um ataque Kerberoasting.

  • Shortest Path from Owned Principals = Se clicarmos com o botão direito do mouse em um nó e selecionarmos Mark user as owned ou Mark computer as owned, nós podemos executar essa consulta para ver até onde podemos ir de qualquer usuário/computador que tenhamos marcado como "ownado". Isso pode ser muito útil para montar novos ataques.

  • Shortest Paths to Domain Admins from Owned Principals = Encontre o caminho mais curto para o acesso de administrador de domínio de qualquer usuário ou computador marcado como owned.

  • Shortest Paths to High-Value Targets = Isso nos dará o caminho mais curto para qualquer objeto que o BloodHound já considere um alvo de alto valor. Ele também pode ser usado para encontrar caminhos para qualquer objeto em que clicamos com o botão direito do mouse e selecionamos Mark X as High Value.

Cypher Query Language

Linguagem utilizada para realizar pesquisas (queries) de relacionamentos. A sintaxe da linguagem de consulta Cypher é baseada em ASCII-Art e é extremamente visual e fácil de ler. Cypher mostra padrões de notas e relacionamentos e filtra padrões com base em rótulos e propriedades.

  • Nodes - Representado com parênteses em torno dos atributos e informações correspondentes

  • Relationships - Representado por traços e setas, com o tipo de relacionamento entre colchetes. Estes mostram a direção do relacionamento. -> (seta ) mostra um relacionamento indo em uma direção enquanto - (traço) descreve um relacionamento indo em ambas as direções. No BloodHound, os relacionamentos são sempre mostrados na direção de mais privilégios/compromissos, aproveitando as credenciais ou abusando da associação ao grupo.

IMPORTANTE: Algumas queries personalizadas não funcionam no BloodHound, então deve acessar o Neo4J para executá-las, acessível em http://localhost:7474

Abaixo segue uma simples query:

MATCH (A)-[B]->(C) RETURN A,B,C

Cada variável é definida usando uma única letra ou uma palavra inteira. Aqui os identificadores de variáveis são A,B,C. Conforme discutido anteriormente, A e C são nós, enquanto o B entre colchetes é a relação entre os dois nós. O exemplo acima procura relacionamentos que vão de A a C, e a instrução RETURN informa ao banco de dados para retornar todos os itens que correspondem aos nomes de variáveis especificados.

Na query abaixo, estamos procurando direitos específicos que o grupo Domain Users não poderia ter:

MATCH p=(m:Group)-[r:Owns|:WriteDacl|:GenericAll|:WriteOwner|:ExecuteDCOM|:GenericWrite|:AllowedToDelegate|:ForceChangePassword]->(n:Computer) WHERE m.name STARTS WITH ‘DOMAIN USERS’ RETURN p

Agora segue uma query um pouco mais avançada, utilizada para calcular os caminhos mais curtos para os administradores de domínio:

MATCH (n:User), (m:Group {name: "DOMAIN ADMINS@<DOMAIN.LOCAL>"}), p=shortestPath((n)-[*1..]->(m)) RETURN p

Essa consulta pode ser usada para localizar todos os administradores locais e o host para o qual eles mapeiam e podem ser dados úteis para apresentar a um cliente para mostrar a extensão dos privilégios de administrador local em sua rede.

MATCH (c:Computer) OPTIONAL MATCH (u1:User)-[:AdminTo]->(c) OPTIONAL MATCH (u2:User)-[:MemberOf*1..]->(:Group)-[:AdminTo]->(c) WITH COLLECT(u1) + COLLECT(u2) AS TempVar,c UNWIND TempVar AS Admins RETURN c.name AS COMPUTER, COUNT(DISTINCT(Admins)) AS ADMIN_COUNT,COLLECT(DISTINCT(Admins.name)) AS USERS ORDER BY ADMIN_COUNT DESC

Calculando a porcentagem de usuários que possuem path para Domain Admin.

MATCH (totalUsers:User {domain:'<DOMAIN.LOCAL>'}) MATCH p=shortestPath((UsersWithPath:User {domain:'<DOMAIN.LOCAL>'})-[r*1..]->(g:Group {name:'DOMAIN ADMINS@<DOMAIN.LOCAL>'})) WITH COUNT(DISTINCT(totalUsers)) as totalUsers, COUNT(DISTINCT(UsersWithPath)) as UsersWithPath RETURN 100.0 * UsersWithPath / totalUsers AS percentUsersToDA

Encontrando os membros de todos os grupos considerados "destinos de alto valor". Isso pode nos ajudar a planejar caminhos de ataque para controlar um desses usuários ou grupos.

MATCH p=(n:User)-[r:MemberOf*1..]->(m:Group {highvalue:true}) RETURN p

A próxima consulta pode localizar rapidamente usuários com uma palavra-chave em seu nome principal de serviço (SPN). Esses tipos de contas geralmente podem estar sujeitos a um ataque Kerberoasting no qual o tíquete TGS Kerberos das contas é recuperado e, a partir dele, o hash de senha NTLM da conta é quebrado offline para recuperar a senha de texto simples. O direcionamento de SPNs SQL pode ser extremamente útil, pois obter acesso a um servidor SQL pode nos conceder acesso a dados confidenciais ou até mesmo privilégios de administrador de domínio.

MATCH (u:User) WHERE ANY (x IN u.serviceprincipalnames WHERE toUpper(x) CONTAINS 'SQL')RETURN u

Procurando usuários que não exigem pré-autenticação do Kerberos e podem estar sujeitos a um ataque ASREPRoasting semelhante ao Kerberoasting.

MATCH (u:User {dontreqpreauth: true}) RETURN u

Para consultar o caminho mais curto de Kerberoasting para administradores de domínio, execute:

MATCH (u:User {hasspn:true}) MATCH (g:Group) WHERE g.name = 'DOMAIN ADMINS@<DOMAIN.LOCAL>' MATCH p = shortestPath( (u)-[*1..]->(g) ) RETURN p

Pontos Importantes

Sempre verifique as permissões do Grupo Domain Users, pois todos os usuários do AD estão inclusos nesse grupo. Verifique por exemplo, se você tem permissões administrativas em algum host da rede, verificando o valor de First Degree Local Admin, na seção LOCAL ADMIN RIGHTS.

Sites

# BloodHound
https://github.com/BloodHoundAD/BloodHound

# BloodHound.py
https://github.com/fox-it/BloodHound.py

# Documentação completa do BloodHound
https://ernw.de/download/BloodHoundWorkshop/ERNW_DogWhispererHandbook.pdf

# DBCreator.py
https://github.com/BloodHoundAD/BloodHound-Tools/blob/master/DBCreator/DBCreator.py

# Guia sobre os tipos de relacionamentos (Edges)
https://bloodhound.readthedocs.io/en/latest/data-analysis/edges.html 

# Referências de query em Cypher
https://neo4j.com/docs/cypher-refcard/current/ 

Last updated