Главная / Блог / Взлом хэшей в CTF: John the Ripper и Hashcat от нуля до первого флага

12 мин.00

Взлом хэшей в CTF: John the Ripper и Hashcat от нуля до первого флага

Взлом хэшей в CTF: John the Ripper и Hashcat от нуля до первого флага

Взлом хэшей в CTF: John the Ripper и Hashcat от нуля до первого флага

Первый CTF, категория Crypto: в условии — строка 5f4dcc3b5aa765d61d8327deb882cf99 и вопрос «Какой пароль?». Сорок минут я тыкался в онлайн-сервисы и бессистемно гуглил, пока сокомандник не показал одну команду в John the Ripper — хэш сломался за доли секунды. Разница между «не знаю с чего начать» и «флаг сдан» — не стаж и не талант, а понимание трёх шагов: определить тип хэша, выбрать инструмент, запустить правильную атаку. Это тот гайд, которого мне не хватило перед первым соревнованием.

Место hash cracking в цепочке атаки

Перед запуском John или Hashcat стоит понять, где взлом хэшей сидит в реальной атаке. По классификации MITRE ATT&CK это техника Password Cracking (T1110.002, тактика Credential Access). Она не живёт сама по себе — до неё идёт извлечение хэшей, после — использование полученных учёток.

Типичная цепочка:

  1. Извлечение хэшей. На Linux — получение /etc/shadow (T1003.008). На Windows — дамп SAM-базы (T1003.002) или памяти LSASS (T1003.001). Иногда хэши валяются в конфигах (T1552.001). В CTF хэш обычно выдаётся в условии напрямую.
  2. Идентификация алгоритма — определение типа хэширования: MD5, SHA-256, bcrypt, NTLM.
  3. Подбор пароля — собственно Password Cracking (T1110.002): перебор кандидатов через словари, маски, правила мутации.
  4. Использование результата — пароль применяется для входа в систему (T1078, Valid Accounts) или сдаётся как флаг в CTF.

В CTF шаги 1 и 4 тривиальны: хэш дан в условии, флаг — пароль в обёртке flag{...}. Вся мякотка — на шагах 2 и 3.

[Применимо: CTF beginner–intermediate; внутренний пентест — крэкинг хэшей из shadow/SAM; внешний пентест — взлом перехваченных NetNTLMv2-хэшей через Responder.]

Определение типа хэша: первый шаг перед взломом

Самая частая ошибка новичка — запустить инструмент, не определив тип хэша. John the Ripper умеет автодетектировать формат, но делает это медленнее и иногда промахивается. Hashcat вообще не запустится без явного -m. Так что идентификация — обязательный первый шаг.

Как определить тип по внешнему виду

Хэши разных алгоритмов выглядят по-разному. Основные маркеры, которые стоит запомнить:

Признак Алгоритм Формат JtR Код Hashcat (-m)
32 hex-символа MD5 --format=raw-md5 0
40 hex-символов SHA-1 --format=raw-sha1 100
64 hex-символа SHA-256 --format=raw-sha256 1400
Префикс $6$ SHA-512crypt (Linux) --format=sha512crypt 1800
Префикс $2a$ или $2b$ bcrypt --format=bcrypt 3200
32 hex, верхний регистр NTLM (Windows) --format=nt 1000

Эту таблицу полезно держать перед глазами на первых соревнованиях. Но для автоматической идентификации есть два помощника.

hashid и hash-identifier

Утилита hashid ставится через pip3 install hashid и принимает хэш как аргумент: hashid '5f4dcc3b5aa765d61d8327deb882cf99'. Вывод покажет список вероятных форматов — MD5, MD4, MD2. В Kali Linux также предустановлен интерактивный скрипт hash-identifier с аналогичной функцией.

Оба инструмента выдают несколько вариантов. Для коротких хэшей без префикса (чистые hex-строки) чаще всего верен первый вариант в списке. Если хэш начинается с $ — это modular crypt format, и алгоритм читается напрямую из префикса.

John the Ripper поддерживает команду john --list=formats | grep -i ntlm, которая покажет все форматы с нужным ключевым словом — удобно, когда не помнишь точное название.

John the Ripper: словарная атака и правила мутации

John the Ripper (JtR) — один из старейших инструментов для подбора паролей по хэшу, написанный Solar Designer. Для CTF нужна jumbo-версия — она поддерживает сотни форматов хэшей, включая zip, pdf, SSH-ключи. В Kali Linux и Parrot OS John предустановлен. Проект открытый, репозиторий — github.com/openwall/john (ветка bleeding-jumbo), активно поддерживается.

