
На crypto-таске прошлогоднего CTF лежал файл с единственной строкой: 5f4dcc3b5aa765d61d8327deb882cf99. Ни формата, ни подсказки — голый hex. Если знаешь, что это MD5, и у тебя настроен John — флаг прилетает через 40 секунд. Участник на соседнем месте потратил на тот же таск полтора часа: запустил Hashcat с -m 1000 (NTLM вместо MD5), перебор шёл вхолостую, а --show молчал, потому что результаты уходили не в тот pot-файл. Разница между первым и вторым сценарием — не талант и не видеокарта за две тысячи долларов. Это навык из трёх шагов: определить хэш, выбрать инструмент, запустить правильную атаку. Разберём каждый на реальных CTF-задачах.
Тип хэша — первое, что нужно выяснить. Без этого ни John, ни Hashcat не помогут: оба работают с конкретным алгоритмом, и ошибка в определении формата превращает перебор в пустую трату CPU-циклов. В терминах MITRE ATT&CK подбор пароля по хэшу — техника Password Cracking (T1110.002, Credential Access), и успех целиком зависит от корректной идентификации алгоритма.
Часть хэшей содержит встроенные маркеры, которые однозначно указывают на алгоритм. По документации John the Ripper (Openwall) самые распространённые:
$1$ — MD5crypt (устаревшие Linux-системы)$5$ — SHA-256crypt$6$ — SHA-512crypt (дефолт на большинстве современных дистрибутивов)$2y$ или $2b$ — bcrypt$y$ — yescrypt (дефолт на Debian 12, Ubuntu 24.04+)$argon2id$ — Argon2 (самый ресурсоёмкий для подбора)Видишь строку вида $6$rounds=5000$saltsalt$... — это SHA-512crypt. В John формат указывается как --format=sha512crypt, в Hashcat — -m 1800. Маркер снимает любую неопределённость.
Сложнее с сырыми hex-строками без маркеров. 32 символа hex — MD5, NTLM, LM или ещё десяток алгоритмов. 64 символа — SHA-256, SHA3-256, RIPEMD-256. Без контекста — гадание на кофейной гуще.
Два инструмента для начальной идентификации. Утилита hashid выводит ранжированный список возможных алгоритмов: hashid 'хэш-строка' покажет варианты от наиболее вероятного к менее. Альтернатива — hash-identifier — работает в интерактивном режиме. Оба предустановлены в Kali, оба доступны как веб-версии. Но ни hashid, ни hash-identifier не дают стопроцентного ответа — они работают по длине строки и набору символов, без учёта контекста.
А контекст решает всё: хэш из /etc/shadow → SHA-512crypt или yescrypt (техника OS Credential Dumping, T1003.008). Хэш из вывода secretsdump.py или NTDS.dit → NTLM. 32 hex-символа из веб-дампа → с высокой вероятностью MD5 (по данным OWASP A02:2021 Cryptographic Failures, MD5 до сих пор валяется в legacy-приложениях).
John the Ripper умеет автоматически определять формат — достаточно запустить john hash.txt без флага --format. Но если автоопределение ошибётся (а на CTF это случается с сырыми hex-хэшами), потерянное время не вернуть. Правило простое: проверяй формат до запуска.
Работает если: Kali Linux / Parrot OS (John jumbo предустановлен), Debian/Ubuntu (через apt), macOS (Homebrew: brew install john-jumbo), Windows (бинарь с openwall.com). RAM — от 2 ГБ. CPU — любой x86-64. Для --fork рекомендуется 4+ ядер.
Не работает / деградирует если: установлена не-jumbo версия John. Стоковая версия поддерживает порядка 12 форматов, jumbo — 470+. Разница критическая: без jumbo большинство CTF-хэшей не распознаются. Проверка: john --list=build-info | head -3 — в выводе должно быть слово «jumbo». Нет его — нужна пересборка из исходников (клонируем github.com/openwall/john, дальше cd john/src && ./configure && make -j$(nproc)).
На Kali и Parrot jumbo стоит из коробки: sudo apt install john гарантирует нужную сборку. После установки — john --test=10 прогоняет короткий бенчмарк по поддерживаемым форматам и подтверждает, что сборка работает на текущем железе. Это не соревнование — это проверка.
Основной рабочий процесс John в CTF — словарная атака. Получил хэш, определил формат, указываешь путь к словарю:
john --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5 hash.txt
Loaded 1 password hash (Raw-MD5 [MD5 128/128 AVX 4x3])
Press 'q' or Ctrl-C to abort, almost any other key for status
password (?)
1g 0:00:00:00 DONE 100.0g/s 14000p/s
Use the "--show --format=Raw-MD5" to display cracked passwords
Session completed
Команда берёт каждое слово из rockyou.txt, вычисляет MD5 и сравнивает с хэшами из файла. На современном CPU 14 миллионов слов из rockyou прогоняются за секунды для быстрых алгоритмов (MD5, NTLM, SHA1) и за часы для медленных (bcrypt, scrypt, argon2).
Результат John сохраняет в pot-файл (~/.john/john.pot). Посмотреть найденные пароли: john --show hash.txt — вывод в формате хэш:пароль. Именно здесь лежит твой флаг. Типичная ошибка новичка: повторный запуск john hash.txt после успешного взлома — John пишет «No password hashes left to crack», и человек думает, что пароль не найден. Решение всегда одно: --show.
Если процесс прервался (закрытый терминал, уснувший ноутбук) — john --restore продолжит с места остановки. Сессия сохраняется автоматически в .rec-файл.
Утилиты *2john — извлечение хэшей из файлов. Вот чего нет в Hashcat, и вот что делает John незаменимым для половины CTF-тасков категории crypto и misc:
zip2john archive.zip > hash.txt — стягивает хэш из защищённого ZIP-архиваssh2john id_rsa > hash.txt — из SSH-ключа с парольной фразой (T1552.001, Credentials In Files)pdf2john document.pdf > hash.txt — из защищённого PDFkeepass2john database.kdbx > hash.txt — из KeePass-базыunshadow /etc/passwd /etc/shadow > hash.txt — объединяет файлы Linux для крекинга (T1003.008 по ATT&CK)После извлечения — стандартный john --wordlist=rockyou.txt hash.txt. John сам определит формат (ZIP, SSH, PDF) и подберёт нужный модуль. Знание *2john-утилит сокращает решение типовых CTF-тасков с часов до минут.
Правила (rules) — умножение словаря. Флаг --rules активирует встроенные правила преобразования. Каждое слово мутирует: password превращается в Password, PASSWORD, password1, p@ssword, password!, Password2024 — десятки вариантов из одного слова. Без --rules проверяются только точные совпадения. С --rules покрытие вырастает на два порядка. Запуск: john --wordlist=rockyou.txt --rules --format=Raw-MD5 hash.txt. Для серьёзных сессий добавляй --fork=8 (распараллеливание на 8 ядер) и --session=ctf-task1 (именованная сессия для восстановления).
Работает если: есть дискретный GPU (NVIDIA с CUDA или AMD с OpenCL), VRAM от 2 ГБ (рекомендуется 4+), установлены актуальные драйверы. ОС: Linux (оптимально), Windows, macOS (с ограничениями). Проверка GPU: hashcat -I выводит список обнаруженных устройств. Пустой список = проблема с драйверами.
Работает в CPU-режиме с --force: без GPU Hashcat запускается принудительно, но скорость будет сопоставима с John или ниже. Для быстрых хэшей (MD5, SHA1) на CTF CPU-режим терпим. Для bcrypt — бессмысленно.
Не работает если: виртуальная машина без проброса GPU (VirtualBox / VMware без GPU passthrough — классическая боль новичков), GPU без OpenCL 1.2+, macOS с Apple Silicon (Metal-поддержка ограничена).
Ключевое отличие Hashcat от John: нужно явно указать номер режима хэша через -m. Никакого автоопределения — ошибся с режимом, и перебор идёт в пустоту. Частые режимы на CTF:
| Режим | Алгоритм | Контекст |
|---|---|---|
-m 0 |
MD5 | Веб-дампы, CTF crypto |
-m 100 |
SHA1 | Веб-приложения, Git |
-m 1400 |
SHA-256 | Современные приложения |
-m 1700 |
SHA-512 | Серверные хэши |
-m 1000 |
NTLM | Windows SAM, AD |
-m 1800 |
sha512crypt | Linux /etc/shadow |
-m 3200 |
bcrypt | Современные веб-фреймворки |
-m 13400 |
KeePass | KeePass-базы |
Полный список: hashcat --example-hashes — показывает пример хэша для каждого режима. Это полезнее hashcat --help, потому что можно визуально сравнить формат найденного хэша с эталонным.
Словарная атака — режим -a 0: hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt ищет MD5-хэш по словарю rockyou. Hashcat находит словарный пароль практически мгновенно после построения кэша — первый запуск может занять ~15 секунд на кэширование, последующие проходят за пару секунд.
Результаты: hashcat --show -m 0 hash.txt выводит найденные пары хэш:пароль. Pot-файл хранится в ~/.local/share/hashcat/hashcat.potfile.
Маска — продвинутый брутфорс, где ты задаёшь шаблон вместо перебора всех возможных символов. Режим -a 3. Символы маски:
?l — строчная буква (a-z)?u — заглавная буква (A-Z)?d — цифра (0-9)?s — спецсимвол (!@#$...)?a — любой печатный символПредусловие: маска работает только если ты знаешь (или можешь предположить) структуру пароля. Структура неизвестна — словарная атака эффективнее.
Пример: задание подсказывает, что пароль начинается с заглавной буквы, затем 4 строчных и 2 цифры (паттерн вида Admin99):
hashcat -m 0 -a 3 hash.txt ?u?l?l?l?l?d?d
Маска ?u?a?a?a?a для SHA-256 существенно сокращает пространство перебора по сравнению с полным брутфорсом ?a?a?a?a?a — ускорение может составлять разы в зависимости от железа. Маска не угадывает — она отсекает заведомо невозможные комбинации. В John маска тоже поддерживается через --mask=?u?l?l?l?l?d?d, но Hashcat на GPU обрабатывает маски заметно быстрее.
На CTF, где в условии есть подсказка о формате пароля (скажем, «пароль — имя с заглавной буквы и год рождения»), маска даёт кратное ускорение по сравнению с чистым перебором.
rockyou.txt — стандартный словарь для CTF и пентестов. Содержит порядка 14 миллионов паролей из утечки сервиса RockYou в 2009 году. В Kali валяется в /usr/share/wordlists/rockyou.txt.gz — файл нужно распаковать командой gzip -d /usr/share/wordlists/rockyou.txt.gz перед первым использованием. Частый источник ошибок: попытка запустить John или Hashcat на сжатом файле завершается молчаливым провалом — ни ошибки, ни результата.
Масштаб реальных утечек, которые питают словари, впечатляет: по данным Have I Been Pwned, утечка LinkedIn затронула 164 миллиона учётных записей с паролями. Пароли из таких утечек попадают в публичные словари и активно используются на CTF-площадках. Словарная атака эффективна именно потому, что люди предсказуемы в выборе паролей (OWASP A07:2021 Identification and Authentication Failures подтверждает это из года в год).
Rainbow tables — предвычисленные таблицы соответствий хэш-пароль — работают только для хэшей без соли. Большинство современных алгоритмов (SHA-512crypt, bcrypt, yescrypt, Argon2) используют соль, что делает rainbow tables бесполезными. На CTF ты столкнёшься либо с солёными хэшами (нужен словарь + перебор), либо с несолёным MD5/SHA1, где словарная атака быстрее поиска по rainbow table. По факту словари вытеснили rainbow tables почти полностью.
CeWL — генерирует словарь из содержимого веб-страницы: cewl -d 2 -m 5 https://target.com -w custom_wordlist.txt обходит страницу на глубину 2, собирает слова длиной от 5 символов. Полезно для CTF-тасков, где подсказка вплетена в описание задания или на связанной странице.
crunch — генерирует все комбинации по заданным параметрам. Пример: crunch 6 6 -t @@%%^^ -o wordlist.txt создаст все шестисимвольные строки с двумя буквами, двумя цифрами и двумя спецсимволами. Осторожно: без ограничений crunch генерирует терабайты — всегда задавай минимальный и максимальный размер и шаблон.
Правила вместо гигантских словарей. Один словарь + правила мутации покрывают больше комбинаций, чем огромный словарь без правил. В John: --rules. В Hashcat: -r /usr/share/hashcat/rules/best64.rule (64 самых эффективных правила) или -r /usr/share/hashcat/rules/rockyou-30000.rule (30 000 правил из анализа утечки RockYou). best64.rule — лучший стартовый выбор для CTF: минимальное время, максимальное покрытие типовых мутаций.
Оба инструмента решают одну задачу — подбор пароля по хэшу. Вопрос не «какой лучше», а «какой подходит под конкретную задачу». Trade-off таблица (на основе документации Openwall и бенчмарков):
| Критерий | John the Ripper (jumbo) | Hashcat |
|---|---|---|
| Основная платформа | CPU | GPU (CPU через --force) |
| Автоопределение хэша | Да | Нет (нужен -m) |
| Извлечение хэшей из файлов | Нативно (*2john утилиты) | Нет |
| Количество форматов | 470+ | 350+ |
| Скорость на GPU | Ограниченная | Максимальная |
| Маска-атаки | Да (--mask) | Да (-a 3), более гибкие |
| Правила мутации | Встроенные (--rules) | Файлы правил (-r), больше контроля |
| Возобновление сессии | --restore (автоматическое) | --session + --restore |
| Лучший сценарий для CTF | Неизвестный формат, файлы (ZIP/SSH/PDF/KeePass), CPU-only среда | Известный хэш, GPU доступен, большие объёмы |
| Когда НЕ использовать | Нужна максимальная GPU-скорость | Формат неизвестен, нет GPU, нужны *2john |
На практике: начинай с John, если не знаешь формат хэша или если таск содержит файл (архив, ключ, база). Переключайся на Hashcat, когда формат определён и доступен GPU. Многие CTF-игроки используют оба в связке: John для извлечения и идентификации хэша, Hashcat для финального перебора на GPU. Это не костыль — это рабочий процесс, который работает и на реальных аудитах.
Неверный режим хэша в Hashcat. Указал -m 0 (MD5) для SHA-256 → Hashcat молча перебирает, ничего не находит, ты думаешь, что пароль сложный. На деле ты сравниваешь MD5-значения с SHA-256 хэшем — совпадение невозможно по определению. Проверяй перед запуском: hashcat --example-hashes | grep -A2 'пример-хэша'.
Забытый --show. John нашёл пароль, вывел его в терминал при первом запуске — и больше не покажет. Повторный запуск даёт «No password hashes left to crack». Новичок бросает и переключается на Hashcat, теряя время. Решение: всегда проверять john --show hash.txt и john --show --format=Raw-MD5 hash.txt (с явным форматом, если автоопределение молчит).
Путаница между -a 0 и -a 3 в Hashcat. -a 0 — словарная атака (требует файл словаря вторым аргументом). -a 3 — маска/брутфорс (требует маску). Указал -a 3 и подал словарь вместо маски — Hashcat интерпретирует имя файла как маску и выдаст непредсказуемый результат. -a 0 без словаря — ошибка запуска. Запомнить просто: 0 = Zero = словарь (загружаем готовый файл), 3 = маска (генерируем на лету).
rockyou.txt не распакован. В Kali файл лежит как rockyou.txt.gz. Команда ls -la /usr/share/wordlists/rockyou* покажет, нужна ли распаковка. Без gzip -d инструменты не выдадут ошибку — просто не найдут совпадений. Тихий провал.
Отсутствие --rules в John. Словарь rockyou содержит 14 миллионов строк — только точные совпадения. С правилами (--rules) каждая строка мутирует в десятки-сотни вариантов: покрытие вырастает до сотен миллионов кандидатов. Разница между «не найдено» и «флаг через 30 секунд» зачастую — один забытый флаг.
Hashcat в VM без проброса GPU. VirtualBox и VMware по умолчанию не пробрасывают GPU. Hashcat запустится только с --force в CPU-режиме, и скорость упадёт в 10-100 раз. Для CTF с MD5 ещё терпимо. Для bcrypt — провал. Работаешь в VM — бери John (он изначально CPU-ориентирован) или настраивай GPU passthrough.
Большинство CTF-игроков, которых я наблюдал на площадках, теряют время не на «сложный пароль», а на одну из этих шести ошибок. Техника Password Cracking (T1110.002) — в первую очередь про методичность, а не про мощность оборудования. Восемь из десяти crypto-тасков решаются правильным определением хэша плюс rockyou.txt с --rules. Никаких рендер-ферм, никаких облачных кластеров — чистый навык.
Я вижу устойчивый перекос: новички тратят часы на оптимизацию GPU-пайплайна и поиск «идеального словаря на 100 ГБ», игнорируя первый и самый важный этап — анализ самого хэша. Контекст задания, маркеры формата, длина строки, источник данных — вся эта информация лежит на поверхности и сужает пространство поиска сильнее любого GPU. Формула на бумаге простая, но по-настоящему ощущается только когда сам раз за разом прогоняешь разные сценарии. На HackerLab.pro есть целый блок crypto-тасков, где именно этот навык — определение формата и выбор атаки — прокачивается быстрее, чем по writeup-ам.
Второй момент — порог входа в серьёзный пентест ниже, чем кажется после первых CTF-тасков. Разница между «решил crypto на CTF» и «ломаю хэши из NTDS.dit на реальном аудите» — не столько в инструментах (те же John и Hashcat), сколько в понимании, откуда хэши берутся и как выстраивать цепочку атаки от начального доступа до эскалации. Если хочешь не просто writeup, а пройти всю атаку самому — на WAPT есть лаба на каждый кейс и ментор в чате при затыке.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «cryptography».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...