John the Ripper e Conjuntos de Caracteres Personalizados

Kali LinuxBeginner
Pratique Agora

Introdução

Neste laboratório, você explorará as capacidades avançadas do John the Ripper, focando especificamente em como aproveitar conjuntos de caracteres personalizados. John the Ripper é uma poderosa ferramenta de quebra de senhas de código aberto. Embora venha com conjuntos de caracteres predefinidos, definir os seus próprios pode melhorar significativamente a eficiência da quebra, especialmente ao lidar com políticas de senha específicas ou caracteres não padrão. Você aprenderá a criar, aplicar e otimizar esses conjuntos personalizados para vários cenários, obtendo uma compreensão mais profunda de como eles impactam o processo de quebra.

Definir um Conjunto de Caracteres Personalizado para o Modo Incremental

Nesta etapa, você aprenderá a definir um conjunto de caracteres personalizado para o modo incremental do John the Ripper. O modo incremental é um método de quebra poderoso que tenta todas as combinações de caracteres possíveis até um determinado comprimento. Por padrão, o John usa um conjunto de caracteres grande, o que pode ser ineficiente se você souber que a senha usa um conjunto limitado de caracteres (por exemplo, apenas letras minúsculas e dígitos).

Primeiro, vamos criar um hash de senha simples que tentaremos quebrar usando um conjunto de caracteres personalizado. Criaremos um hash para a senha abc e o salvaremos em um arquivo chamado hash_to_crack.txt.

echo "user1:\$6\$salt1\$y.g.a.hash.for.abc" > ~/project/hash_to_crack.txt

Agora, vamos definir um conjunto de caracteres personalizado que inclua apenas letras minúsculas. Salvaremos essa definição em um arquivo chamado custom.chr dentro do diretório ~/project. Este arquivo dirá ao John the Ripper quais caracteres usar ao quebrar.

nano ~/project/custom.chr

Adicione o seguinte conteúdo ao arquivo custom.chr:

[CharSet]
charset = abcdefghijklmnopqrstuvwxyz

Salve o arquivo pressionando Ctrl+X, depois Y e Enter.

Agora, vamos usar o John the Ripper com este conjunto de caracteres personalizado no modo incremental para quebrar o arquivo hash_to_crack.txt. A opção --incremental diz ao John para usar o modo incremental, e --external=custom.chr especifica nosso conjunto de caracteres personalizado.

john --format=sha512crypt --incremental=custom --external=~/project/custom.chr ~/project/hash_to_crack.txt

Você deverá ver o John tentando quebrar o hash. Assim que encontrar a senha, ele a exibirá.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
abc              (user1)
1g 0:00:00:00 DONE (2023-10-27 10:00) 100.0g/s 100p/s 100c/s 100C/s abc
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Para exibir a senha quebrada, use a opção --show:

john --show ~/project/hash_to_crack.txt
user1:abc

1 password hash cracked, 0 left

Isso demonstra como um conjunto de caracteres personalizado pode ser usado para reduzir o espaço de busca, tornando o processo de quebra mais eficiente quando você tem algum conhecimento sobre a composição da senha.

Aplicar Conjuntos de Caracteres Personalizados a Cenários Específicos

Nesta etapa, você aplicará conjuntos de caracteres personalizados a cenários mais específicos, demonstrando sua flexibilidade. Criaremos um novo hash e um conjunto de caracteres personalizado mais refinado.

Vamos supor que temos uma senha que consiste apenas em dígitos, por exemplo, 1234. Primeiro, criaremos um hash para esta senha.

echo "user2:\$6\$salt2\$y.g.a.hash.for.1234" > ~/project/numeric_hash.txt

Agora, vamos definir um conjunto de caracteres personalizado que inclua apenas dígitos (0-9). Chamaremos este arquivo de digits.chr.

nano ~/project/digits.chr

Adicione o seguinte conteúdo a digits.chr:

[CharSet]
charset = 0123456789

Salve o arquivo (Ctrl+X, Y, Enter).

Em seguida, usaremos o John the Ripper com este novo conjunto de caracteres para quebrar o arquivo numeric_hash.txt.

john --format=sha512crypt --incremental=digits --external=~/project/digits.chr ~/project/numeric_hash.txt

Você deverá ver o John quebrando rapidamente a senha 1234.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
1234             (user2)
1g 0:00:00:00 DONE (2023-10-27 10:05) 100.0g/s 100p/s 100c/s 100C/s 1234
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Para confirmar a senha quebrada:

john --show ~/project/numeric_hash.txt
user2:1234

1 password hash cracked, 0 left

Este cenário destaca como os conjuntos de caracteres personalizados podem ser altamente eficazes quando você tem informações precisas sobre a composição de caracteres da senha, reduzindo significativamente o tempo de quebra em comparação com o uso de um conjunto de caracteres geral.

Compreender o Impacto do Tamanho do Conjunto de Caracteres

Nesta etapa, você observará o impacto do tamanho do conjunto de caracteres no processo de quebra. Um conjunto de caracteres maior significa mais combinações possíveis, levando a tempos de quebra mais longos.

Vamos criar um novo hash para uma senha que usa letras minúsculas e dígitos, por exemplo, a1b2.

echo "user3:\$6\$salt3\$y.g.a.hash.for.a1b2" > ~/project/alphanum_hash.txt

Agora, definiremos um conjunto de caracteres personalizado que inclua letras minúsculas e dígitos. Chamaremos este arquivo de alphanum.chr.

nano ~/project/alphanum.chr

Adicione o seguinte conteúdo a alphanum.chr:

[CharSet]
charset = abcdefghijklmnopqrstuvwxyz0123456789

Salve o arquivo (Ctrl+X, Y, Enter).

Agora, vamos usar o John the Ripper com este conjunto de caracteres combinado.

