Use John the Ripper para Quebrar Chaves Privadas SSH

Kali LinuxBeginner
Pratique Agora

Introdução

As chaves SSH (Secure Shell) são uma forma segura de autenticar em servidores remotos, oferecendo uma alternativa mais robusta aos logins baseados em senha. Para segurança adicional, uma chave privada SSH pode ser criptografada com uma frase-senha (passphrase). Se um atacante obtiver acesso ao seu arquivo de chave privada, ele ainda precisará da frase-senha para usá-la.

No entanto, uma frase-senha fraca pode ser uma vulnerabilidade significativa. Neste laboratório, você assumirá o papel de um analista de segurança para entender esse risco. Você aprenderá a usar o John the Ripper, uma poderosa ferramenta de quebra de senhas de código aberto, para quebrar a frase-senha de uma chave privada SSH. Este exercício tem fins educacionais para destacar a importância de usar frases-senhas fortes.

Gerar uma Chave Privada SSH Protegida por Senha

Nesta etapa, você gerará um novo par de chaves SSH. A chave privada será protegida com uma frase-senha simples e fácil de adivinhar. Esta chave servirá como alvo para o nosso exercício de quebra nas etapas subsequentes.

Usaremos o comando ssh-keygen para criar a chave. Especificaremos o tipo de chave, o tamanho em bits e o nome do arquivo para garantir que ela seja criada dentro do diretório do nosso projeto.

Execute o seguinte comando para gerar um par de chaves RSA SSH. Quando solicitado a inserir uma frase-senha, digite labex.

ssh-keygen -t rsa -b 2048 -f ./my_ssh_key -C "labex@labex.io"

Você será solicitado a inserir e confirmar uma frase-senha. Digite labex e pressione Enter para ambas as solicitações.

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): labex
Enter same passphrase again: labex
Your identification has been saved in ./my_ssh_key
Your public key has been saved in ./my_ssh_key.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx labex@labex.io
The key's randomart image is:
+---[RSA 2048]----+
|        .        |
|       . .       |
|      .   .      |
|     . . . .     |
|    . . S .      |
|   . . . o       |
|  . . . + .      |
| . . . =.o.o     |
|..  .oo*+E+      |
+----[SHA256]-----+

Agora, liste os arquivos no diretório atual para ver o par de chaves recém-criado: a chave privada my_ssh_key e a chave pública my_ssh_key.pub.

ls -l
total 12
-rw------- 1 labex labex 1823 Jan 01 12:00 my_ssh_key
-rw-r--r-- 1 labex labex  401 Jan 01 12:00 my_ssh_key.pub
-rw-r--r-- 1 labex labex   48 Jan 01 12:00 wordlist.txt

Você criou com sucesso uma chave privada SSH protegida por senha.

Extrair Hash da Chave SSH usando ssh2john

O John the Ripper não pode trabalhar diretamente com o formato de arquivo de chave SSH. Ele requer um formato de hash específico que representa a frase-senha criptografada. Para obter este hash, usaremos uma utilidade chamada ssh2john, que está incluída no pacote John the Ripper.

Nesta etapa, você executará o ssh2john na chave privada que você criou (my_ssh_key) e salvará sua saída em um novo arquivo. Este arquivo conterá o hash que o john poderá então tentar quebrar.

Execute o seguinte comando para extrair o hash e salvá-lo em um arquivo chamado ssh_hash.txt:

ssh2john my_ssh_key > ssh_hash.txt

Este comando não produz nenhuma saída no terminal porque o redirecionamos para o arquivo ssh_hash.txt usando o operador >.

Para ver o conteúdo do arquivo de hash gerado, use o comando cat:

cat ssh_hash.txt

Você verá uma longa string de texto, que é a representação em hash da frase-senha da sua chave. Ela se parecerá com algo assim:

my_ssh_key:$ssh2$0$16$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$1040$xxxxxxxx...

Agora você tem o arquivo de hash pronto para o processo de quebra.

Quebrar Hash de Chave SSH com John the Ripper

Com o hash extraído, é hora de usar o John the Ripper para quebrá-lo. Realizaremos um "ataque de dicionário", onde o john tenta cada palavra de uma lista fornecida como uma possível frase-senha. Para este laboratório, usaremos o arquivo wordlist.txt que foi pré-criado em seu ambiente.

Em um cenário do mundo real, os atacantes usam listas de palavras massivas contendo milhões de senhas comuns, nomes e palavras de dicionário. Nossa lista de palavras simples contém a frase-senha correta, labex, garantindo que a quebra será bem-sucedida para esta demonstração.

Execute o comando john, especificando a lista de palavras e o arquivo de hash:

john --wordlist=wordlist.txt ssh_hash.txt

O John iniciará o processo de quebra. Como a frase-senha está em nossa lista de palavras curta, ela será encontrada quase instantaneamente.

Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH private keys ssh2john])
Cost 1 (KDF/cipher) is 0 for all loaded hashes
Cost 2 (iteration count) is 16 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
labex            (my_ssh_key)
1g 0:00:00:00 DONE (2023-01-01 12:05) 12.50g/s 12.50p/s 12.50c/s 12.50C/s sunshine..labex
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Sucesso! A linha de saída labex (my_ssh_key) mostra que a frase-senha labex foi recuperada com sucesso para a chave my_ssh_key.

