
hate_crack v2.14.3
Инструмент для автоматизации методологий взлома с помощью Hashcat от команды TrustedSec.
___ ___ __ _________ __
/ | \_____ _/ |_ ____ \_ ___ \____________ ____ | | __
/ ~ \__ \\ __\/ __ \ / \ \/\_ __ \__ \ _/ ___\| |/ /
\ Y // __ \| | \ ___/ \ \____| | \// __ \\ \___| <
\___|_ /(____ /__| \___ >____\______ /|__| (____ /\___ >__|_ \
\/ \/ \/_____/ \/ \/ \/ \/
Установка
Установка из исходников — единственный поддерживаемый способ. hate_crack не
распространяется через PyPI: pip install hate-crack указывает на 0.0.0 заглушку,
которая намеренно не работает и ведёт обратно сюда. Имя удерживается только для того, чтобы
никто другой не смог опубликовать под ним клон — см.
packaging/pypi-placeholder/.
1. Установка hashcat
Hashcat должен быть установлен и доступен в вашем PATH:
Ubuntu/Kali:```bash sudo apt-get install -y hashcat
macOS (Homebrew):```bash
brew install hashcat
Или скачайте готовый бинарный файл с https://hashcat.net/hashcat/ и укажите hcatPath в config.json в его расположение.
2. Скачивание hate_crack
Клонируйте с субмодулями (требуется для hashcat-utils, princeprocessor, pcfg_cracker и опционально omen):```bash git clone --recurse-submodules https://github.com/trustedsec/hate_crack.git cd hate_crack
Если вы клонировали без подмодулей, инициализируйте их:```bash
git submodule update --init --recursive
Затем настройте конфигурацию при необходимости. hate_crack использует два конфигурационных файла, каждый из которых отвечает за свой набор параметров:
config.json— пути к wordlist, маски, правила, тюнинг, potfile, путь к hashcat, лимиты кандидатов, переключатели уведомлений, значения по умолчанию для CLI (35 параметров)..env— только настройки интеграции со сторонними сервисами: учётные данные Hashview и Hashmob, учётные данные Pushover, Ollama и pipal (14 параметров). Не отслеживается git, создаётся с правами0600.
Эта граница проведена именно здесь по одной причине: .env — это файл, который может содержать секреты. Учётные данные и конфигурация сторонних сервисов хранятся в неотслеживаемом файле с правами 0600; всё, что hate_crack делает локально, остаётся в config.json, который безопасно публиковать, сравнивать и сохранять в собственные заметки. Именно поэтому учётные данные Pushover находятся в .env, а переключатели включения/отключения Pushover — в config.json: переключатели — это локальные настройки, а не секреты.
У каждого ключа ровно одно место. Ключ, размещённый в другом файле, игнорируется, а hate_crack выводит предупреждение с названием файла, в котором он должен находиться. Любой ключ по-прежнему можно переопределить для одного запуска, экспортировав его переменную окружения. Большинству пользователей этот шаг можно пропустить, поскольку пути по умолчанию работают сразу.
config.json является постоянным и полноценным — он не объявлен устаревшим, и его удаление не запланировано. Переместились только настройки интеграций.
Обновление с единого config.json? hate_crack выполнит миграцию автоматически при первом запуске: настройки интеграций копируются в новый файл .env с правами 0600, затем удаляются из config.json, чтобы оба файла не претендовали на них. Он выводит, какие ключи были перемещены (никогда — их значения), и сохраняет ваш исходный файл как config.json.pre-split.bak перед его изменением. Всё остальное в config.json остаётся без изменений, включая порядок ключей.
Первый запуск: hate_crack создаёт оба файла за вас, так что делать ничего не нужно. Чтобы настроить .env вручную, скопируйте отслеживаемый шаблон:```bash
cp .env.example .env
chmod 600 .env
`.env.example` закоммичен и поставляется со всеми пустыми ключами учётных данных. Сам `.env` **никогда** нельзя коммитить — он находится в .gitignore, как и его обычные варианты резервных имён, и hate_crack всегда создаёт его с режимом `0600` (только чтение и запись для владельца). Файл `.env.example` генерируется из схемы; перегенерируйте его после изменения `hate_crack/config_schema.py` с помощью `uv run python -m hate_crack.config_writer`.
### 3. Установка зависимостей и hate_crack
Проще всего запустить `make` (или `make install`) — он автоматически определяет вашу ОС и устанавливает:
- Внешние зависимости (p7zip, transmission-daemon / transmission-remote)
- Собирает подмодули (hashcat-utils, princeprocessor, pcfg_cracker и, при желании, omen)
- Python-зависимости через uv и CLI-обёртку в `~/.local/bin/hate_crack````bash
make
Это идемпотентно - оно пропускает уже установленные инструменты. Чтобы принудительно выполнить чистую переустановку:```bash make reinstall
**Или установите зависимости вручную:**
### Внешние зависимости
Они требуются для определённых процессов загрузки/извлечения:
- `7z`/`7za` (p7zip) — используется для извлечения архивов `.7z`.
- `transmission-daemon` / `transmission-remote` — используется для загрузки торрентов Weakpass.
Команды установки вручную:
Ubuntu/Kali:```bash
sudo apt-get update
sudo apt-get install -y p7zip-full transmission-daemon
macOS (Homebrew):```bash brew install p7zip transmission-cli # provides transmission-daemon and transmission-remote
Затем установите зависимости Python и CLI-обёртку:```bash
uv sync
mkdir -p ~/.local/bin
printf '#!/usr/bin/env bash\nset -euo pipefail\nexec uv run --directory %s python -m hate_crack "$@"\n' "$(pwd)" > ~/.local/bin/hate_crack
chmod +x ~/.local/bin/hate_crack
Структура проекта
Основная логика теперь разделена на модули в каталоге hate_crack/:
hate_crack/cli.py: вспомогательные функции argparse и переопределения конфигурации.hate_crack/api.py: интеграции с Hashview, Weakpass и Hashmob (загрузки/меню/вспомогательные функции).hate_crack/attacks.py: обработчики атак из меню.hate_crack/hashmob_wordlist.py: утилиты для словарей Hashmob (тонкая обёртка; вызывает api.py).hate_crack/corpus_stats.py: статистика паролей по всему корпусу, используемая для описания корпуса LLM.hate_crack/plaintext.py: извлекает пароль из строки корпуса (удаление префикса хеша, декодирование$HEX[...]); используется режимами LLM, corpus_stats и rulegen.hate_crack/llm.py: генерация структурированных (JSON) кандидатов LLM через Atomic Agents.hate_crack/menu.py: общий рендерер меню, включая необязательную навигацию стрелками.hate_crack/noninteractive.py: диспетчер для скриптовых подкоманд атак.hate_crack/notify/: пакет уведомлений (бэкенд Pushover, отслеживание завершения каждого подбора).hate_crack/username_detect.py: определяет входные файлы видаusername:hash, чтобы решить, использовать ли--usernameв hashcat.hate_crack/formatting.py,hate_crack/progress.py: вспомогательные функции форматирования вывода и отображения прогресса.hate_crack/main.py: основная реализация CLI.
Верхнеуровневый hate_crack.py остаётся главной точкой входа и координирует эти модули.
Ссылки и благодарности
Этот проект зависит от ряда внешних проектов и сервисов и вдохновлён ими. Благодарности:
- Hashview (http://github.com/hashview/)
- Weakpass (https://weakpass.com)
- Hashmob (https://hashmob.net)
Использование
После установки с помощью make запускайте hate_crack из любого места:```bash
hate_crack
or with arguments:
hate_crack <hash_file> <hash_type> [options]
Как вариант, запустите через `uv`:```bash
uv run hate_crack.py <hash_file> <hash_type>
Запуск как инструмент (рекомендуется)
Установка с помощью make из корня репозитория — это собирает подмодули и объединяет ресурсы:```bash
cd /path/to/hate_crack
make
hate_crack
Команда `make install` создаёт bash-шим в `~/.local/bin/hate_crack`, который запускается из каталога репозитория, поэтому конфигурация и ресурсы всегда находятся независимо от вашей текущей рабочей директории.
Конфигурация также ищется в:
- Корне репозитория и каталоге пакета
- `~/.hate_crack`
**Примечание:** параметр `hcatPath` в `config.json` предназначен только для указания расположения бинарного файла hashcat (необязателен, если hashcat находится в PATH). Ресурсы Hate_crack (hashcat-utils, princeprocessor, pcfg_cracker, omen) загружаются из каталога репозитория и автоматически включаются в комплект командой `make install`.
### Запуск как скрипт
Скрипт использует shebang `uv`. Сделайте его исполняемым и запустите:```bash
chmod +x hate_crack.py
./hate_crack.py
Вы также можете использовать Python напрямую:```bash python hate_crack.py
### Неинтерактивное / скриптовое использование
Для автоматизации можно запустить одну атаку напрямую, минуя меню. Имя атаки передаётся первым аргументом, за которым следуют файл хешей и тип хеша hashcat. Запросы предварительной обработки (фильтрация учётных записей компьютеров, перебор LM-хешей в первую очередь, дедупликация повторяющихся учётных записей) в этом режиме автоматически принимают значения по умолчанию. Процесс завершается с кодом `0` при успехе и ненулевым кодом при ошибке (отсутствующий файл хешей, нечисловой тип хеша, отсутствующий словарь или неизвестное имя файла правил).```bash
# Quick crack: one wordlist + optional rule(s) from the rules directory
hate_crack quick hashes.txt 1000 --wordlist rockyou.txt --rules best64.rule
# Chain two rules in a single run
hate_crack quick hashes.txt 1000 --wordlist rockyou.txt --rules best64.rule+d3ad0ne.rule
# Run two rules as two separate passes
hate_crack quick hashes.txt 1000 --wordlist rockyou.txt --rules best64.rule d3ad0ne.rule
# Canned dictionary methodology (uses your configured wordlists)
hate_crack dict hashes.txt 1000
# Brute force lengths 1-8
hate_crack brute hashes.txt 1000 --min 1 --max 8
# Top-mask attack targeting ~4 hours
hate_crack topmask hashes.txt 1000 --target-time 4
Troubleshooting
Error: "would clobber existing tag" when updating
Старый клон может отказаться обновляться, выводя длинный список строк вроде:``` ! [rejected] v2.5.0 -> v2.5.0 (would clobber existing tag)
Это затрагивает клоны, созданные до июля 2026 года. Опубликованная история была тогда переписана, чтобы удалить некоторые файлы, которые никогда не должны были быть закоммичены, из-за чего каждый коммит получил новый ID; поэтому теги старого клона указывают на объекты, которых в этом репозитории больше нет, и git отказывается перемещать тег, который у него уже есть. С вашей рабочей копией всё в порядке, и никакие данные о взломе не находятся под угрозой.
Восстановление выполняется одноразовым сбросом. Это отбрасывает локальные коммиты и правки в рабочей копии, поэтому, если вы настроили что-либо, отслеживаемое git (в отличие от `config.json`, который не отслеживается), сначала закоммитьте это в ветку:```bash
cd /path/to/hate_crack
git fetch --tags --force origin
git checkout -B main origin/main
make install
--force здесь только обновляет теги; он не может изменить ваши коммиты. После этого
встроенный механизм обновления работает нормально. Версии до 2.18 не могли выполнить это
восстановление самостоятельно, поэтому его нужно один раз сделать вручную.
Ошибка: каталог сборки не существует
Если вы видите ошибку вроде:``` Error: Build directory /opt/hashcat/hashcat-utils does not exist. Expected to find expander at /opt/hashcat/hashcat-utils/bin/expander.
Это означает, что ресурсы hate_crack не были включены в установленный пакет.
**Понимание путей:**
- `hcatPath` в config.json → указывает на **расположение бинарного файла hashcat** (необязательно, может быть в PATH)
- `hashcat-utils/` и `princeprocessor/` → включаются в пакет командой `make install`
**Решение:**
Переустановите с помощью Makefile, который собирает подмодули и устанавливает инструмент:```bash
cd /path/to/hate_crack # the repository checkout
make install
Конфигурация по умолчанию (config.json.example):
Большинство пользователей могут использовать настройки по умолчанию без изменений:
hcatWordlists:./wordlists(относительно корня репозитория или HOME/.hate_crack)hcatOptimizedWordlists:./optimized_wordlists(каталог, используемый Quick Crack; возвращается кhcatWordlists, если не найден)rules_directory:./hashcat/rules(включает правила субмодулей)hcatTuning: `` (пустая строка — флаги тюнинга по умолчанию отсутствуют)
Примеры настроек config.json:```json { "hcatPath": "/usr/local/bin", # Location of hashcat binary (optional, auto-detected from PATH) "hcatBin": "hashcat", # Hashcat binary name "hcatWordlists": "./wordlists", # Dictionary wordlist directory (relative or absolute) "rules_directory": "./hashcat/rules", # Rules directory (relative or absolute) "hcatTuning": "", # Additional hashcat flags (empty by default) ... }
**Загрузка конфигурации:**
- Приоритет для каждого ключа: `os.environ` > собственный файл этого ключа (`.env` или `config.json`) > встроенное значение по умолчанию
- Для отсутствующих ключей используются встроенные значения по умолчанию; `config.json.example` документирует каждый ключ из `config.json`
- Оба файла ищутся независимо друг от друга в следующем порядке: **корень репозитория**, затем **каталог установленного пакета**, затем **`~/.hate_crack`**. Побеждает первый найденный экземпляр; нормально, если два файла окажутся из разных каталогов.
- При первом запуске создаются оба файла — `config.json` из `config.json.example`, `.env` из встроенных значений по умолчанию. Если в старом `config.json` всё ещё хранятся ключи интеграции, они копируются в новый `.env`, и hate_crack сообщает, какие из них удалить из `config.json`; сам он никогда не редактирует этот файл.
- При каждом запуске hate_crack выводит два файла, которые были фактически загружены: ```
[*] config.json: /home/you/.hate_crack/config.json
[*] .env: /home/you/.hate_crack/.env
Прочитайте эти две строки, прежде чем отлаживать настройку, которая «не применяется». Они здесь из-за двух ловушек в порядке поиска:
- Чекаут имеет приоритет над вашим домашним каталогом. Сначала ищется корень репозитория, поэтому
.envилиconfig.json, лежащие в любом чекауте, из которого вы запускаете инструмент, имеют приоритет над тем, что в~/.hate_crack— а запуск инструмента из чекаута — это именно то, что создаёт эти файлы там в первую очередь. - Текущая рабочая директория никогда не просматривается.
.envв каталоге, где вы находитесь, намеренно игнорируется: каталоги проектов полны файлов, которые никто не задумывал как конфигурацию. Поместите его в корень репозитория или в~/.hate_crack.
Ошибка: слияние с ref 'refs/heads/master', но такой ref не был получен
Если вы видите:``` Your configuration specifies to merge with the ref 'refs/heads/master' from the remote, but no such ref was fetched.
Ветка по умолчанию была переименована с `master` на `main`. Исправьте с помощью:```bash
git remote set-head origin -a
git branch -m master main
git branch --set-upstream-to=origin/main main
git pull
Цели Makefile
По умолчанию (полная установка) - собирает подмодули, устанавливает зависимости и устанавливает инструмент:```bash make
or explicitly:
make install
Это идемпотентно — пропускает уже установленные инструменты.
**Принудительная чистая переустановка:**```bash
make reinstall
Быстрое обновление — пересобирает подмодули и переустанавливает инструмент (после получения изменений):```bash make update
**Uninstall** - удаляет зависимости ОС и инструмент:```bash
make uninstall
Соберите только hashcat-utils:```bash make hashcat-utils
**Запуск тестов** - автоматически обрабатывает HATE_CRACK_SKIP_INIT при необходимости:```bash
make test
Отчёт о покрытии:```bash make coverage
**Очистить артефакты сборки/тестирования:**```bash
make clean
Разработка
Настройка окружения для разработки
Установите проект с опциональными зависимостями для разработки (включая линтеры и инструменты тестирования):```bash make dev-install
### Запуск линтеров и проверок типов
Перед отправкой изменений запустите эти проверки локально. Используйте `make lint` для всего, или запускайте отдельные проверки:
**Ruff (линтинг и форматирование):**```bash
make ruff
# or manually:
uv run ruff check hate_crack tests tools packaging hate_crack.py
Автоисправление проблем:```bash uv run ruff format hate_crack tests tools packaging hate_crack.py uv run ruff check --fix hate_crack tests tools packaging hate_crack.py
**ty (проверка типов):**```bash
make ty
# or manually:
uv run ty check hate_crack
Запустить все проверки вместе:```bash make lint
### Запуск тестов
Тесты автоматически определяют, когда подмодули не собраны, и устанавливают `HATE_CRACK_SKIP_INIT=1` автоматически.```bash
make test
Или запустите pytest напрямую:```bash uv run pytest -v
С покрытием:```bash
make coverage
Или с pytest:```bash uv run pytest --cov=hate_crack
### Git-хуки (prek)
Git-хуки управляются с помощью [prek](https://github.com/j178/prek) (v0.3.3+). Установите хуки с помощью:```bash
prek install --hook-type pre-push --hook-type pre-commit
Это устанавливает хуки, определённые в prek.toml, с использованием схемы TOML для локального репозитория pre-commit:
- pre-push (локальные хуки): ruff, ruff-format, ty, pytest, pytest-lima, bandit
- pre-commit (из
pre-commit/pre-commit-hooks): trailing-whitespace, end-of-file-fixer, check-yaml, check-merge-conflict, check-added-large-files, detect-private-key
Автофиксаторы pre-commit перезаписывают файлы на месте, поэтому после их запуска снова индексируйте изменения и создайте коммит.
Примечание: prek 0.3.3 ожидает repos = [...] на верхнем уровне. Старый формат [hooks.<stage>] commands = [...] не поддерживается.
Навигация по меню с помощью стрелок
По умолчанию меню используют классический выбор с помощью пронумерованного print() + input(), который принимает полные многозначные номера.
Чтобы включить навигацию с помощью стрелок через simple-term-menu, установите HATE_CRACK_ARROW_MENU=1. В этом режиме работают только однозначные клавиши быстрого доступа; до пунктов с номерами 10 и выше нужно добираться стрелками. Режим стрелок также требует TTY, поэтому он остаётся выключенным, когда вывод перенаправляется через конвейер.
Зависимости для разработки
Дополнительная группа [dev] включает:
- ty - Статический проверщик типов
- ruff - Быстрый линтер и форматтер Python
- pytest - Фреймворк для тестирования
- pytest-cov - Отчёт о покрытии кода
Общие параметры:
--download-hashview: Скачать хэши из Hashview перед взломом.--hashview: Интерактивное меню Hashview для управления хэшами, словарями и задачами.--hashview --help: Показать параметры командной строки Hashview.--weakpass: Скачать словари с Weakpass.--hashmob: Скачать словари с Hashmob.net.--download-torrent <FILENAME>: Скачать конкретный торрент-файл Weakpass.--download-all-torrents: Скачать все доступные торренты Weakpass из кэша.--wordlists-dir <PATH>/--optimized-wordlists-dir <PATH>: Переопределить каталоги словарей.--pipal-path <PATH>: Переопределить путь к pipal.--restore-potfile: Пересоздать<hashfile>.outиз POT-файла hashcat при запуске, заменяя существующее содержимое, затем продолжить в обычное меню. Без этого флага поиск POT выполняется только тогда, когда.outещё не существует. Пункт меню 93 делает то же самое по запросу, с запросом подтверждения.--maxruntime <SECONDS>: Переопределить максимальное время выполнения.--bandrel-basewords <PATH>: Переопределить файл базовых слов bandrel.--update: Обновить до последнего релиза и переустановить. Переключает рабочую копию наmain, если она находится на другой ветке, так как теги релизов находятся там.--nightly: Обновить до последней nightly-версии вместо этого, из веткиnightly-dev. Nightly-сборки прошли CI, но не входят в оформленный релиз. Также может быть записано как--update --nightly.--no-optimized-kernel(или--no-optimize): Никогда не передавать-Oв hashcat на протяжении всего запуска. ПереопределяетoptimizedKernelAttacksвconfig.jsonи убирает любой-O, который вы указали вhcatTuning. Ничего не записывается обратно в конфиг, поэтому это применяется только к текущему запуску. С подкомандой указывайте его перед подкомандой:./hate_crack.py --no-optimize quick hashes.txt 1000 --wordlist words.txt.--debug: Включить отладочное журналирование (пишет в stderr).
Интеграция с Hashview
hate_crack интегрируется с Hashview для централизованного управления хэшами и распределённого взлома.
Интерактивное меню
Доступ к интерактивному меню Hashview:```bash hate_crack.py --hashview
Menu options:
- **(1) Загрузить взломанные хэши** - Загрузить результаты взлома из текущей сессии в Hashview
- **(2) Загрузить словарь** - Загрузить файл словаря в Hashview
- **(3) Скачать словарь** - Скачать словарь из Hashview
- **Скачать правило** - Скачать файл правил из Hashview (распакованный в открытый текст, готовый для `hashcat -r`)
- **(4) Скачать оставшиеся хэши** - Скачать оставшиеся невзломанные хэши (предлагает переключиться для взлома)
- **(5) Скачать найденные хэши** - Скачать уже взломанные хэши с паролями в открытом виде (для справки/анализа)
- **(6) Загрузить файл хэшей и создать задание** - Загрузить новый файл хэшей и создать задание на взлом
- **(99) Назад в главное меню** - Вернуться в главное меню
**Важно: Скачать найденные и Скачать оставшиеся**
- **Скачать оставшиеся хэши (4)**: Скачивает невзломанные хэши, которые требуют взлома. Автоматически объединяет с любыми найденными хэшами, если они доступны, и предлагает переключиться на этот файл хэшей для взлома.
- **Скачать найденные хэши (5)**: Скачивает уже взломанные хэши в формате hash:cleartext. Они предназначены для справки и не могут быть взломаны дальше. Запрос на переключение не показывается.
#### Интерфейс командной строки
Операции Hashview также можно выполнять через командную строку:
Загрузить взломанные хэши:```bash
hate_crack.py --hashview upload-cracked --file <output_file>.out --hash-type 1000
Загрузите список слов:```bash hate_crack.py --hashview upload-wordlist --file .txt --name "My Wordlist"
Скачайте файл правил (сохранённый в распакованном виде, готовый для `hashcat -r`):```bash
hate_crack.py --hashview download-rules --rules-id 4 --output best64.rule
Скачать оставшиеся хеши (невзломанные хеши для взлома):```bash hate_crack.py --hashview download-left --customer-id 1 --hashfile-id 123
Скачать найденные хеши (уже взломанные хеши с открытым текстом):```bash
hate_crack.py --hashview download-found --customer-id 1 --hashfile-id 123
Загрузите hashfile и создайте задачу:```bash
hate_crack.py --hashview upload-hashfile-job --file hashes.txt --customer-id 1
--hash-type 1000 --job-name "NTLM Crack Job" --hashfile-name "Domain Hashes"
#### Конфигурация
Укажите учетные данные Hashview в `.env` (это настройки интеграции, поэтому они не хранятся в `config.json`):```
HASHVIEW_URL=https://hashview.example.com
HASHVIEW_API_KEY=your-api-key-here
Конфигурация Ollama
Атака LLM (вариант 12) использует Ollama для генерации кандидатов паролей. Настройте модель, контекстное окно и таймаут запроса в .env:```
OLLAMA_MODEL=qwen2.5:32b
OLLAMA_NUM_CTX=8192
OLLAMA_TIMEOUT=300
- **`OLLAMA_MODEL`** — Модель Ollama, используемая для генерации кандидатов (по умолчанию: `qwen2.5:32b`). LLM-атака использует структурированный (JSON) вывод, поэтому выбирайте модель с хорошей поддержкой инструментов/JSON.
- **`OLLAMA_NUM_CTX`** — Размер контекстного окна для модели (по умолчанию: `8192`). До введения статистики по корпусу это значение было `2048`, что было слишком мало для размещения передаваемого промпта: 500 выбранных открытых текстов занимают примерно 2 000–3 500 токенов ещё до системного промпта и ответа, поэтому Ollama молча обрезала часть выборки, которую сэмплер тщательно распределил по файлу.
- **`OLLAMA_TIMEOUT`** — Количество секунд ожидания ответа генерации до прекращения попытки (по умолчанию: `300`). Увеличьте это значение, если большая модель всё ещё загружается в VRAM при первом запросе, что в противном случае может превысить тайм-аут; hate_crack выводит истекшее время тайм-аута и имя этого параметра при срабатывании.
- **`OLLAMA_MAX_SAMPLE_LINES`** — Пороговое значение, ниже которого LLM-режимы также вставляют буквальные открытые тексты в промпт (по умолчанию: `500`). Значения ≤ 0 обрабатываются как 500.
Режимы на основе корпуса (**Wordlist**, **Cracked passwords**, **Pattern rules**) всегда описывают *весь* корпус статистически — доли базовых слов, маски, регистр, длины, завершающие цифры и символы, годы — а не вставляют его фрагмент. Агрегация ограничена, поэтому дамп из 120 000 паролей занимает примерно столько же места в промпте, сколько и файл из 500 строк. Когда весь корпус умещается ниже этого порога, в промпт включаются и исходные открытые тексты, поскольку скрывать небольшой корпус от модели нет никакого смысла.
Это заменяет прежнее поведение, при котором вставлялась равномерно распределённая выборка из до `ollamaMaxSampleLines` паролей. Выборка из большого дампа не передавала никакой информации о частотах: модель не могла отличить базовое слово, используемое 8% организации, от слова, используемого одним человеком, — а именно этот сигнал делает проверку такой догадки оправданной.
- **`OLLAMA_NO_CLOUD`** — Когда `true`, отказываться отправлять что-либо в *облачную* модель Ollama. Ollama проксирует модель с тегом `-cloud` (`gpt-oss:120b-cloud`, `deepseek-v3.1:671b-cloud`) на ollama.com через тот же локальный endpoint, который используют локальные модели, поэтому ничто в запросе не выглядит иначе — но промпты hate_crack содержат восстановленные открытые тексты, статистику корпуса и имя, отрасль и местоположение клиента. С этим параметром имя облачной модели отклоняется до построения любого запроса. По умолчанию `false`, поэтому намеренно настроенная облачная модель продолжает работать; включите его для проектов, где данные клиента не должны покидать хост.
- **`OLLAMA_AUTO_RESEARCH`** — Когда `true` (по умолчанию), режим **Target info** просит локальную модель предложить отрасль и местоположение, как только вы ввели название компании, и предлагает их как редактируемые значения по умолчанию в промптах. Установите `false`, чтобы всегда получать пустые промпты (полезно при медленной модели, поскольку исследование требует одного дополнительного цикла обмена перед началом атаки).
- **`OLLAMA_HOST`** — Где Ollama ожидает подключения. Принимает простое `host:port` (`theplague.lan:11434`) или полный URL со схемой (`https://ollama.example.com`); в любом случае базовый URL нормализуется перед использованием. По умолчанию: `localhost:11434`. Задайте его в `.env` или экспортируйте как настоящую переменную окружения, чтобы переопределить это значение для одного запуска — это то же имя переменной, которое читает собственный CLI Ollama.
Убедитесь, что Ollama запущена и модель загружена (`ollama pull qwen2.5:32b`), прежде чем использовать LLM-атаку — hate_crack больше не загружает отсутствующие модели автоматически.
Атака предлагает три режима генерации:
1. **Target info** — компания / отрасль / местоположение; модель формирует кандидатов на основе этих данных.
После того как вы введёте название компании, hate_crack спрашивает ту же локальную модель, что ей уже известно об этой организации, и предварительно заполняет поля **Industry** и **Location** ответами, показанными в скобках: ```
Company name: Acme Rail Services
[!] The values in parentheses below are the local model's GUESSES, not verified OSINT.
Press Enter to accept, or type your own value to override.
Industry (freight rail maintenance):
Location (Omaha, Nebraska):
Нажмите Enter, чтобы принять подсказку, или введите поверх неё. Эти значения — воспоминания модели, не OSINT — относитесь к ним как к отправной точке, а не как к разведывательным данным о клиенте. Поиск использует только локальный сервер Ollama, поэтому имя клиента никогда не покидает хост; никаких веб-запросов или обращений к сторонним API не происходит. Если модель не распознаёт организацию (частый случай для небольших клиентов), она ничего не возвращает, и вы получаете просто пустые поля ввода: ``` Company name: Acme Rail Services Industry: Location:
Сбой исследования — тайм-аут, Ollama не запущена, пустой ответ — никогда не блокирует атаку; он просто переходит к пустым подсказкам. Установите `ollamaAutoResearch` в `false`, чтобы полностью пропустить исследование.
2. **Список слов** — извлеките базовые слова из образца списка слов.
3. **Взломанные пароли** — передайте уже восстановленные за эту сессию открытые тексты (`<hashfile>.out`) обратно модели, чтобы она могла вывести собственные правила формирования паролей целевой организации (базовые слова, времена года, годы, суффиксы, лэтспик) и генерировать *новые* кандидаты в том же стиле. Этот вариант появляется только после того, как взломан хотя бы один хеш; весь файл анализируется статистически точно так же, как в режиме «Список слов» (см. `ollamaMaxSampleLines` выше).
#### Конфигурация PCFG
Атака PCFG (вариант 20) и атака PRINCE-LING (вариант 21) используют подмодуль `pcfg_cracker`. Настройте их в `config.json`:```json
{
"pcfgRuleset": "DEFAULT",
"pcfgMaxCandidates": 50000000,
"pcfgPrinceLingMaxCandidates": 10000000
}
pcfgRuleset— Имя обученной грамматики для использования (по умолчанию:DEFAULT), преобразуется вpcfg_cracker/Rules/<name>/. Обучите свою с помощьюtrainer.pyиз pcfg_cracker и укажите здесь имя набора правил.pcfgMaxCandidates— Максимальное количество кандидатов, которыеpcfg_guesser.pyгенерирует для PCFG-атаки (по умолчанию:50000000).pcfgPrinceLingMaxCandidates— Максимальное количество базовых слов, которыеprince_ling.pyзаписывает в кэшированный базовый список слов PRINCE (по умолчанию:10000000).
Оптимизированные ядра (optimizedKernelAttacks)
Флаг -O hashcat выбирает оптимизированные ядра, которые работают существенно быстрее, но ограничивают длину кандидатов (примерно 31 символ, для некоторых режимов меньше) и молча пропускают всё, что длиннее. Список optimizedKernelAttacks в config.json определяет атаки, которые запускаются с -O; удалите атаку из списка, чтобы запустить её с ядрами полной длины. Список в config.json.example совпадает со встроенным значением по умолчанию, применяемым, когда config.json отсутствует.
Четыре атаки учитывают эту настройку, но по умолчанию не оптимизированы, поскольку они подают кандидатов, которые могут превышать потолок -O, — добавьте их в список, чтобы включить оптимизацию:
hcatNgramX,hcatOllama,hcatOmen,hcatLMtoNT
Чтобы отключить -O везде для одного запуска без редактирования конфигурации, передайте --no-optimized-kernel (сокращённая форма --no-optimize). Он переопределяет список для каждой атаки, а также убирает -O, записанный в hcatTuning, который в противном случае дошёл бы до hashcat независимо от списка.
Имена сопоставляются точно, и нераспознанная запись сообщается при запуске, а не игнорируется. Обратите внимание, что атаки, которые делегируют другой атаке, управляются той атакой, которой они делегируют, а не собственным именем: PRINCE-LING следует за hcatPrince, а Spoonman, Rosetta и режимы LLM pattern-rule следуют за hcatQuickDictionary.
Уведомления (пункт меню 82)
hate_crack может отправлять push-уведомления Pushover по завершении атак и, при желании, при взломе отдельных хэшей. Все элементы управления находятся в пункте главного меню 82 — Notifications:
- Переключить Pushover-уведомления [ON/OFF] — главный переключатель. Сохраняется в
config.jsonкакnotify_enabled. - Переключить уведомления о каждом взломе [ON/OFF] — когда включено, фоновый tailer следит за файлом
.outи отправляет уведомление о каждом взломе (с агрегацией пачек за тик). Сохраняется вconfig.jsonкакnotify_per_crack_enabled. Его нельзя включить, пока главный переключатель выключен — сначала включите пункт 1. - Отправить тестовое Pushover-уведомление — отправляет готовое push-сообщение, чтобы вы могли убедиться, что ваша пара токен/пользователь Pushover работает. Работает даже при выключенном главном переключателе.
Учётные данные хранятся в .env; остальные параметры настройки доступны только через конфигурационный файл config.json:
NOTIFY_PUSHOVER_TOKEN,NOTIFY_PUSHOVER_USER(в.env) — обязательны для отправки любого push-сообщения. В меню эти значения не записываются; редактируйте.envсамостоятельно.notify_attack_allowlist— имена атак, для которых автоматически даётся согласие без запроса[y/N/always]. Заполняется автоматически, когда вы отвечаетеalways.notify_suppress_in_orchestrators(по умолчаниюtrue) — отключает уведомления от отдельных атак, объединённых в цепочку Extensive Crack, который вместо них отправляет одно сводное уведомление. Установитеfalse, чтобы получать уведомление о каждой атаке в цепочке. Другие пункты меню, выполняющие несколько проходов (например, Quick Crack с несколькими цепочками правил), не являются оркестраторами и всегда уведомляют о каждом проходе.notify_max_cracks_per_burst(по умолчанию5),notify_poll_interval_seconds(по умолчанию5.0) — настройка tailer'а для уведомлений о каждом взломе. Логику агрегации пачек см. вhate_crack/notify/tailer.py.
Инструменты для работы со списками слов (пункт меню 80)
Подменю Wordlist Tools предоставляет утилиты предварительной обработки списков слов на основе бинарников hashcat-utils, а также загрузку списков слов с Hashmob.net и Weakpass. Доступ через пункт 80 в главном меню.
| Опция | Бинарник | Назначение |
|---|---|---|
| 1 | len.bin | Фильтрация по длине — оставить только слова, длина которых находится между минимальной и максимальной |
| 2 | req-include.bin | Требовать классы символов — оставить только слова, содержащие все требуемые типы символов |
| 3 | req-exclude.bin | Исключать классы символов — удалить слова, содержащие любой исключённый тип символов |
| 4 | cutb.bin | Извлечение подстроки — вырезать диапазон байтов из каждого слова |
| 5 | splitlen.bin | Разделить по длине — создать отдельные файлы для каждой длины слова (файлы с именами 01-64 в выходном каталоге) |
| 6 | rli.bin / rli2.bin | Вычитание слов — удалить записи, которые встречаются в одном или нескольких других файлах |
| 7 | gate.bin | Шардирование — извлечь каждое N-е слово для распределённого взлома на нескольких машинах |
| 8 | - | Оптимизация списков слов — удаление дубликатов и разделение на файлы по длине в каталоге оптимизированных списков слов |
| 9 | - | Загрузить списки слов с Hashmob.net |
| 10 | - | Загрузить списки слов с Weakpass (через BitTorrent) |
Биты маски классов символов (используются в пунктах 2 и 3): 1=строчные, 2=заглавные, 4=цифры, 8=символы, 16=прочее. Складывайте значения: 7 = строчные+заглавные+цифры.
Как следует использовать шардирование: шардирование разбивает один список слов на N равных непересекающихся частей, чтобы работу можно было распределить между несколькими машинами или GPU. Каждая часть чередуется (каждая N-я строка), поэтому каждый шард является репрезентативной выборкой всего списка, а не непрерывным фрагментом начала/конца — ни один узел не застревает на взломе только низковероятностного хвоста.
Запустите пункт 7 один раз, укажите входной список слов, базовый путь вывода и количество шардов (N). Он записывает все N частей за один проход, с именами с номером части, дополненным нулями (base.001, base.002, … до base.00N). Скопируйте одну часть на каждый узел и укажите её в запуске hashcat на этом узле. На системе с одним GPU шардирование не даёт ускорения, но одна часть по-прежнему остаётся быстрой репрезентативной выборкой для быстрой пробной проверки перед запуском на полном списке.
Автоматическая проверка обновлений
hate_crack может автоматически проверять GitHub на наличие новых версий при запуске. Эта возможность управляется параметром конфигурации check_for_updates:```json
{
"check_for_updates": true
}
- **`check_for_updates`** — Включить автоматическую проверку версий при запуске (по умолчанию: `true`).
- При включении hate_crack получает информацию о последнем релизе с GitHub и показывает уведомление, если доступно обновление.
- Проверка выполняется асинхронно и не блокирует запуск. Сетевые ошибки молча игнорируются.
##### Каналы обновления
| Channel | Flag | Source | What you get |
|---------|------|--------|--------------|
| Релиз | `--update` | `main` | Последний сформированный релиз. Это значение по умолчанию, и именно его предлагает проверка при запуске. |
| Ночная сборка | `--nightly` | `nightly-dev` | Работа, прошедшая CI, но ещё не выпущенная. |
Версии следуют обычному semver, при этом номер увеличивается в зависимости от того, что реально находится в наборе изменений. Вторая компонента увеличивается **только при добавлении функций**: цикл, содержащий любой коммит `feat`, направляется к `X.(Y+1).0`, а цикл, состоящий только из исправлений, документации и служебных задач, направляется к `X.Y.(Z+1)`.
Ветка `nightly-dev` помечает кандидатов в релиз для той версии, к которой движется набор изменений — `v2.20.1rc1`, `v2.20.1rc2`, … — а при слиянии в `main` та же целевая версия повышается до финального релиза. Кандидаты являются настоящими pre-release по стандарту PEP 440, поэтому они корректно упорядочиваются в обоих направлениях:
2.20.0 < 2.20.1rc1 < 2.20.1rc2 < 2.20.1 < 2.21.0rc1 < 2.21.0
Целевая версия может измениться в середине цикла: первый добавленный коммит `feat` переводит её с `X.Y.(Z+1)` на `X.(Y+1).0`, и нумерация кандидатов начинается заново для новой цели. Номер всегда соответствует тому, что набор изменений выпустил бы сегодня.
Старшая компонента никогда не увеличивается автоматически — тема с `!` или завершающая строка `BREAKING CHANGE:` считается функцией, поскольку автоматический мажорный релиз находится на расстоянии одной опечатки в строке темы от необратимого опубликованного релиза. Мажорный релиз — это явное действие человека: создайте тег и запушьте его вручную.
Политика находится в `tools/next_version.py`, используется обеими процедурами тегирования и покрыта модульными тестами в `tests/test_next_version.py`.
Проверка при запуске всегда предлагает только релизы, поскольку ночные сборки вообще не публикуют релизов на GitHub, а проверка читает конечную точку GitHub "latest release" — поэтому включение `check_for_updates` никогда не переведёт вас на nightly. Каналы сейчас разделяют две вещи: этот факт, а также то, что кандидат является настоящим pre-release по PEP 440, поэтому инструмент, ранжирующий сырые номера версий, также считает его более старым, чем релиз, в который он превращается.
Любой из флагов сначала переключает ваш checkout на соответствующую ветку (и отказывается это делать, если у вас есть незакоммиченные изменения). Если вы используете nightly и хотите вернуться к релизному коду, `--update` вернёт вас на `main`.
#### Автоматическое объединение найденных хэшей (только при загрузке left)
При загрузке left-хэшей (невзломанных хэшей) hate_crack автоматически:
1. Пытается загрузить найденные (взломанные) хэши из Hashview в качестве вспомогательной операции
2. Объединяет найденные хэши с локальными файлами `.out` (например, `left_1_123.txt.out` или `left_1_123.nt.txt.out` для формата pwdump)
3. Удаляет дубликаты записей
4. Удаляет временные файлы разбиения после объединения
Это гарантирует, что ваши локальные результаты взлома остаются синхронизированными с централизованной базой данных Hashview при работе с невзломанными хэшами.
**Примечание:** Опция download-found загружает уже взломанные хэши отдельно для справочных целей и не выполняет никакого объединения и не запрашивает взлом.
Значение `<hash_type>` получается путём запуска `hashcat --help`
Примеры хэшей: http://hashcat.net/wiki/doku.php?id=example_hashes```
$ hashcat --help |grep -i ntlm
5500 | NetNTLMv1 | Network protocols
5500 | NetNTLMv1 + ESS | Network protocols
5600 | NetNTLMv2 | Network protocols
1000 | NTLM | Operating-Systems
3h ➜ sudo apt install wireshark``` $ ./hate_crack.py 1000
/ | _____ / | ____ _ ___ ____________ ____ | | __
/ ~ __ \ / __ \ / \ /_ __ _ \ / | |/ /
\ Y // __ | | \ / \ _| | // __ \ _| <
___| /(__ /| _ >______ /|__| ( /___ >|_
/ / /___/ / / / /
Version 2.0
## Тестирование
Тестовый набор в основном работает офлайн и использует моки/фикстуры. Проверки реальной сети и
проверки системных зависимостей выполняются по желанию через переменные окружения.
### Запуск тестов локально```bash
# Run all tests
uv run pytest -v
# Run specific test
uv run pytest tests/test_hashview.py -v
Вы также можете запустить полный набор тестов с помощью make test.
Живые тесты (по желанию)
Установите любую из следующих переменных, чтобы включить живые проверки:
HASHMOB_TEST_REAL=1— живая проверка подключения к Hashmob/меню CLIHASHVIEW_TEST_REAL=1— живая проверка меню CLI HashviewWEAKPASS_TEST_REAL=1— живая проверка меню CLI WeakpassHATE_CRACK_REQUIRE_DEPS=1— завершить с ошибкой, если отсутствует7z,transmission-daemonилиtransmission-remote
Живой тест загрузки Hashview
Живой тест загрузки Hashview пропускается по умолчанию. Чтобы запустить его, установите
переменную окружения и укажите действительные учётные данные в .env:```bash
HATE_CRACK_RUN_LIVE_TESTS=1 uv run pytest tests/test_upload_cracked_hashes.py -v
### Живые тесты Hashview против локального Docker-стека
Вместо того чтобы направлять живые тесты на удалённый сервер Hashview, вы можете
позволить набору тестов развернуть локальный [Hashview](https://github.com/hashview/hashview)
Docker-стек, наполнить его данными, запустить живые тесты против него и удалить его. Установите
`HASHVIEW_TEST_LOCAL=1` и укажите `HASHVIEW_REPO` на локальную копию Hashview:```bash
HASHVIEW_TEST_LOCAL=1 HASHVIEW_REPO=~/projects/hashview \
HATE_CRACK_SKIP_INIT=1 uv run pytest tests/test_hashview_cli_subcommands_subprocess.py -v
Это поднимает docker compose в репозитории Hashview, инициализирует административный API-ключ, заказчика, хеш-файл и данные о взломанных «effective task», после чего экспортирует переменные окружения HASHVIEW_*, которые читают тесты. Полезные переменные окружения:
HASHVIEW_TEST_LOCAL=1— включить локальный стек (в противном случае не действует)HASHVIEW_REPO=<path>— каталог Hashview (по умолчанию~/projects/hashview)HASHVIEW_KEEP=1— оставить контейнеры запущенными после сессии (ускоряет повторные прогоны)HASHVIEW_LOCAL_PORT=5000— порт хоста, на котором публикуется приложение
CLI hate_crack учитывает переменные окружения HASHVIEW_URL / HASHVIEW_API_KEY
(переопределяя .env, в котором хранятся эти два ключа), что позволяет
набору тестов нацеливать CLI на локальный стек без редактирования вашей сохранённой конфигурации.
Сквозные тесты установки (локально + Docker)
Локальная установка uv tool + выполнение скрипта (используется временный HOME):```bash HATE_CRACK_RUN_E2E=1 uv run pytest tests/test_e2e_local_install.py -v
Установка/запуск полного цикла на основе Docker (кэшируется через `Dockerfile.test`):```bash
HATE_CRACK_RUN_DOCKER_TESTS=1 uv run pytest tests/test_docker_script_install.py -v
Тест Docker E2E также загружает небольшое подмножество rockyou и запускает базовый подбор hashcat для проверки интеграции внешних инструментов.
Сквозной тест виртуальной машины Lima (только macOS):
Предварительные требования: должны быть установлены Lima и rsync.```bash
brew install lima
Тестовая ВМ автоматически развёртывается со всеми зависимостями Linux (hashcat, build-essential, curl, git, gzip, p7zip-full, transmission-daemon, ocl-icd-libopencl1, pocl-opencl-icd, uv).```bash
HATE_CRACK_RUN_LIMA_TESTS=1 uv run pytest tests/test_lima_vm_install.py -v
Этот тест проверяет установку и выполнение в облегчённой виртуальной машине Linux на macOS.
Структура теста
- tests/test_hashview.py: Полный набор тестов для класса HashviewAPI с имитируемыми ответами API, включающий:
- Список клиентов и проверка данных
- Тесты аутентификации и авторизации
- Функциональность загрузки файла хэшей
- Полный рабочий процесс создания задания
Все тесты используют имитируемые вызовы API, поэтому они могут выполняться без подключения к серверу Hashview.
(1) Быстрый подбор (2) Расширенный подбор по методологии Pure_Hate (3) Атака перебором (4) Атака по топ-маскам (5) Атака по отпечаткам (6) Комбинаторные атаки (7) Гибридная атака (8) Перебор по 100 лучшим маскам Pathwell (9) Атака PRINCE (10) Методология Bandrel (11) Атака Loopback (12) Атака LLM (13) Атака OMEN (14) Атака по ad-hoc маскам (15) Марковская атака перебором (16) N-граммовая атака (17) Атака перестановками (18) Атака со случайными правилами (19) Атака на парольные фразы Combipow (20) Атака PCFG (21) Атака PRINCE-LING (22) Атака Spoonman (23) Атака Rosetta
(80) Инструменты для словарей (81) Инструменты для файлов правил (82) Уведомления
(93) Пересоздать .out из POT-файла (94) Hashview API (95) Анализировать хэши с помощью Pipal (96) Экспортировать вывод в формат Excel (97) Показать взломанные хэши (98) Показать README (99) Выход
Выберите задачу:```
Option 94 — Hashview API is only listed when HASHVIEW_API_KEY is set in .env.
The YOLO, Middle, and Thorough Combinator attacks were previously at keys 10-12. They now live in the Combinator Attacks submenu (option 6) along with Combinator3 and CombinatorX.
Quick Crack
Runs a dictionary attack against wordlists in your hcatOptimizedWordlists directory (falls back to hcatWordlists if not configured) and optionally applies rules. Multiple rules can be selected by comma-separated list, and chains can be created with the '+' symbol. Pressing Enter at the wordlist prompt uses the configured optimized wordlists directory as the default.
Какие правила вы хотите запустить?
(1) best64.rule
(2) d3ad0ne.rule
(3) T0XlC.rule
(4) dive.rule
(99) YOLO...запустить все правила
Введите разделенный запятыми список правил, которые вы хотите запустить. Чтобы запустить правила в цепочке, используйте символ +.
Например, 1+1 запустит best64.rule дважды в цепочке, а 1,2 запустит best64.rule, а затем d3ad0ne.rule последовательно.
Выбирайте с умом:```
#### Extensive Pure_Hate Methodology Crack
Runs several attack methods provided by Martin Bos (formerly known as pure_hate):
* Brute Force Attack (7 characters)
* Dictionary Attack
* All wordlists in `hcatWordlists` with `best64.rule`
* `rockyou.txt` with `d3ad0ne.rule`
* `rockyou.txt` with `T0XlC.rule`
* Top Mask Attack (Target Time = 4 Hours)
* Fingerprint Attack
* Combinator Attack
* Hybrid Attack
* Extra - Just For Good Measure
- Runs a dictionary attack using `rockyou.txt` with chained `combinator.rule` and `InsidePro-PasswordsPro.rule` rules
#### Brute Force Attack
Brute forces all characters with the choice of a minimum and maximum password length.
#### Top Mask Attack
Uses StatsGen and MaskGen from PACK (https://thesprawl.org/projects/pack/) to perform a top mask attack using passwords already cracked for the current session.
Presents the user a choice of target cracking time to spend (default 4 hours).
#### Fingerprint Attack
https://hashcat.net/wiki/doku.php?id=fingerprint_attack
Runs a fingerprint attack using passwords already cracked for the current session.
#### Combinator Attack
https://hashcat.net/wiki/doku.php?id=combinator_attack
Runs a combinator attack using the "rockyou.txt" wordlist.
#### Hybrid Attack
https://hashcat.net/wiki/doku.php?id=hybrid_attack
* Runs several hybrid attacks using the "rockyou.txt" wordlists.
- Hybrid Wordlist + Mask - ?s?d wordlists/rockyou.txt ?1?1
- Hybrid Wordlist + Mask - ?s?d wordlists/rockyou.txt ?1?1?1
- Hybrid Wordlist + Mask - ?s?d wordlists/rockyou.txt ?1?1?1?1
- Hybrid Mask + Wordlist - ?s?d ?1?1 wordlists/rockyou.txt
- Hybrid Mask + Wordlist - ?s?d ?1?1?1 wordlists/rockyou.txt
- Hybrid Mask + Wordlist - ?s?d ?1?1?1?1 wordlists/rockyou.txt
#### Pathwell Top 100 Mask Brute Force Crack
Runs a brute force attack using the top 100 masks from KoreLogic:
https://blog.korelogic.com/blog/2014/04/04/pathwell_topologies
#### PRINCE Attack
https://hashcat.net/events/p14-trondheim/prince-attack.pdf
Runs a PRINCE attack using wordlists/rockyou.txt
#### YOLO Combinator Attack
Runs a continuous combinator attack using random wordlists from the configured wordlists directory for the left and right sides.
#### Middle Combinator Attack
https://jeffh.net/2018/04/26/combinator_methods/
Runs a modified combinator attack adding a middle character mask:
wordlists/rockyou.txt + masks + worklists/rockyou.txt
Where the masks are some of the most commonly used separator characters:
2 4 <space> - _ , + . &
#### Thorough Combinator Attack
https://jeffh.net/2018/04/26/combinator_methods/
* Runs many rounds of different combinator attacks with the rockyou list.
- Standard Combinator attack: rockyou.txt + rockyou.txt
- Middle Combinator attack: rockyou.txt + ?n + rockyou.txt
- Middle Combinator attack: rockyou.txt + ?s + rockyou.txt
- End Combinator attack: rockyou.txt + rockyou.txt + ?n
- End Combinator attack: rockyou.txt + rockyou.txt + ?s
- Hybrid middle/end attack: rockyou.txt + ?n + rockyou.txt + ?n
- Hybrid middle/end attack: rockyou.txt + ?s + rockyou.txt + ?s
#### Bandrel Methodology
Prompts for comma-separated names and creates a pseudo hybrid attack by capitalizing the first letter and adding up to six additional characters at the end. Each word is limited to a total of five minutes.
- Built-in common words (seasons, months) included as a customizable `config.json` entry (`bandrel_common_basedwords`)
- The default five-minute time limit is customizable via `bandrelmaxruntime` in `config.json`
#### Loopback Attack
https://hashcat.net/wiki/doku.php?id=loopback_attack
Uses hashcat's loopback mode to feed cracked passwords from the current session back into the attack pipeline with rules applied. This generates new password candidates based on variations of already-cracked passwords, which is particularly effective for finding related passwords that follow similar patterns.
* Prompts for rule selection to apply to the loopback candidates
* Uses an empty wordlist with the --loopback flag to process previously cracked passwords
* Automatically downloads Hashmob rules if no rules are available locally
#### LLM Attack
Uses a local Ollama instance to generate password candidates for a capture-the-flag scenario. Prompts for the fake company name, industry, and location, then sends these details to the configured LLM model to produce likely password candidates using industry terms and company name permutations. The generated candidates are fed into a hashcat wordlist+rules attack.
* Requires a running Ollama instance (default: `http://localhost:11434`, override with `OLLAMA_HOST` in `.env` or the environment) with the model already pulled — hate_crack does not auto-pull
* Candidate generation uses structured (JSON) output via Atomic Agents, so pick a model with good schema adherence (default: `qwen2.5:32b`)
* Configurable model, context window, request timeout, and sample size via `.env` (see Ollama Configuration below)
* Prompts for target company name, industry, and location. The industry and location prompts are pre-filled with the local model's guesses about the named organization (editable, and clearly labelled as guesses rather than verified OSINT); disable with `ollamaAutoResearch: false`
* Alternatively derives basewords from a sample **wordlist**, or from the **cracked passwords** of the current session (`<hashfile>.out`) so the model mirrors the target organization's own password conventions and produces new candidates in that style (only offered once something has been cracked)
* A live spinner with an elapsed-seconds counter runs during generation, and requests are bounded by `ollamaTimeout` so a model stuck loading into VRAM reports a timeout instead of hanging
**Pattern rules mode** (option 4 in the LLM submenu) takes the same shape as the [Spoonman Attack](#spoonman-attack) — a baseword list run through a rule file, both derived from one corpus — but infers each side with the model instead of extracting it. Spoonman is exact and therefore bounded: its basewords all appear in the corpus and its rules only reproduce transformations the corpus already shows. This asks the model to generalize on both axes, so it can name the *word families* behind a sample (the company and its products, site names, local sports teams, seasons, mascots) and write decorations the corpus does not contain.
* Pattern source is either the current session's cracked passwords (offered first, and only once something has been cracked, since those reveal the target's real conventions) or a sample wordlist
* **You are not asked to pick a rule file.** The model writes one, from the same corpus statistics — a stock rule file encodes the internet's habits, and the point of spending a model round trip is to encode *this* organization's
* Basewords are normalized to lowercase letters only, discarding anything under 3 characters, so the generated rules supply case, digits, and punctuation exactly once
* Generated rules are validated before hashcat sees them, and anything using an op hashcat does not have, a position argument outside `0-9A-Z`, more than 31 functions, or a stray comment or non-ASCII character is discarded. hashcat drops an invalid rule *silently* when valid rules share the file, so an unscreened line would become missing coverage rather than an error. The op table was established by testing hashcat itself, not from its rule documentation, which lists ops hashcat will not actually run
* Local-model yield varies a lot run to run, so a thin answer is asked again once and the two rounds are merged — a handful of rules would waste the pass they are spent on
* If no rule survives validation the basewords still run, unmutated, rather than throwing away the expensive half of the run
* Output lands in `<hashfile>.llm_patterns/` as `basewords.txt` and `rules.rule` — per-run scratch, laid out like `.spoonman/` and removed on exit
#### OMEN Attack
Uses the Ordered Markov ENumerator (OMEN) to train a statistical password model from a wordlist and generate password candidates. This attack learns patterns from known passwords and generates new candidates based on those patterns.
* Requires OMEN binaries (createNG and enumNG) to be built from the omen submodule
* Interactive menu: use existing model, train new model, or cancel
* Training wordlist picker shows available wordlists from configured directory or accepts a custom path
* Validates all 5 required model files (createConfig, CP/IP/EP/LN.level) before running
* Captures and reports enumNG errors instead of failing silently
* Generates up to a specified number of password candidates (configurable via `omenMaxCandidates`)
* Pipes generated candidates directly into hashcat for cracking
* Model files and metadata are stored in `~/.hate_crack/omen/` for persistence across sessions
#### Combinator Attacks Submenu
Opens an interactive submenu with six combinator attack variants (formerly at menu keys 10-12). Consolidates related attacks for cleaner menu organization:
- Combinator Attack - combines two wordlists
- YOLO Combinator Attack - combines all permutations of multiple wordlists
- Middle Combinator Attack - combines wordlists with an extra word in the middle
- Thorough Combinator Attack - comprehensive combination of wordlists with rules
- Combinator3 Attack - combines exactly 3 wordlists using `combinator3.bin`, generating all `word1+word2+word3` combinations piped to hashcat
- CombinatorX Attack - combines 2-8 wordlists using `combinatorX.bin` with optional `--sepFill` separator character between word segments
#### Ad-hoc Mask Attack
Runs hashcat mask attack (mode 3) with a user-specified custom mask string. Allows fine-grained control over character-set brute forcing.
* Opens with a choice between typing a mask and selecting a mask file
* Prompts for a hashcat mask (e.g., `?u?l?l?l?d?d` for uppercase + lowercase + lowercase + lowercase + digit + digit)
* Supports custom character sets (`-1`, `-2`, `-3`, `-4`) for specialized character combinations
* Interactive charset entry with early exit on blank input
* Mask files (`.hcmask`) can be selected with tab completion, defaulting to the bundled `masks/` directory; hashcat runs every mask in the file in order. Because a mask file defines its own charsets inline, the `-1` through `-4` prompts are skipped when one is chosen
* Useful for targeted brute forcing when you know password structure patterns
#### Markov Brute Force Attack
Generates password candidates using Markov chain statistical models. Similar to OMEN but simpler and faster.
* Checks for existing `.hcstat2` Markov table from previous sessions (with option to reuse, regenerate, or cancel)
* Generates table from training source if needed:
- Can use cracked passwords from current session (`.out` file) as training data
- Or select any wordlist from configured directory or custom path
* Interactive menu: choose minimum and maximum password length
* Uses `--increment` flag to test lengths in sequence
* Markov table persists with hash file (filename.out.hcstat2) for fast subsequent runs
* Faster than OMEN for general-purpose brute forcing
#### N-gram Attack
Generates n-gram candidates from a corpus file using `ngramX.bin` from hashcat-utils and pipes them into hashcat.
* Prompts for a corpus file with tab completion, defaulting to the configured wordlist directory
* Prompts for an n-gram group size (default 3)
* Gzip-compressed corpus files are auto-detected and decompressed on the fly
* Useful when you have target-relevant prose (scraped site copy, leaked documents, internal wiki exports) rather than a password list
#### Permutation Attack
Generates all character permutations of each word in a targeted wordlist and pipes them to hashcat via `permute.bin` from hashcat-utils.
* Prompts for a single wordlist file (not a directory)
* Effective against short targeted wordlists where the character set is known but the order is not (company abbreviations, name fragments, known tokens)
* WARNING: Scales as N! per word - an 8-character word produces 40,320 permutations. Only practical for words up to ~8 characters.
* Uses `permute.bin < wordlist | hashcat` pipeline pattern
#### Random Rules Attack
Generates a set of random hashcat mutation rules using `generate-rules.bin`, writes them to a temporary file, then runs hashcat against a chosen wordlist with those rules.
* Prompts for rule count (default 65536)
* Prompts for wordlist path with tab-completion and numbered selection
* Temporary rules file is cleaned up after the run regardless of outcome
* Useful when known rule sets are exhausted - explores random rule-space for additional cracks
#### Combipow Passphrase Attack
Generates all unique non-empty subset combinations from a short wordlist using `combipow.bin` and pipes them into hashcat. Designed for passphrase cracking when you know the pool of words a password was built from.
* Prompts for a wordlist file (max 63 lines - combipow generates up to 2^n-1 combinations)
* Optional space separator (`-s` flag) to insert spaces between words in each combination
* Warns if the wordlist exceeds 20 lines (output volume may be large)
* Aborts with a clear message if the wordlist exceeds 63 lines (hard limit)
* Candidates are piped directly to hashcat stdin
#### PCFG Attack
Uses [pcfg_cracker](https://github.com/lakiw/pcfg_cracker) to generate candidates from a Probabilistic Context-Free Grammar, piping `pcfg_guesser.py` output directly into hashcat's stdin mode. A PCFG models password *structure* (baseword + digits + symbol, capitalization habits, keyboard walks) with learned probabilities, so candidates come out roughly in descending likelihood order.
* Requires the `pcfg_cracker` submodule. Presence is checked at startup and reported non-fatally: if it is missing, the PCFG attacks are simply unavailable. Run `make` to fetch it.
* Uses the trained grammar named by `pcfgRuleset` in `config.json` (default `DEFAULT`), read from `pcfg_cracker/Rules/<name>/`
* Candidate count is capped by `pcfgMaxCandidates` (default 50,000,000)
* hate_crack does not wrap grammar training. To build a grammar from a target-specific password set, run pcfg_cracker's own `trainer.py` and point `pcfgRuleset` at the resulting ruleset name
#### PRINCE-LING Attack
Uses pcfg_cracker's `prince_ling.py` to derive an optimized PRINCE base wordlist from a trained grammar, then hands it to the existing PRINCE attack. PRINCE-LING picks base words the grammar says are actually productive, so the PRINCE combination space is far less wasteful than pointing PRINCE at a generic wordlist.
* Requires the `pcfg_cracker` submodule and a trained ruleset directory, same as the PCFG attack
* The generated wordlist is cached at `<hcatOptimizedWordlists>/pcfg_prince_ling_<ruleset>.txt` and reused across sessions
* Regenerates only when the ruleset directory is newer than the cached wordlist, so retraining a grammar invalidates the cache automatically
* Generation is written to a temporary file and atomically moved into place; a failed or interrupted run cleans up its partial file and leaves any existing cache intact
* Base wordlist size is capped by `pcfgPrinceLingMaxCandidates` (default 10,000,000)
#### Spoonman Attack
Derives a baseword list and a hashcat rule file from a corpus of known plaintext passwords — a previous engagement's cracked output, a leak dump, or any password list — such that the baseword x rule cross product reconstructs the corpus exactly (see the memory bound below for the one case where it does not). Contributed as issue #169 by @Spoonman1091.
Each password is split into its letters-only lowercased core (the baseword) plus a rule that rebuilds the original from it, using `l`/`u`/`c` for casing, `T{p}` toggles, `${x}`/`^{x}` for trailing and leading characters, and `i{p}{x}` for interior ones.
* When the current session already has cracked plaintexts (`<hash file>.out` exists and is non-empty), a picker offers those as the corpus ahead of a free-form path — the target's own recovered passwords derive rules describing that target's actual conventions, which is exactly what you want to fire back at the remaining uncracked hashes. Deriving from `.out` and then cracking the same hash file appends new plaintexts to that same file, growing the corpus for the next run; that is the intended feedback loop, not corruption. Sessions with no cracked output yet see no picker at all — just today's path prompt
* Prompts for the corpus, then for how much of the rule file to run: top 50% coverage (listed first and recommended), top 75%, top 95%, top 99%, or the full set
* Rules are sorted by how many passwords each one rebuilds, so a truncated file keeps the most productive rules. Coverage is extremely long-tailed: on a 98.2M-password sample, 50% coverage needed 4,120 rules while 95% needed 16,119,661 and 100% needed 21,029,696 — the last few percent typically costs orders of magnitude more rules than the first half, which is why the smallest tier is listed first and is usually the right choice
* Output is written beside the hash file in `<hash file>.spoonman/`, alongside the other ephemeral wordlists: `basewords.txt`, `rules.full.rule`, the capped rule files, and `coverage.txt` with per-milestone rule counts. Derivation is skipped on later runs of the same hash file unless the corpus has been modified since, and the directory is removed on exit by the temp-file cleanup
* Derivation is bounded in memory. Both counters would otherwise grow for the whole read with nothing written until the end, so a corpus large enough to exhaust RAM lost the entire pass to an OOM kill and produced no output; a measured run against a 31 GB corpus reached 14.1 GB resident at 11% of the file and was still accelerating. Each counter is now capped at 20 million distinct keys (about 1.6 GB apiece), and the lowest-frequency keys are discarded once it is exceeded. If that happens, the run says so on the console and in `coverage.txt`, the output reconstructs the retained keys rather than 100% of the corpus, and the coverage percentages are relative to those. Corpora below the cap are unaffected
* Passwords that cannot be expressed as a rule are written verbatim as their own baseword with a `:` no-op, so coverage stays complete. This covers two hashcat limits: rule positions cannot address past index 35, and hashcat rejects any rule with more than 31 functions — silently, when valid rules share the file
* The derivation self-checks every password by reconstructing it in-process, and reports any failures rather than reporting success
* Corpus lines may carry a hash in front of the password, as cracked output does. A leading field is dropped only when it has the shape of a hash (a hex digest at a known length, or a crypt-style `$id$` string), so `hash:salt:plain` is handled while a plaintext or wordlist entry containing a colon survives intact. `$HEX[...]` plaintexts are decoded. If most lines look like an uncracked dump rather than cracked output, `coverage.txt` records the count and the attack warns — the derived basewords and rules would otherwise be meaningless without any error being raised
#### Rosetta Attack
Mines hashcat `--debug-mode 5` logs for the basewords and rules that already cracked something, then runs their full cross product. Powered by [HashcatRosetta](https://github.com/bandrel/HashcatRosetta), the same library behind [Analyze Hashcat Rules](#analyze-hashcat-rules-rule-file-tools-option-5).
No setup is needed to feed it: `_add_debug_mode_for_rules` appends `--debug-mode 5 --debug-file` to every rule-based hashcat invocation hate_crack makes, so the logs accumulate in `hcatDebugLogPath` (`~/.hate_crack/hashcat_debug` by default, one file per session) as a side effect of normal use. A mode 5 log records only candidates that cracked a hash, in the form `baseword:rule:candidate:wordlist`, which is what makes both halves known-productive against this target population; the trailing wordlist field also shows which list is earning its keep on a multi-wordlist run. HashcatRosetta parses mode 4 and mode 5 alike, so logs written before the switch are still read.
The value is in the cross product rather than the recorded pairs. A pair present in a log has already cracked its hash and will not crack another, but a rule that worked on one baseword has usually never been tried against the others — so N basewords and M rules yield close to N x M untried candidates.
The menu first asks how to rank rules — choices 1-3 below, plus a fourth, unrelated mode:
* Rules can be ranked by application frequency, by how many distinct basewords each one worked on, or by how many unique candidates each one generated. Frequency is the default; baseword spread is the better choice when the goal is a rule set that generalizes past the specific words it was learned from
* Only after one of those three is picked does hate_crack list the logs found in `hcatDebugLogPath` newest-first with their sizes; pick one, pick all of them (up to 20), or type a path to a log from elsewhere
* Prompts for how many top rules to keep (default 100) and how many top basewords (default all). Zero means unlimited for either. The keyspace is the product of the two and is printed before hashcat starts
* Output is written beside the hash file in `<hash file>.rosetta/` as `basewords.txt` and `rules.rule`, alongside the other ephemeral wordlists, and the directory is removed on exit by the temp-file cleanup
* Reading stops at 1,000,000 debug lines, since the analyzer needs the whole batch in memory at once. Truncation is reported on the console rather than assumed harmless — logs from a long run routinely exceed this, in which case the newest log is the one worth selecting
* **LLM Mask Attack** (4) - a different mode entirely, and the only one that needs no debug logs. Prompts for a natural-language description of the passwords you expect (length, character patterns, symbols, etc.), sends it to the locally configured Ollama model, writes the returned masks to `<hash file>.hcmask`, and runs a `-a 3` hashcat mask attack against them
#### Wordlist Tools (option 80)
A submenu of wordlist preprocessing utilities using hashcat-utils binaries. All tools read from and write to files on disk. All file and directory path prompts support tab completion.
| Key | Tool | Description |
|-----|------|-------------|
| 1 | Filter by Length | Keep only words between a min and max length (`len.bin`) |
| 2 | Require Char Classes | Keep words that include all char classes in mask (`req-include.bin`). Mask: 1=lower, 2=upper, 4=digit, 8=symbol (additive) |
| 3 | Exclude Char Classes | Remove words containing any char class in mask (`req-exclude.bin`). Same mask encoding |
| 4 | Extract Substring | Cut bytes from each word at a given offset and optional length (`cutb.bin`) |
| 5 | Split by Length | Create per-length files in an output directory (`splitlen.bin`) |
| 6 | Subtract Wordlist | Remove lines from a wordlist that appear in one or more remove files. Mode 1 uses `rli2.bin` (single file); mode 2 uses `rli.bin` (multiple files) |
| 7 | Shard Wordlist | Split a wordlist into N equal, interleaved parts in one run, written as `base.001`…`base.00N` for distributed cracking (`gate.bin`) |
| 8 | Optimize Wordlists | Dedupe and split the selected wordlists into per-length files under an output directory |
| 9 | Download from Hashmob.net | Browse and download wordlists from Hashmob.net into the configured wordlist directory |
| 10 | Download from Weakpass | Browse and download Weakpass wordlist torrents, with automatic extraction |
All binaries are in `hate_crack/hashcat-utils/bin/`.
#### Rule File Tools (option 81)
Preprocesses hashcat rule files using `cleanup-rules.bin` and `rules_optimize.bin` from hashcat-utils, and downloads rule files from Hashmob.net.
* **Clean** (1) - removes invalid syntax and duplicate rules using `cleanup-rules.bin`. Useful after combining rule files or downloading rules from external sources.
* **Optimize** (2) - consolidates redundant operations using `rules_optimize.bin`. Reduces rule file size and improves cracking speed.
* **Clean and optimize** (3) - runs both operations in sequence via a temporary file, then writes the final result.
* **Download rules from Hashmob.net** (4) - fetches rule files into the configured `rulesDirectory`.
* **Analyze Hashcat rules** (5) - opcode frequency analysis of a rule file, powered by HashcatRosetta.
The three preprocessing operations read from an input file and write to a separate output file (original is never modified).
#### Download Rules from Hashmob.net (Rule File Tools option 4)
Downloads the latest rule files from Hashmob.net's rule repository. These rules are curated and optimized for password cracking and can be used with the Quick Crack and Loopback Attack modes.
* Downloads rule sets in parallel using a thread pool (up to 4 concurrent downloads)
* Skips rules already downloaded locally
* Reports download summary with success/failure counts
* Stores rules in the configured rules directory
#### Analyze Hashcat Rules (Rule File Tools option 5)
Powered by HashcatRosetta (https://github.com/bandrel/HashcatRosetta), this feature analyzes hashcat rule files to provide detailed insights into rule composition and complexity.
* Prompts for a rule file path
* Displays frequency analysis of rule opcodes (operations)
* Helps understand what transformations a rule set performs
* Useful for rule debugging and optimization
#### Download Wordlists from Hashmob.net (Wordlist Tools option 9)
Downloads wordlists from Hashmob.net's collection of cracked passwords and commonly used wordlists.
* Interactive menu for browsing available wordlists
* Progress tracking for large downloads
* Stores wordlists in configured wordlist directory
#### Weakpass Wordlist Menu (Wordlist Tools option 10)
Interactive menu for downloading and managing wordlists from Weakpass.com via BitTorrent.
* Browse available Weakpass wordlist torrents
* Download specific wordlists or entire collections
* Automatic extraction of compressed archives
* Progress tracking for torrent downloads
-------------------------------------------------------------------
### Version History
The full, per-release changelog now lives in [CHANGELOG.md](https://github.com/trustedsec/hate_crack/blob/HEAD/CHANGELOG.md).