Проверить наличие: john --version. Если не установлен: sudo apt install john -y.

Требования к окружению

  • ОС: Kali Linux 2022+ (JtR предустановлен), Ubuntu/Debian (установка через apt), Windows (бинарь с openwall.com)
  • RAM: минимум 2 ГБ для словарных атак, 4 ГБ для работы с крупными словарями
  • VRAM: не требуется — JtR работает на CPU (GPU-поддержка в jumbo-версии есть, но ограничена)
  • Словарь: rockyou.txt — в Kali лежит по пути /usr/share/wordlists/rockyou.txt.gz, распаковать через gunzip
  • Сеть: не требуется, все операции локальные

Словарная атака (dictionary attack)

Основной режим для CTF. Хэш записывается в текстовый файл, по одному на строку. Формат — чистый хэш или username:hash.

Для примера создадим тестовый MD5-хэш слова «password123» через Python: python3 -c "import hashlib; print(hashlib.md5(b'password123').hexdigest())" > hash.txt. В файле окажется 482c811da5d5b4bc6d497ffa98491e38.

john --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 hash.txt

Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Press 'q' or Ctrl-C to abort, almost any other key for status
password123      (?)
1g 0:00:00:00 DONE 100.0%
Session completed

Разбор: --wordlist — путь к словарю, --format=raw-md5 — явное указание типа хэша (без него John пробует угадать, что медленнее и ненадёжнее). После взлома результат сохраняется в pot-файл (john --show hash.txt покажет все найденные пароли). Хотите повторить атаку с тем же хэшем — добавьте --potfile-disable, иначе John пропустит уже найденный хэш.

Если пароль есть в rockyou.txt — John найдёт его за доли секунды. Словарная атака на CPU по rockyou.txt (14+ миллионов записей) для быстрых хэшей вроде MD5 и SHA-1 завершается практически мгновенно.

Режим правил (Rules)

Когда пароль — мутация словарного слова (например, Password123! вместо password), помогают правила. Они трансформируют каждое слово из словаря на лету: добавляют цифры, меняют регистр, дублируют символы.

Встроенный набор правил jumbo-версии запускается флагом --rules=Jumbo: john --wordlist=rockyou.txt --rules=Jumbo --format=raw-md5 hash.txt. Правило --rules=Single хорошо работает, если в хэш-файле указано имя пользователя — John мутирует его как базу пароля.

Основные операции синтаксиса правил (описаны в john.conf): c — капитализация первой буквы, l — перевод в нижний регистр, $N — добавить символ N в конец, r — реверс строки, d — дубликация. Для CTF beginner-уровня встроенных наборов хватит за глаза, кастомные правила писать не придётся.

Вспомогательные скрипты *2john

Главный козырь JtR — набор скриптов для извлечения хэшей из защищённых файлов. Если в CTF-задании дан запароленный zip — команда zip2john protected.zip > zip_hash.txt вытянет хэш, который затем ломается стандартной словарной атакой. Аналогично работают pdf2john, ssh2john, rar2john, keepass2john и десятки других. Для Linux-систем утилита unshadow объединяет /etc/passwd и /etc/shadow в формат, пригодный для John.

Hashcat: маски и GPU-ускорение

Hashcat — второй ключевой инструмент. Главное архитектурное отличие: Hashcat изначально спроектирован под GPU-вычисления. На видеокарте среднего уровня Hashcat перебирает миллиарды кандидатов в секунду — на порядки быстрее JtR на CPU. Проект открытый с 2015 года, репозиторий — github.com/hashcat/hashcat, активно поддерживается.

На CPU Hashcat тоже работает, но без GPU теряет своё главное преимущество. Для CTF на ноутбуке без дискретной видеокарты CPU-режим допустим при работе с короткими паролями и быстрыми хэшами (MD5, SHA-1). Для bcrypt или длинных паролей — уже мучение.

Ключевые отличия от JtR

Hashcat не автодетектирует формат хэша — обязателен флаг -m с числовым кодом: -m 0 — MD5, -m 100 — SHA-1, -m 1400 — SHA-256, -m 1700 — SHA-512, -m 1000 — NTLM, -m 3200 — bcrypt. Режимы атаки указываются через -a: -a 0 — словарная, -a 3 — brute-force/mask, -a 6 — гибридная (словарь + маска).

Словарная атака: hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt. При первом запуске Hashcat строит кэш словаря (10–15 секунд). При повторных — кэш переиспользуется.

Mask-атака: главная сила Hashcat

Mask-атака — оптимизированный brute-force, где указывается шаблон пароля. Критически полезна в CTF, когда структура пароля угадывается из подсказки.

