
На последнем джеопарди-CTF я потратил 40 минут на таск категории crypto — не потому что хеш был сложным, а потому что скормил hashcat неверный режим. Хеш выглядел как 32 символа hex, я на автомате вбил -m 0 (raw-MD5), а это оказался NTLM. Флаг ушёл команде, которая начала с hashid. Обидно? Ещё как. Но урок на всю жизнь.
По данным Verizon DBIR 2025, 38% подтверждённых утечек связаны с кражей учётных данных, а IBM X-Force фиксирует рост таких атак на 71% за год. Задания на подбор пароля по хешу встречаются практически в каждом CTF — и неспроста. Ниже — полный workflow: от распознавания хеша до получения флага, с конкретными командами John the Ripper и Hashcat, разбором типичных граблей и выбором инструмента под задачу.
Прежде чем запускать взлом хешей John the Ripper и Hashcat, нужно точно определить алгоритм. Неверный формат — это не просто потраченное время. Hashcat молча прокрутит весь словарь, не найдёт совпадений и выведет «Exhausted». А вы даже не поймёте, что ошибка была на старте. Знаю по себе. Подробнее — в нашем руководстве по создание ctf заданий.
hashid — основной инструмент определения типа хеша в CTF-инвентаре. Установка: pip3 install hashid. Запуск: hashid '<хеш>'. На выходе — список вероятных форматов с указанием режима hashcat (-m) и формата John (--format).
hash-identifier (в свежих Kali может отсутствовать, ставится через apt install hash-identifier) делает то же самое, но без привязки к конкретным флагам. Есть ещё name-that-hash — более свежая альтернатива. Для CTF я выбираю hashid: он экономит шаг поиска нужного -m.
Типичный вывод hashid для строки 5f4dcc3b5aa765d61d8327deb882cf99:
Analyzing '5f4dcc3b5aa765d61d8327deb882cf99'
[+] MD2 [Hashcat Mode: N/A]
[+] MD5 [Hashcat Mode: 0][JtR Format: raw-md5]
[+] MD4 [Hashcat Mode: 900][JtR Format: raw-md4]
[+] NTLM [Hashcat Mode: 1000][JtR Format: nt]
Видите проблему? MD5 и NTLM — оба 32 hex-символа. hashid не может различить их однозначно, он предлагает варианты. Дальше работает контекст задания.
Что проверять при ручном определении типа хеша:
| Признак | Алгоритм | Hashcat -m | JtR --format |
|---|---|---|---|
| 32 hex, без обвязки | MD5 или NTLM | 0 / 1000 | raw-md5 / nt |
| 40 hex | SHA-1 | 100 | raw-sha1 |
| 64 hex | SHA-256 | 1400 | raw-sha256 |
| 128 hex | SHA-512 | 1700 | raw-sha512 |
| $1$salt$hash | md5crypt | 500 | md5crypt |
| $5$salt$hash | sha256crypt | 7400 | sha256crypt |
| $6$salt$hash | sha512crypt | 1800 | sha512crypt |
| $2a$ или $2b$ | bcrypt | 3200 | bcrypt |
Контекст решает. Хеш из /etc/shadow на Linux (T1003.008 — /etc/passwd and /etc/shadow, саб-техника T1003 OS Credential Dumping по MITRE ATT&CK) — практически всегда sha512crypt с префиксом $6$. Хеш из SAM-базы Windows (T1003.002 — Security Account Manager) — NTLM. Тикет Kerberoasting (T1558.003) — Kerberos 5 etype 23, hashcat -m 13100.
Частая ловушка CTF — путать raw-MD5 (-m 0, миллиарды хешей/сек на GPU) с md5crypt (-m 500, сотни тысяч хешей/сек). Разница в скорости — четыре порядка. На одном таске это стоило мне полчаса.
John the Ripper умеет определять формат автоматически: запускаете john hashes.txt без --format, и он попытается подобрать тип сам. Для стандартных unix-хешей ($6$, $2b$) работает безошибочно. Для raw-хешей без обвязки — лотерея.
John the Ripper (JtR) создан Solar Designer из проекта Openwall. Jumbo-версия поддерживает более 400 форматов хешей. Проверить наличие и версию: john --version. В Kali и Parrot он предустановлен, но для доступа ко всем форматам стоит собрать jumbo из исходников: git clone https://github.com/openwall/john -b bleeding-jumbo john-jumbo, затем cd john-jumbo/src && ./configure && make -sj4.
Режим --single использует имя пользователя и метаданные из файла хешей для генерации кандидатов паролей. Если в задании дан хеш в формате admin:$6$salt$hash, John возьмёт «admin» и прогонит через правила mangling — добавит цифры, развернёт регистр, подставит типичные суффиксы (admin1, Admin123, nimda).
Нюанс, на котором спотыкаются новички: для работы Single Crack Mode файл должен быть именно в формате username:hash. Без имени пользователя режим не сгенерирует кандидатов — и будет тупо бесполезен.
Запуск: john --single --format=sha512crypt hashes.txt. Это самый быстрый режим. На CTF стоит начинать с него.
Классика подбора пароля по хешу. Rockyou wordlist — 14+ миллионов реальных паролей из утечки RockYou 2009 года. В Kali файл лежит в /usr/share/wordlists/rockyou.txt.gz. Перед первым использованием распаковать: gunzip /usr/share/wordlists/rockyou.txt.gz. Запуск словарной атаки: john --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 hashes.txt.
На практике словарная атака на SHA-512 хеш с паролем из rockyou занимает доли секунды — это по сути lookup, а не перебор. Если пароль есть в словаре, он найдётся мгновенно.
Результат смотрим через john --show hashes.txt. John хранит найденные пароли в ~/.john/john.pot — при повторном запуске на тот же хеш скажет «No password hashes left to crack». Очистка: rm ~/.john/john.pot.
Полный перебор: john --incremental hashes.txt. Ограничение набора символов: --incremental=Digits (только цифры — отлично для PIN-кодов), --incremental=Alpha (буквы), --incremental=Alnum (буквы + цифры). Для CTF это работает на паролях до 6-7 символов. На чём-то длиннее без GPU переключайтесь на Hashcat — John в CPU-режиме уступает ему при длительном переборе.
Hashcat — зверь с нативной GPU-производительностью и поддержкой 450+ алгоритмов. Для работы с NVIDIA GPU нужен CUDA Toolkit, для AMD — ROCm (Linux) или AMD HIP SDK (Windows). На CPU hashcat тоже работает через OpenCL-рантайм от Intel (apt install intel-opencl-icd) или PoCL.
Базовая словарная атака на MD5: hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt. Разбор флагов: -m 0 — тип хеша (0 = raw-MD5, 1000 = NTLM, 1400 = raw-SHA256, 1700 = raw-SHA512, 3200 = bcrypt), -a 0 — режим атаки (straight/dictionary).
Главное преимущество hashcat — автоматическое распределение задач между несколькими GPU. John the Ripper тоже поддерживает GPU через OpenCL, но только для ограниченного подмножества форматов (OpenCL-варианты вроде raw-sha256-opencl) и требует ручной конфигурации. У hashcat проще: подключаете вторую карту — он её подхватит.
Если GPU нет (типичная ситуация на CTF с виртуалкой), hashcat может выдать ошибку. Флаг --force заставит его работать на CPU, но это костыль — правильнее поставить OpenCL-рантайм для процессора.
Hashcat поддерживает шесть режимов атаки через флаг -a:
| Режим | Флаг | Описание | Применение в CTF |
|---|---|---|---|
| Straight (Dictionary) | -a 0 | Словарная атака | Первый шаг на любом таске |
| Combination | -a 1 | Комбинация двух словарей | Пароли из двух слов |
| Brute Force/Mask | -a 3 | Перебор по маске | Короткие пароли, известная структура |
| Hybrid wordlist+mask | -a 6 | Словарь + маска справа | Пароли типа «password123» |
| Hybrid mask+wordlist | -a 7 | Маска + словарь слева | Пароли типа «2024admin» |
Rule-based атака — модификация словарных слов на лету. Hashcat поставляется с готовыми наборами правил в директории rules/: best64.rule (64 самых эффективных — начинайте с него), rockyou-30000.rule (правила из паттернов реальных утечек), d3ad0ne.rule (агрессивный набор). Запуск: hashcat -m 0 -a 0 hash.txt rockyou.txt -r rules/best64.rule. Правила трансформируют «password» в «Password», «PASSWORD», «p@ssword», «password1» и десятки других вариаций — без раздувания словаря.
Hashcat обрабатывает правила in-kernel: GPU вычисляет мутации внутри ядра, не перебрасывая данные на CPU. Это даёт заметный прирост скорости по сравнению с JtR, где rule engine работает иначе.
Маска — шаблон, описывающий структуру пароля. Вместо перебора всех возможных символов указываете, что на каждой позиции: буква, цифра или спецсимвол.
Символы маски в hashcat: ?l — строчная (a-z), ?u — прописная (A-Z), ?d — цифра (0-9), ?s — спецсимвол, ?a — любой печатный символ. Пароль из 4 цифр (PIN): hashcat -m 0 -a 3 hash.txt ?d?d?d?d. Пароль «заглавная + 4 строчных + 2 цифры»: hashcat -m 0 -a 3 hash.txt ?u?l?l?l?l?d?d.
На практике маска ?u?a?a?a?a вместо полного перебора ?a?a?a?a?a может сократить время подбора 5-символьного SHA-256 пароля в несколько раз — просто за счёт уменьшения пространства. Если из условия задания видна хотя бы часть структуры — маска критически экономит время.
Гибридные атаки комбинируют словарь и маску. Режим -a 6 (словарь + маска справа): hashcat -m 1700 -a 6 hash.txt rockyou.txt ?d?d?d — проверит каждое слово из rockyou с добавлением трёхзначного числа. Режим -a 7 (маска слева): hashcat -m 1700 -a 7 hash.txt ?d?d?d rockyou.txt. Покрывает типичные паттерны реальных паролей: люди берут словарное слово и лепят к нему цифры или год.
John the Ripper тоже поддерживает маски через --mask=?u?l?l?l?l?d?d, но без GPU-ускорения толку меньше.
Словарная атака на пароль — самый результативный метод на CTF. Качество словаря определяет результат.
Rockyou wordlist скачивать не нужно, если работаете в Kali — он уже в системе. Это первое, что пробуете на любом CTF-таске. В подавляющем большинстве соревнований начального и среднего уровня пароль найдётся именно здесь. По данным IBM X-Force 2025, в dark web ежедневно появляется более 6000 свежих учётных записей — словари растут постоянно.
Если rockyou не помог: SecLists (github.com/danielmiessler/SecLists) — крупнейшая коллекция словарей по категориям (passwords, usernames, fuzzing). CeWL — генератор целевых словарей из веб-сайтов: если в задании есть URL, стоит попробовать cewl <url> -w custom_wordlist.txt. Crackstation — словарь на 1.5 миллиарда записей для серьёзных задач за пределами типичного CTF.
John the Ripper хранит правила в конфигурационном файле john.conf. Готовые наборы вызываются через --rules=Jumbo или --rules=Single. Но настоящая сила JtR — в кастомных правилах. Вот пример, который добавляет типичные суффиксы к каждому слову:
[List.Rules:CTFAppend]
Az"[0-9]"
Az"[0-9][0-9]"
Az"!"
Az"123"
Az"2024"
cAz"1"
Здесь A — append, z — к концу слова, c — capitalize first letter. Добавляете этот блок в john.conf и вызываете: john --wordlist=rockyou.txt --rules=CTFAppend --format=raw-md5 hashes.txt.
Разработчики JtR неоднократно подчёркивали: оптимизация правил и устранение дубликатов кандидатов — ключевой фактор эффективного подбора. Генерировать миллионы дублей бесполезно: каждый хеш — это GPU-цикл, потраченный впустую.
Оба инструмента решают задачу Password Cracking (T1110.002, Credential Access по MITRE ATT&CK), но сильные стороны у них разные. На GPU hashcat вытягивает больше, на CPU разница минимальна — JtR местами даже быстрее.
| Критерий | John the Ripper (jumbo) | Hashcat |
|---|---|---|
| GPU-ускорение | Через OpenCL, только для части форматов | Нативное, для большинства режимов, автораспределение между GPU |
| Автоопределение хеша | Да, встроенное | Нет, требует явного -m |
| Число форматов | 400+ | 450+ |
| Rule engine | Внешний (john.conf) | In-kernel, быстрее на GPU |
| Извлечение хешей из файлов | Да (*2john утилиты) | Нет |
| Multi-GPU | Ручная конфигурация | Автоматическое разделение задач |
| Инсталляция | Сборка из исходников (рекомендуется) | Готовые бинарники |
| Сессии и восстановление | Да | Да, с более гибким управлением |
Практический вывод: начинайте с John (авто-определение формата, быстрый single crack, утилиты *2john), переключайтесь на Hashcat при наличии GPU или необходимости сложных масок. Многие CTF-игроки держат оба — JtR для быстрого первого прохода, Hashcat для тяжёлой артиллерии.
На CTF часто попадаются не голые хеши, а защищённые файлы — зашифрованные ZIP-архивы, PDF с паролем, SSH-ключи с passphrase, KeePass-базы. И вот тут John the Ripper незаменим.
Набор утилит *2john извлекает из файлов «псевдохеши» — данные, нужные для проверки кандидатов паролей. Стандартный workflow для ZIP-архива на CTF:
zip2john protected.zip > zip_hash.txt
john --wordlist=/usr/share/wordlists/rockyou.txt zip_hash.txt
john --show zip_hash.txt
Аналогично для других форматов: pdf2john protected.pdf > pdf_hash.txt для PDF с паролем, ssh2john id_rsa > ssh_hash.txt для приватного SSH-ключа с passphrase, keepass2john database.kdbx > keepass_hash.txt для KeePass. Полный зоопарк утилит в Kali: ls /usr/share/john/*.py — там десятки скриптов, от bitcoin2john до telegram2john.
После извлечения псевдохеша можно подбирать пароль и через hashcat, но нужно знать правильный -m. Для ZIP это -m 13600 (WinZip), -m 17200/-m 17210 (PKZIP). Для SSH-ключа — -m 22921 (RSA/DSA). Извлечение хеша всё равно идёт через *2john — собственных утилит для этого у hashcat нет.
На CTF среднего уровня часто встречается связка: дамп /etc/shadow (sha512crypt) или зашифрованный архив + подсказка в задании, намекающая на структуру пароля. Определяете тип, пробуете rockyou, не помогло — применяете маску по подсказке. Этот алгоритм закрывает большинство тасков.
За годы CTF-практики я собрал список граблей, на которые наступает каждый второй новичок. Некоторые из них — мои собственные.
Неверный режим хеша. Запускаете hashcat -m 0 (MD5) на хеше sha256crypt ($5$...) — hashcat выдаст «Token length exception» или промолотит словарь впустую. Всегда проверяйте тип через hashid перед запуском. Ошибка номер один.
Rockyou.txt не распакован. Kali поставляется с rockyou.txt.gz. Забыли gunzip — hashcat попытается обработать сжатый файл и ничего не найдёт. Никакой ошибки при этом не будет — просто нулевой результат. Молча. Без объяснений.
Повторный запуск без очистки pot-файла. John хранит результаты в ~/.john/john.pot, Hashcat — в ~/.local/share/hashcat/hashcat.potfile. Если хеш уже был взломан ранее, повторный запуск покажет «All hashes found in potfile» или «No password hashes left to crack». Для нового CTF-таска с совпадающим хешем используйте --potfile-disable (hashcat) или удалите pot-файл.
Слишком широкая маска. ?a?a?a?a?a?a?a?a — это 95^8 = 6.6 квадриллионов комбинаций. Даже на топовой GPU это займёт дни. Если из контекста задания известно хоть что-то о структуре пароля — сужайте маску.
Пропуск правил при неудаче словарной атаки. Если rockyou.txt не помог, многие сразу прыгают к brute force. Стоп. Между этими этапами попробуйте rule-based атаку: hashcat -m 0 -a 0 hash.txt rockyou.txt -r rules/best64.rule. Правила покрывают модификации словарных слов (P@ssword, Password1, password!) — и часто быстрее полного перебора.
hashid '<хеш>'john --wordlist=/usr/share/wordlists/rockyou.txt --format=<тип> hash.txtjohn --wordlist=rockyou.txt --rules=Jumbo --format=<тип> hash.txthashcat -m <mode> -a 0 hash.txt rockyou.txt -r best64.rulehashcat -m <mode> -a 3 hash.txt <маска>zip2john, pdf2john, ssh2johnjohn --show hash.txt или hashcat --show hash.txtЭтот workflow закрывает порядка 90% CTF-тасков на хеши. Оставшиеся 10% — кастомные алгоритмы, где придётся писать собственный скрипт.
По данным CrowdStrike Global Threat Report 2025, 75% реальных вторжений используют действительные учётные данные. Навык подбора пароля по хешу — не только CTF-дисциплина. Понимание того, как атакующий ломает хеши (техника Brute Force, T1110), напрямую помогает при аудите парольных политик: видишь, какие пароли падают за секунды, какие за часы, а какие не падают вообще. Bcrypt с cost factor 12 и пароль на 12 символов — это одна реальность. MD5 и «password123» — совсем другая.
Тема кажется линейной: скачал rockyou, запустил hashcat, получил пароль. На деле нюансов больше, чем кажется на первом CTF. Выбор между JtR и Hashcat — не вопрос «что лучше», а вопрос «какую задачу решаю прямо сейчас». JtR идеален для быстрого определения формата и извлечения хешей из файлов. Hashcat — для тяжёлого перебора на GPU. А самая ценная привычка — не пропускать этап определения типа хеша. Те 40 минут впустую из-за неверного -m учат лучше любого writeup. Если хочешь не просто writeup, а пройти всю атаку самому — на WAPT есть лаба на каждый кейс, включая credential-цепочки от дампа до подбора.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «cryptography».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...