O John the Ripper salva as senhas quebradas em um arquivo chamado "pot file" (~/.john/john.pot por padrão). Para visualizar a senha quebrada novamente sem reexecutar o ataque, você pode usar a opção --show:

john --show ssh_hash.txt
my_ssh_key:labex

1 password hash cracked, 0 left

Isso confirma a frase-senha quebrada. Você agora quebrou com sucesso a frase-senha fraca de uma chave SSH.

Compreender a Segurança de Chaves SSH

Este laboratório demonstra um ponto crítico: a segurança de uma chave SSH protegida por frase-senha é tão forte quanto a própria frase-senha. Vamos detalhar os componentes da segurança de chaves SSH.

  • Força da Chave (Criptografia): Refere-se ao algoritmo (por exemplo, RSA, ECDSA, Ed25519) e ao tamanho da chave (por exemplo, 2048, 4096 bits) usados para gerar a chave. Um tamanho de chave maior torna exponencialmente mais difícil para um atacante quebrar a criptografia subjacente por meio de força bruta. Isso protege contra ataques que tentam derivar a chave privada da chave pública.

  • Força da Frase-Senha (Criptografia): Isso protege o próprio arquivo de chave privada. Quando você define uma frase-senha, o arquivo de chave privada é criptografado. Se alguém roubar este arquivo, não poderá usá-lo sem antes descriptografá-lo. Como você viu, uma frase-senha fraca, comum ou baseada em dicionário pode ser quebrada facilmente. Uma frase-senha forte deve ser longa, complexa e única, tornando um ataque de dicionário ou força bruta computacionalmente inviável.

  • Permissões de Arquivo (Controle de Acesso): As permissões de arquivo do seu sistema operacional fornecem a primeira linha de defesa. Um arquivo de chave privada deve sempre ter permissões que restrinjam o acesso apenas ao proprietário (por exemplo, 600 ou -rw-------). Isso impede que outros usuários no mesmo sistema leiam o arquivo de chave.

Em nosso laboratório, a força criptográfica da chave era irrelevante porque o vetor de ataque não era a criptografia em si, mas a frase-senha fraca usada para criptografar o arquivo.

Melhores Práticas para Gerenciamento de Chaves SSH

Compreender os riscos é o primeiro passo. Aplicar as melhores práticas é como mitigá-los. Aqui estão regras essenciais para gerenciar suas chaves SSH com segurança em um ambiente do mundo real.

  • Use Frases-Senhas Fortes e Únicas:

    • Nunca use palavras comuns, nomes ou padrões simples.
    • Uma frase-senha forte deve ser longa (mais de 15 caracteres) e conter uma mistura de letras maiúsculas, minúsculas, números e símbolos.
    • Considere usar um gerenciador de senhas para gerar e armazenar frases-senhas altamente complexas.
  • Use Algoritmos Modernos e Tamanhos de Chave Adequados:

    • Prefira algoritmos modernos como Ed25519 ou ECDSA em vez do antigo RSA. Eles oferecem melhor segurança e desempenho.
    • Se estiver usando RSA, certifique-se de um tamanho de chave de pelo menos 2048 bits, com 4096 bits sendo recomendado para segurança de longo prazo.
  • Proteja Arquivos de Chave Privada:

    • Sempre certifique-se de que seus arquivos de chave privada (por exemplo, ~/.ssh/id_rsa) tenham permissões de arquivo rigorosas. Use chmod 600 para permitir acesso de leitura/escrita apenas ao seu usuário.
  • Use um Agente SSH:

    • Um agente SSH (ssh-agent) é um programa em segundo plano que armazena em cache suas chaves privadas descriptografadas na memória. Você digita sua frase-senha uma vez ao adicionar a chave ao agente, e não precisará digitá-la novamente durante sua sessão. Isso é conveniente e seguro, pois a frase-senha não é digitada repetidamente nem armazenada em disco.
  • Rotacione Chaves Regularmente:

    • Gere periodicamente novos pares de chaves SSH e desative os antigos. Isso limita a janela de oportunidade para um atacante caso uma chave antiga seja comprometida.
  • Nunca Compartilhe Chaves Privadas:

    • Uma chave privada é privada. É sua identidade única. Nunca a envie por e-mail, chat ou qualquer outro meio. Se outra pessoa precisar de acesso, ela deve gerar seu próprio par de chaves e fornecer a você sua chave pública.

Resumo

Neste laboratório, você ganhou experiência prática com uma tarefa comum de auditoria de segurança. Você realizou com sucesso:

  • A geração de um novo par de chaves SSH protegido por uma frase-senha.
  • O uso da utilidade ssh2john para extrair um hash que pode ser quebrado do arquivo de chave privada.
  • A execução de um ataque de dicionário usando John the Ripper para quebrar a frase-senha fraca.
  • O aprendizado dos princípios fundamentais da segurança de chaves SSH, incluindo os papéis distintos da força criptográfica e da força da frase-senha.
  • A revisão das melhores práticas essenciais para o gerenciamento seguro de chaves SSH.

Este exercício demonstra que mesmo ferramentas criptográficas fortes podem ser minadas por práticas humanas fracas. Sempre proteja suas chaves SSH com frases-senhas fortes e únicas para garantir a integridade de sua identidade digital.