hashcat -m 0 -a 3 hash.txt ?u?l?l?l?l?d?d

# Чарсеты масок:
# ?l = строчная буква (a-z)
# ?u = заглавная буква (A-Z)
# ?d = цифра (0-9)
# ?s = спецсимвол (!@#$%...)
# ?a = любой печатный символ

Маска ?u?l?l?l?l?d?d описывает пароль вида «Слово42» — заглавная буква, четыре строчных, две цифры. Если задание подсказывает такой формат, маска сократит пространство перебора в десятки раз по сравнению с ?a?a?a?a?a?a?a. Маска с известным первым символом ускоряет взлом примерно в 2.5–3 раза по сравнению с полным перебором того же пароля.

Правила в Hashcat

Hashcat поддерживает правила, совместимые с JtR по базовому синтаксису (по документации hashcat.net, функции с одинаковыми буквенными именами совместимы на 100%). Встроенный файл best64.rule содержит 64 наиболее результативных правила — отличный выбор для CTF: hashcat -m 0 -a 0 hash.txt rockyou.txt -r rules/best64.rule.

Отдельная фишка Hashcat — стекинг правил: несколько файлов через -r комбинируются мультипликативно. Три правила в первом файле и три во втором дают девять комбинаций. Приём мощный, но с большими файлами объём комбинаций растёт экспоненциально — не злоупотребляйте.

Для отладки правил есть режим --stdout: hashcat -r rule.txt --stdout wordlist.txt покажет трансформированные слова без хэширования — удобно проверить, что правило делает то, что вы задумали.

John the Ripper vs Hashcat: когда что использовать

Инструмент Преимущества Ограничения Когда использовать Когда не использовать
John the Ripper Автодетект формата, скрипты *2john, низкий порог входа, инкрементальный режим Слабая GPU-поддержка, медленнее на brute-force CTF: запароленные файлы (zip/pdf/ssh), первый проход по словарю, Linux shadow Длинные mask-атаки на GPU, массовый крэкинг
Hashcat Нативное GPU-ускорение, мощные маски, стекинг правил, отладка через --stdout Нет автодетекта формата, нет аналога *2john Mask-атаки с подсказкой о структуре, brute-force с GPU Запароленные файлы без стороннего извлечения хэша

Алгоритм выбора для CTF

  1. Задание дало файл (zip, pdf, KeePass) — John: *2john вытянет хэш, затем словарная атака.
  2. Задание дало чистый хэш без подсказок — определите тип через hashid, запустите John с --wordlist=rockyou.txt и явным --format. Не нашёл — добавьте --rules=Jumbo.
  3. Известна структура пароля (подсказка в условии: «6 символов, начинается с заглавной») — Hashcat с mask-атакой.
  4. GPU доступен — для brute-force и mask всегда Hashcat.
  5. Только CPU, короткий хэш — разницы почти нет, используйте то, что привычнее.

На практике оба инструмента дополняют друг друга. Типичный CTF-workflow: JtR для быстрого первого прохода и работы с файлами, Hashcat — когда нужна грубая вычислительная сила.

Rockyou.txt и подготовка словарей для CTF

Словарь rockyou.txt — свыше 14 миллионов паролей из утечки сервиса RockYou в 2009 году. Он покрывает подавляющее большинство CTF-задач beginner-intermediate уровня. В Kali Linux лежит по пути /usr/share/wordlists/rockyou.txt.gz — перед первым использованием распаковать: gunzip /usr/share/wordlists/rockyou.txt.gz.

Утечки продолжают пополнять базы паролей. По данным Have I Been Pwned, за последние годы произошли крупные сливы с миллионами записей: Z-lib в 2024 году — 9.7 млн записей, российский онлайн-кинотеатр START — 7.4 млн записей. Люди продолжают ставить слабые и повторяющиеся пароли, что делает словарные атаки эффективными далеко за пределами CTF.

Для задач посложнее rockyou бывает мало. Коллекция SecLists (github.com/danielmiessler/SecLists) содержит десятки специализированных словарей: пароли по длине, по языку, по тематике. Директория Passwords/ — основной раздел.

Фильтрация словаря под подсказку

Если задание намекает на свойства пароля, словарь стоит отфильтровать — это ускоряет атаку на порядки. Классический пример: задание сообщает, что пароль из 11 символов и связан со словом «academy». Фильтрация через awk 'length($1) == 11 { print $1 }' rockyou.txt | grep -i 'academy' > filtered.txt оставит единицы строк вместо 14 миллионов — John сломает хэш мгновенно.

Практика: от хэша до флага за пять минут

