Identificar Hashes Gerados por KDFs
Nesta etapa, você aprenderá a identificar o formato dos hashes gerados por diferentes KDFs. Embora a saída bruta de uma KDF possa ser uma string binária, quando armazenados em sistemas, eles são frequentemente codificados (por exemplo, Base64 ou hexadecimal) e prefixados com identificadores que indicam a KDF usada, o salt e, às vezes, a contagem de iterações ou o fator de custo. Este formato padronizado permite que ferramentas como o John the Ripper as reconheçam e processem corretamente.
Vamos analisar os formatos comuns de hash para PBKDF2, bcrypt e scrypt.
PBKDF2:
Os hashes PBKDF2 geralmente aparecem em um formato que inclui o algoritmo, iterações, salt e a chave derivada. Por exemplo, em arquivos /etc/shadow no Linux, os hashes PBKDF2 (especificamente SHA512) podem parecer assim:
$6$rounds=5000$<salt>$<hash>
Aqui, $6$ indica SHA-512, rounds= especifica as iterações, seguido pelo salt e pelo hash real.
bcrypt:
Os hashes bcrypt são facilmente reconhecíveis por seu prefixo $2a$, $2b$ ou $2y$, seguido pelo fator de custo (por exemplo, 10), o salt e o hash.
Exemplo: $2a$10$<salt><hash>
scrypt:
Os hashes scrypt geralmente começam com $7$ ou $scrypt$, seguidos por parâmetros como ln, r, p (custo logarítmico, tamanho do bloco e fator de paralelização), o salt e o hash.
Exemplo: $7$<ln>$<r>$<p>$<salt><hash>
Para demonstrar, vamos criar um arquivo contendo alguns hashes de KDF de exemplo. Usaremos uma ferramenta chamada mkpasswd (que faz parte do pacote whois) para gerar um hash bcrypt e, em seguida, construiremos manualmente um hash PBKDF2 para demonstração.
Primeiro, instale o pacote whois para obter o mkpasswd:
sudo apt install -y whois
Agora, vamos gerar um hash bcrypt para a senha "password123" com um fator de custo de 10.
mkpasswd -m bcrypt -S $(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16) -s 10 password123
Este comando gera um hash bcrypt. A opção -S fornece um salt aleatório, e -s 10 define o fator de custo para 10. A saída será uma string de hash bcrypt.
$2a$10$<random_salt_string><hash_string>
Agora, vamos criar um arquivo chamado kdf_hashes.txt que o John the Ripper possa ler. Incluiremos um hash bcrypt e um hash PBKDF2 criado manualmente.
nano kdf_hashes.txt
Adicione o seguinte conteúdo ao arquivo. Substitua <YOUR_GENERATED_BCRYPT_HASH> pelo hash bcrypt real que você gerou na etapa anterior.
user1:$2a$10$<YOUR_GENERATED_BCRYPT_HASH>
user2:$pbkdf2-sha256$100000$c0ffee$a1b2c3d4e5f678901234567890abcdef1234567890abcdef1234567890abcdef
Nota: O hash PBKDF2 para user2 é um placeholder para fins de demonstração. Não é um hash real de uma senha conhecida, mas segue o formato que o John the Ripper espera para PBKDF2-SHA256. O formato é $pbkdf2-sha256$<iterations>$<salt_hex>$<hash_hex>.
Salve o arquivo pressionando Ctrl+X, depois Y, depois Enter.
Agora, vamos usar o John the Ripper para identificar os tipos de hash em kdf_hashes.txt:
john --format=raw-md5 --show kdf_hashes.txt
Nota: Usamos --format=raw-md5 como um formato fictício porque o John requer um formato especificado para --show, mesmo que seja apenas para identificação. O John detectará automaticamente os formatos KDF reais.
A saída mostrará o John identificando os tipos de hash:
0 password hashes cracked, 2 left
O John identifica corretamente que existem dois hashes e reconhecerá seus tipos KDF quando tentar quebrá-los. Esta etapa se concentra principalmente no reconhecimento dos formatos de hash.