Определение хешей, сгенерированных KDFs
На этом этапе вы научитесь определять формат хешей, сгенерированных различными KDFs. Хотя необработанный вывод KDF может представлять собой двоичную строку, при хранении в системах они часто кодируются (например, Base64 или шестнадцатеричным кодом) и предваряются идентификаторами, указывающими используемый KDF, соль, а иногда и количество итераций или фактор стоимости. Этот стандартизированный формат позволяет таким инструментам, как John the Ripper, правильно распознавать и обрабатывать их.
Рассмотрим распространенные форматы хешей для PBKDF2, bcrypt и scrypt.
PBKDF2:
Хеши PBKDF2 часто имеют формат, включающий алгоритм, количество итераций, соль и выведенный ключ. Например, в файлах /etc/shadow в Linux хеши PBKDF2 (в частности, SHA512) могут выглядеть следующим образом:
$6$rounds=5000$<salt>$<hash>
Здесь $6$ указывает на SHA-512, rounds= задает количество итераций, за которыми следуют соль и сам хеш.
bcrypt:
Хеши bcrypt легко узнаваемы по префиксу $2a$, $2b$ или $2y$, за которым следует фактор стоимости (например, 10), соль и хеш.
Пример: $2a$10$<salt><hash>
scrypt:
Хеши scrypt обычно начинаются с $7$ или $scrypt$, за которыми следуют параметры, такие как ln, r, p (логарифмическая стоимость, размер блока и фактор параллелизма), соль и хеш.
Пример: $7$<ln>$<r>$<p>$<salt><hash>
Для демонстрации давайте создадим файл, содержащий несколько примеров хешей KDF. Мы будем использовать инструмент под названием mkpasswd (который является частью пакета whois) для генерации хеша bcrypt, а затем вручную составим хеш PBKDF2 для демонстрации.
Сначала установите пакет whois, чтобы получить mkpasswd:
sudo apt install -y whois
Теперь сгенерируем хеш bcrypt для пароля "password123" с фактором стоимости 10.
mkpasswd -m bcrypt -S $(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16) -s 10 password123
Эта команда генерирует хеш bcrypt. Опция -S предоставляет случайную соль, а -s 10 устанавливает фактор стоимости равным 10. Вывод будет представлять собой строку хеша bcrypt.
$2a$10$<random_salt_string><hash_string>
Теперь создадим файл с именем kdf_hashes.txt, который сможет прочитать John the Ripper. Мы включим хеш bcrypt и вручную созданный хеш PBKDF2.
nano kdf_hashes.txt
Добавьте следующее содержимое в файл. Замените <YOUR_GENERATED_BCRYPT_HASH> фактическим хешем bcrypt, который вы сгенерировали на предыдущем шаге.
user1:$2a$10$<YOUR_GENERATED_BCRYPT_HASH>
user2:$pbkdf2-sha256$100000$c0ffee$a1b2c3d4e5f678901234567890abcdef1234567890abcdef1234567890abcdef
Примечание: Хеш PBKDF2 для user2 является заполнитель для демонстрационных целей. Это не реальный хеш известного пароля, но он соответствует формату, который John the Ripper ожидает для PBKDF2-SHA256. Формат: $pbkdf2-sha256$<iterations>$<salt_hex>$<hash_hex>.
Сохраните файл, нажав Ctrl+X, затем Y, затем Enter.
Теперь используем John the Ripper для идентификации типов хешей в kdf_hashes.txt:
john --format=raw-md5 --show kdf_hashes.txt
Примечание: Мы используем --format=raw-md5 как фиктивный формат, потому что John требует указания формата для --show, даже если это просто идентификация. John автоматически определит фактические форматы KDF.
Вывод покажет, как John идентифицирует типы хешей:
0 password hashes cracked, 2 left
John правильно определяет, что есть два хеша, и распознает их типы KDF при попытке их взлома. Этот шаг в основном фокусируется на распознавании форматов хешей.