
Три hex-строки в файле challenge.txt — 32 символа, 40 символов и 64 символа. До конца CTF двадцать минут. Участник рядом гуглит «online hash cracker», я запускаю hashid и через полторы минуты знаю: MD5, SHA-1, SHA-256. Ещё через три — три флага подобраны через John с rockyou.txt. Разница не в таланте и не в видеокарте за две тысячи долларов. Разница — в workflow из трёх шагов: определить тип хэша, выбрать инструмент, запустить правильную атаку.
По данным CrowdStrike Global Threat Report 2025, 75% вторжений используют действительные учётные данные. IBM X-Force фиксирует рост атак с credential abuse на 71% за год, а в даркнете ежедневно всплывает порядка 6000 свежих учёток. Умение работать с хэшами — фундамент не только для CTF, но и для реального пентеста. Разберём каждый шаг на конкретных командах.
Без правильного определения формата ни John, ни Hashcat не помогут. Оба работают с конкретным алгоритмом хэширования: ошибся — перебор идёт вхолостую, время утекает. В терминологии MITRE ATT&CK подбор пароля по хэшу — техника Password Cracking (T1110.002, Credential Access). Успех целиком зависит от корректной идентификации алгоритма. Подробнее — в нашем подробном разборе создание ctf заданий.
Часть хэшей содержит встроенные префиксы, которые однозначно указывают на алгоритм. Вот основные:
| Префикс | Алгоритм | John --format | Hashcat -m |
|---|---|---|---|
$1$ |
MD5crypt | md5crypt | 500 |
$5$ |
SHA-256crypt | sha256crypt | 7400 |
$6$ |
SHA-512crypt | sha512crypt | 1800 |
$2y$ / $2b$ |
bcrypt | bcrypt | 3200 |
$y$ |
yescrypt | yescrypt (jumbo 2022+) | не поддержан |
$argon2id$ |
Argon2 | argon2 | не поддержан |
Видишь строку $6$rounds=5000$saltsalt$... — это SHA-512crypt. В John указываешь --format=sha512crypt, в Hashcat — -m 1800. Маркер снимает любую неопределённость. Типичная ошибка новичка — игнорировать префикс и пытаться угадать формат по длине строки. Если префикс есть — он уже содержит ответ, не надо ничего выдумывать.
Сложнее с сырыми hex-строками без префиксов. 32 символа hex — это может быть MD5, NTLM, MD4 или ещё десяток алгоритмов. 40 символов — SHA-1 или RIPEMD-160. 64 символа — SHA-256, SHA3-256, Keccak-256. По одной длине формат не определишь.
hashid — первый инструмент для разведки. Ставится через pip3 install hashid, в Kali предустановлен. Альтернатива — hash-identifier в интерактивном режиме.
$ hashid '5f4dcc3b5aa765d61d8327deb882cf99'
Analyzing '5f4dcc3b5aa765d61d8327deb882cf99'
[+] MD2
[+] MD5
[+] MD4
[+] Double MD5
[+] LM
[+] RIPEMD-128
[+] NTLM
Вывод — ранжированный список от наиболее вероятного к менее вероятному. Для 32-символьной hex-строки самые частые кандидаты — MD5 и NTLM. Но hashid работает только по длине и набору символов, контекст задачи ему неведом.
Для окончательного подтверждения типа в Hashcat есть hashcat --example-hashes — выводит пример хэша для каждого поддерживаемого режима. Сравниваешь формат визуально и точно знаешь номер -m. Это полезнее hashcat --help, потому что показывает реальные строки, а не абстрактные описания. В John аналог — john --list=formats, но без примеров: просто список форматов, нужный ищешь через grep: john --list=formats | grep -i ntlm.
Контекст решает больше, чем любой автоматический идентификатор. Откуда получен хэш — вот что определяет алгоритм:
/etc/shadow — SHA-512crypt или yescrypt, техника OS Credential Dumping: /etc/passwd and /etc/shadow (T1003.008, Credential Access). На большинстве современных дистрибутивов дефолт — SHA-512crypt ($6$), на Debian 12+ и Ubuntu 24.04+ — yescrypt ($y$)secretsdump.py или дампа NTDS.dit — NTLM*2johnВ CTF-тасках контекст часто прячется в мелочах. Файл shadow.bak — очевидно /etc/shadow. Файл ntds_dump.txt — NTLM. Описание задачи упоминает «старый веб-сервер» — почти наверняка MD5. Пять секунд на чтение описания экономят пятнадцать минут перебора с неверным форматом. Я на это попадался не раз — запускаешь перебор, GPU греется, а через десять минут понимаешь, что формат не тот.
John the Ripper — рабочая лошадка для CTF. Автоопределение формата хэша, утилиты *2john для извлечения хэшей из файлов и работа на CPU без дискретной GPU. Если на CTF ты сидишь с ноутбука без видеокарты — John закрывает большинство задач.
На Kali и Parrot OS John jumbo предустановлен. sudo apt install john гарантирует нужную сборку. Критический момент: стоковый John поддерживает около 12 форматов, jumbo — свыше 470. Без jumbo большинство CTF-хэшей тупо не распознаются.
Проверка: john --list=build-info | head -3 — в выводе должно быть слово «jumbo». Нет его — пересобирай: клонируешь репозиторий github.com/openwall/john, переходишь в john/src, запускаешь ./configure && make -j$(nproc). Сборка из исходников даёт доступ к самым свежим форматам, которых ещё нет в пакетных менеджерах.
После установки john --test=10 прогоняет короткий бенчмарк и подтверждает, что сборка живая. Минимальные требования: CPU x86-64, RAM от 2 ГБ. Для --fork рекомендуется 4+ ядер.
Основной workflow John в CTF — словарная атака (dictionary attack). Получил хэш, определил формат, указал путь к словарю. Словарь rockyou.txt — это более 14 миллионов паролей из утечки RockYou 2009 года. В Kali лежит по пути /usr/share/wordlists/rockyou.txt.gz — перед первым использованием распакуй через gunzip.
$ 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
password (?)
1g 0:00:00:00 DONE (зависит от CPU и SIMD)
Session completed
$ john --show hash.txt
?:password
1 password hash cracked, 0 left
John берёт каждое слово из rockyou.txt, вычисляет MD5 и сравнивает с хэшами в файле. Для быстрых алгоритмов (MD5, SHA-1, NTLM) 14 миллионов слов прогоняются за секунды на современном CPU. Для медленных (bcrypt, scrypt, argon2) — за часы или дни. Тут ничего не поделаешь, такова цена «правильного» хэширования.
Результат сохраняется в pot-файл ~/.john/john.pot. Посмотреть найденные пароли: john --show hash.txt. Если процесс прервался (закрытый терминал, уснувший ноутбук) — john --restore продолжит с места остановки, сессия сохраняется автоматически.
John умеет автоматически определять формат — можно запустить просто john hash.txt без флага --format. Для хэшей с маркерами ($6$, $2y$) автоопределение работает отлично. Для сырых hex-строк может ошибиться — лучше указывать формат явно.
Вот чего нет в Hashcat и что делает John незаменимым для половины CTF-тасков в категориях crypto и misc. Утилиты *2john вытаскивают хэши из защищённых файлов:
| Утилита | Источник | CTF-применение |
|---|---|---|
zip2john |
ZIP-архив с паролем | Файл flag.zip с флагом внутри |
ssh2john |
SSH-ключ с парольной фразой (T1552.001) | Приватный ключ id_rsa |
pdf2john |
Защищённый PDF | Документ с флагом |
keepass2john |
KeePass-база .kdbx | База учётных данных |
rar2john |
RAR-архив | Запароленный архив |
office2john |
Документы Office | Защищённый .docx/.xlsx |
Workflow одинаковый: zip2john archive.zip > hash.txt, затем john --wordlist=rockyou.txt hash.txt. John сам определит формат (ZIP, SSH, PDF) и подберёт нужный модуль. Утилита unshadow объединяет /etc/passwd и /etc/shadow для крекинга Linux-паролей — покрытие техники T1003.008 по ATT&CK. Знание *2john-утилит сокращает решение типовых тасков с часов до минут. На CTF это буквально разница между «решил» и «не успел».
Флаг --rules активирует встроенные правила преобразования каждого слова из словаря. Слово password мутирует в Password, PASSWORD, password1, p@ssword, password! — десятки вариантов из одного слова. Без --rules проверяются только точные совпадения. С правилами покрытие вырастает на два порядка.
Запуск: john --wordlist=rockyou.txt --rules --format=Raw-MD5 hash.txt. Для многоядерного CPU добавляй --fork=8 для распараллеливания и --session=ctf-task1 для именованной сессии.
John поддерживает несколько встроенных наборов: --rules=Single (быстрый, хорош для username-based паролей), --rules=Jumbo (расширенный набор в jumbo-сборке). Кастомные правила описываются в john.conf — синтаксис выразительный: A — «append», c — capitalize, l — lowercase, r — reverse, d — duplicate. Пример правила для добавления двузначных чисел: Az"[0-9][0-9]" — применит суффиксы от 00 до 99 к каждому слову.
Hashcat — второй ключевой инструмент, заточенный под параллельные вычисления на GPU. Если John выигрывает в универсальности и утилитах *2john, то Hashcat доминирует в скорости перебора на видеокартах и в гибкости масочных атак. По данным исследования HashKitty (arxiv, 2025), Hashcat поддерживает более широкий диапазон алгоритмов на GPU и автоматически раскидывает нагрузку между несколькими GPU, тогда как John требует ручной настройки для multi-GPU.
Ключевое отличие от John: нужно явно указать номер режима через -m. Никакого автоопределения — ошибся с режимом, перебор идёт в пустоту. Частые режимы на CTF:
| Режим (-m) | Алгоритм | Длина hex-строки |
|---|---|---|
| 0 | MD5 | 32 |
| 100 | SHA-1 | 40 |
| 1400 | SHA-256 | 64 |
| 1700 | SHA-512 | 128 |
| 1000 | NTLM | 32 |
| 500 | MD5crypt ($1$) | — |
| 1800 | SHA-512crypt ($6$) | — |
| 3200 | bcrypt ($2y$) | — |
Полный справочник: hashcat --example-hashes. Если не уверен в номере — сравни формат найденного хэша с эталонным из этого списка. Два раза посмотреть быстрее, чем двадцать минут гонять перебор не с тем -m.
Hashcat требует дискретный GPU с поддержкой OpenCL 1.2+ (NVIDIA с CUDA или AMD с OpenCL) и VRAM от 2 ГБ. Проверка: hashcat -I выводит список обнаруженных устройств. Пустой список — проблема с драйверами. И вот тут классическая боль новичков: Hashcat в виртуальной машине без проброса GPU (VirtualBox, VMware без GPU passthrough) — это страдание. Работает с --force в CPU-режиме, но скорость сопоставима с John или ниже. Если работаешь постоянно — ставь Kali на bare metal или настраивай GPU passthrough.
Словарная атака — режим -a 0: hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt ищет MD5-хэш по словарю. Первый запуск занимает ~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 — любой печатный символ.
# Полный перебор 7 символов: 95^7 = 69 трлн комбинаций
hashcat -m 1400 -a 3 hash.txt ?a?a?a?a?a?a?a
# Маска (заглавная + 4 строчных + 2 цифры): ~1.2 млрд комбинаций
hashcat -m 1400 -a 3 hash.txt ?u?l?l?l?l?d?d
# Разница: в 58 000 раз меньше комбинаций
На практике маска отсекает нерелевантные комбинации и сокращает время перебора в разы (а для длинных паролей — на порядки). Если знаешь хотя бы структуру пароля — маска твой лучший друг.
Гибридная атака (-a 6 и -a 7) комбинирует словарь с маской. Режим -a 6 добавляет маску после каждого слова из словаря, -a 7 — перед словом. Подозреваешь пароль вида password123 или admin2024! — гибридная атака найдёт его быстрее чистого перебора: hashcat -m 0 -a 6 hash.txt rockyou.txt ?d?d?d.
Hashcat поддерживает свой синтаксис правил через -r file.rule. Встроенные наборы лежат в директории rules/ установки: best64.rule (64 наиболее эффективных правила — для начала хватит за глаза) и rockyou-30000.rule (30000 правил из анализа утечки). Запуск: hashcat -m 0 -a 0 hash.txt rockyou.txt -r best64.rule. Правила можно комбинировать через несколько флагов -r — каждый набор применяется последовательно, что даёт мультипликативный рост покрытия.
Оба инструмента решают одну задачу — подбор пароля по хэшу. Но trade-off'ы разные:
| Критерий | John the Ripper | Hashcat |
|---|---|---|
| Автоопределение формата | Да | Нет — обязателен -m N |
| Скорость на GPU | Поддержка ограничена | Оптимизирован, быстрее в 5-100x |
| Скорость на CPU | Хорошая | Работает с --force, не оптимизирован |
| Утилиты *2john | Да — zip, ssh, pdf, keepass, rar | Нет |
| Работа в VM без GPU | Нативная поддержка CPU | Требует --force, низкая скорость |
| Маска и гибридные атаки | Поддерживает | Развитый синтаксис, удобнее |
| Multi-GPU | Ручная настройка | Автоматическое распределение |
| Лучший сценарий CTF | Файлы (zip, ssh, pdf), CPU-only | Длинные маски на GPU, массовый перебор |
| Когда НЕ подходит | Массовый перебор длинных паролей | Нет GPU; файл нужно сначала обработать |
Практическое правило: начинай с John (автоопределение + *2john), переключайся на Hashcat когда нужна маска на GPU или словарь не сработал. На CTF с ограниченным временем именно эта последовательность работает лучше всего.
Rockyou.txt — стандартная отправная точка, но далеко не единственный вариант. Для CTF-тасков, где пароль тематический (связан с описанием задачи, персонажем, организацией), кастомные словари работают лучше.
CeWL генерирует словарь из слов на веб-странице: cewl -d 2 -m 5 https://target-site.com -w custom.txt сканирует сайт на глубину 2, собирает слова длиной от 5 символов. Если CTF-таск привязан к конкретному сайту — CeWL даёт релевантный словарь за минуту.
crunch генерирует словари по шаблону: crunch 6 6 0123456789 -o pins.txt создаст все 6-символьные комбинации цифр (миллион вариантов). Для PIN-кодов и паролей известной длины — самое оно.
SecLists (репозиторий Daniel Miessler) — коллекция словарей для пентеста: passwords, usernames, fuzzing-списки. Каталог Passwords/ содержит десятки тематических списков. Для CTF: начинай с rockyou.txt + --rules, не сработало — генерируй кастомный словарь через CeWL из контекста задачи или бери специализированный список из SecLists.
Отдельно про rainbow tables — предвычисленные таблицы соответствия хэш-пароль. RainbowCrack позволяет искать пароль за секунды, но таблицы занимают сотни гигабайт и бесполезны для солёных хэшей (bcrypt, SHA-512crypt). На CTF rainbow tables встречаются редко — задачи обычно решаются словарём или маской.
Шесть ошибок, которые я вижу раз за разом на CTF и в тренировочных тасках:
1. Неверный тип хэша. Самая частая и самая дорогая по времени. 32 символа hex — новичок запускает hashcat -m 1000 (NTLM) вместо -m 0 (MD5). Перебор идёт, GPU греется, результата нет. Всегда проверяй через hashid и hashcat --example-hashes до запуска. Две минуты на проверку экономят двадцать минут вхолостую.
2. Не-jumbo версия John. Стоковый John поддерживает порядка 12 форматов. CTF-таск с SSH-ключом или KeePass-базой просто не распознаётся. Проверка: john --list=build-info — ищи слово «jumbo». Нет — пересобирай из исходников.
3. Pot-файл блокирует повторный запуск. John нашёл пароль, а ты не заметил. Повторный запуск выдаёт «No password hashes left to crack». Кажется, что пароль не найден, а он уже давно в pot-файле. john --show hash.txt — пароль уже там. Hashcat ведёт себя аналогично — hashcat --show -m 0 hash.txt.
4. Hashcat без GPU в виртуалке. VirtualBox и VMware по умолчанию не пробрасывают GPU. Hashcat отказывается запускаться или ползёт на порядки медленнее. Используй --force для CPU-режима или переключись на John. Если работаешь постоянно — настрой GPU passthrough или ставь Kali на bare metal.
5. Не распакован rockyou.txt. В Kali словарь лежит в формате .gz по пути /usr/share/wordlists/rockyou.txt.gz. Без gunzip John и Hashcat не могут прочитать файл. Встречается на каждом втором CTF у тех, кто работает со свежей установкой Kali. Мелочь, а десять минут съедает.
6. Забыт --show после завершения. Hashcat хранит результаты в ~/.local/share/hashcat/hashcat.potfile, John — в ~/.john/john.pot. Перебор завершился, пароль в терминале не видно — смотри pot-файл или используй --show. Pot-файл работает даже после перезагрузки.
Типовой CTF-сценарий от начала до конца. Ты получил файл challenge.zip — защищённый паролем ZIP-архив. Внутри, по условию задачи, лежит текстовый файл с флагом.
Шаг 1. Извлечение хэша. Запускаешь zip2john challenge.zip > hash.txt. Утилита вытаскивает хэш из ZIP-архива и записывает его в формат, понятный John. На выходе — строка с метаданными архива и хэшем пароля.
Шаг 2. Идентификация. Здесь zip2john определяет тип автоматически (PKZIP или WinZip). Для сырых хэшей на этом этапе запустил бы hashid или сверился с hashcat --example-hashes.
Шаг 3. Словарная атака. john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt определит формат автоматически и запустит перебор. Если пароль словарный — результат за секунды.
Шаг 4. Проверка результата. john --show hash.txt показывает найденный пароль. Распаковываешь архив: unzip -P найденный_пароль challenge.zip, читаешь файл с флагом.
Шаг 5 (если словарь не помог). Rules. john --wordlist=rockyou.txt --rules hash.txt. Мутация каждого слова увеличивает покрытие на два порядка. Если пароль — модификация словарного слова (P@ssword, password123!), rules найдут его.
Шаг 6 (если и rules не помогли). Маска в Hashcat. Смотришь подсказки в описании таска. Пароль 6 цифр? Берёшь тот же хэш из zip2john, подбираешь соответствующий режим Hashcat (например, -m 13600 для WinZip AES) через hashcat --example-hashes и запускаешь маску ?d?d?d?d?d?d. Для PIN-кодов и коротких числовых паролей маска справляется за секунды.
Шаг 7 (опционально). Кастомный словарь. Описание таска упоминает персонажа, компанию, дату? Генерируешь тематический словарь через CeWL или crunch, добавляешь --rules для мутации. На тасках среднего уровня именно контекстный словарь даёт флаг.
Весь процесс — от 5 до 15 минут для типового CTF-таска начального уровня. На соревнованиях с ограниченным временем знание этого workflow буквально определяет место в таблице результатов.
Дополнение для blue team: как password cracking выглядит с другой стороны. По классификации D3FEND (MITRE), контрмеры против техники T1110.002 включают Password Rotation (D3-PR), Credential Compromise Scope Analysis (D3-CCSA) и Decoy User Credential (D3-DUC) — ловушки-учётки. Для защиты /etc/shadow (T1003.008) D3FEND рекомендует File Integrity Monitoring (D3-FIM). В SigmaHQ есть правило proc_creation_win_hktl_hashcat.yml для детекта запуска Hashcat на Windows по имени процесса и аргументам командной строки. На CTF эти знания помогают оценить реалистичность таска: если хэш — argon2id с высоким cost factor, словарная атака за время соревнования физически невозможна и задача решается иначе (ищи утечку пароля в другом месте, а не долби хэш).
Я прошёл через десятки CTF-тасков на password cracking за последние два года, и паттерн одинаков: 80% задач закрываются одним workflow. hashid → john --wordlist=rockyou.txt → --show. Без вариантов. Оставшиеся 20% — задачи, где нужно думать: кастомный словарь из контекста таска, маска по подсказке из описания, цепочка *2john → John → rules. Именно на этих 20% разделяются команды в турнирной таблице.
Главная ошибка тех, кто застрял на начальном уровне — учат инструменты, но не учатся думать о паролях. Знать синтаксис hashcat -m 0 -a 3 мало. Нужно понимать: откуда хэш, кто создал пароль, какие паттерны вероятны. Хэш из shadow-файла Linux-сервера — не то же самое, что хэш из веб-приложения 2008 года. Первый — SHA-512crypt с нормальной парольной политикой, второй — MD5 от слова из rockyou. Инструменты вторичны, мышление первично. Если хочешь не просто writeup'ы читать, а пройти всю credential-цепочку от начала до конца — на WAPT это разбирают в модулях с лабами на каждый вектор.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «cryptography».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...