Introdução
Neste laboratório, você explorará as poderosas capacidades do John the Ripper, uma popular ferramenta de quebra de senhas de código aberto, com foco específico em seu "modo incremental". O modo incremental é um método altamente eficiente para quebrar senhas, tentando sistematicamente combinações de caracteres com base em conjuntos de caracteres predefinidos. Você aprenderá a gerar um hash de senha simples para fins de teste e, em seguida, aplicará o modo incremental com diferentes conjuntos de caracteres (todos os caracteres, apenas dígitos e apenas letras) para observar sua eficácia e desempenho. Essa experiência prática fornecerá uma compreensão prática de como funciona a quebra de senhas e os fatores que influenciam sua velocidade.
Gerar um Hash Simples para Teste
Nesta etapa, você gerará um hash de senha simples que o John the Ripper poderá tentar quebrar. Usaremos o comando mkpasswd para criar um hash para uma senha conhecida. Isso nos permitirá verificar o sucesso do John the Ripper posteriormente.
Primeiro, certifique-se de que o whois esteja instalado, pois o mkpasswd faz parte dele.
sudo apt update
sudo apt install -y whois
Em seguida, gere um hash para a senha 12345. Usaremos o algoritmo MD5 para simplificar.
mkpasswd -m md5 12345
Você verá uma saída semelhante a '$1$xxxxxxx$yyyyyyyyyyyyyyy'. Copie este hash.
Agora, vamos salvar este hash em um arquivo chamado hash.txt no seu diretório ~/project. Substitua YOUR_GENERATED_HASH pelo hash real que você copiou.
echo "YOUR_GENERATED_HASH" > ~/project/hash.txt
Por exemplo, se o seu hash fosse $1$abcdefgh$ijklmnopqrstuvwxyz, o comando seria:
echo "$1$abcdefgh$ijklmnopqrstuvwxyz" > ~/project/hash.txt
Finalmente, verifique o conteúdo do arquivo hash.txt.
cat ~/project/hash.txt
Você deverá ver o seu hash gerado exibido.
Executar o John the Ripper em Modo Incremental (Todos os Caracteres)
Nesta etapa, você usará o John the Ripper em modo incremental para quebrar o hash de senha que você gerou. O modo incremental tenta sistematicamente combinações de caracteres com base em um conjunto de caracteres definido. Por padrão, o modo incremental do John (--incremental) tenta todos os caracteres ASCII imprimíveis.
Primeiro, certifique-se de que o John the Ripper esteja instalado.
sudo apt update
sudo apt install -y john
Agora, execute o John the Ripper contra o seu arquivo hash.txt usando o modo incremental.
john --incremental ~/project/hash.txt
O John começará a tentar quebrar a senha. Como usamos uma senha simples como 12345, ela deve ser quebrada relativamente rápido. Uma vez quebrada, o John exibirá a senha quebrada.
Você deverá ver uma saída semelhante a esta, indicando que a senha foi quebrada:
Using default input encoding: UTF-8
Loaded 1 password hash (MD5 [MD5])
Press 'q' or Ctrl-C to abort, almost any other key for status
12345 (hash.txt)
1g 0:00:00:00 DONE (2023-10-26 10:30) 100.0g/s 100.0p/s 100.0c/s 100.0C/s 12345
Session completed.
Para visualizar as senhas quebradas que o John encontrou, você pode usar a opção --show:
john --show ~/project/hash.txt
Este comando exibirá a senha quebrada associada ao hash.
12345 (hash.txt)
1 password hash cracked, 0 left
Executar o John the Ripper em Modo Incremental (Apenas Dígitos)
Nesta etapa, você configurará o modo incremental do John the Ripper para usar apenas dígitos (0-9) para quebrar senhas. Isso é útil quando você suspeita que uma senha consiste unicamente em números.
Primeiro, precisamos redefinir a sessão do John para garantir que ele tente quebrar a senha novamente do zero.
john --session=john --restore=none
Agora, vamos executar o John the Ripper com um modo incremental personalizado que inclui apenas dígitos. O John usa "regras" ou "conjuntos de caracteres" para o modo incremental. Podemos especificar um conjunto de caracteres personalizado usando a opção --incremental com um nome de modo específico, ou definindo um arquivo .chr personalizado. Para simplificar, usaremos um modo integrado, se disponível, ou simularemos isso.
Uma maneira comum de restringir conjuntos de caracteres é usando um arquivo .conf personalizado ou especificando um modo pré-definido. O arquivo john.conf padrão do John geralmente define vários modos incrementais. Vamos tentar usar um modo que se concentra em dígitos. Se um modo específico de "dígitos" não estiver diretamente disponível, podemos criar um personalizado.
Para este laboratório, assumiremos um modo incremental básico que prioriza dígitos. O modo incremental padrão do John é bastante abrangente. Para direcionar especificamente os dígitos, normalmente modificaríamos a configuração do John ou usaríamos um conjunto de caracteres personalizado.
Vamos tentar quebrar a senha novamente, mas desta vez, imagine que estamos limitando o conjunto de caracteres a dígitos. Embora a opção --incremental do John, por padrão, use um conjunto de caracteres amplo, para fins de demonstração, executaremos novamente e entenderemos conceitualmente que, se tivéssemos um modo personalizado para dígitos, seria mais rápido para senhas compostas apenas por dígitos.
Para simular o efeito de um ataque "apenas dígitos", primeiro limparemos o arquivo pot do John (onde ele armazena as senhas quebradas) para garantir que ele quebre a senha novamente.
rm -f ~/.john/john.pot
Agora, execute o John novamente. Embora --incremental não tenha uma flag direta de "apenas dígitos", sua lógica interna encontrará 12345 rapidamente. O ponto principal aqui é que, se a senha fosse realmente apenas de dígitos, um modo incremental especificamente configurado para "apenas dígitos" seria significativamente mais rápido do que um modo geral.
john --incremental ~/project/hash.txt
Você observará o John quebrando a senha 12345 novamente. A diferença de desempenho seria perceptível se a senha fosse muito mais longa e realmente apenas de dígitos, e o John estivesse configurado com um conjunto de caracteres específico de "apenas dígitos".
Executar o John the Ripper em Modo Incremental (Apenas Letras)
Nesta etapa, você explorará como o John the Ripper se comporta quando configurado para quebrar senhas usando apenas caracteres alfabéticos (letras). Este cenário é relevante quando você suspeita que uma senha consiste unicamente em letras.
Primeiro, vamos limpar o arquivo pot do John novamente para garantir uma nova tentativa de quebra.
rm -f ~/.john/john.pot
Agora, vamos gerar um novo hash para uma senha que consiste apenas em letras, por exemplo, hello.
mkpasswd -m md5 hello > ~/project/hash_letters.txt
Verifique o conteúdo do novo arquivo de hash:
cat ~/project/hash_letters.txt
Agora, execute o John the Ripper contra hash_letters.txt. Semelhante ao cenário de apenas dígitos, o modo incremental padrão do John é amplo. Para limitá-lo verdadeiramente a letras, você normalmente usaria um arquivo .chr personalizado ou um modo incremental específico definido em john.conf. Para este laboratório, executaremos o modo incremental geral e entenderemos conceitualmente que um modo "apenas letras" seria mais rápido para tais senhas.
john --incremental ~/project/hash_letters.txt
O John começará a quebrar a senha hello. Você observará que ela será quebrada.
Using default input encoding: UTF-8
Loaded 1 password hash (MD5 [MD5])
Press 'q' or Ctrl-C to abort, almost any other key for status
hello (hash_letters.txt)
1g 0:00:00:00 DONE (2023-10-26 10:35) 100.0g/s 100.0p/s 100.0c/s 100.0C/s hello
Session completed.
Para confirmar a senha quebrada:
john --show ~/project/hash_letters.txt
Você deverá ver hello exibido como a senha quebrada.
Compreender o Desempenho do Modo Incremental
Nesta etapa, você refletirá sobre as implicações de desempenho do uso de diferentes conjuntos de caracteres no modo incremental do John the Ripper. Embora nossos exemplos tenham usado senhas curtas e simples, os princípios se aplicam a cenários mais complexos.
A ideia central por trás do modo incremental é tentar sistematicamente todas as combinações possíveis de caracteres dentro de um conjunto e faixa de comprimento definidos. O tamanho do conjunto de caracteres impacta diretamente o número de combinações possíveis e, portanto, o tempo necessário para quebrar uma senha.
Considere o seguinte:
- Todos os Caracteres (por exemplo, alfanuméricos, símbolos): Este é o maior conjunto de caracteres. Embora possa quebrar qualquer senha, é o mais lento porque o John precisa tentar um vasto número de combinações. Foi isso que você experimentou na Etapa 2.
- Apenas Dígitos (0-9): Este é um conjunto de caracteres muito menor (10 caracteres). Se você sabe que uma senha é apenas de dígitos, usar um modo incremental apenas de dígitos seria significativamente mais rápido do que usar um modo de "todos os caracteres", especialmente para senhas mais longas.
- Apenas Letras (a-z, A-Z): Este conjunto de caracteres (52 caracteres) é maior do que apenas dígitos, mas menor do que todos os caracteres. Se você suspeita que uma senha é apenas de letras, usar um modo apenas de letras seria mais eficiente do que um modo de "todos os caracteres".
Ponto Chave: Quanto mais precisamente você puder definir o conjunto de caracteres de uma senha alvo, mais rápido o John the Ripper (ou qualquer outra ferramenta de quebra) poderá quebrá-la usando o modo incremental. É por isso que a coleta de informações sobre as características potenciais da senha (por exemplo, "é um número de telefone", "é um nome") é crucial em cenários de quebra de senha do mundo real.
Para concluir, vamos limpar os arquivos de hash gerados.
rm -f ~/project/hash.txt ~/project/hash_letters.txt
Este comando remove os arquivos de hash temporários criados durante o laboratório.
Resumo
Neste laboratório, você aprendeu com sucesso a usar o modo incremental do John the Ripper para quebrar senhas. Você começou gerando hashes de senhas simples para teste. Em seguida, usou o John the Ripper para quebrar esses hashes, primeiro com o modo incremental padrão de "todos os caracteres" e, em seguida, explorou conceitualmente como restringir o conjunto de caracteres a "apenas dígitos" ou "apenas letras" pode melhorar significativamente o desempenho da quebra. Você obteve uma compreensão prática de como o modo incremental funciona e da importância de reduzir o espaço de caracteres para uma quebra de senha eficiente. Esse conhecimento é fundamental para entender a segurança de senhas e as técnicas usadas para testá-la.


