AD Exploit - Evil-WinRm e BloodHound

O cenário que vou descrever neste artigo é um pentest interno do tipo greybox com foco em um servidor AD (Active Directory). Uma credencial de domínio é disponibilizada, com um usuário sem privilégios administrativos na rede. Os testes tem como objetivo identificar vulnerabilidades em que uma credencial com baixo nível de privilégios pode ser usada para exploração. 

Ao executar a enumeração de portas com NMAP, identifiquei diversos serviços ativos no servidor AD. O primeiro protocolo que vou abordar é o WinRM. 

Protocolo WinRM 

O WinRM é usado para gerenciamento remoto de sistemas, como a execução de comandos, scripts, consultas WMI. A comunicação é feita através do protocolo SOAP sobre HTTP/HTTPS. 

WinRM sobre HTTP usa a porta 5985 ou HTTPS com a porta 5986. 

Durante um pentest interno, ao encontrar um servidor Windows, podemos usar a ferramenta Evil-WinRm para testar o protocolo WinRM. A instalação da ferramenta é feita com o gerenciador de pacotes Ruby através do comando: 

gem install evil-winrm 

Usando o Evil-WinRm é possível obter acesso ao servidor com a credencial de usuário comum fornecida para a realização do pentest. 

evil-winrm -i [IP] -u [username] -p [password] 


Com o acesso ao servidor, podemos iniciar a enumeração interna. 

BloodHound

O BloodHound é uma ferramenta para mapear o servidor AD (Active Directory) e corelacionar as relações de confiança, permissão e privilégios entre usuários, grupos e computadores. Através desse mapeamento de corelação, podemos identificar caminhos vulneráveis que um atacante pode explorar para obter acesso privilegiado na rede. 

Para instalar a ferramenta é necessário obter o Docker e Docker Compose. 

apt install docker.io

Instalação do Docker Compose: 

curl -L "https://github.com/docker/compose/releases/download/v2.32.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Outras versões do Docker Compose: https://github.com/docker/compose/releases

Após o download do docker-compose, configure a permissão de execução: 

chmod +x /usr/local/bin/docker-compose

Em seguida, crie um diretório com nome BloodHound e faça o download do arquivo docker-compose da ferramenta.

curl -L https://ghst.ly/getbhce > docker-compose.yml

docker-compose pull && docker-compose up

Acesse a ferramenta através do endereço: http://localhost:8080/ui. A primeira vez em que a ferramenta é executada, uma senha é gerada e no primeiro login essa senha é modificada. O usuário de acesso é admin. 



Para fazer a coleta dos dados, usamos os scripts da ferramenta Python BloodHound Colletor disponível no repositório AQUI

A instalação requer o ambiente virtual para instalação da CLI do Colletor:

Ambiente Virtual: source venv/bin/activate

Instalação da CLI: pip install bloodhound-ce

Clone da ferramenta: git clone https://github.com/dirkjanm/BloodHound.py

Verificar branch do repositório: git checkout bloodhound-ce

Instalação final: pip install .

Após a instalação, iniciamos a coleta de dados com o comando:

bloodhound-ce-python -d [domain-name] -c all -u [user] -p [password] -ns [ip] --zip


A coleta resulta em um arquivo .zip que é importado na ferramenta BloodHound. Crie um diretório para armazenar o arquivo e não se perder durante o período de teste. 


Anteriormente, usando a ferramenta Crackmapexec fiz a enumeração de usuários com o comando:

crackmapexec smb [ip] -u [user] -p [password] --users


No BoodHound busquei por interações entre o usuário Olivia fornecido para o teste e os outros usuários. Olivia possui a permissão GenericAll que permite modificar a senha do usuário Michael.


GenericAll é uma permissão global e equivale a ter o controle total sobre um objeto do AD, como um usuário por exemplo. Os objetos no AD podem ser usuários, grupos, computador, OU, GPO, e cada um desses objetos possui uma ACL (Access Control List) que define as permissões sobre um objeto.

Neste cenário, o usuário Olivia pode mudar a senha do usuário Michael, conforme descrito na ferramenta:


A partir do Kali é possível usar a ferramenta net para trocar a senha do usuário Michael: 



net rpc password "TargetUser" "newP@ssword2022" -U "DOMAIN"/"ControlledUser"%"Password" -S "DomainController"

Usando o Evil-WinRm é possível acessar o servidor com a credencial do usuário Michael. Esse usuário faz parte do grupo Remote Management Users e portanto tem permissão para acessar servidores remotos usando o protocolo WinRM. 

Voltando a análise do AD, o usuário Michael tem permissão para trocar a senha do usuário Benjamin.

Diferente da Olivia, o usuário Michael possui a permissão ForceChangePassword e, ao usar o mesmo comando da ferramenta net para trocar a senha do usuário Benjamin, foi possível acessar o servidor pelo WinRm, SMB e através do FTP. 