Смоделируем типичное CTF-задание. Условие: «Перехвачен хэш пароля администратора. Найди пароль. Формат флага: flag{пароль}

Дан хэш: 482c811da5d5b4bc6d497ffa98491e38

Требования к окружению

  • ОС: Kali Linux 2022+ или любой Linux с установленными JtR, hashid
  • RAM: 4 ГБ минимум
  • Словарь: rockyou.txt распакован и доступен
  • Сеть: не требуется

Решение по шагам

Шаг 1: определяем тип. Запускаем hashid '482c811da5d5b4bc6d497ffa98491e38'. Вывод покажет MD5 как наиболее вероятный формат — 32 hex-символа без префикса.

Шаг 2: записываем хэш в файл. echo '482c811da5d5b4bc6d497ffa98491e38' > target.txt

Шаг 3: словарная атака. john --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 target.txt — результат: password123, время — менее секунды.

Шаг 4: проверяем. john --show target.txt — подтверждает найденный пароль. Флаг: flag{password123}.

Если словарь не помог — добавляем правила: john --wordlist=rockyou.txt --rules=Jumbo --format=raw-md5 target.txt. Если и это не сработало, а задание содержит подсказку о структуре — переходим к Hashcat с маской: hashcat -m 0 -a 3 target.txt ?l?l?l?l?l?l?d?d.

Альтернативный путь через Hashcat для того же хэша: hashcat -m 0 -a 0 target.txt /usr/share/wordlists/rockyou.txt. Результат тот же, первый запуск чуть медленнее из-за инициализации кэша.

Ограничения: когда инструменты не помогут

bcrypt и scrypt: медленные хэши

Не все хэши ломаются за секунды. bcrypt (префикс $2a$) и scrypt специально спроектированы как медленные хэш-функции: каждая проверка кандидата занимает на порядки больше времени, чем MD5. Словарная атака по rockyou.txt на bcrypt с cost factor 12 может занять часы даже на GPU. В CTF задание с bcrypt — сигнал, что пароль либо очень короткий (4–5 символов), либо есть подсказка для сужения перебора.

Соль и salted-хэши

Хэши с солью (SHA-512crypt в Linux /etc/shadow, bcrypt) не поддаются атаке через rainbow tables. John и Hashcat умеют работать с солёными хэшами, но уникальность каждой соли делает массовый крэкинг медленнее. В CTF соль обычно включена в хэш-строку (формат $6$salt$hash) и обрабатывается автоматически — отдельных действий не требуется.

Длинные и сложные пароли

Brute-force пароля из 12+ символов с полным ASCII-набором — нереалистичен. Пространство перебора растёт экспоненциально: 6 символов ?a — около 735 миллиардов комбинаций (часы на GPU), 8 символов — 6.6 квадриллионов (годы). Если словарная атака и правила не помогли, в CTF стоит вернуться к условию задачи и поискать дополнительную подсказку, а не ждать завершения brute-force.

Кастомные алгоритмы

Иногда в CTF используются нестандартные схемы: двойное хэширование md5(md5(password)), конкатенация с секретом sha256(password + "salt_string"), или вовсе самописные функции. Hashcat поддерживает некоторые составные форматы (например, -m 2600 для md5(md5($pass))), но для полностью кастомных алгоритмов придётся писать скрипт. Это уже задача не на cracking, а на reverse engineering хэш-функции — другая категория навыков.

Большинство новичков, приходя в CTF, начинают с изучения экзотики — rainbow tables, коллизии, timing attacks на хэш-функции. На практике свыше 80% задач Crypto beginner-уровня решаются одной командой: john --wordlist=rockyou.txt --format=<тип> hash.txt. Не потому что задачи примитивные — потому что составители моделируют реальное поведение пользователей, а пользователи выбирают слабые пароли.

На соревнованиях я не раз видел ребят, которые писали кастомные Python-скрипты для MD5-перебора, не зная, что John делает это в тысячи раз быстрее. Или тратили час на установку GPU-драйверов для Hashcat, когда задача решалась за 0.1 секунды на CPU с rockyou.txt. Самый действенный совет: возьмите три хэша разных типов — MD5, SHA-256, bcrypt — запишите в файлы, сломайте каждый через John со словарём, повторите через Hashcat с маской. Пятнадцать минут практики заменяют два часа чтения документации. Если хочется не точечных навыков, а системного понимания ИБ с нуля — на IB Basics в Codeby School берут с любого старта, включая криптографию и практику атак.

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».

Поделиться

0 комментариев

Пожалуйста, войдите, чтобы оставить комментарий.

Загрузка комментариев...