sexta-feira, 3 de fevereiro de 2012

Descobrindo senhas no Linux com o John the Ripper

O programa John the Ripper (http://www.openwall.com/john/) é capaz de quebrar senhas de usuários em diversos sistemas operacionais, incluindo Unix, Linux, Windows e DOS. Seu propósito inicial é detectar senhas fracas, para que o administrador do sistema solicite ao usuário que altere sua senha. O John the Ripper é capaz de identificar o algoritmo utilizado para gerar os hashes das senhas.

Um sistema Linux tradicional armazena as senhas das contas dos usuários no arquivo /etc/passwd. As distribuições modernas utilizam o arquivo /etc/shadow para armazenar as senhas. Desta forma, primeiramente é necessário combinar o /etc/passwd e o /etc/shadow em um único arquivo para que o programa john reconheça o conteúdo. Use uma linha de comando semelhante a apresentada a seguir:

# unshadow /etc/passwd /etc/shadow > senhas.txt

Neste primeiro momento é necessário acessar como root para ter permissão de leitura nos arquivos em /etc/. Se preferir, copie os arquivos /etc/passwd e /etc/shadow para um diretório de usuário e execute o comando unshadow por este usuário nas cópias do passwd e shadow:

$ unshadow passwd shadow > senhas.txt

Agora podemos executar o programa john neste arquivo combinado de senhas, para que o programa quebre as senhas encontradas:

$ john senhas.txt

Pode ser interessante, para não perder tempo, especificar determinado usuário para quebrar a senha. Há algumas formas para fazer isto, com a opção --users, especificando o nome do usuário, o número UID, ou excluindo os outros usuários. As três linhas abaixo são exemplos para cada uma das formas:

$ john --users=convidado senhas.txt
$ john --users=503 senhas.txt
$ john --users=-root,joao,pedro senhas.txt

Quando o programa john está em execução, ele não exibe as tentativas de quebra, mas uma linha de palpites pode ser exibida pressionando a tecla Espaço. Esta linha possui informações como tempo gasto, caracteres por segundo, tentativas de senhas etc. Para abortar pressione Ctrl+C.

Ao encontrar a senha, ela é exibida junto com o nome do usuário. As senhas quebradas serão armazenadas no arquivo ~/.john/john.pot, para consultas posteriores, com o comando:

$ john --show senhas.txt

Veja um exemplo completo de comando e resposta do programa john (a senha da conta convidado é 123):

$ john --users=convidado senhas.txt
Loaded 1 password hash (generic crypt(3) [?/64])
123              (convidado)
guesses: 1  time: 0:00:00:05 100% (2)  c/s: 146  trying: 12345 - missy

A senha 123 é muito simples e rápida de se quebrar. Entretanto, senhas com oito ou mais caracteres alfanuméricos, armazenadas com a função crypt(), podem demorar um bocado para serem quebradas.

Por exemplo, sem contar caracteres especiais e maiúsculas, pode-se usar as 26 letras e os 10 números para compor um dígito da senha. Uma senha com 8 dígitos pode ser formada de 36 elevado à 8 arranjos diferentes, ou seja, 2,82e+12 arranjos. Isto é relativamente imenso. Se um computador pudesse processar 10 milhões de senhas por segundo, apenas comparando o hash, a quebra desta senha por força-bruta poderia levar até 78 horas. É tempo razoável mas possível.

Com a necessidade de usar a função crypt(), o desempenho no número de senhas por segundo cai bastante. Pois felizmente, as distribuições Linux adicionam um "salt", forçando o uso da função crypt(), para dificultar a quebra por força-bruta com Hash Tables.

O modo de uso do programa john, apresentado neste artigo, não utiliza Hash Tables. Os arranjos são gerados e calculados com a função crypt() em cada tentativa. Isto atrasa bastante o processo.

O programa John the Ripper utiliza alguns modos para otimizar a quebra da senha e possui algumas opções para sua linha de comando. Consulte a documentação, normalmente localizada em /usr/share/doc/john-x.x.x/, para saber mais.

Nenhum comentário:

Postar um comentário