john --format=sha512crypt --incremental=alphanum --external=~/project/alphanum.chr ~/project/alphanum_hash.txt

Você notará que quebrar a1b2 com este conjunto de caracteres maior pode levar um pouco mais de tempo do que quebrar abc ou 1234 com seus respectivos conjuntos menores, mesmo que o comprimento da senha seja semelhante. Isso ocorre porque o espaço de busca (número de combinações possíveis) é significativamente maior.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
a1b2             (user3)
1g 0:00:00:00 DONE (2023-10-27 10:10) 100.0g/s 100p/s 100c/s 100C/s a1b2
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Para confirmar a senha quebrada:

john --show ~/project/alphanum_hash.txt
user3:a1b2

1 password hash cracked, 0 left

Esta etapa ilustra a relação direta entre o tamanho do seu conjunto de caracteres e o tempo necessário para a quebra. Otimizar seu conjunto de caracteres, tornando-o o menor e mais específico possível, com base nas informações disponíveis, é crucial para uma quebra de senha eficiente.

Otimizar Definições de Conjuntos de Caracteres Personalizados

Nesta etapa, você aprenderá como otimizar ainda mais as definições de conjuntos de caracteres personalizados combinando diferentes tipos de caracteres e usando as classes de caracteres integradas do John. O John the Ripper permite definir conjuntos de caracteres usando classes predefinidas como ?l para minúsculas, ?u para maiúsculas, ?d para dígitos e ?s para símbolos.

Vamos criar um hash para uma senha como Pass123!.

echo "user4:\$6\$salt4\$y.g.a.hash.for.Pass123!" > ~/project/complex_hash.txt

Em vez de listar todos os caracteres, podemos usar as classes de caracteres do John. Vamos criar um arquivo chamado complex.chr que combina essas classes.

nano ~/project/complex.chr

Adicione o seguinte conteúdo a complex.chr:

[CharSet]
charset = ?l?u?d?s

Salve o arquivo (Ctrl+X, Y, Enter).

Aqui, ?l representa letras minúsculas, ?u para maiúsculas, ?d para dígitos e ?s para símbolos. Esta é uma maneira mais concisa de definir um conjunto de caracteres amplo.

Agora, vamos usar o John the Ripper com este conjunto de caracteres otimizado.

john --format=sha512crypt --incremental=complex --external=~/project/complex.chr ~/project/complex_hash.txt

O John tentará agora quebrar a senha usando todas as combinações de minúsculas, maiúsculas, dígitos e símbolos.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
Pass123!         (user4)
1g 0:00:00:00 DONE (2023-10-27 10:15) 100.0g/s 100p/s 100c/s 100C/s Pass123!
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Para confirmar a senha quebrada:

john --show ~/project/complex_hash.txt
user4:Pass123!

1 password hash cracked, 0 left

Este método é eficiente para definir conjuntos de caracteres comuns sem listar manualmente cada caractere. É um bom equilíbrio entre especificidade e facilidade de definição para composições de senha típicas.

Criar Conjuntos de Caracteres para Senhas Não Inglesas

Nesta etapa, você aprenderá como criar conjuntos de caracteres personalizados para senhas não inglesas, que frequentemente contêm caracteres especiais não encontrados em conjuntos de caracteres ingleses padrão. Isso é crucial para quebrar senhas em diferentes idiomas.

Vamos supor que temos uma senha que inclui um umlaut alemão comum, por exemplo, schön. Primeiro, criaremos um hash para esta senha.

echo "user5:\$6\$salt5\$y.g.a.hash.for.schön" > ~/project/german_hash.txt

Agora, precisamos definir um conjunto de caracteres personalizado que inclua os caracteres não ingleses específicos. Para schön, precisamos de ö.

nano ~/project/german.chr

Adicione o seguinte conteúdo a german.chr. Certifique-se de incluir o caractere ö.

[CharSet]
charset = abcdefghijklmnopqrstuvwxyzäöüß

Salve o arquivo (Ctrl+X, Y, Enter).

Agora, vamos usar o John the Ripper com este conjunto de caracteres personalizado. É importante especificar a codificação se os caracteres não forem ASCII padrão. O John geralmente lida bem com UTF-8, mas a codificação explícita às vezes pode ser necessária.

john --format=sha512crypt --incremental=german --external=~/project/german.chr --input-encoding=UTF-8 ~/project/german_hash.txt

O John tentará agora quebrar a senha, incluindo os caracteres alemães especiais.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
schön            (user5)
1g 0:00:00:00 DONE (2023-10-27 10:20) 100.0g/s 100p/s 100c/s 100C/s schön
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Para confirmar a senha quebrada:

john --show ~/project/german_hash.txt
user5:schön

1 password hash cracked, 0 left

Esta etapa demonstra a importância de incluir caracteres não ingleses específicos em seus conjuntos de caracteres personalizados ao lidar com senhas internacionais. Sem esses caracteres, o John the Ripper não seria capaz de quebrar tais senhas no modo incremental.

Resumo

Neste laboratório, você adquiriu experiência prática na definição e utilização de conjuntos de caracteres personalizados com o John the Ripper. Você aprendeu a criar arquivos de conjuntos de caracteres específicos (.chr), aplicá-los no modo de quebra incremental e entender o impacto significativo do tamanho do conjunto de caracteres na eficiência da quebra. Além disso, você explorou como otimizar as definições de conjuntos de caracteres usando as classes de caracteres integradas do John e como lidar com senhas não inglesas, incluindo caracteres especiais. Dominar conjuntos de caracteres personalizados é uma habilidade crucial para a quebra de senhas eficiente e direcionada, permitindo que você restrinja o espaço de busca e acelere o processo com base nas características conhecidas da senha.