O downloado arquivo Backup.psafe3 é permitido. 

Extensão .psafe3

Extensão usada pelo gerenciador de senhas Password Safe, e o arquivo é criptografado. Como não sei a senha mestre do arquivo, será necessário fazer a quebra através de brute-force. 

O Hashcat possui o módulo 5200 específico para arquivos .safe3 

hashcat -m 5200 Backup.psafe3 /opt/SecLists/Passwords/Leaked-Databases/rockyou-75.txt 


O Password Safe pode ser instalado usando a versão disponivel neste repositório AQUI

Com a senha master descoberta foi possível acessar banco de dados do gerenciador e obter outras credenciais. 


Com o Crackmapexec validei os acessos dos usuários aos serviços SMB e WinRM. O usuário Emily tem acesso ao SMB e WinRM. Logo, usando o Evil-Winrm consegui acessar a máquina desse usuário. 


No BloodHound podemos ver que o usuário Emily tem permissão GenericWrite na conta Ethan. 


O GenericWrite concede permissão para modificar qualquer atributo não-protegido da conta do usuário-alvo, incluindo os atributos "members for a group" e "Service Principal Names".

De acordo com o BloodHound, o usuário Emily tem permissão de escrita no atributo "mds-KeyCredentialsLink" da conta do Ethan. Modificar esse atributo permite ao atacante criar uma "Shadow Credentials".  Outro vertor de ataque é a permissão para escrever no atributo Service Principal Name (SPN) e essa ação permite a execução do ataque Kerberoast. 

O Service Principal Name (SPN) é um identificador único que associa um serviço a uma conta de serviço para ser usada pelo Kerberos para autenticação. 

Kerberoasting é um ataque onde um usuário autenticado no domínio solicita um ticket para um serviço usando o atributo SPN, e o ticket que retorna é criptografado com a senha do usuário associado ao serviço. Se a senha for de baixa complexidade, ela pode ser quebrada offline através de força-bruta. 

Neste cenário, posso usar o usuário Emily para atribuir um SPN falso, uma vez que a permissão GenericWrite permite essa ação. Mesmo sendo um serviço falso, posso solicitar um ticket kerberos para o SPN, e o mesmo vai retornar o hash da senha do usuário ETHAN criptografada. 

O BloodHound nos dá as instruções para o ataque Kerberoasting com Linux. 


Fiz o download do arquivo no repositório AQUI e ao executar o script, retornou erro de sincronização do horário da máquina Kali com o Domain Controller. 


Instalei o pacote install ntpsec-ntpdate e usei o comando ntpdate administrator.htb para sincronizar o horário. 


Ao executar o script do ataque novamente, funcionou e obtive o hash da senha do usuário Ethan. 

Comando: 

python3 targetedKerberoast.py -d 'administrator.htb' -u emily -p UXLCI5iETUsIBoFVTj8yQFKoHjXmb -o hashEthan


A ferramenta John consegue quebrar o hash do ticket Kerberos com o comando: 

john --format=krb5tgs --wordlist=/opt/SecLists/Passwords/Leaked-Databases/rockyou-75.txt hashEthan 


O usuário Ethan tem acesso por SMB ao domain controller mas não tem acesso pelo WinRM. 

Ao buscar no BloodHound as permissões deste usuário, vi que é possível executar o ataque DCSync. 



Como funciona o ataque DCSync? 

No ataque DCSync, o atacante utiliza ferramentas como Mimikatz para imitar o comportamento de um DC legítimo, enviando requisições de replicação via DRSR. O Active Directory replica objetos entre os Domain Controllers usando o protocolo Directory Replication Service Remote Protocol (DRSR).

O usuário Ethan possui permissão nos atributos: DS-Replication-Get-Changes e DS-Replication-Get-Changes-All, o que possibilita o ataque pois esses atributos permitem replicação no domínio. 

O Impacket está instalado na máquina Kali, então com o comando abaixo eu consigo obter todos os hashes de senha dos usuários do domínio: 

impacket-secretsdump administrator.htb/ethan:limpbizkit@10.10.11.42 


Ao obter o hash do usuário Administrator com o ataque DCSync bem sucedido, é possível acessar o domain controler como administrador com a ferramenta Evil-Winrm: 

evil-winrm -i 10.10.11.42 -u administrator -H 3dc553ce4b9fd20bd016e098d2d2fd2e


Nesse laboratório demostrei como realizar um pentest com foco no Active Directory. No próximo artigo, vou complementar explicando em detalhes cada um dos ataques, o caminho do ataque e quais as medidas de proteção para evitar esse tipo de brecha. 

#HACKINGBR

Comentários

Postagens mais visitadas