
На последнем picoCTF я потерял 40 минут на таске категории Crypto — не потому что пароль оказался сложным, а потому что скормил SHA-512 хеш в Hashcat с режимом -m 1400 (это SHA-256). Инструмент молча перебирал комбинации, я грешил на словарь, а проблема была в одной цифре флага -m. Одна цифра. Сорок минут. Типичная ситуация для тех, кто только осваивает взлом хешей паролей через John the Ripper и Hashcat: оба инструмента работают как часы, но неочевидны в деталях. Дальше — конкретный разбор, от идентификации формата хеша до получения флага.
Новички часто спрашивают: зачем два инструмента, если задача одна — подбор пароля по хешу? Каждый закрывает свою нишу. John the Ripper (JtR) умеет автоматически определять формат хеша, содержит набор утилит *2john для извлечения хешей из файлов (ZIP, RAR, SSH-ключи, KeePass-базы, PDF) и отлично работает на CPU. Hashcat заточен под GPU-ускорение и при наличии видеокарты перебирает пароли в десятки раз быстрее, но требует явного указания типа хеша через флаг -m. Подробнее — в нашем подробном разборе создание ctf заданий.
По данным HashKitty (arxiv, 2025), Hashcat поддерживает более широкий набор алгоритмов на GPU и автоматически раскидывает задачи между несколькими видеокартами, тогда как JtR требует ручной конфигурации для мульти-GPU. Зато JtR может сам определить тип хеша — а Hashcat без правильного -m даже не стартанёт.
В реальных атаках взлом хешей — это техника Credential Access по классификации MITRE ATT&CK (Password Cracking, T1110.002). Злоумышленник сначала извлекает хеши (дамп /etc/shadow, SAM или сетевой перехват), затем подбирает пароли оффлайн. В CTF цепочка обычно упрощена до «получил хеш — сломал — ввёл флаг», но понимание полного workflow помогает и на соревнованиях, и на пентесте.
По данным IBM X-Force Threat Intelligence Index 2025, 32% всего обнаруженного вредоносного ПО за 2024 год — infostealers, которые крадут в том числе хешированные пароли. Так что умение работать с обоими инструментами — вполне прикладной навык.
| Критерий | John the Ripper | Hashcat |
|---|---|---|
| Автоопределение хеша | Да | Нет, нужен флаг -m |
| GPU-ускорение | Через OpenCL, ограниченно | Нативно (CUDA и OpenCL) |
| Мульти-GPU | Ручная настройка | Автоматическое разделение |
| Извлечение хешей из файлов | Да, семейство *2john | Нет |
| Удобство для CTF | Быстрый старт, меньше параметров | Быстрее на GPU, гибкие маски |
| Просмотр результатов | john --show hash.txt |
hashcat -m X hash.txt --show |
Мой подход для CTF-тасков простой: если хеш лежит в файле (архив, документ, SSH-ключ) — начинаю с John, потому что *2john извлечёт хеш в нужном формате за одну команду. Если хеш уже известен и нужен максимальный перебор — переключаюсь на Hashcat с GPU.
Прежде чем запускать любой инструмент для взлома хешей, нужно понять, какой алгоритм использовался. Ошибка в формате — и инструмент будет молотить впустую, как в моём примере с picoCTF.
Первый способ — визуальный. Многие хеши имеют характерные признаки. MD5 — 32 символа в hex (d577273ff885c3f84dadb8578bb41399). SHA-1 — 40 символов. SHA-256 — 64 символа. SHA-512 — 128 символов. NTLM визуально похож на MD5 (тоже 32 hex-символа), но без соли и используется в Windows. Хеши с префиксами $1$, $5$, $6$ — crypt-форматы Unix (MD5, SHA-256 и SHA-512 соответственно). Префикс $2a$ или $2b$ — bcrypt.
Второй способ — утилиты. В Kali предустановлены hash-identifier и hashid. Запускаете hashid -m <хеш>, и утилита покажет вероятные форматы вместе с номерами режимов Hashcat. Флаг -j добавит форматы John. Экономит минуты, которые иначе уходят на гугление таблиц соответствия.
Третий способ — John сам. Записываете хеш в файл и запускаете john hash.txt без параметров. JtR попытается автоматически определить формат. В выводе будет строка вида Loaded 1 password hash (Raw-SHA256 [SHA256 128/128 AVX 4x]) — готово, формат определён.
| Алгоритм | Пример/признак | --format (John) | -m (Hashcat) |
|---|---|---|---|
| MD5 | 32 hex-символа | Raw-MD5 | 0 |
| SHA-1 | 40 hex-символов | Raw-SHA1 | 100 |
| SHA-256 | 64 hex-символа | Raw-SHA256 | 1400 |
| SHA-512 | 128 hex-символов | Raw-SHA512 | 1700 |
| NTLM | 32 hex-символа (Windows) | NT | 1000 |
| bcrypt | Префикс $2a$ или $2b$ | bcrypt | 3200 |
| MD5 Unix crypt | Префикс $1$ | md5crypt | 500 |
| SHA-512 Unix crypt | Префикс $6$ | sha512crypt | 1800 |
Путаницу между Raw-SHA512 (-m 1700, обычный SHA-512) и sha512crypt (-m 1800, Unix crypt с солью и итерациями) я наблюдаю у новичков чаще всего. Первый — быстрый хеш, перебирается за секунды. Второй — медленный, специально спроектированный для защиты паролей. Разница в скорости подбора — на порядки.
Словарная атака — первое, что стоит попробовать в CTF. Большинство тасков на взлом хешей паролей используют пароли из реальных утечек, а значит, они с высокой вероятностью есть в популярных словарях.
Основной словарь — rockyou.txt. 14+ миллионов паролей из утечки сервиса RockYou в 2009 году, входит в стандартную поставку Kali по пути /usr/share/wordlists/rockyou.txt. Аналогичные словари собраны из утечек LinkedIn (164 миллиона хешей паролей, по данным Have I Been Pwned) и других крупных инцидентов. По моей оценке, rockyou.txt покрывает 70-80% CTF-тасков категории Crypto с хешами.
# John the Ripper — словарная атака на SHA-256
john --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-SHA256 hash.txt
# Hashcat — словарная атака на SHA-256
hashcat -m 1400 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
# Посмотреть найденный пароль
john --show hash.txt
hashcat -m 1400 hash.txt --show
По бенчмаркам (dev.to, сравнение на Intel Core i7-9700K), словарная атака на пароль из rockyou.txt завершается за 0 секунд в обоих инструментах — это фактически lookup, а не перебор. Hashcat при первом запуске может потратить 10-15 секунд на построение кэша словаря, но при повторных запусках время падает до 2 секунд.
Если пароля в rockyou.txt нет — пробуйте другие словари. В Kali есть /usr/share/wordlists/dirbuster/ с различными списками, а для генерации целевого словаря под конкретный CTF-таск пригодится CeWL — утилита собирает слова с указанного сайта. Например, cewl -d 2 -w custom_wordlist.txt https://target-site.com создаст словарь из слов на целевом ресурсе. Для тасков, где в описании есть подсказки (имя персонажа, название компании), кастомный словарь часто оказывается решающим.
Когда словарь не помогает, следующий шаг — mask-атака. Это оптимизированный brute force: вы задаёте шаблон пароля — какие символы могут стоять на каждой позиции. Вместо перебора всех возможных комбинаций инструмент проверяет только те, что соответствуют маске.
В Hashcat маски задаются через placeholder'ы: ?l — строчная буква, ?u — заглавная, ?d — цифра, ?s — спецсимвол, ?a — любой печатный символ. В John используется аналогичный синтаксис через флаг --mask.
# Hashcat: маска для пароля вида "Pass1234" (заглавная + строчные + цифры)
hashcat -m 0 -a 3 hash.txt ?u?l?l?l?d?d?d?d
# John: аналогичная маска для MD5
john --mask=?u?l?l?l?d?d?d?d --format=Raw-MD5 hash.txt
# Hashcat: полный brute force 6 символов (любые печатные)
hashcat -m 0 -a 3 hash.txt ?a?a?a?a?a?a
Разница в скорости между mask-атакой и полным brute force — колоссальная. По бенчмарку на SHA-256, маска с указанием, что первый символ — заглавная буква, ускорила взлом в 3 раза для John и в 2.5 раза для Hashcat по сравнению с полным перебором тех же 5-символьных паролей.
Полный brute force (?a?a?a?a?a?a — все комбинации из 6 символов) на CPU занимает около 10 минут для MD5. Для 7 символов — уже часы, для 8 — дни. На GPU Hashcat справляется быстрее, но даже с мощной видеокартой brute force паролей длиннее 8 символов нецелесообразен. В CTF brute force имеет смысл только когда вы точно знаете длину пароля и хотя бы часть его структуры.
Режим атаки в Hashcat задаётся через -a. -a 0 — словарная атака, -a 3 — brute force/mask, -a 1 — комбинаторная (склейка двух словарей), -a 6 и -a 7 — гибридные (словарь + маска). В John режимы переключаются через отдельные флаги: --wordlist, --mask, --incremental.
Пароли вида password123 или P@ssw0rd! — мутации базовых слов. Люди берут простое слово и добавляют цифры, меняют регистр, подставляют спецсимволы вместо букв (leet-speak). Правила мутации (rules) автоматизируют эти паттерны.
В Hashcat правила подключаются через флаг -r. Стандартный набор best64.rule содержит 64 самых эффективных правила мутации — каждое модифицирует слова из словаря: добавляет цифры в конец, меняет первую букву на заглавную, переворачивает слово. Команда hashcat -m 0 -a 0 hash.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rule прогонит весь rockyou.txt через 64 мутации — это 14 миллионов × 64 = почти миллиард кандидатов. Для более агрессивного перебора есть d3ad0ne.rule (свыше 34 тысяч правил) и dive.rule.
В John правила работают аналогично, но подключаются через --rules. По умолчанию John применяет собственный набор в режиме Wordlist. Запуск john --wordlist=rockyou.txt --rules --format=Raw-MD5 hash.txt использует стандартные правила модификации: капитализация, суффиксы, leet-замены.
Гибридная атака в Hashcat (-a 6 или -a 7) комбинирует словарь с маской. Пример: hashcat -m 0 -a 6 hash.txt rockyou.txt ?d?d?d берёт каждое слово из словаря и дописывает к нему три цифры. Если CTF-пароль — словарное слово с добавленными цифрами (типичный сценарий), гибридная атака найдёт его за минуты.
Комбинаторная атака (-a 1) склеивает слова из двух словарей: hashcat -m 0 -a 1 hash.txt wordlist1.txt wordlist2.txt. Каждое слово из первого файла соединяется с каждым из второго. Подходит для паролей-фраз вроде sunflowerhouse.
На CTF хеш обычно дан в файле или в описании задачи — нужно восстановить исходный пароль. На пентесте хеш ещё нужно извлечь — отдельная история из арсенала Credential Access. Но набор инструментов одинаковый.
В CTF-тасках категории Forensics или в пентест-лабах (HackTheBox, TryHackMe) часто встречается сценарий: получен доступ к файлу /etc/shadow (Linux) или к базе SAM (Windows). В терминах MITRE ATT&CK это OS Credential Dumping — извлечение хешей из /etc/passwd и /etc/shadow (T1003.008) или из Security Account Manager (T1003.002).
# Linux: объединить passwd и shadow для John
unshadow /etc/passwd /etc/shadow > unshadowed.txt
john --wordlist=/usr/share/wordlists/rockyou.txt unshadowed.txt
# Извлечь хеш из ZIP-архива
zip2john protected.zip > zip_hash.txt
john --wordlist=/usr/share/wordlists/rockyou.txt zip_hash.txt
# Аналогично для RAR, SSH-ключей, KeePass
rar2john archive.rar > rar_hash.txt
ssh2john id_rsa > ssh_hash.txt
keepass2john database.kdbx > keepass_hash.txt
Утилита unshadow из пакета John объединяет /etc/passwd (имена пользователей) и /etc/shadow (хеши) в единый файл, который John умеет парсить. Для Windows NTLM-хешей формат проще — обычные 32-символьные hex-строки, подаёте напрямую: john --format=NT ntlm_hashes.txt или hashcat -m 1000 ntlm_hashes.txt rockyou.txt.
Семейство утилит *2john — одна из сильнейших сторон John the Ripper, которой у Hashcat нет. Эти скрипты (в основном на Python) извлекают хеш пароля из защищённого файла в формат, понятный John. Полный список конвертеров можно глянуть командой ls /usr/share/john/*.py | grep 2john — там обычно 50+ утилит.
Типичный CTF-воркфлоу: получаете файл (архив, PDF, SSH-ключ с passphrase, базу KeePass) → запускаете соответствующий *2john → получаете хеш → ломаете John или Hashcat. Для Hashcat нужно вручную определить режим -m по виду хеша — например, zip2john выдаёт хеш в формате, который Hashcat принимает с -m 13600 (WinZip) или -m 17200-17230 (PKZIP).
На практике я часто использую John для извлечения и начального перебора через словарь, а если не помогло — копирую хеш и переключаюсь на Hashcat с mask-атакой на GPU. Конвейер работает быстро: zip2john отрабатывает за миллисекунды, словарная атака с rockyou.txt — за секунды.
За пару лет решения CTF-тасков с хешами я собрал коллекцию типичных граблей. Каждая стоила от 10 минут до часа.
Неверный формат хеша — лидер антирейтинга. В John можно положиться на автоопределение, но если оно ошиблось (а с NTLM vs MD5 это случается — оба 32 hex-символа), результат будет пустым. В Hashcat неправильный -m — гарантия потерянного времени. Правило: всегда проверяйте формат через hashid -m перед запуском.
Забытый --show — John хранит найденные пароли в файле ~/.john/john.pot. Если запустить взлом повторно, John скажет «No password hashes left to crack» — он уже нашёл пароль, просто не показывает. Команда john --show hash.txt выводит ранее найденные результаты. Hashcat работает аналогично: файл hashcat.potfile в рабочей директории, просмотр через --show.
Brute force вместо словаря — начинающие часто запускают полный перебор на 8-символьный пароль, хотя он есть в rockyou.txt. Словарная атака заняла бы 0 секунд, brute force — дни. Порядок атак: сначала словарь (rockyou.txt), затем словарь с правилами (best64.rule), затем маска (если знаете структуру), и только в крайнем случае — полный перебор.
Кодировка словаря — rockyou.txt в Kali по умолчанию запакован в gz. Не забывайте распаковать: gunzip /usr/share/wordlists/rockyou.txt.gz. Ещё нюанс: некоторые словари в UTF-8, а хеш был создан из пароля в Latin-1 — John и Hashcat могут не найти совпадение из-за различия в кодировке. Флаг --encoding= в John помогает в таких случаях.
Слишком длинные пароли в brute force — каждый дополнительный символ увеличивает пространство перебора экспоненциально. Для charset ?a (95 печатных символов) 6 символов = 735 миллиардов комбинаций, 7 символов = 69 триллионов. Даже на GPU перебор 8+ символов в charset ?a займёт недели.
Игнорирование соли — хеши формата $6$rounds=5000$saltsalt$hash... содержат соль, которая делает rainbow tables бесполезными. John и Hashcat обрабатывают соль автоматически, но если вы вручную извлекли только часть хеша без соли — инструмент не сможет подобрать пароль. Всегда копируйте хеш целиком, включая префикс и соль.
Отдельная история — OWASP A07:2021 (Identification and Authentication Failures). Стандарт описывает слабые пароли как одну из ключевых проблем аутентификации. То, что CTF-пароли легко ломаются через rockyou.txt, демонстрирует ровно эту проблему: пользователи ставят предсказуемые пароли, и никакой алгоритм хеширования не спасёт, если сам пароль — password123.
По моему опыту, 90% CTF-тасков с хешами решаются в три шага: определить формат, запустить словарную атаку с rockyou.txt, при неудаче — добавить правила мутации. Mask-атака и brute force нужны в оставшихся 10%, обычно когда автор таска специально создал пароль, которого нет ни в одном словаре.
Если смотреть шире — навык подбора паролей по хешу пригодится не только на CTF. Каждый пентест рано или поздно приводит к дампу хешей: из Active Directory, из конфигов приложений (Credentials In Files, T1552.001 по MITRE ATT&CK), из баз паролей менеджеров (Credentials from Password Stores, T1555). Разница между «нашёл хеш, но не смог сломать» и «нашёл хеш, достал пароль за 30 секунд» — это разница между отчётом с одним вектором и полной цепочкой компрометации.
Я замечаю характерную ошибку: новички фокусируются на скорости перебора — ставят Hashcat на мощную GPU, гоняют бенчмарки. Но в CTF скорость GPU почти никогда не является узким местом. Узкое место — выбор правильного режима атаки и правильного словаря. Человек с rockyou.txt на ноутбуке с CPU-only John решит таск за секунду, а человек с RTX 4090 и неправильным -m не решит его никогда. Если хочешь прокачать именно это умение — выбирать стратегию, а не покупать железо — на WAPT эту цепочку (от извлечения хешей до подбора паролей) разбирают в лабах с реальными сценариями, где ментор подскажет, почему конкретная атака не сработала.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «cryptography».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...