
В 2012 году из LinkedIn утекли 164 миллиона хешей паролей — SHA-1 без соли. Пароли из этой утечки потом массово восстанавливались через John the Ripper и hashcat. Но если при работе с реальными дампами на восстановление уходят дни вычислений, то в CTF задача другая: определить формат хеша, подставить правильный --format и подобрать пароль за минуты, пока тикает таймер соревнования. Именно на этом цикле — от определения хеша до получения пароля — сыпется большинство новичков. Не потому что John сложный, а потому что его неправильно кормят данными.
Эта статья — пошаговый разбор взлома хешей John the Ripper для тех, кто решает CTF-таски и готовится к сертификационным экзаменам. Без абстрактной криптографии — только терминал, команды и типичные грабли.
Прежде чем запускать взлом хешей John the Ripper, нужно понять, что именно лежит в файле. Автоматическое определение формата в John работает, но далеко не всегда корректно. На CTF я видел ситуации, когда John определял sha512crypt как общий crypt — и молча жевал перебор не тем алгоритмом. Один неправильный --format — полчаса на ветер.
Утилита hashid — основной инструмент для определения типа хеша. Ставится через pip3 install hashid и принимает хеш-строку напрямую. Строка 5f4dcc3b5aa765d61d8327deb882cf99 — 32 hex-символа, и hashid предложит: [+] MD2, [+] MD5, [+] MD4. По данным Redfox Security, вывод ранжирован по вероятности, но без контекста hashid не отличит MD5 от NTLM — обе строки одинаковой длины.
Второй вариант — hash-identifier, предустановлен в Kali. Интерактивный режим: запускаете, вставляете хеш, получаете список возможных форматов. Для скриптинга менее удобен, но иногда точнее ранжирует варианты.
Главное: ни hashid, ни hash-identifier не видят контекст. Строка из 32 hex-символов может оказаться Raw-MD5, MD4 или NTLM. Разница — в источнике хеша. Если дамп из SAM на Windows-системе (техника OS Credential Dumping: Security Account Manager, T1003.002 по MITRE ATT&CK) — это NTLM. Если из веб-приложения на PHP — скорее всего MD5. Контекст задачи — первый подсказчик.
Опытный CTF-игрок определяет формат до запуска утилит — по характерным маркерам:
$1$ — md5crypt (FreeBSD MD5)$5$ — sha256crypt$6$ — sha512crypt (стандарт современных Linux-систем, связан с техникой /etc/passwd and /etc/shadow, T1003.008)$2a$ или $2b$ — bcryptДля проверки через John: john --list=formats | grep -i 'md5' покажет все форматы с "md5" в названии. Jumbo-версия поддерживает более 200 форматов — от Raw-MD5 до Django, WordPress (phpass) и Kerberos TGT. Если не уверены — john --list=formats и grep по ключевому слову. Стандартный приём.
Отдельный случай — вложенные кодировки. В CTF-тасках часто встречается base64 поверх hex поверх MD5 (такая матрёшка). Если хеш выглядит как base64-строка, раскодируйте первый слой через echo "строка" | base64 -d | xxd и оценивайте результат. Иногда нужно размотать 2-3 слоя вручную, прежде чем доберётесь до реального хеша.
John the Ripper для начинающих обычно сводится к одной команде: john hashes.txt. Но за этой простотой — три принципиально разных режима, и выбор между ними определяет, найдёте вы пароль за секунды или будете ждать до конца CTF.
Режим --single — первое, что стоит пробовать. John берёт имя пользователя из файла (формат username:hash) и мутирует его: добавляет цифры, меняет регистр, дублирует символы, переставляет местами. Если пользователь admin, John проверит Admin, admin1, admin123, ADMIN, admin! и сотни других вариаций.
Запуск: john --single --format=raw-md5 hashes.txt. В CTF этот режим неожиданно эффективен — создатели тасков нередко делают пароль производным от username или названия задачи. Проверка занимает секунды и ничего не стоит. Грех не попробовать.
Wordlist-атака на пароли — основной режим для практической работы. John берёт каждое слово из словаря, хеширует указанным алгоритмом и сравнивает с целевым хешем.
Стандартный запуск: john --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 hashes.txt. Словарь rockyou.txt — 14 миллионов паролей из реальной утечки — отправная точка в любом сценарии. В Kali он лежит в /usr/share/wordlists/rockyou.txt.gz и требует распаковки через gunzip.
Критический флаг — --rules. Без него John проверяет слова как есть. С --rules применяет мутации: password превращается в Password, password1, p@ssword, PASSWORD123!. Правила настраиваются в john.conf, и встроенный набор уже покрывает распространённые паттерны — замены символов, добавление цифр, смена регистра.
Если rockyou не помогает — подключайте кастомные словари. На CTF я собираю wordlist из описания задачи, имён файлов, метаданных и комментариев в коде. Часто словарь из 50 слов с правильными rules ломает хеш быстрее, чем 14 миллионов строк rockyou. Серьёзно.
Режим --incremental — классический brute force. John перебирает все комбинации символов, начиная с коротких. Команда john --incremental hashes.txt запустит полный перебор. Для ограничения набора: --incremental=Digits (только цифры), --incremental=Alpha (только буквы), --incremental=Alnum (буквы и цифры).
На CPU этот режим бесполезен для паролей длиннее 7-8 символов — пространство перебора растёт экспоненциально. Для длинных паролей целесообразнее переключаться на hashcat с GPU-ускорением. Но для коротких PIN-кодов и числовых паролей incremental mode в John справляется быстро — тут ему хватает.
Разберём типовые сценарии, которые встречаются и на CTF, и при реальной работе.
Классическая задача — получены файлы /etc/passwd и /etc/shadow (получение этих файлов классифицируется как техника T1003.008 по MITRE ATT&CK). Порядок действий:
Первый шаг — объединить файлы утилитой unshadow: unshadow passwd.txt shadow.txt > combined.txt. Второй — запустить John с wordlist: john --wordlist=/usr/share/wordlists/rockyou.txt combined.txt. Третий — посмотреть результаты: john --show combined.txt.
Типичная ошибка — забыть про unshadow и скормить John чистый /etc/shadow. John может принять файл, но не всегда корректно свяжет хеш с пользователем. unshadow создаёт формат, который John ожидает — строки, где данные из passwd и shadow объединены в единую запись. Пропустите этот шаг — потеряете время на отладке, а не на взломе.
При работе с Windows-инфраструктурой NTLM-хеши извлекаются из Security Account Manager (T1003.002). Формат дампа: administrator:500:aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c:::. Восстановление паролей из хешей в формате NTLM:
john --format=nt --wordlist=/usr/share/wordlists/rockyou.txt ntlm_hashes.txt
Флаг --format=nt обязателен. Без него John может определить формат как LM или generic crypt. Для Net-NTLMv2 (перехваченные через Responder challenge-response) формат другой: --format=netntlmv2. Путаница между NT и Net-NTLMv2 — одна из самых частых ошибок на CTF и экзаменах. Это разные алгоритмы, разные форматы, разная скорость перебора.
Jumbo-версия John поставляется с десятками утилит для извлечения хешей: zip2john, rar2john, pdf2john, ssh2john, keepass2john и другие. Воркфлоу стандартный: сначала извлечь хеш (zip2john protected.zip > zip_hash.txt), затем подобрать пароль (john --wordlist=/usr/share/wordlists/rockyou.txt zip_hash.txt), наконец посмотреть результат (john --show zip_hash.txt).
В CTF утилиты *2john — рабочая лошадка. Задачи с защищёнными архивами, SSH-ключами с парольной фразой и KeePass-базами встречаются постоянно. Полный список конвертеров: find / -name "*2john*" 2>/dev/null в Kali или директория /usr/share/john/.
Стандартные правила --rules покрывают типичные мутации, но для CTF и целевых задач часто нужны специфические преобразования. Правила задаются в файле john.conf в секциях [List.Rules:RuleName].
Синтаксис правил: A — append (добавить), z — к концу строки, c — capitalize (заглавная первая буква), l — lowercase (всё в нижний регистр), r — reverse (развернуть строку), d — duplicate (дублировать слово). Пример кастомного набора:
[List.Rules:CTFAppend]
Az"[0-9][0-9]"
Az"!"
Az"2024"
Az"2025"
cAz"[0-9]"
Этот набор берёт каждое слово из словаря и генерирует варианты: word01–word99, word!, word2024, word2025, Word0–Word9. Запуск: john --wordlist=custom.txt --rules=CTFAppend --format=raw-md5 hashes.txt. Jumbo-версия поставляется с набором правил --rules=Jumbo, который покрывает тысячи комбинаций мутаций.
На CTF я создаю правила под конкретный таск. Если в описании упоминается год — добавляю суффиксы 2024, 2025. Если хинт указывает на leet-speak — пишу правила подстановки: sa@ (replace a→@), se3 (replace e→3), so0 (replace o→0). Три строки в john.conf — и словарь из 100 слов превращается в десятки тысяч кандидатов. Вот где магия, а не в размере словаря.
Вопрос «John the Ripper vs Hashcat» — один из самых частых при сравнении инструментов для подбора паролей. Короткий ответ: они дополняют друг друга, а не конкурируют.
| Критерий | John the Ripper | Hashcat |
|---|---|---|
| Вычислительная база | CPU (основной), частичная GPU | GPU (основной), CPU как fallback |
| Автодетект формата | Да, встроенный | Нет, формат через -m вручную |
| Утилиты извлечения | Десятки *2john конвертеров | Нет, нужны сторонние скрипты |
| Правила мутации | Свой синтаксис, гибкий движок | Свой синтаксис, частично совместим |
| Восстановление сессии | --restore | --restore |
| Скорость на GPU | Ниже | Значительно выше |
| Удобство для CTF | Выше (автодетект, *2john) | Ниже для быстрых тасков |
На крупных дампах эти два инструмента часто используют в связке — вместе они покрывают больше, чем каждый по отдельности.
Мой подход: запускаю John с wordlist и rules для быстрой проверки (автодетект экономит время). Если не помогло — переключаюсь на hashcat с GPU для масочных атак и длительного incremental. На CTF John выигрывает за счёт скорости старта: не нужно вручную указывать -m, не нужны сторонние скрипты для извлечения хешей из архивов. Запустил — и он уже работает.
John the Ripper CTF-сценарии имеют свою специфику. Вот что реально работает.
Все взломанные пароли John сохраняет в ~/.john/john.pot. При повторном запуске с тем же хешем вы увидите «No password hashes left to crack» — это не ошибка, John просто помнит, что уже ломал этот хеш. Чтобы перезапустить: удалите строку из john.pot или укажите альтернативный файл через --pot=newpot.txt.
Для просмотра всех найденных паролей: john --show hashes.txt. Для конкретного формата: john --show --format=raw-md5 hashes.txt.
При нажатии Ctrl+C John сохраняет состояние в john.rec. Продолжить прерванную сессию — john --restore. Состояние автоматически сохраняется каждые 10 минут. Для параллельной работы с несколькими хешами используйте именованные сессии: john --session=task1 hashes.txt, затем john --restore=task1. На CTF с несколькими тасками параллельно — незаменимая штука.
Типичный CTF-таск: строка выглядит как base64. Декодируете — hex. Переводите hex в байты — MD5-хеш. Рабочий подход: echo "строка" | base64 -d для каждого слоя, затем определяете финальный хеш по длине. Два-три слоя кодировок — норма для категорий crypto и forensics.
Если в задаче фигурирует HMAC (например, HMAC-SHA256), John поддерживает этот формат. Но для HMAC нужен ключ — если ключ известен, он передаётся в файле хеша в специальном формате. Если ключ и есть искомый пароль — John подберёт его через wordlist-атаку.
Самый мощный приём на CTF — составить словарь из самого задания. Имя автора, название таска, текст описания, имена файлов, комментарии в коде — всё идёт в кастомный wordlist. Утилита cewl для парсинга веб-страниц или ручной сбор через grep и awk — часто словарь из 50 слов с правильными rules даёт результат быстрее, чем 14 миллионов строк rockyou. Я на нескольких CTF решал таски именно так — rockyou молчит, а три слова из описания с суффиксом 2024! дают пароль за секунду.
hashid или hash-identifier--single (если есть username — за секунды)--rulesКаждый следующий шаг дороже предыдущего по времени. В подавляющем большинстве CTF-тасков пароль находится на шагах 3-5. Incremental mode нужен редко — обычно проблема не в вычислительной мощности, а в правильном словаре.
Три грабли, на которые стабильно наступают даже не новички.
Неправильный --format. Если видите предупреждение detected hash type "X", but the string is also recognized as "Y" — явно укажите формат. Пример: Use the "--format=crypt" option to force loading these as that type instead. На CTF неправильный формат — самая частая причина «невзламываемого» хеша. Хеш не виноват, виноват тот, кто его кормит.
Кодировка файла. Если файл с хешами создан в Windows или скопирован из веб-формы, могут остаться невидимые символы: BOM, \r\n вместо \n, пробелы в конце строки. Проверяйте через xxd hashes.txt | head и чистите через dos2unix или tr -d '\r'. На одном CTF я потерял 40 минут из-за невидимого пробела после хеша — John загружал 0 из 1 хеша и молча завершался. Обидно до скрежета зубов.
Гигантский словарь без правил. Словарь на 100 ГБ без rules менее эффективен, чем rockyou с агрессивными мутациями. С --rules=Jumbo одно слово генерирует сотни вариаций — это покрывает больше пространства реальных паролей, чем линейный перебор огромного файла. Качество подготовки словарей и правил определяет успех восстановления паролей из хешей — не размер файла и не частота процессора.
Большинство руководств по John the Ripper заканчиваются на john --wordlist=rockyou.txt hashes.txt и считают задачу выполненной. На практике эта команда — только начало. Реальная эффективность Password Cracking (T1110.002 по MITRE ATT&CK) определяется тем, что происходит до запуска: насколько точно определён формат, насколько релевантен словарь, насколько продуманы правила мутации. За три года CTF-соревнований я не припомню случая, чтобы голый rockyou без rules решил нетривиальную задачу. Brute force атака на хеши — это не про вычислительную мощность, а про понимание, как люди придумывают пароли. Пока incremental mode перебирает aaa, aab, aac, атакующий с правильным словарём и тремя строками в john.conf уже нашёл Company2025!. Интуиция, что подставить в wordlist и какие мутации включить — навык, который нарабатывается только через повторение разных сценариев. На WAPT эту механику разбирают в лабах с прогрессией от простых хешей до полноценных цепочек credential access — с обратной связью от ментора, когда застрял.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «cryptography».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...