
hate_crack v2.11.2
Uma ferramenta para automatizar metodologias de cracking através do Hashcat da equipe TrustedSec.
___ ___ __ _________ __
/ | \_____ _/ |_ ____ \_ ___ \____________ ____ | | __
/ ~ \__ \\ __\/ __ \ / \ \/\_ __ \__ \ _/ ___\| |/ /
\ Y // __ \| | \ ___/ \ \____| | \// __ \\ \___| <
\___|_ /(____ /__| \___ >____\______ /|__| (____ /\___ >__|_ \
\/ \/ \/_____/ \/ \/ \/ \/
Instalação
Instalar a partir do código-fonte é o único caminho suportado. hate_crack não
é distribuído no PyPI: pip install hate-crack resolve para um placeholder 0.0.0
que falha de propósito e aponta de volta para cá. O nome é mantido apenas para que
ninguém mais possa publicar algo parecido sob ele — veja
packaging/pypi-placeholder/.
1. Instalar o hashcat
O Hashcat deve estar instalado e disponível no seu PATH:
Ubuntu/Kali:```bash sudo apt-get install -y hashcat
macOS (Homebrew):```bash
brew install hashcat
Ou baixe um binário pré-compilado de https://hashcat.net/hashcat/ e defina hcatPath em config.json para a sua localização.
2. Baixar o hate_crack
Clone com submódulos (necessário para hashcat-utils, princeprocessor, pcfg_cracker e, opcionalmente, omen):```bash git clone --recurse-submodules https://github.com/trustedsec/hate_crack.git cd hate_crack
Se você clonou sem submódulos, inicialize-os:```bash
git submodule update --init --recursive
Depois personalize a configuração, se necessário. hate_crack usa dois arquivos de configuração, cada um com um conjunto distinto de configurações:
config.json— caminhos de wordlist, máscaras, regras, ajustes, potfile, caminho do hashcat, limites de candidatos, interruptores de notificação, padrões de preferência de CLI (35 configurações)..env— apenas configurações de integração de terceiros: credenciais do Hashview e Hashmob, credenciais do Pushover, Ollama e pipal (14 configurações). Não rastreado pelo git, criado com modo0600.
A linha é traçada ali por um motivo: .env é o arquivo que pode conter segredos. As credenciais e a configuração de serviços de terceiros ficam no arquivo não rastreado, com modo 0600; tudo o que o hate_crack faz localmente permanece em config.json, que é seguro para compartilhar, comparar (diff) e versionar em suas próprias anotações. É também por isso que as credenciais do Pushover estão em .env enquanto os interruptores de ligar/desligar do Pushover estão em config.json — os interruptores são preferências locais, não segredos.
Cada chave tem exatamente um lugar. Uma chave colocada no outro arquivo é ignorada, e o hate_crack imprime um aviso informando o arquivo ao qual ela pertence. Qualquer chave ainda pode ser substituída em uma execução única exportando sua variável de ambiente. A maioria dos usuários pode pular esta etapa, pois os caminhos padrão funcionam imediatamente.
config.json é permanente e de primeira classe — não está obsoleto e não há cronograma para removê-lo. Apenas as configurações de integração foram movidas.
Atualizando a partir de um único config.json? O hate_crack faz a migração para você na primeira execução: as configurações de integração são copiadas para um novo .env com modo 0600 e, em seguida, removidas do config.json para que os dois arquivos não reivindiquem as mesmas configurações. Ele imprime quais chaves foram movidas (nunca seus valores) e salva seu original como config.json.pre-split.bak antes de alterá-lo. Todo o resto em config.json permanece exatamente como estava, incluindo a ordem das chaves.
Primeira execução: o hate_crack cria os dois arquivos para você, portanto não há nada a fazer. Para configurar o .env manualmente, em vez disso, copie o modelo rastreado:```bash
cp .env.example .env
chmod 600 .env
`.env.example` é commitado e incluído com todas as chaves de credenciais vazias. O `.env` em si **nunca** deve ser commitado — ele está no gitignore, juntamente com suas variações de backup habituais, e o hate_crack sempre o cria no modo `0600` (somente leitura/gravação do proprietário). O `.env.example` é gerado a partir do esquema; regenere-o após alterar `hate_crack/config_schema.py` com `uv run python -m hate_crack.config_writer`.
### 3. Instalar dependências e o hate_crack
A maneira mais fácil é executar `make` (ou `make install`), que detecta automaticamente seu sistema operacional e instala:
- Dependências externas (p7zip, transmission-daemon / transmission-remote)
- Compila submódulos (hashcat-utils, princeprocessor, pcfg_cracker e, opcionalmente, omen)
- Dependências Python via uv e um shim de CLI em `~/.local/bin/hate_crack````bash
make
Isto é idempotente - ele ignora ferramentas já instaladas. Para forçar uma reinstalação limpa:```bash make reinstall
**Ou instale as dependências manualmente:**
### Dependências Externas
Elas são necessárias para determinados fluxos de download/extração:
- `7z`/`7za` (p7zip) — usado para extrair arquivos `.7z`.
- `transmission-daemon` / `transmission-remote` — usado para baixar torrents do Weakpass.
Comandos de instalação manual:
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
Em seguida, instale as dependências Python e o shim da 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
Estrutura do Projeto
A lógica principal agora está dividida em módulos sob hate_crack/:
hate_crack/cli.py: helpers do argparse e substituições de configuração.hate_crack/api.py: integrações com Hashview, Weakpass e Hashmob (downloads/menus/helpers).hate_crack/attacks.py: handlers de ataque do menu.hate_crack/hashmob_wordlist.py: utilitários de wordlist do Hashmob (wrapper fino; chama api.py).hate_crack/corpus_stats.py: estatísticas de senhas de todo o corpus usadas para descrever um corpus ao LLM.hate_crack/plaintext.py: recupera a senha a partir de uma linha do corpus (remoção de prefixo de hash, decodificação$HEX[...]); compartilhado pelos modos LLM, corpus_stats e rulegen.hate_crack/llm.py: geração estruturada (JSON) de candidatos via Atomic Agents.hate_crack/menu.py: renderizador de menu compartilhado, incluindo navegação opcional por setas.hate_crack/noninteractive.py: despachante para os subcomandos de ataque scriptados.hate_crack/notify/: pacote de notificações (backend Pushover, tailer por crack).hate_crack/username_detect.py: detecta arquivos de entradausername:hashpara decidir sobre o--usernamedo hashcat.hate_crack/formatting.py,hate_crack/progress.py: helpers de formatação de saída e exibição de progresso.hate_crack/main.py: implementação principal da CLI.
O hate_crack.py de nível superior continua sendo o ponto de entrada principal e orquestra esses módulos.
Referências e Agradecimentos
Este projeto depende e é inspirado por uma série de projetos e serviços externos. Agradecimentos a:
- Hashview (http://github.com/hashview/)
- Weakpass (https://weakpass.com)
- Hashmob (https://hashmob.net)
Uso
Após instalar com make, execute o hate_crack de qualquer lugar:```bash
hate_crack
or with arguments:
hate_crack <hash_file> <hash_type> [options]
Alternativamente, execute via `uv`:```bash
uv run hate_crack.py <hash_file> <hash_type>
Executar como ferramenta (recomendado)
Instale usando make a partir da raiz do repositório - isso compila os submódulos e empacota os recursos:```bash
cd /path/to/hate_crack
make
hate_crack
O comando `make install` cria um shim bash em `~/.local/bin/hate_crack` que executa a partir do diretório do repositório, para que a configuração e os assets sejam sempre encontrados independentemente do seu diretório de trabalho atual.
A configuração também é procurada em:
- A raiz do repositório e o diretório do pacote
- `~/.hate_crack`
**Nota:** O `hcatPath` em `config.json` é apenas para a localização do binário do hashcat (opcional se o hashcat estiver no PATH). Os assets do Hate_crack (hashcat-utils, princeprocessor, pcfg_cracker, omen) são carregados do diretório do repositório e empacotados automaticamente pelo `make install`.
### Executar como script
O script usa um shebang `uv`. Torne-o executável e execute:```bash
chmod +x hate_crack.py
./hate_crack.py
Você também pode usar Python diretamente:```bash python hate_crack.py
### Uso não interativo / via script
Para automação, você pode lançar um único ataque diretamente, contornando o menu. O nome do ataque é o primeiro argumento, seguido pelo arquivo de hash e pelo tipo de hash do hashcat. Os prompts de pré-processamento (filtragem de contas de computador, força bruta LM-first, deduplicação de contas duplicadas) aceitam automaticamente seus padrões neste modo. O processo termina com `0` em caso de sucesso e com código diferente de zero em caso de erro (arquivo de hash ausente, tipo de hash não numérico, wordlist ausente ou nome de arquivo de regra desconhecido).```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
Solução de problemas
Erro: "would clobber existing tag" ao atualizar
Um clone mais antigo pode se recusar a atualizar, imprimindo uma longa lista de linhas como:``` ! [rejected] v2.5.0 -> v2.5.0 (would clobber existing tag)
Isto afeta clones criados antes de julho de 2026. O histórico publicado foi reescrito
então para remover alguns arquivos que nunca deveriam ter sido commitados, o que deu
a cada commit um novo ID; portanto, as tags de um clone mais antigo apontam para objetos que este
repositório não contém mais, e o git se recusa a mover uma tag que já possui.
Nada está errado com o seu checkout e nenhum dado de cracking está em risco.
Recupere com um reset único. Isso descarta commits locais e edições no
checkout; portanto, se você personalizou algo rastreado pelo git (ao contrário de
`config.json`, que não é rastreado), faça commit disso em um branch primeiro:```bash
cd /path/to/hate_crack
git fetch --tags --force origin
git checkout -B main origin/main
make install
--force aqui apenas atualiza as tags; ele não pode tocar em seus commits. Depois disso, o atualizador embutido funciona normalmente. Versões anteriores à 2.18 não conseguiam realizar essa recuperação sozinhas, por isso ela precisa ser feita manualmente uma vez.
Erro: o diretório de build não existe
Se você vir um erro como:``` Error: Build directory /opt/hashcat/hashcat-utils does not exist. Expected to find expander at /opt/hashcat/hashcat-utils/bin/expander.
Isso significa que os assets do hate_crack não foram incluídos no pacote instalado.
**Entendendo os caminhos:**
- `hcatPath` em config.json → aponta para a **localização do binário do hashcat** (opcional, pode estar no PATH)
- `hashcat-utils/` e `princeprocessor/` → incluídos no pacote pelo `make install`
**Solução:**
Reinstale usando o Makefile, que compila os submódulos e instala a ferramenta:```bash
cd /path/to/hate_crack # the repository checkout
make install
Configuração padrão (config.json.example):
A maioria dos usuários pode usar os padrões sem personalização:
hcatWordlists:./wordlists(relativo à raiz do repositório ou HOME/.hate_crack)hcatOptimizedWordlists:./optimized_wordlists(diretório usado pelo Quick Crack; usahcatWordlistscomo fallback se não encontrado)rules_directory:./hashcat/rules(inclui regras dos submódulos)hcatTuning: `` (string vazia - sem flags de ajuste padrão)
Exemplo de personalizações do 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) ... }
**Carregamento de configuração:**
- Precedência para cada chave: `os.environ` > o arquivo home da própria chave (`.env` ou `config.json`) > padrão integrado
- Chaves ausentes recorrem aos padrões integrados; `config.json.example` documenta todas as chaves de `config.json`
- Ambos os arquivos são procurados, independentemente um do outro, nesta ordem: **raiz do repositório**, depois o **diretório do pacote instalado**, depois **`~/.hate_crack`**. A primeira correspondência vence; é normal que os dois arquivos venham de diretórios diferentes.
- Na primeira execução, ambos são criados — `config.json` a partir de `config.json.example`, `.env` a partir dos padrões integrados. Se um `config.json` mais antigo ainda contiver chaves de integração, elas são copiadas para o novo `.env` e o hate_crack informa quais você deve excluir de `config.json`; ele nunca edita esse arquivo por conta própria.
- Em todas as execuções, o hate_crack exibe os dois arquivos que realmente carregou: ```
[*] config.json: /home/you/.hate_crack/config.json
[*] .env: /home/you/.hate_crack/.env
Leia essas duas linhas antes de depurar uma configuração que "não está fazendo efeito". Elas existem por causa de duas armadilhas na ordem de busca:
- Um checkout tem precedência sobre o seu diretório inicial. A raiz do repositório é pesquisada primeiro, então um
.envouconfig.jsonpresente em qualquer checkout a partir do qual você executa a ferramenta prevalece sobre o que está em~/.hate_crack— e executar a ferramenta a partir de um checkout é exatamente o que cria esses arquivos ali em primeiro lugar. - O diretório de trabalho atual nunca é pesquisado. Um
.envno diretório em que você está é ignorado, deliberadamente: diretórios de engajamento estão cheios de arquivos que ninguém pretendia usar como configuração. Coloque-o na raiz do repositório ou em~/.hate_crack.
Erro: merge com a ref 'refs/heads/master' mas nenhuma ref desse tipo foi buscada
Se você vir:``` Your configuration specifies to merge with the ref 'refs/heads/master' from the remote, but no such ref was fetched.
O branch padrão foi renomeado de `master` para `main`. Corrija com:```bash
git remote set-head origin -a
git branch -m master main
git branch --set-upstream-to=origin/main main
git pull
Alvos do Makefile
Padrão (instalação completa) - compila submódulos, instala dependências e instala a ferramenta:```bash make
or explicitly:
make install
Isto é idempotente - ignora ferramentas já instaladas.
**Forçar reinstalação limpa:**```bash
make reinstall
Atualização rápida - reconstrói submódulos e reinstala a ferramenta (após puxar as alterações):```bash make update
**Desinstalar** - remove dependências do SO e a ferramenta:```bash
make uninstall
Compilar apenas hashcat-utils:```bash make hashcat-utils
**Executar testes** - lida automaticamente com HATE_CRACK_SKIP_INIT quando necessário:```bash
make test
Relatório de cobertura:```bash make coverage
**Limpar artefatos de build/teste:**```bash
make clean
Development
Setting Up the Development Environment
Install the project with optional dev dependencies (includes linters and testing tools):```bash make dev-install
### Executando Linters e Verificações de Tipo
Antes de enviar alterações, execute estas verificações localmente. Use `make lint` para tudo, ou execute verificações individuais:
**Ruff (linting e formatação):**```bash
make ruff
# or manually:
uv run ruff check hate_crack tests tools packaging hate_crack.py
Corrigir problemas automaticamente:```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 (verificação de tipos):**```bash
make ty
# or manually:
uv run ty check hate_crack
Executar todas as verificações em conjunto:```bash make lint
### Executando Testes
Os testes detectam automaticamente quando os submódulos não estão compilados e definem `HATE_CRACK_SKIP_INIT=1` automaticamente.```bash
make test
Ou execute pytest diretamente:```bash uv run pytest -v
Com cobertura:```bash
make coverage
Ou com pytest:```bash uv run pytest --cov=hate_crack
### Git Hooks (prek)
Os hooks do Git são gerenciados pelo [prek](https://github.com/j178/prek) (v0.3.3+). Instale os hooks com:```bash
prek install --hook-type pre-push --hook-type pre-commit
Isto instala os hooks definidos em prek.toml usando o esquema de repositório local do pre-commit:
- pre-push (hooks locais): ruff, ruff-format, ty, pytest, pytest-lima, bandit
- pre-commit (de
pre-commit/pre-commit-hooks): trailing-whitespace, end-of-file-fixer, check-yaml, check-merge-conflict, check-added-large-files, detect-private-key
Os auto-fixers do pre-commit reescrevem os ficheiros no local, por isso volte a preparar (re-stage) e faça commit novamente depois de eles serem executados.
Nota: o prek 0.3.3 espera repos = [...] no nível superior. O formato antigo [hooks.<stage>] commands = [...] não é suportado.
Navegação de Menu com Setas
Os menus usam a seleção clássica numerada com print() + input() por predefinição, que
aceita chaves completas de vários dígitos.
Para ativar a navegação por setas através de simple-term-menu, defina
HATE_CRACK_ARROW_MENU=1. Nesse modo, apenas funcionam teclas de atalho de um dígito;
as opções numeradas a partir de 10 devem ser alcançadas com as setas. O modo de setas
também requer um TTY, por isso permanece desativado quando a saída é encaminhada (piped).
Dependências de Desenvolvimento
O grupo opcional [dev] inclui:
- ty - Verificador de tipos estático
- ruff - Linter e formatador Python rápido
- pytest - Estrutura de testes
- pytest-cov - Relatório de cobertura
Opções comuns:
--download-hashview: Baixar hashes do Hashview antes de quebrar.--hashview: Menu interativo do Hashview para gerir hashes, wordlists e tarefas.--hashview --help: Mostrar as opções de linha de comandos do Hashview.--weakpass: Baixar wordlists do Weakpass.--hashmob: Baixar wordlists do Hashmob.net.--download-torrent <FILENAME>: Baixar um ficheiro torrent específico do Weakpass.--download-all-torrents: Baixar todos os torrents disponíveis do Weakpass a partir da cache.--wordlists-dir <PATH>/--optimized-wordlists-dir <PATH>: Substituir os diretórios de wordlists.--pipal-path <PATH>: Substituir o caminho do pipal.--restore-potfile: Reconstruir<hashfile>.outa partir do ficheiro POT do hashcat no arranque, substituindo qualquer conteúdo existente, e depois continuar para o menu normal. Sem esta flag, a consulta ao POT só é executada quando.outainda não existe. A opção 93 do menu faz o mesmo a pedido, com um prompt de confirmação.--maxruntime <SECONDS>: Substituir o tempo máximo de execução.--bandrel-basewords <PATH>: Substituir o ficheiro de palavras-base do bandrel.--update: Atualizar para a versão mais recente e reinstalar. Muda o checkout paramainse estiver noutro ramo, uma vez que as tags de lançamento vivem lá.--nightly: Atualizar para o nightly mais recente a partir do ramonightly-dev. Os nightlies passaram no CI, mas não fazem parte de um lançamento oficial. Também pode ser escrito como--update --nightly.--no-optimized-kernel(ou--no-optimize): Nunca passar-Oao hashcat durante toda a execução. SubstituioptimizedKernelAttacksemconfig.jsone remove qualquer-Oque coloque emhcatTuning. Nada é gravado de volta no config, por isso aplica-se apenas a esta execução. Com um subcomando, coloque-o antes do subcomando:./hate_crack.py --no-optimize quick hashes.txt 1000 --wordlist words.txt.--debug: Ativar registo de depuração (escreve em stderr).
Integração com Hashview
O hate_crack integra-se com o Hashview para gestão centralizada de hashes e cracking distribuído.
Menu Interativo
Aceda ao menu interativo do Hashview:```bash hate_crack.py --hashview
Menu options:
- **(1) Carregar Hashes Quebrados** - Enviar os hashes quebrados da sessão atual para o Hashview
- **(2) Carregar Wordlist** - Enviar um arquivo de wordlist para o Hashview
- **(3) Baixar Wordlist** - Baixar uma wordlist do Hashview
- **Baixar Regra** - Baixar um arquivo de regras do Hashview (descomprimido para texto simples, pronto para `hashcat -r`)
- **(4) Baixar Hashes Restantes** - Baixar os hashes restantes não quebrados (solicita a troca para quebra)
- **(5) Baixar Hashes Encontrados** - Baixar hashes já quebrados com senhas em texto claro (para referência/análise)
- **(6) Carregar Hashfile e Criar Job** - Enviar novo hashfile e criar um job de quebra
- **(99) Voltar ao Menu Principal** - Retornar ao menu principal
**Importante: Baixar Encontrados vs Baixar Restantes**
- **Baixar Hashes Restantes (4)**: Baixa hashes não quebrados que precisam de quebra. Mescla automaticamente com quaisquer hashes encontrados, se disponíveis, e solicita a troca para este hashfile para quebra.
- **Baixar Hashes Encontrados (5)**: Baixa hashes já quebrados no formato hash:texto claro. Eles servem para referência e não podem ser quebrados novamente. Nenhum prompt de troca é exibido.
#### Interface de Linha de Comando
As operações do Hashview também podem ser realizadas via linha de comando:
Carregar hashes quebrados:```bash
hate_crack.py --hashview upload-cracked --file <output_file>.out --hash-type 1000
Carregar uma wordlist:```bash hate_crack.py --hashview upload-wordlist --file .txt --name "My Wordlist"
Baixe um arquivo de regras (salvo descompactado, pronto para `hashcat -r`):```bash
hate_crack.py --hashview download-rules --rules-id 4 --output best64.rule
Baixar hashes restantes (hashes não quebrados para quebra):```bash hate_crack.py --hashview download-left --customer-id 1 --hashfile-id 123
Baixar hashes encontrados (hashes já quebrados com texto claro):```bash
hate_crack.py --hashview download-found --customer-id 1 --hashfile-id 123
Carregue o hashfile e crie o job:```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"
#### Configuração
Defina as credenciais do Hashview em `.env` (são configurações de integração, portanto não ficam em `config.json`):```
HASHVIEW_URL=https://hashview.example.com
HASHVIEW_API_KEY=your-api-key-here
Configuração do Ollama
O Ataque LLM (opção 12) usa o Ollama para gerar candidatos a senhas. Configure o modelo, a janela de contexto e o tempo limite de requisição em .env:```
OLLAMA_MODEL=qwen2.5:32b
OLLAMA_NUM_CTX=8192
OLLAMA_TIMEOUT=300
- **`OLLAMA_MODEL`** — O modelo Ollama usado para geração de candidatos (padrão: `qwen2.5:32b`). O ataque LLM usa saída estruturada (JSON), então escolha um modelo com bom suporte a ferramentas/JSON.
- **`OLLAMA_NUM_CTX`** — Tamanho da janela de contexto para o modelo (padrão: `8192`). Era `2048` antes da introdução das estatísticas de corpus, o que era pequeno demais para conter o prompt que estava sendo fornecido: 500 textos simples amostrados consomem aproximadamente 2.000–3.500 tokens antes do prompt do sistema e da resposta, então o Ollama truncava silenciosamente parte da amostra que o amostrador havia distribuído cuidadosamente pelo arquivo.
- **`OLLAMA_TIMEOUT`** — Segundos de espera por uma resposta de geração antes de desistir (padrão: `300`). Aumente esse valor se um modelo grande ainda estiver carregando na VRAM na primeira requisição, caso contrário isso pode exceder o tempo limite; o hate_crack imprime o tempo limite decorrido e o nome dessa configuração quando isso ocorre.
- **`OLLAMA_MAX_SAMPLE_LINES`** — O limite abaixo do qual os modos LLM também colam os textos simples literais no prompt (padrão: `500`). Valores ≤ 0 são tratados como 500.
Os modos derivados de corpus (**Wordlist**, **Cracked passwords**, **Pattern rules**) sempre descrevem o *corpus* inteiro estatisticamente — proporções de palavras-base, máscaras, capitalização, comprimentos, dígitos e símbolos finais, anos — em vez de colar uma fatia dele. A agregação é limitada, então um dump de 120.000 senhas custa aproximadamente o mesmo espaço de prompt que um de 500 linhas. Quando todo o corpus cabe nesse limite, os textos simples brutos também são incluídos, já que não há nada a ganhar ocultando um corpus pequeno do modelo.
Isso substitui o comportamento anterior de colar uma amostra uniformemente espaçada de até `ollamaMaxSampleLines` senhas. Uma amostra de um dump grande não transmitia nenhuma informação de frequência: o modelo não conseguia distinguir uma palavra-base usada por 8% da organização de uma usada por uma única pessoa, que é precisamente o sinal que faz uma tentativa valer a pena.
- **`OLLAMA_NO_CLOUD`** — Quando `true`, recusa-se a enviar qualquer coisa para um modelo *cloud* do Ollama. O Ollama encaminha um modelo com tag `-cloud` (`gpt-oss:120b-cloud`, `deepseek-v3.1:671b-cloud`) para ollama.com através do mesmo endpoint local usado por um modelo local, então nada na requisição parece diferente — mas os prompts do hate_crack carregam textos simples recuperados, estatísticas de corpus e o nome, setor e localização do cliente. Com isso definido, um nome de modelo cloud é recusado antes que qualquer requisição seja construída. O padrão é `false`, então um modelo cloud configurado deliberadamente continua funcionando; ative essa opção para engajamentos em que os dados do cliente não podem sair do host.
- **`OLLAMA_AUTO_RESEARCH`** — Quando `true` (padrão), o modo **Target info** pede ao modelo local para sugerir o setor e a localização assim que você digitar o nome da empresa, e os oferece como padrões editáveis de prompt. Defina como `false` para sempre obter prompts em branco (útil com um modelo lento, pois a pesquisa custa uma ida e volta extra antes do ataque começar).
- **`OLLAMA_HOST`** — Onde o Ollama está escutando. Aceita um `host:port` sem esquema (`theplague.lan:11434`) ou uma URL completa com esquema (`https://ollama.example.com`); de qualquer forma, a URL base é normalizada antes do uso. O padrão é `localhost:11434`. Defina-o no `.env`, ou exporte-o como uma variável de ambiente real para sobrescrever isso em uma única execução — é o mesmo nome de variável que o CLI do próprio Ollama lê.
- Garanta que o Ollama esteja em execução e que o modelo tenha sido baixado (`ollama pull qwen2.5:32b`) antes de usar o LLM Attack — o hate_crack não baixa mais automaticamente modelos ausentes.
O ataque oferece três modos de geração:
1. **Target info** — empresa / setor / localização; o modelo deriva candidatos a partir desses detalhes.
Depois que você digita o nome da empresa, o hate_crack pergunta ao mesmo modelo local o que ele já sabe sobre essa organização e pré-preenche os prompts **Industry** e **Location** com as respostas, mostradas entre parênteses: ```
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):
Pressione Enter para aceitar uma sugestão ou digite por cima dela. Esses valores são a lembrança do modelo, não OSINT — trate-os como um ponto de partida, não como inteligência sobre o cliente. A consulta usa apenas o servidor Ollama local, portanto o nome do cliente nunca sai do host; não há chamadas de API web ou de terceiros. Se o modelo não reconhecer a organização (o caso comum para clientes pequenos), ele não retorna nada e você obtém apenas prompts em branco: ``` Company name: Acme Rail Services Industry: Location:
Uma falha de pesquisa — timeout, Ollama não executando, resposta vazia — nunca bloqueia o ataque; ela apenas retrocede para prompts em branco. Defina `ollamaAutoResearch` como `false` para pular a pesquisa por completo.
2. **Wordlist** — derivar palavras-base de uma wordlist de amostra.
3. **Senhas quebradas** — alimentar o modelo com os textos simples já recuperados nesta sessão (`<hashfile>.out`) para que ele possa inferir as próprias convenções de senha da organização alvo (palavras-base, estações do ano, anos, sufixos, leetspeak) e gerar *novos* candidatos no mesmo estilo. Esta opção só é listada depois que pelo menos um hash foi quebrado; o arquivo inteiro é analisado estatisticamente exatamente como no modo Wordlist (veja `ollamaMaxSampleLines` acima).
#### Configuração do PCFG
O Ataque PCFG (opção 20) e o Ataque PRINCE-LING (opção 21) usam o submódulo `pcfg_cracker`. Configure-os no `config.json`:```json
{
"pcfgRuleset": "DEFAULT",
"pcfgMaxCandidates": 50000000,
"pcfgPrinceLingMaxCandidates": 10000000
}
pcfgRuleset— Nome da gramática treinada a utilizar (padrão:DEFAULT), resolvido parapcfg_cracker/Rules/<name>/. Treine a sua com otrainer.pydo pcfg_cracker e defina isto como o nome do ruleset.pcfgMaxCandidates— Máximo de candidatos quepcfg_guesser.pyemite para o ataque PCFG (padrão:50000000).pcfgPrinceLingMaxCandidates— Máximo de palavras-base queprince_ling.pyescreve na wordlist base do PRINCE em cache (padrão:10000000).
Kernels otimizados (optimizedKernelAttacks)
A flag -O do hashcat seleciona kernels otimizados, que são substancialmente mais rápidos, mas limitam o comprimento do candidato (cerca de 31 caracteres, menos para alguns modos) e ignoram silenciosamente qualquer coisa mais longa. optimizedKernelAttacks em config.json lista os ataques que são executados com -O; omita um ataque da lista para o executar com kernels de comprimento total. A lista em config.json.example corresponde ao padrão incorporado que se aplica quando não existe um config.json.
Quatro ataques respeitam a definição, mas não são otimizados por padrão, porque fornecem candidatos que podem exceder o limite do -O — adicione-os à lista para aderir:
hcatNgramX,hcatOllama,hcatOmen,hcatLMtoNT
Para desligar o -O em todo o lado numa única execução sem editar a configuração, passe --no-optimized-kernel (forma abreviada --no-optimize). Isto sobrepõe-se à lista para todos os ataques e também remove um -O escrito em hcatTuning, que de outra forma chegaria ao hashcat independentemente da lista.
Os nomes são correspondidos exatamente, e uma entrada não reconhecida é reportada no arranque em vez de ser ignorada. Note que os ataques que delegam noutro ataque são controlados pelo ataque em que delegam, não pelo seu próprio nome: PRINCE-LING segue hcatPrince, enquanto Spoonman, Rosetta e os modos LLM de pattern-rule seguem hcatQuickDictionary.
Notificações (opção 82 do menu)
O hate_crack pode enviar notificações push Pushover quando os ataques terminam e, opcionalmente, quando hashes individuais são quebrados. Todos os controlos ficam na opção 82 — Notifications do menu principal:
Toggle Pushover Notifications [ON/OFF]— interruptor mestre. Persiste emconfig.jsoncomonotify_enabled.Toggle Per-Crack Notifications [ON/OFF]— quando ON, um tailer em segundo plano observa o ficheiro.oute envia uma notificação por crack (com agregação de rajadas por tick). Persiste emconfig.jsoncomonotify_per_crack_enabled. Não pode ser ativado enquanto o interruptor mestre estiver OFF — ative primeiro a opção 1.Send Test Pushover Notification— envia uma notificação de teste para que possa confirmar que o seu par token/utilizador Pushover funciona. Funciona mesmo com o interruptor mestre OFF.
As credenciais ficam em .env; os restantes parâmetros de ajuste só existem no ficheiro de configuração config.json:
NOTIFY_PUSHOVER_TOKEN,NOTIFY_PUSHOVER_USER(em.env) — necessárias para que qualquer notificação push seja enviada. Nada no menu as escreve; edite o.envvocê mesmo.notify_attack_allowlist— nomes de ataques que dão consentimento automático sem o prompt[y/N/always]. É preenchida automaticamente quando respondealways.notify_suppress_in_orchestrators(padrãotrue) — silencia os ataques individuais encadeados pelo Extensive Crack, que dispara um único resumo em vez disso. Defina comofalsepara receber uma notificação por ataque encadeado. Outras entradas do menu que executam várias passagens (por exemplo, Quick Crack com múltiplas cadeias de regras) não são orquestradores e notificam sempre por passagem.notify_max_cracks_per_burst(padrão5),notify_poll_interval_seconds(padrão5.0) — ajuste do tailer por crack. Consultehate_crack/notify/tailer.pypara a lógica de agregação de rajadas.
Ferramentas de Wordlist (opção 80 do menu)
O submenu Ferramentas de Wordlist fornece utilitários de pré-processamento de wordlists baseados em binários do hashcat-utils, além de downloads de wordlists do Hashmob.net e Weakpass. Aceda através da opção 80 no menu principal.
| Opção | Binário | O que faz |
|---|---|---|
| 1 | len.bin | Filtrar por comprimento - manter apenas palavras entre um comprimento mínimo e máximo |
| 2 | req-include.bin | Exigir classes de caracteres - manter apenas palavras que contenham todos os tipos de caracteres exigidos |
| 3 | req-exclude.bin | Excluir classes de caracteres - remover palavras que contenham qualquer tipo de carácter excluído |
| 4 | cutb.bin | Extrair substring - cortar um intervalo de bytes de cada palavra |
| 5 | splitlen.bin | Dividir por comprimento - criar ficheiros separados por comprimento de palavra (ficheiros nomeados 01-64 num diretório de saída) |
| 6 | rli.bin / rli2.bin | Subtrair palavras - remover entradas que apareçam em um ou mais outros ficheiros |
| 7 | gate.bin | Fragmentar - extrair cada N-ésima palavra para cracking distribuído em várias máquinas |
| 8 | - | Otimizar wordlists - remover duplicados e dividir em ficheiros por comprimento no diretório de wordlists otimizadas |
| 9 | - | Descarregar wordlists do Hashmob.net |
| 10 | - | Descarregar wordlists do Weakpass (via BitTorrent) |
Bits de máscara de classes de caracteres (usados pelas opções 2 e 3): 1=minúsculas, 2=maiúsculas, 4=dígito, 8=símbolo, 16=outro. Some os valores: 7 = minúsculas+maiúsculas+dígito.
Como o sharding deve ser usado: o sharding divide uma wordlist em N partes iguais e sem sobreposição, para que o trabalho possa ser distribuído por várias máquinas ou GPUs. Cada parte é intercalada (cada N-ésima linha), pelo que cada shard é uma amostra representativa de toda a lista, em vez de um bloco contíguo do início/fim — nenhum nó fica preso a quebrar apenas a cauda de baixa probabilidade.
Execute a opção 7 uma vez, forneça uma wordlist de entrada, um caminho base de saída e uma contagem de shards (N). Ela escreve todas as N partes numa única passagem, nomeadas com números de parte com zeros à esquerda (base.001, base.002, … até base.00N). Copie uma parte para cada nó e aponte a execução do hashcat desse nó para ela. Num sistema com uma única GPU, o sharding não dá aceleração, mas uma única parte continua a ser uma amostra rápida e representativa para uma passagem de triagem rápida antes de se comprometer com a lista completa.
Verificações Automáticas de Atualizações
O hate_crack pode verificar automaticamente o GitHub para versões mais recentes no arranque. Esta funcionalidade é controlada pela opção de configuração check_for_updates:```json
{
"check_for_updates": true
}
- **`check_for_updates`** — Ativa verificações automáticas de versão na inicialização (padrão: `true`).
- Quando ativado, o hate_crack busca as informações da versão mais recente no GitHub e exibe um aviso se houver uma atualização disponível.
- A verificação é executada de forma assíncrona e não bloqueia a inicialização. Erros de rede são ignorados silenciosamente.
##### Canais de Atualização
| Canal | Bandeira | Origem | O que você obtém |
|---------|------|--------|--------------|
| Release | `--update` | `main` | A versão estável mais recente. Este é o padrão e o que a verificação de inicialização oferece. |
| Nightly | `--nightly` | `nightly-dev` | Trabalho que passou pela CI, mas ainda não foi lançado. |
As versões seguem o semver comum, com o incremento derivado do que está de fato no
lote. O segundo componente muda **apenas para funcionalidades (features)**: um ciclo que contenha
qualquer commit `feat` está caminhando para `X.(Y+1).0`, e um ciclo apenas com correções,
documentação e tarefas de manutenção está caminhando para `X.Y.(Z+1)`.
`nightly-dev` cria tags de candidatos a lançamento para a versão para a qual o lote está caminhando — `v2.20.1rc1`, `v2.20.1rc2`, … — e o merge para `main` promove esse mesmo alvo ao seu lançamento final. Os candidatos são pré-lançamentos reais do PEP 440, então eles são ordenados corretamente em ambas as extremidades:
2.20.0 < 2.20.1rc1 < 2.20.1rc2 < 2.20.1 < 2.21.0rc1 < 2.21.0
O alvo pode mudar no meio do ciclo: o primeiro `feat` a ser incorporado o move de
`X.Y.(Z+1)` para `X.(Y+1).0`, e a numeração dos candidatos recomeça para o novo alvo.
O número sempre indica o que o lote publicaria hoje.
O componente principal nunca é incrementado automaticamente — um assunto com `!` ou um rodapé `BREAKING CHANGE:` é contado como uma funcionalidade, porque um incremento automático de versão principal está a apenas uma linha de assunto mal digitada de um lançamento publicado irreversível. Um incremento de versão principal é um ato humano explícito: crie a tag e envie (push) manualmente.
A política está em `tools/next_version.py`, compartilhada pelos dois fluxos de trabalho de criação de tags e
com testes unitários em `tests/test_next_version.py`.
A verificação de inicialização oferece apenas lançamentos, porque as builds noturnas não publicam nenhum
lançamento do GitHub e a verificação lê o endpoint "latest release" do GitHub — portanto,
ativar `check_for_updates` nunca fará você cair em uma versão noturna. Duas coisas mantêm
os canais separados: isso e o fato de que um candidato é um pré-lançamento real do PEP 440,
de modo que uma ferramenta que classifica números de versão crus também o trata como mais antigo do que
o lançamento em que ele se torna.
Qualquer uma das bandeiras muda seu checkout para o branch correspondente primeiro (e
se recusa a fazer isso se houver alterações não confirmadas). Se você estiver executando uma versão noturna
e quiser voltar ao código lançado, `--update` o move de volta para `main`.
#### Mesclagem Automática de Hashes Encontrados (Somente Download de Left)
Ao baixar hashes left (hashes não quebrados), o hate_crack automaticamente:
1. Tenta baixar quaisquer hashes encontrados (quebrados) do Hashview como uma operação auxiliar
2. Mescla os hashes encontrados com arquivos `.out` locais (ex.: `left_1_123.txt.out` ou `left_1_123.nt.txt.out` para o formato pwdump)
3. Remove entradas duplicadas
4. Limpa arquivos divididos temporários após a mesclagem
Isso garante que seus resultados locais de quebra permaneçam sincronizados com o banco de dados centralizado do Hashview ao trabalhar com hashes não quebrados.
**Nota:** A opção download-found baixa hashes já quebrados separadamente para fins de referência e não realiza nenhuma mesclagem nem solicita a quebra.
O <hash_type> é obtido executando `hashcat --help`
Hashes de Exemplo: 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
Iniciar OWASP ZAP com Docker:
docker run -t owasp/zap2docker-weekly zap-api-scan.py \
-t https://www.example.com/openapi.json \
-f openapi -r zap_report.html
Opções:``` $ ./hate_crack.py 1000
/ | _____ / | ____ _ ___ ____________ ____ | | __
/ ~ __ \ / __ \ / \ /_ __ _ \ / | |/ /
\ Y // __ | | \ / \ _| | // __ \ _| <
___| /(__ /| _ >______ /|__| ( /___ >|_
/ / /___/ / / / /
Version 2.0
## Testes
A suíte de testes é majoritariamente offline e usa mocks/fixtures. Verificações de rede ao vivo e
verificações de dependências do sistema são opcionais, ativadas por variáveis de ambiente.
### Executando Testes Localmente```bash
# Run all tests
uv run pytest -v
# Run specific test
uv run pytest tests/test_hashview.py -v
Você também pode executar a suíte completa com make test.
Testes ao Vivo (Opt-In)
Defina qualquer um dos seguintes para habilitar verificações ao vivo:
HASHMOB_TEST_REAL=1— verificação ao vivo de conectividade/menu CLI do HashmobHASHVIEW_TEST_REAL=1— verificação ao vivo do menu CLI do HashviewWEAKPASS_TEST_REAL=1— verificação ao vivo do menu CLI do WeakpassHATE_CRACK_REQUIRE_DEPS=1— falha se7z,transmission-daemonoutransmission-remoteestiver ausente
Teste ao Vivo de Upload do Hashview
O teste ao vivo de upload do Hashview é ignorado por padrão. Para executá-lo, defina a
variável de ambiente e forneça credenciais válidas no .env:```bash
HATE_CRACK_RUN_LIVE_TESTS=1 uv run pytest tests/test_upload_cracked_hashes.py -v
### Testes ao Vivo do Hashview Contra uma Stack Docker Local
Em vez de apontar os testes ao vivo para um servidor Hashview remoto, você pode fazer
a suíte subir uma stack Docker local do [Hashview](https://github.com/hashview/hashview),
alimentá-la, executar os testes ao vivo contra ela e derrubá-la. Defina
`HASHVIEW_TEST_LOCAL=1` e aponte `HASHVIEW_REPO` para um checkout do 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
Isto inicia o docker compose no repositório Hashview, popula uma chave de API de administrador, um cliente, um arquivo de hash e dados quebrados de "tarefa efetiva", e então exporta as variáveis de ambiente HASHVIEW_* que os testes leem. Variáveis de ambiente úteis:
HASHVIEW_TEST_LOCAL=1— ativa a stack local (sem efeito caso contrário)HASHVIEW_REPO=<path>— checkout do Hashview (padrão~/projects/hashview)HASHVIEW_KEEP=1— mantém os contêineres em execução após a sessão (re-execuções mais rápidas)HASHVIEW_LOCAL_PORT=5000— porta do host em que o aplicativo é publicado
A CLI hate_crack respeita as variáveis de ambiente HASHVIEW_URL / HASHVIEW_API_KEY
(substituindo o .env onde essas duas chaves residem), o que permite que a
suíte aponte a CLI para a stack local sem editar a sua configuração persistida.
Testes de Instalação Ponto a Ponto (Local + Docker)
Instalação local da ferramenta uv + execução do script (usa um HOME temporário):```bash HATE_CRACK_RUN_E2E=1 uv run pytest tests/test_e2e_local_install.py -v
Instalação/execução de ponta a ponta baseada em Docker (com cache via `Dockerfile.test`):```bash
HATE_CRACK_RUN_DOCKER_TESTS=1 uv run pytest tests/test_docker_script_install.py -v
O teste E2E do Docker também baixa um pequeno subconjunto do rockyou e executa uma quebra básica com hashcat para validar a integração com ferramentas externas.
Teste de ponta a ponta da VM Lima (somente macOS):
Pré-requisitos: Lima e rsync devem estar instalados.```bash
brew install lima
A VM de teste é provisionada automaticamente com todas as dependências 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
This test validates installation and execution within a lightweight Linux VM on macOS.
Estrutura do Teste
- tests/test_hashview.py: Suíte de testes abrangente para a classe HashviewAPI com respostas de API simuladas, incluindo:
- Listagem de clientes e validação de dados
- Testes de autenticação e autorização
- Funcionalidade de upload de arquivo de hash
- Fluxo completo de criação de jobs
Todos os testes usam chamadas de API simuladas, para que possam ser executados sem conectividade com um servidor Hashview.
(1) Quebra Rápida (2) Quebra Extensiva com a Metodologia Pure_Hate (3) Ataque de Força Bruta (4) Ataque de Máscara Top (5) Ataque de Impressão Digital (6) Ataques Combinadores (7) Ataque Híbrido (8) Quebra de Força Bruta com Máscara Top 100 da Pathwell (9) Ataque PRINCE (10) Metodologia Bandrel (11) Ataque Loopback (12) Ataque LLM (13) Ataque OMEN (14) Ataque de Máscara Ad-hoc (15) Ataque de Força Bruta Markov (16) Ataque de N-gramas (17) Ataque de Permutação (18) Ataque de Regras Aleatórias (19) Ataque de Frase-senha Combipow (20) Ataque PCFG (21) Ataque PRINCE-LING (22) Ataque Spoonman (23) Ataque Rosetta
(80) Ferramentas de Wordlist (81) Ferramentas de Arquivos de Regras (82) Notificações
(93) Regenerar .out a partir do arquivo POT (94) API do Hashview (95) Analisar hashes com o Pipal (96) Exportar Saída para o Formato Excel (97) Exibir Hashes Quebrados (98) Exibir README (99) Sair
Selecione uma tarefa:```
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.
Quais regras você gostaria de executar?
(1) best64.rule
(2) d3ad0ne.rule
(3) T0XlC.rule
(4) dive.rule
(99) YOLO...executar todas as regras
Insira uma lista separada por vírgulas das regras que você deseja executar. Para executar regras encadeadas, use o símbolo +.
Por exemplo, 1+1 executará best64.rule encadeada duas vezes e 1,2 executará best64.rule e depois d3ad0ne.rule sequencialmente.
Escolha com sabedoria:```
#### 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).