
hate_crack v2.11.2
Un outil pour automatiser les méthodologies de craquage via Hashcat de l'équipe TrustedSec.
___ ___ __ _________ __
/ | \_____ _/ |_ ____ \_ ___ \____________ ____ | | __
/ ~ \__ \\ __\/ __ \ / \ \/\_ __ \__ \ _/ ___\| |/ /
\ Y // __ \| | \ ___/ \ \____| | \// __ \\ \___| <
\___|_ /(____ /__| \___ >____\______ /|__| (____ /\___ >__|_ \
\/ \/ \/_____/ \/ \/ \/ \/
Installation
L'installation à partir des sources est la seule voie prise en charge. hate_crack n'est pas
distribué sur PyPI: pip install hate-crack correspond à un espace réservé 0.0.0
qui échoue volontairement et renvoie ici. Le nom n'est conservé que pour empêcher
quiconque de publier un équivalent sous cette identité — voir
packaging/pypi-placeholder/.
1. Installer hashcat
Hashcat doit être installé et disponible dans votre PATH:
Ubuntu/Kali:```bash sudo apt-get install -y hashcat
macOS (Homebrew):```bash
brew install hashcat
Ou téléchargez un binaire pré-compilé depuis https://hashcat.net/hashcat/ et définissez hcatPath dans config.json sur son emplacement.
2. Télécharger hate_crack
Clonez avec les sous-modules (requis pour hashcat-utils, princeprocessor, pcfg_cracker, et optionnellement omen) :```bash git clone --recurse-submodules https://github.com/trustedsec/hate_crack.git cd hate_crack
Si vous avez cloné sans les sous-modules, initialisez-les :```bash
git submodule update --init --recursive
Ensuite, personnalisez la configuration si nécessaire. hate_crack utilise deux fichiers de configuration, chacun gérant un ensemble distinct de réglages :
config.json— chemins des wordlists, masques, règles, ajustement, potfile, chemin de hashcat, limites de candidats, bascules de notification, valeurs par défaut des préférences CLI (35 réglages)..env— paramètres d'intégration tiers uniquement : identifiants Hashview et Hashmob, identifiants Pushover, Ollama et pipal (14 réglages). Non suivi par git, créé en mode0600.
La séparation se situe là pour une raison : .env est le fichier qui peut contenir des secrets. Les identifiants et la configuration des services tiers vont dans le fichier non suivi, en 0600 ; tout ce que hate_crack fait localement reste dans config.json, qui peut être partagé, passé au diff et consigné dans vos propres notes en toute sécurité. C'est aussi pour cela que les identifiants Pushover sont dans .env tandis que les bascules marche/arrêt de Pushover sont dans config.json — les bascules sont des préférences locales, pas des secrets.
Chaque clé possède exactement un emplacement. Une clé placée dans l'autre fichier est ignorée, et hate_crack affiche un avertissement nommant le fichier auquel elle appartient. N'importe quelle clé peut néanmoins être remplacée pour une exécution unique en exportant sa variable d'environnement. La plupart des utilisateurs peuvent ignorer cette étape, car les chemins par défaut fonctionnent immédiatement.
config.json est permanent et de première classe — il n'est pas déprécié et aucun calendrier de suppression n'est prévu. Seuls les paramètres d'intégration ont été déplacés.
Migration depuis un seul config.json ? hate_crack le migre pour vous au premier lancement : les paramètres d'intégration sont copiés dans un nouveau .env en mode 0600, puis retirés de config.json afin que les deux fichiers ne les revendiquent pas tous les deux. Il affiche quelles clés ont été déplacées (jamais leurs valeurs), et enregistre votre original sous config.json.pre-split.bak avant d'y toucher. Tout le reste dans config.json est laissé exactement tel quel, ordre des clés compris.
Premier lancement : hate_crack crée les deux fichiers pour vous, il n'y a donc rien à faire. Pour configurer .env à la main, copiez plutôt le modèle suivi :```bash
cp .env.example .env
chmod 600 .env
`.env.example` est commité et fourni avec chaque clé d’identifiants vide. `.env` lui-même ne doit **jamais** être commité — il est gitignoré, ainsi que ses variantes de sauvegarde habituelles, et hate_crack le crée toujours avec le mode `0600` (lecture/écriture pour le propriétaire uniquement). `.env.example` est généré à partir du schéma ; régénérez-le après avoir modifié `hate_crack/config_schema.py` avec `uv run python -m hate_crack.config_writer`.
### 3. Installer les dépendances et hate_crack
La façon la plus simple est d’exécuter `make` (ou `make install`), qui détecte automatiquement votre OS et installe :
- Dépendances externes (p7zip, transmission-daemon / transmission-remote)
- Construit les sous-modules (hashcat-utils, princeprocessor, pcfg_cracker, et optionnellement omen)
- Dépendances Python via uv et un shim CLI dans `~/.local/bin/hate_crack````bash
make
Cette opération est idempotente - elle ignore les outils déjà installés. Pour forcer une réinstallation propre :```bash make reinstall
**Ou installez les dépendances manuellement :**
### Dépendances externes
Celles-ci sont requises pour certains flux de téléchargement/extraction :
- `7z`/`7za` (p7zip) — utilisé pour extraire les archives `.7z`.
- `transmission-daemon` / `transmission-remote` — utilisé pour télécharger les torrents Weakpass.
Commandes d'installation manuelle :
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
Ensuite, installez les dépendances Python et le shim 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
Structure du projet
La logique principale est désormais répartie en modules sous hate_crack/ :
hate_crack/cli.py: helpers argparse et remplacements de configuration.hate_crack/api.py: intégrations Hashview, Weakpass et Hashmob (téléchargements/menus/helpers).hate_crack/attacks.py: gestionnaires de menus pour les attaques.hate_crack/hashmob_wordlist.py: utilitaires de listes de mots Hashmob (wrapper léger ; appelle api.py).hate_crack/corpus_stats.py: statistiques de mots de passe sur l'ensemble du corpus utilisées pour décrire un corpus au LLM.hate_crack/plaintext.py: récupère le mot de passe à partir d'une ligne du corpus (suppression du préfixe de hash, décodage$HEX[...]) ; partagé par les modes LLM, corpus_stats et rulegen.hate_crack/llm.py: génération structurée (JSON) de candidats LLM via Atomic Agents.hate_crack/menu.py: rendu de menu partagé, avec navigation optionnelle par touches fléchées.hate_crack/noninteractive.py: répartiteur pour les sous-commandes d'attaque scriptées.hate_crack/notify/: package de notifications (backend Pushover, tailer par crack).hate_crack/username_detect.py: détecte les fichiers d'entréeusername:hashpour décider de l'option--usernamede hashcat.hate_crack/formatting.py,hate_crack/progress.py: helpers de formatage de sortie et d'affichage de progression.hate_crack/main.py: implémentation principale du CLI.
Le fichier hate_crack.py de premier niveau reste le point d'entrée principal et orchestre ces modules.
Références et remerciements
Ce projet dépend de et s'inspire d'un certain nombre de projets et services externes. Merci à :
- Hashview (http://github.com/hashview/)
- Weakpass (https://weakpass.com)
- Hashmob (https://hashmob.net)
Utilisation
Après installation avec make, exécutez hate_crack depuis n'importe où :```bash
hate_crack
or with arguments:
hate_crack <hash_file> <hash_type> [options]
Vous pouvez également exécuter via `uv` :```bash
uv run hate_crack.py <hash_file> <hash_type>
Exécuter en tant qu'outil (recommandé)
Installez à l'aide de make depuis la racine du dépôt - cela construit les sous-modules et regroupe les ressources :```bash
cd /path/to/hate_crack
make
hate_crack
La commande `make install` crée un shim bash dans `~/.local/bin/hate_crack` qui s'exécute depuis le répertoire du dépôt, afin que la configuration et les ressources soient toujours trouvées quel que soit votre répertoire de travail courant.
La configuration est également recherchée dans :
- La racine du dépôt et le répertoire du paquet
- `~/.hate_crack`
**Remarque :** Le `hcatPath` dans `config.json` sert uniquement à l'emplacement du binaire hashcat (facultatif si hashcat est dans le PATH). Les ressources Hate_crack (hashcat-utils, princeprocessor, pcfg_cracker, omen) sont chargées depuis le répertoire du dépôt et embarquées automatiquement par `make install`.
### Exécuter en tant que script
Le script utilise un shebang `uv`. Rendez-le exécutable et lancez-le :```bash
chmod +x hate_crack.py
./hate_crack.py
Vous pouvez également utiliser Python directement :```bash python hate_crack.py
### Utilisation non interactive / scriptée
Pour l'automatisation, vous pouvez lancer une seule attaque directement, en contournant le menu. Le nom de l'attaque est le premier argument, suivi du fichier de hash et du type de hash hashcat. Les invites de prétraitement (filtrage des comptes d'ordinateur, force brute LM-first, déduplication des comptes en double) acceptent automatiquement leurs valeurs par défaut dans ce mode. Le processus se termine avec `0` en cas de succès et une valeur non nulle en cas d'erreur (fichier de hash manquant, type de hash non numérique, fichier de liste de mots manquant ou nom de fichier de règles inconnu).```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
Dépannage
Erreur : "would clobber existing tag" lors de la mise à jour
Un ancien clone peut refuser de se mettre à jour, affichant une longue liste de lignes comme :``` ! [rejected] v2.5.0 -> v2.5.0 (would clobber existing tag)
Cela affecte les clones créés avant juillet 2026. L'historique publié a été réécrit
ensuite pour supprimer certains fichiers qui n'auraient jamais dû être commités, ce qui a donné
à chaque commit un nouvel ID ; les tags d'un ancien clone pointent donc vers des objets que ce
dépôt ne contient plus, et git refuse de déplacer un tag qu'il possède déjà.
Rien ne cloche dans votre checkout et aucune donnée de cracking n'est en danger.
Récupérez avec une réinitialisation unique. Cela supprime les commits et modifications locaux dans le
checkout ; donc si vous avez personnalisé quelque chose suivi par git (contrairement à
`config.json`, qui n'est pas suivi), commitez-le d'abord sur une branche :```bash
cd /path/to/hate_crack
git fetch --tags --force origin
git checkout -B main origin/main
make install
--force ne met ici à jour que les tags ; il ne peut pas toucher à vos commits. Par la suite, le programme de mise à jour intégré fonctionne normalement. Les versions antérieures à 2.18 ne pouvaient pas effectuer cette récupération elles-mêmes, c'est pourquoi elle doit être faite à la main une fois.
Erreur : le répertoire de build n'existe pas
Si vous voyez une erreur comme :``` Error: Build directory /opt/hashcat/hashcat-utils does not exist. Expected to find expander at /opt/hashcat/hashcat-utils/bin/expander.
Cela signifie que les ressources hate_crack n'ont pas été incluses dans le paquet installé.
**Comprendre les chemins :**
- `hcatPath` dans config.json → pointe vers **l'emplacement du binaire hashcat** (optionnel, peut être dans le PATH)
- `hashcat-utils/` et `princeprocessor/` → inclus dans le paquet par `make install`
**Solution :**
Réinstallez en utilisant le Makefile, qui compile les sous-modules et installe l'outil :```bash
cd /path/to/hate_crack # the repository checkout
make install
Configuration par défaut (config.json.example):
La plupart des utilisateurs peuvent utiliser les valeurs par défaut sans personnalisation:
hcatWordlists:./wordlists(relatif à la racine du dépôt ou à HOME/.hate_crack)hcatOptimizedWordlists:./optimized_wordlists(répertoire utilisé par Quick Crack; bascule surhcatWordlistss'il n'est pas trouvé)rules_directory:./hashcat/rules(inclut les règles du sous-module)hcatTuning: `` (chaîne vide - aucun indicateur de réglage par défaut)
Exemple de personnalisations 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) ... }
**Chargement de la configuration :**
- Précédence pour chaque clé : `os.environ` > le fichier d'accueil de la clé (`.env` ou `config.json`) > valeur par défaut intégrée
- Les clés manquantes retombent sur les valeurs par défaut intégrées ; `config.json.example` documente chaque clé de `config.json`
- Les deux fichiers sont recherchés, indépendamment l'un de l'autre, dans cet ordre : **racine du dépôt**, puis **répertoire du paquet installé**, puis **`~/.hate_crack`**. Le premier trouvé est utilisé ; il est normal que les deux fichiers proviennent de répertoires différents.
- Au premier lancement, les deux sont créés — `config.json` à partir de `config.json.example`, `.env` à partir des valeurs par défaut intégrées. Si un ancien `config.json` contient encore des clés d'intégration, elles sont copiées dans le nouveau `.env` et hate_crack vous indique lesquelles supprimer de `config.json` ; il ne modifie jamais ce fichier lui-même.
- À chaque exécution, hate_crack affiche les deux fichiers qu'il a réellement chargés : ```
[*] config.json: /home/you/.hate_crack/config.json
[*] .env: /home/you/.hate_crack/.env
Lisez ces deux lignes avant de déboguer un réglage qui « ne prend pas effet ». Elles existent à cause de deux pièges dans l'ordre de recherche :
- Un checkout prime sur votre répertoire personnel. La racine du dépôt est recherchée en premier, donc un
.envouconfig.jsonse trouvant dans n'importe quel checkout depuis lequel vous exécutez l'outil l'emporte sur celui de~/.hate_crack— et exécuter l'outil depuis un checkout est précisément ce qui crée ces fichiers là en premier lieu. - Le répertoire de travail courant n'est jamais recherché. Un
.envdans le répertoire où vous vous trouvez est ignoré, délibérément : les répertoires d'engagement sont pleins de fichiers que personne n'a destinés à servir de configuration. Placez-le dans la racine du dépôt ou dans~/.hate_crack.
Erreur : merge with ref 'refs/heads/master' but no such ref was fetched
Si vous voyez :``` Your configuration specifies to merge with the ref 'refs/heads/master' from the remote, but no such ref was fetched.
La branche par défaut a été renommée de `master` à `main`. Corrigez avec :```bash
git remote set-head origin -a
git branch -m master main
git branch --set-upstream-to=origin/main main
git pull
Cibles Makefile
Par défaut (installation complète) - compile les sous-modules, installe les dépendances et installe l'outil :```bash make
or explicitly:
make install
Ceci est idempotent - il ignore les outils déjà installés.
**Réinstallation propre forcée :**```bash
make reinstall
Mise à jour rapide - reconstruit les sous-modules et réinstalle l'outil (après avoir récupéré les modifications) :```bash make update
**Désinstallation** - supprime les dépendances OS et l'outil:```bash
make uninstall
Compiler uniquement hashcat-utils :```bash make hashcat-utils
**Exécuter les tests** - gère automatiquement HATE_CRACK_SKIP_INIT lorsque nécessaire :```bash
make test
Rapport de couverture :```bash make coverage
**Nettoyer les artefacts de build/test:**```bash
make clean
Développement
Configuration de l'environnement de développement
Installez le projet avec les dépendances de développement facultatives (inclut les linters et les outils de test):```bash make dev-install
### Exécution des linters et des vérifications de types
Avant de pousser des modifications, exécutez ces vérifications localement. Utilisez `make lint` pour tout, ou exécutez des vérifications individuelles :
**Ruff (lint et formatage) :**```bash
make ruff
# or manually:
uv run ruff check hate_crack tests tools packaging hate_crack.py
Correction automatique des problèmes :```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 (vérification de type):**```bash
make ty
# or manually:
uv run ty check hate_crack
Exécuter toutes les vérifications ensemble :```bash make lint
### Exécution des tests
Les tests détectent automatiquement lorsque les sous-modules ne sont pas construits et définissent `HATE_CRACK_SKIP_INIT=1` automatiquement.```bash
make test
Ou exécutez pytest directement :```bash uv run pytest -v
Avec couverture :```bash
make coverage
Ou avec pytest :```bash uv run pytest --cov=hate_crack
### Hooks Git (prek)
Les hooks Git sont gérés par [prek](https://github.com/j178/prek) (v0.3.3+). Installez les hooks avec :```bash
prek install --hook-type pre-push --hook-type pre-commit
Ceci installe les hooks définis dans prek.toml en utilisant le schéma TOML local-repo de pre-commit :
- pre-push (hooks locaux) : ruff, ruff-format, ty, pytest, pytest-lima, bandit
- pre-commit (depuis
pre-commit/pre-commit-hooks) : trailing-whitespace, end-of-file-fixer, check-yaml, check-merge-conflict, check-added-large-files, detect-private-key
Les auto-correcteurs pre-commit réécrivent les fichiers sur place, donc re-stagez et committez à nouveau après leur exécution.
Remarque : prek 0.3.3 attend repos = [...] au niveau supérieur. L'ancien format [hooks.<stage>] commands = [...] n'est pas pris en charge.
Navigation dans le menu avec les touches fléchées
Les menus utilisent par défaut la sélection classique numérotée print() + input(), qui accepte les touches complètes à plusieurs chiffres.
Pour activer la navigation par touches fléchées via simple-term-menu, définissez HATE_CRACK_ARROW_MENU=1. Dans ce mode, seules les touches de raccourci à un seul chiffre fonctionnent ; les options numérotées 10 et plus doivent être atteintes avec les touches fléchées. Le mode touches fléchées nécessite également un TTY, il reste donc désactivé lorsque la sortie est redirigée (piped).
Dépendances de développement
Le groupe optionnel [dev] comprend :
- ty - Vérificateur de types statique
- ruff - Linter et formateur Python rapide
- pytest - Cadre de test
- pytest-cov - Rapport de couverture
Options courantes :
--download-hashview: Télécharger les hashes depuis Hashview avant le cracking.--hashview: Menu Hashview interactif pour gérer les hashes, les wordlists et les tâches.--hashview --help: Afficher les options en ligne de commande de Hashview.--weakpass: Télécharger les wordlists depuis Weakpass.--hashmob: Télécharger les wordlists depuis Hashmob.net.--download-torrent <FILENAME>: Télécharger un fichier torrent Weakpass spécifique.--download-all-torrents: Télécharger tous les torrents Weakpass disponibles depuis le cache.--wordlists-dir <PATH>/--optimized-wordlists-dir <PATH>: Remplacer les répertoires de wordlists.--pipal-path <PATH>: Remplacer le chemin de pipal.--restore-potfile: Reconstruire<hashfile>.outà partir du fichier POT de hashcat au démarrage, en remplaçant tout contenu existant, puis continuer dans le menu normal. Sans ce drapeau, la recherche POT ne s'exécute que lorsque.outn'existe pas déjà. L'option de menu 93 fait la même chose à la demande, avec une invite de confirmation.--maxruntime <SECONDS>: Remplacer la durée d'exécution maximale.--bandrel-basewords <PATH>: Remplacer le fichier de mots de base bandrel.--update: Mettre à jour vers la dernière version et réinstaller. Bascule le checkout surmains'il est sur une autre branche, car les tags de version y vivent.--nightly: Mettre à jour vers la dernière nightly à la place, depuis la branchenightly-dev. Les nightly ont passé la CI mais ne font pas partie d'une version publiée. Peut aussi s'écrire--update --nightly.--no-optimized-kernel(ou--no-optimize) : Ne jamais passer-Oà hashcat pour toute l'exécution. RemplaceoptimizedKernelAttacksdansconfig.jsonet supprime tout-Oque vous avez mis danshcatTuning. Rien n'est réécrit dans la config, cela ne s'applique donc qu'à cette exécution. Avec une sous-commande, placez-le avant la sous-commande :./hate_crack.py --no-optimize quick hashes.txt 1000 --wordlist words.txt.--debug: Activer la journalisation de débogage (écrit sur stderr).
Intégration Hashview
hate_crack s'intègre à Hashview pour la gestion centralisée des hashes et le cracking distribué.
Menu interactif
Accéder au menu interactif Hashview :```bash hate_crack.py --hashview
Options du menu :
- **(1) Upload Cracked Hashes** - Envoyer les résultats crackés de la session courante vers Hashview
- **(2) Upload Wordlist** - Envoyer un fichier wordlist vers Hashview
- **(3) Download Wordlist** - Télécharger une wordlist depuis Hashview
- **Download Rule** - Télécharger un fichier de règles depuis Hashview (décompressé en texte brut, prêt pour `hashcat -r`)
- **(4) Download Left Hashes** - Télécharger les hashes non crackés restants (invite à basculer pour le cracking)
- **(5) Download Found Hashes** - Télécharger les hashes déjà crackés avec les mots de passe en clair (pour référence/analyse)
- **(6) Upload Hashfile and Create Job** - Envoyer un nouveau fichier de hashes et créer une tâche de cracking
- **(99) Back to Main Menu** - Revenir au menu principal
**Important : Download Found vs Download Left**
- **Download Left Hashes (4)** : Télécharge les hashes non crackés qui doivent être crackés. Fusionne automatiquement avec les hashes trouvés si disponibles, et invite à basculer vers ce fichier de hashes pour le cracking.
- **Download Found Hashes (5)** : Télécharge les hashes déjà crackés au format hash:cleartext. Ceux-ci servent de référence et ne peuvent pas être crackés davantage. Aucune invite de basculement n'est affichée.
#### Interface en ligne de commande
Les opérations Hashview peuvent également être effectuées via la ligne de commande :
Envoyer les hashes crackés :```bash
hate_crack.py --hashview upload-cracked --file <output_file>.out --hash-type 1000
Téléverser une liste de mots :```bash hate_crack.py --hashview upload-wordlist --file .txt --name "My Wordlist"
Téléchargez un fichier de règles (enregistré décompressé, prêt pour `hashcat -r`):```bash
hate_crack.py --hashview download-rules --rules-id 4 --output best64.rule
Télécharger les hashes restants (hashes non craqués pour le craquage):```bash hate_crack.py --hashview download-left --customer-id 1 --hashfile-id 123
Télécharger les hashes trouvés (hashes déjà craqués avec texte en clair):```bash
hate_crack.py --hashview download-found --customer-id 1 --hashfile-id 123
Téléverser le hashfile et créer la tâche :```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"
#### Configuration
Définissez les identifiants Hashview dans `.env` (ce sont des paramètres d'intégration, donc ils ne se trouvent pas dans `config.json`) :```
HASHVIEW_URL=https://hashview.example.com
HASHVIEW_API_KEY=your-api-key-here
Configuration d'Ollama
L'attaque LLM (option 12) utilise Ollama pour générer des candidats de mot de passe. Configurez le modèle, la fenêtre de contexte et le délai d'expiration de la requête dans .env :```
OLLAMA_MODEL=qwen2.5:32b
OLLAMA_NUM_CTX=8192
OLLAMA_TIMEOUT=300
- **`OLLAMA_MODEL`** — Le modèle Ollama utilisé pour la génération de candidats (par défaut : `qwen2.5:32b`). L'attaque LLM utilise une sortie structurée (JSON), choisissez donc un modèle avec un bon support des outils/JSON.
- **`OLLAMA_NUM_CTX`** — Taille de la fenêtre de contexte pour le modèle (par défaut : `8192`). Elle était de `2048` avant l'introduction des statistiques de corpus, ce qui était trop petit pour contenir le prompt qui lui était fourni : 500 textes clairs échantillonnés représentent environ 2,000–3,500 tokens avant le prompt système et la réponse, donc Ollama tronquait silencieusement une partie de l'échantillon que l'échantillonneur avait soigneusement répartie dans le fichier.
- **`OLLAMA_TIMEOUT`** — Secondes à attendre une réponse de génération avant d'abandonner (par défaut : `300`). Augmentez cette valeur si un grand modèle est encore en cours de chargement en VRAM lors de la première requête, ce qui peut sinon dépasser le délai d'attente ; hate_crack affiche le délai écoulé et le nom de ce paramètre lorsque cela se produit.
- **`OLLAMA_MAX_SAMPLE_LINES`** — Le seuil en dessous duquel les modes LLM collent également les textes clairs littéraux dans le prompt (par défaut : `500`). Les valeurs ≤ 0 sont traitées comme 500.
Les modes dérivés du corpus (**Wordlist**, **Cracked passwords**, **Pattern rules**) décrivent toujours le *corpus entier* de manière statistique — proportions de mots de base, masques, casses, longueurs, chiffres et symboles finaux, années — plutôt que d'en coller un extrait. L'agrégation est bornée, donc un dump de 120,000 mots de passe coûte à peu près le même espace de prompt qu'un dump de 500 lignes. Lorsque le corpus entier tient sous ce seuil, les textes clairs bruts sont également inclus, car il n'y a rien à gagner à cacher un petit corpus au modèle.
Cela remplace le comportement précédent consistant à coller un échantillon régulièrement espacé d'au plus `ollamaMaxSampleLines` mots de passe. Un échantillon d'un gros dump ne transmettait aucune information de fréquence : le modèle ne pouvait pas distinguer un mot de base utilisé par 8 % de l'organisation d'un mot de base utilisé par une seule personne, ce qui est précisément le signal qui rend une tentative intéressante.
- **`OLLAMA_NO_CLOUD`** — Quand `true`, refuse d'envoyer quoi que ce soit à un modèle *cloud* Ollama. Ollama transmet un modèle marqué `-cloud` (`gpt-oss:120b-cloud`, `deepseek-v3.1:671b-cloud`) vers ollama.com via le même point de terminaison local qu'un modèle local, donc rien dans la requête ne semble différent — mais les prompts de hate_crack contiennent les textes clairs récupérés, les statistiques du corpus, ainsi que le nom, le secteur et la localisation du client. Avec cette option activée, un nom de modèle cloud est refusé avant même la construction de toute requête. La valeur par défaut est `false`, donc un modèle cloud configuré délibérément continue de fonctionner ; activez-la pour les missions où les données client ne doivent pas quitter l'hôte.
- **`OLLAMA_AUTO_RESEARCH`** — Quand `true` (par défaut), le mode **Target info** demande au modèle local de suggérer le secteur et la localisation dès que vous avez tapé le nom de l'entreprise, et les propose comme valeurs par défaut modifiables du prompt. Mettez `false` pour toujours obtenir des prompts vides (utile avec un modèle lent, car la recherche coûte un aller-retour supplémentaire avant le début de l'attaque).
- **`OLLAMA_HOST`** — Où Ollama écoute. Accepte un `host:port` nu (`theplague.lan:11434`) ou une URL complète avec un schéma (`https://ollama.example.com`) ; dans les deux cas, l'URL de base est normalisée avant utilisation. Par défaut `localhost:11434`. Définissez-le dans `.env`, ou exportez-le comme une véritable variable d'environnement pour le remplacer pour une seule exécution — c'est le même nom de variable que lit le propre CLI d'Ollama.
- Assurez-vous qu'Ollama est en cours d'exécution et que le modèle est téléchargé (`ollama pull qwen2.5:32b`) avant d'utiliser l'attaque LLM — hate_crack ne télécharge plus automatiquement les modèles manquants.
L'attaque propose trois modes de génération :
1. **Target info** — entreprise / secteur / localisation ; le modèle déduit les candidats de ces détails.
Après avoir tapé le nom de l'entreprise, hate_crack demande au même modèle local ce qu'il sait déjà de cette organisation et pré-remplit les prompts **Industry** et **Location** avec les réponses, affichées entre parenthèses : ```
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):
Appuyez sur Entrée pour accepter une suggestion ou tapez par-dessus. Ces valeurs sont le souvenir du modèle, pas de l'OSINT — traitez-les comme un point de départ, pas comme des renseignements sur le client. La recherche n'utilise que le serveur Ollama local, donc le nom du client ne quitte jamais l'hôte ; il n'y a aucun appel web ou API tiers. Si le modèle ne reconnaît pas l'organisation (cas courant pour les petits clients), il ne renvoie rien et vous obtenez simplement des invites vides : ``` Company name: Acme Rail Services Industry: Location:
Un échec de recherche — délai d'attente, Ollama non lancé, réponse vide — ne bloque jamais l'attaque ; il retombe simplement sur des invites vides. Définissez `ollamaAutoResearch` sur `false` pour ignorer complètement la recherche.
2. **Wordlist** — dériver les mots de base à partir d'un échantillon de liste de mots.
3. **Mots de passe craqués** — renvoyer au modèle les textes en clair déjà récupérés lors de cette session (`<hashfile>.out`) afin qu'il puisse déduire les conventions de mots de passe propres à l'organisation cible (mots de base, saisons, années, suffixes, leetspeak) et générer de *nouveaux* candidats dans le même style. Cette option n'est proposée qu'à partir du moment où au moins un hash a été craqué ; le fichier entier est analysé statistiquement exactement comme le mode Wordlist (voir `ollamaMaxSampleLines` ci-dessus).
#### Configuration PCFG
L'attaque PCFG (option 20) et l'attaque PRINCE-LING (option 21) utilisent le sous-module `pcfg_cracker`. Configurez-les dans `config.json` :```json
{
"pcfgRuleset": "DEFAULT",
"pcfgMaxCandidates": 50000000,
"pcfgPrinceLingMaxCandidates": 10000000
}
pcfgRuleset— Nom de la grammaire entraînée à utiliser (défaut :DEFAULT), résolu verspcfg_cracker/Rules/<name>/. Entraînez la vôtre avectrainer.pyde pcfg_cracker et définissez cette valeur sur le nom du jeu de règles.pcfgMaxCandidates— Nombre maximal de candidats quepcfg_guesser.pyémet pour l'attaque PCFG (défaut :50000000).pcfgPrinceLingMaxCandidates— Nombre maximal de mots de base queprince_ling.pyécrit dans la liste de mots de base PRINCE en cache (défaut :10000000).
Noyaux optimisés (optimizedKernelAttacks)
L'option -O de hashcat sélectionne les noyaux optimisés, qui sont nettement plus rapides
mais plafonnent la longueur des candidats (environ 31 caractères, moins pour certains modes) et
ignorent silencieusement tout ce qui est plus long. optimizedKernelAttacks dans config.json liste
les attaques qui s'exécutent avec -O; omettez une attaque de la liste pour l'exécuter avec des
noyaux pleine longueur. La liste dans config.json.example correspond au défaut intégré
qui s'applique lorsqu'aucun config.json n'existe.
Quatre attaques respectent ce réglage mais ne sont pas optimisées par défaut, car
elles alimentent des candidats pouvant dépasser le plafond de -O — ajoutez-les à la liste pour
les activer :
hcatNgramX,hcatOllama,hcatOmen,hcatLMtoNT
Pour désactiver -O partout pour une seule exécution sans modifier la configuration, passez
--no-optimized-kernel (forme courte --no-optimize). Cela remplace la liste pour
chaque attaque et supprime également un -O écrit dans hcatTuning, qui
atteindrait sinon hashcat indépendamment de la liste.
Les noms sont comparés exactement, et une entrée non reconnue est signalée au démarrage
plutôt qu'ignorée. Notez que les attaques qui délèguent à une autre attaque sont
contrôlées par l'attaque à laquelle elles délèguent, et non par leur propre nom : PRINCE-LING
suit hcatPrince, tandis que Spoonman, Rosetta et les modes de règles de motifs LLM
suivent hcatQuickDictionary.
Notifications (option de menu 82)
hate_crack peut envoyer des notifications push Pushover lorsque les attaques se terminent et,
optionnellement, lorsque des hachages individuels sont cassés. Tous les contrôles se trouvent sous
l'option 82 — Notifications du menu principal :
- Activer/désactiver les notifications Pushover [ON/OFF] — interrupteur principal. Persiste dans
config.jsonsousnotify_enabled. - Activer/désactiver les notifications par crack [ON/OFF] — lorsqu'il est sur ON, un tailer en arrière-plan surveille le fichier
.outet pousse une notification par crack (avec agrégation des rafales par tick). Persiste dansconfig.jsonsousnotify_per_crack_enabled. Ne peut pas être activé pendant que l'interrupteur principal est sur OFF — activez d'abord l'option 1. - Envoyer une notification Pushover de test — déclenche une notification prédéfinie pour confirmer que votre paire jeton/utilisateur Pushover fonctionne. Fonctionne même lorsque l'interrupteur principal est sur OFF.
Les identifiants se trouvent dans .env; les autres paramètres de réglage ne se configurent que dans le fichier config.json :
NOTIFY_PUSHOVER_TOKEN,NOTIFY_PUSHOVER_USER(dans.env) — requis pour que toute notification soit envoyée. Rien dans le menu n'écrit ces valeurs; modifiez.envvous-même.notify_attack_allowlist— noms des attaques qui acceptent automatiquement sans l'invite[y/N/always]. Rempli automatiquement lorsque vous répondezalways.notify_suppress_in_orchestrators(défauttrue) — réduit au silence les attaques individuelles enchaînées par Extensive Crack, qui émet à la place une seule notification récapitulative. Mettezfalsepour obtenir une notification par attaque enchaînée. Les autres entrées de menu qui exécutent plusieurs passes (par exemple Quick Crack avec plusieurs chaînes de règles) ne sont pas des orchestrateurs et notifient toujours par passe.notify_max_cracks_per_burst(défaut5),notify_poll_interval_seconds(défaut5.0) — réglage du tailer par crack. Voirhate_crack/notify/tailer.pypour la logique d'agrégation des rafales.
Outils de listes de mots (option de menu 80)
Le sous-menu Outils de listes de mots fournit des utilitaires de prétraitement de listes de mots reposant sur les binaires hashcat-utils, ainsi que des téléchargements de listes de mots depuis Hashmob.net et Weakpass. Accédez-y via l'option 80 du menu principal.
| Option | Binaire | Description |
|---|---|---|
| 1 | len.bin | Filtrer par longueur - ne conserver que les mots entre une longueur minimale et maximale |
| 2 | req-include.bin | Exiger des classes de caractères - ne conserver que les mots contenant tous les types de caractères requis |
| 3 | req-exclude.bin | Exclure des classes de caractères - supprimer les mots contenant un type de caractère exclu |
| 4 | cutb.bin | Extraire une sous-chaîne - couper une plage d'octets de chaque mot |
| 5 | splitlen.bin | Fractionner par longueur - créer des fichiers séparés par longueur de mot (fichiers nommés 01-64 dans un répertoire de sortie) |
| 6 | rli.bin / rli2.bin | Soustraire des mots - supprimer les entrées présentes dans un ou plusieurs autres fichiers |
| 7 | gate.bin | Partitionner - extraire un mot sur N pour le cracking distribué sur plusieurs machines |
| 8 | - | Optimiser les listes de mots - dédupliquer et fractionner en fichiers par longueur dans le répertoire des listes de mots optimisées |
| 9 | - | Télécharger des listes de mots depuis Hashmob.net |
| 10 | - | Télécharger des listes de mots depuis Weakpass (via BitTorrent) |
Bits du masque de classes de caractères (utilisés par les options 2 et 3) : 1=minuscule, 2=majuscule, 4=chiffre, 8=symbole, 16=autre. Additionnez les valeurs : 7 = minuscule+majuscule+chiffre.
Comment le partitionnement est censé être utilisé : le partitionnement divise une liste de mots en N parties égales et non chevauchantes afin que le travail puisse être réparti sur plusieurs machines ou GPU. Chaque partie est entrelacée (une ligne sur N), donc chaque fragment est un échantillon représentatif de la liste entière plutôt qu'un bloc contigu de début/fin — aucun nœud n'est coincé à casser uniquement la queue à faible probabilité.
Exécutez l'option 7 une fois, donnez-lui une liste de mots en entrée, un chemin de base en sortie et un nombre de fragments (N). Elle écrit les N parties en une seule passe, nommées avec des numéros de partie remplis de zéros (base.001, base.002, … jusqu'à base.00N). Copiez une partie sur chaque nœud et pointez l'exécution hashcat de ce nœud dessus. Sur un système à un seul GPU, le partitionnement n'apporte aucun gain de vitesse, mais une seule partie reste un échantillon rapide et représentatif pour une passe de triage rapide avant de s'engager sur la liste complète.
Vérifications automatiques de mises à jour
hate_crack peut vérifier automatiquement sur GitHub la présence de nouvelles versions au démarrage. Cette fonctionnalité est contrôlée par l'option de configuration check_for_updates :```json
{
"check_for_updates": true
}
- **`check_for_updates`** — Active la vérification automatique des versions au démarrage (par défaut : `true`).
- Lorsque cette option est activée, hate_crack récupère les dernières informations de version depuis GitHub et affiche une notification si une mise à jour est disponible.
- La vérification s'exécute de manière asynchrone et ne bloque pas le démarrage. Les erreurs réseau sont ignorées silencieusement.
##### Canaux de mise à jour
| Canal | Option | Source | Ce que vous obtenez |
|---------|------|--------|--------------|
| Release | `--update` | `main` | La dernière version publiée. C'est le choix par défaut et ce que propose la vérification au démarrage. |
| Nightly | `--nightly` | `nightly-dev` | Le travail qui a passé la CI mais qui n'a pas encore été publié. |
Les versions suivent le semver classique, l'incrément étant dérivé de ce qui se trouve réellement dans le lot. Le deuxième composant n'évolue **que pour les fonctionnalités** : un cycle contenant un commit `feat` aboutit à `X.(Y+1).0`, et un cycle composé uniquement de correctifs, de documentation et de maintenance aboutit à `X.Y.(Z+1)`.
`nightly-dev` tague des release candidates pour la version vers laquelle le lot se dirige — `v2.20.1rc1`, `v2.20.1rc2`, … — et la fusion vers `main` promeut cette même cible en version finale. Les candidates sont de véritables préversions PEP 440, elles se classent donc correctement aux deux extrémités :
2.20.0 < 2.20.1rc1 < 2.20.1rc2 < 2.20.1 < 2.21.0rc1 < 2.21.0
La cible peut changer en cours de cycle : le premier `feat` qui arrive la fait passer de `X.Y.(Z+1)` à `X.(Y+1).0`, et la numérotation des candidates redémarre pour la nouvelle cible. Le numéro indique toujours ce que le lot publierait aujourd'hui.
Le composant majeur n'est jamais incrémenté automatiquement — un sujet avec `!` ou un pied de page `BREAKING CHANGE:` compte comme une fonctionnalité, car une version majeure automatique n'est qu'à une ligne de sujet mal saisie d'une publication définitive irréversible. Une version majeure est un acte humain explicite : il faut créer le tag et le pousser à la main.
La politique se trouve dans `tools/next_version.py`, partagée par les deux workflows de tagging et testée unitairement dans `tests/test_next_version.py`.
La vérification au démarrage ne propose jamais que des releases, car les nightly ne publient aucune release GitHub et la vérification lit le point d'extrémité « latest release » de GitHub — donc activer `check_for_updates` ne vous fera jamais passer sur une nightly. Deux éléments distinguent désormais les canaux : ce fait, et le fait qu'une candidate est une véritable préversion PEP 440, de sorte qu'un outil qui classe les numéros de version bruts la considère également comme plus ancienne que la release qu'elle devient.
Chacune des deux options bascule d'abord votre checkout vers la branche correspondante (et refuse de le faire si vous avez des modifications non validées). Si vous utilisez une nightly et souhaitez revenir au code publié, `--update` vous ramène sur `main`.
#### Fusion automatique des hashs trouvés (téléchargement des restants uniquement)
Lors du téléchargement des hashs restants (hashs non craqués), hate_crack automatiquement :
1. Tente de télécharger les éventuels hashs trouvés (craqués) depuis Hashview en tant qu'opération auxiliaire
2. Fusionne les hashs trouvés avec les fichiers `.out` locaux (par exemple, `left_1_123.txt.out` ou `left_1_123.nt.txt.out` pour le format pwdump)
3. Supprime les entrées en double
4. Nettoie les fichiers temporaires fractionnés après la fusion
Cela garantit que vos résultats de craquage locaux restent synchronisés avec la base de données centralisée de Hashview lorsque vous travaillez avec des hashs non craqués.
**Remarque :** L'option download-found télécharge séparément les hashs déjà craqués à des fins de référence et n'effectue aucune fusion ni invite à lancer le craquage.
Le <hash_type> est obtenu en exécutant `hashcat --help`
Exemples de hashs : 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
Aucun contenu fourni.``` $ ./hate_crack.py 1000
/ | _____ / | ____ _ ___ ____________ ____ | | __
/ ~ __ \ / __ \ / \ /_ __ _ \ / | |/ /
\ Y // __ | | \ / \ _| | // __ \ _| <
___| /(__ /| _ >______ /|__| ( /___ >|_
/ / /___/ / / / /
Version 2.0
## Testing
La suite de tests est principalement hors ligne et utilise des mocks/fixtures. Les vérifications réseau en direct et les contrôles de dépendances système sont optionnels via des variables d'environnement.
### Exécution des tests localement```bash
# Run all tests
uv run pytest -v
# Run specific test
uv run pytest tests/test_hashview.py -v
Vous pouvez également exécuter la suite complète avec make test.
Tests en direct (opt-in)
Définissez l'une des variables suivantes pour activer les vérifications en direct :
HASHMOB_TEST_REAL=1— vérification de la connectivité Hashmob / du menu CLI en directHASHVIEW_TEST_REAL=1— vérification du menu CLI Hashview en directWEAKPASS_TEST_REAL=1— vérification du menu CLI Weakpass en directHATE_CRACK_REQUIRE_DEPS=1— échoue si7z,transmission-daemonoutransmission-remoteest manquant
Test de téléversement Hashview en direct
Le test de téléversement Hashview en direct est ignoré par défaut. Pour l'exécuter, définissez la variable d'environnement et fournissez des identifiants valides dans .env :```bash
HATE_CRACK_RUN_LIVE_TESTS=1 uv run pytest tests/test_upload_cracked_hashes.py -v
### Tests Hashview en direct contre une pile Docker locale
Au lieu de pointer les tests en direct vers un serveur Hashview distant, vous pouvez faire en sorte que la suite démarre une pile Docker [Hashview](https://github.com/hashview/hashview) locale, la peuple, exécute les tests en direct contre elle, puis la démonte. Définissez `HASHVIEW_TEST_LOCAL=1` et pointez `HASHVIEW_REPO` vers un checkout de 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
This brings up docker compose in the Hashview repo, seeds an admin API key,
a customer, a hashfile, and cracked "effective task" data, then exports the
HASHVIEW_* env vars the tests read. Useful env vars:
HASHVIEW_TEST_LOCAL=1— enable the local stack (no-op otherwise)HASHVIEW_REPO=<path>— Hashview checkout (default~/projects/hashview)HASHVIEW_KEEP=1— leave containers running after the session (faster re-runs)HASHVIEW_LOCAL_PORT=5000— host port the app is published on
The hate_crack CLI honours the HASHVIEW_URL / HASHVIEW_API_KEY environment
variables (overriding the .env those two keys live in), which is what lets the
suite point the CLI at the local stack without editing your persisted config.
End-to-End Install Tests (Local + Docker)
Local uv tool install + script execution (uses a temporary HOME):
Cela démarre docker compose dans le dépôt Hashview, initialise une clé API admin,
un client, un fichier de hachage et des données de « tâches effectives » crackées,
puis exporte les variables d'environnement HASHVIEW_* lues par les tests.
Variables d'environnement utiles :
HASHVIEW_TEST_LOCAL=1— active la pile locale (aucun effet sinon)HASHVIEW_REPO=<path>— dossier de Hashview (par défaut~/projects/hashview)HASHVIEW_KEEP=1— laisse les conteneurs en cours d'exécution après la session (réexécutions plus rapides)HASHVIEW_LOCAL_PORT=5000— port hôte sur lequel l'application est publiée
Le CLI hate_crack respecte les variables d'environnement HASHVIEW_URL / HASHVIEW_API_KEY
(en écrasant le .env dans lequel ces deux clés se trouvent), ce qui permet à la
suite de pointer le CLI vers la pile locale sans modifier votre configuration persistée.
Tests d'installation de bout en bout (local + Docker)
Installation de l'outil uv en local + exécution du script (utilise un HOME temporaire) :```bash HATE_CRACK_RUN_E2E=1 uv run pytest tests/test_e2e_local_install.py -v
Installation/exécution de bout en bout basée sur Docker (mise en cache via `Dockerfile.test`) :```bash
HATE_CRACK_RUN_DOCKER_TESTS=1 uv run pytest tests/test_docker_script_install.py -v
Le test E2E Docker télécharge également un petit sous-ensemble de rockyou et exécute un crack hashcat de base pour valider l'intégration des outils externes.
Test de bout en bout de la VM Lima (macOS uniquement) :
Prérequis : Lima et rsync doivent être installés.```bash
brew install lima
La VM de test est provisionnée automatiquement avec toutes les dépendances 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
Ce test valide l'installation et l'exécution dans une VM Linux légère sur macOS.
Structure du test
- tests/test_hashview.py : Suite de tests complète pour la classe HashviewAPI avec des réponses API simulées, notamment :
- Liste des clients et validation des données
- Tests d'authentification et d'autorisation
- Téléversement de fichier de hachages
- Workflow complet de création de tâche
Tous les tests utilisent des appels API simulés, ils peuvent donc s'exécuter sans connexion à un serveur Hashview.
(1) Craquage rapide (2) Craquage par méthodologie Pure_Hate étendue (3) Attaque par force brute (4) Attaque Top Mask (5) Attaque par empreintes (6) Attaques Combinator (7) Attaque hybride (8) Craquage par force brute avec masques Top 100 de Pathwell (9) Attaque PRINCE (10) Méthodologie Bandrel (11) Attaque en boucle (12) Attaque LLM (13) Attaque OMEN (14) Attaque par masque ad hoc (15) Attaque par force brute de Markov (16) Attaque par N-grammes (17) Attaque par permutation (18) Attaque par règles aléatoires (19) Attaque par phrase de passe Combipow (20) Attaque PCFG (21) Attaque PRINCE-LING (22) Attaque Spoonman (23) Attaque Rosetta
(80) Outils de listes de mots (81) Outils de fichiers de règles (82) Notifications
(93) Régénérer le .out à partir du fichier POT (94) API Hashview (95) Analyser les hachages avec Pipal (96) Exporter la sortie au format Excel (97) Afficher les hachages craqués (98) Afficher le README (99) Quitter
Sélectionnez une tâche :```
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.
Quelle(s) règle(s) souhaitez-vous exécuter ?
(1) best64.rule
(2) d3ad0ne.rule
(3) T0XlC.rule
(4) dive.rule
(99) YOLO...exécuter toutes les règles
Saisissez la liste des règles que vous souhaitez exécuter, séparées par des virgules. Pour exécuter des règles enchaînées, utilisez le symbole +.
Par exemple, 1+1 exécutera best64.rule enchaînée deux fois et 1,2 exécutera best64.rule puis d3ad0ne.rule séquentiellement.
Choisissez judicieusement :```
#### 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).