Commit Graph
397 Commits
Author SHA1 Message Date
Justin BollingerandGitHub bebf008a40 Merge pull request #69 from trustedsec/ollama
Add LLM Attack via Ollama integration
2026-02-13 22:31:09 -05:00
Justin BollingerandClaude Opus 4.6 36b2687de5 fix: add --force --reinstall to uv tool install and add make update target
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 22:30:38 -05:00
Justin BollingerandClaude Opus 4.6 fda6289fb7 fix: add missing rulesDirectory mock in ollama 404 retry test
The test built its own mock context instead of using the shared
ollama_globals helper, missing the rulesDirectory and hcatPotfilePath
patches. This caused FileNotFoundError on CI where /path/to/hashcat/rules
doesn't exist.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 22:25:48 -05:00
Justin BollingerandClaude Opus 4.6 386d08c765 docs: update README for LLM attack, Ollama config, and accuracy fixes
Add LLM Attack (option 15) to menu listing and attack descriptions,
document Ollama config keys, fix broken code block, update pre-push
hook example, add make update target, and correct CI Python versions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 22:20:19 -05:00
Justin BollingerandClaude Opus 4.6 fe467c1d34 fix: resolve CI test failures in ollama and hashview tests
- Mock rulesDirectory in ollama test fixture so hcatOllama doesn't
  fail with FileNotFoundError on CI where /path/to/hashcat/rules
  doesn't exist
- Mock potfile path in hashview auto-merge test so found file cleanup
  isn't blocked by missing ~/.hashcat directory
- Update pre-push hook to match CI env vars (HATE_CRACK_SKIP_INIT=1)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v2.0
2026-02-13 22:15:48 -05:00
Justin BollingerandClaude Opus 4.6 c01601cf67 fix: clean version string to show 2.0+g<hash> format
Strip .postN.devN and .dYYYYMMDD suffixes from setuptools-scm version
in __init__.py so the banner displays a clean version like 2.0+g05b5d6dc7.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 22:11:31 -05:00
Justin BollingerandClaude Opus 4.6 bfcaed3d5e fix: use no-guess-dev version scheme to keep 2.0 base version
Prevents setuptools-scm from bumping to 2.1 on dirty builds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 22:06:53 -05:00
Justin BollingerandClaude Opus 4.6 243fdd305e fix: update ollama tests to match refactored target-only handler
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 22:01:33 -05:00
Justin BollingerandClaude Opus 4.6 8d45881c7e feat: auto-derive version from git tags using setuptools-scm
Replace hardcoded version with setuptools-scm so the version updates
automatically from git tags. The ASCII banner strips the dirty date
suffix but preserves the git node hash.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 21:58:17 -05:00
Justin BollingerandClaude Opus 4.6 a5e3b65030 chore: update default Ollama model to qwen2.5 with num_ctx 8192
Benchmarking showed qwen2.5 at 8192 context is the best default for
speed/quality balance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 21:04:43 -05:00
Justin BollingerandClaude Opus 4.6 762dede867 feat: add Ollama model benchmark script with context window tuning
Standalone tool to compare multiple Ollama models for password candidate
generation. Tests each model at multiple num_ctx values (default: 2048,
8192, 32768) to find the speed/quality sweet spot.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 21:01:19 -05:00
Justin BollingerandClaude Opus 4.6 6fdc485a6d refactor: simplify Ollama attack to target-based generation only
Remove wordlist-based generation option and menu selection. The LLM
attack now goes directly to target-based prompts (company, industry,
location).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 20:28:26 -05:00
Justin BollingerandClaude Opus 4.6 f3daff4bdf refactor: use cracked .out file as sole wordlist source for Ollama attack
Remove ollamaWordlist config key and all references. Wordlist mode now
requires the cracked hashes .out file to exist and extracts passwords
by splitting on the first colon. Detect Ollama refusal responses and
abort gracefully. Update tests accordingly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 20:04:11 -05:00
Justin BollingerandClaude Opus 4.6 a967ba60cd feat: send full wordlist to Ollama with configurable num_ctx
Remove 500-line wordlist cap and send the entire file to Ollama.
Add ollamaNumCtx config key (default 32768) to control the context
window size. Invert wordlist prompt to default-yes, remove unused
ollamaCandidateCount config.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 19:33:23 -05:00
Justin BollingerandClaude Opus 4.6 31c1dbbe35 refactor: rename Markov LLM attack to Ollama attack and simplify interface
Rename markov_attack → ollama_attack and hcatMarkov → hcatOllama across
menu, attacks, and tests. Remove candidate count prompts and cracked-output
default wordlist logic. Rename config keys (markov* → ollama*) and drop
ollamaUrl. Fix Dockerfile.test to use granular build steps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 19:17:50 -05:00
Justin BollingerandClaude Opus 4.6 f9db54e84c fix: overhaul Hashview download flow and fix hashcat --show stderr pollution
- Merge download_left and download_found into single "Download Hashes" menu option
- Append found hash:clear pairs to potfile instead of running broken hashcat re-crack
- Append found hashes to left file so hashcat --show returns full results
- Clean up found_ temp files after merge
- Split found file on first colon (not last) to handle passwords containing colons
- Filter hashcat parse errors from --show stdout in _run_hashcat_show
- Add get_hcat_potfile_path() helper to api.py for potfile resolution
- Remove obsolete download_found_hashes API method and CLI subcommand
- Fix ollama tests to match current 4-arg hcatOllama signature and rule loop

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 19:11:51 -05:00
Justin BollingerandClaude Opus 4.6 ca1d71da6c feat: add --debug logging for Ollama request/response in hcatMarkov
Log the API URL, request payload, raw response JSON, and filtered
candidate counts when debug_mode is active.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 16:52:00 -05:00
Justin BollingerandClaude Opus 4.6 1af4c74065 feat: default Markov LLM wordlist to cracked hashes output
When the cracked hashes output file (.out) exists, use it as the default
wordlist for the LLM Markov attack instead of the generic markovWordlist
config. This makes the attack learn from already-cracked passwords for
the current engagement, falling back to config when no cracked output
exists.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 16:01:44 -05:00
Justin BollingerandClaude Opus 4.6 e205e6e886 feat: add LLM Markov Attack (menu option 15)
Add a new attack mode that uses a local LLM via Ollama to generate
password candidates, converts them into hashcat .hcstat2 Markov
statistics via hcstat2gen, and runs a Markov-enhanced mask attack.

Two generation sub-modes:
- Wordlist-based: feeds sample from an existing wordlist to the LLM
  as pattern context (config-selectable default with Y/N override)
- Target-based: prompts for company name, industry, and location
  for contextual password generation

Pipeline: Ollama API -> candidate file -> hcstat2gen -> LZMA compress
-> hashcat -a 3 --markov-hcstat2

Config additions: ollamaUrl, ollamaModel, markovCandidateCount,
markovWordlist. No new pip dependencies (uses stdlib urllib/lzma).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:13:39 -05:00
Justin BollingerandClaude Opus 4.6 91906e3313 fix: separate hcatPath (hashcat dir) from hate_path (asset dir)
hcatPath now exclusively points to the hashcat install directory and is
auto-discovered from PATH when not configured. hate_path is resolved
from the package directory (installed) or repo root (development) with
no auto-discovery. Extracted vendor-assets/clean-vendor Makefile targets
to deduplicate the install logic.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:23:12 -05:00
larry.spohn c260787985 fix: resolve hashcat binary path from hcatPath + hcatBin
When hcatBin is a relative name (e.g. "hashcat"), construct the full
path by joining hcatPath and hcatBin so the correct hashcat binary is
used instead of relying on PATH resolution.
2026-02-12 13:56:29 -05:00
Justin Bollinger 61bca2c4b6 docs: update README with current attacks and features 2026-02-10 11:56:14 -05:00
Justin Bollinger 55acd71b89 fix: remove switch prompt from download_found hashview option
The download_found option downloads already-cracked hashes (with cleartext
passwords). These cannot be used for cracking, so the 'Switch to this hashfile
for cracking?' prompt is inappropriate and confusing.

The switch prompt is kept for download_left since those are uncracked hashes
that can be cracked.

- Remove the switch-to-cracking prompt from download_found flow
- Add clarifying message that found hashes are already cracked
- Align with intended behavior: download_left prompts to switch, download_found just downloads
2026-02-10 10:46:28 -05:00
Justin Bollinger cac2f1ff7c fix: exclude submodule directories from mypy checks and update pre-push hook
- Add HashcatRosetta and hashcat-utils to mypy exclude patterns in pyproject.toml
- Update .github/workflows/mypy.yml to exclude submodule directories
- Update pre-push hook to exclude submodules and use consistent mypy flags
- Set ignore_missing_imports=true to handle external dependencies gracefully
- Ensure pre-push hook permissions are set correctly (executable)

Fixes mypy check failures caused by missing hashcat_rosetta.formatting stub.
2026-02-10 10:24:51 -05:00
Justin Bollinger 10c4d544db Update menu text for option 91 to show 'Analyze Hashcat Rules' 2026-02-10 09:21:44 -05:00
Justin Bollinger e56da58026 Apply ruff formatting fixes
- Fix line length and formatting in hate_crack/api.py
- Fix line wrapping and f-string formatting in hate_crack/attacks.py
- Apply code style improvements in hate_crack/main.py
- Format test files for consistency
- All changes applied via 'ruff check --fix'
2026-02-09 20:08:51 -05:00
Justin Bollinger 3cf40a44c8 Add menu option 91 for rule analysis using HashcatRosetta 2026-02-09 20:02:52 -05:00
Justin Bollinger 0b83a8476f Update HashcatRosetta submodule to latest version with rule analysis features 2026-02-09 19:58:58 -05:00
Justin Bollinger ebfcb59ed8 Add HashcatRosetta as a submodule for rule analysis functionality 2026-02-09 19:58:04 -05:00
Justin Bollinger b526765aa5 added debug options 2026-02-09 14:30:37 -05:00
Justin Bollinger a8c1abae2f updated documentation 2026-02-06 19:51:48 -05:00
Justin Bollinger 3e6efc0ef8 removed extended expander 2026-02-06 19:37:39 -05:00
Justin Bollinger 604813edd4 fingerprint: select expander length and optionally run hybrid on expanded 2026-02-06 16:44:11 -05:00
Justin Bollinger d9e9930471 working loopback mode with tests 2026-02-06 15:06:25 -05:00
Justin Bollinger b3732abf14 updated loopback logic and added testing 2026-02-06 14:37:37 -05:00
Justin Bollinger 09ac410ace updated loopback logic and added testing 2026-02-06 14:36:15 -05:00
Justin BollingerandGitHub 721628ca9a Remove badge status explanations from README
Removed explanations for badge statuses in the README.
2026-02-06 09:51:28 -05:00
Justin Bollinger 242e065101 ci: add individual badges for each Python version (3.9-3.14)
- Create separate workflow files for Python 3.9, 3.10, 3.11, 3.12, 3.13, 3.14
- Each Python version gets its own status badge
- Easily track which version(s) are failing tests
- Update README to display all 6 Python version badges
- Badges are clickable and link to individual workflow results
- Maintain pytest.yml as combined multi-version workflow
2026-02-06 09:50:32 -05:00
Justin Bollinger 94e1377137 ci: split tests workflow into separate ruff, mypy, and pytest workflows
- Create individual workflow files for ruff, mypy, and pytest
- Each workflow has its own status badge for independent monitoring
- Ruff badge shows code quality status
- Mypy badge shows type checking status
- Pytest badge shows multi-version testing status
- Update README with all three badges and clear status documentation
- Remove combined tests.yml in favor of granular workflows
2026-02-06 09:49:30 -05:00
Justin Bollinger 8ef6c1cba2 ci: add multi-version Python testing and status banners
- Separate lint job for ruff and mypy checks on Python 3.13
- Add pytest matrix strategy to test Python 3.9 through 3.14
- Add GitHub Actions status badge to README
- Document CI/CD pipeline and what each check does
- Include pass/fail criteria for linting, type checking, and testing
- Link to Actions tab for detailed workflow results
2026-02-06 09:46:26 -05:00
Justin Bollinger 3320553bad test: improve live test to skip gracefully when server unavailable
- Add server reachability check before attempting connection
- Test skips if Hashview server is not available on localhost:5000
- Prevents test failures when HASHVIEW_TEST_REAL env var is set but server isn't running
- Allows test to succeed when Docker/server is available and configured
2026-02-06 09:43:49 -05:00
Justin Bollinger 582988ea99 test: improve live test to skip gracefully when server unavailable
- Add server reachability check before attempting connection
- Test skips if Hashview server is not available on localhost:5000
- Prevents test failures when HASHVIEW_TEST_REAL env var is set but server isn't running
- Allows test to succeed when Docker/server is available and configured
2026-02-06 09:43:23 -05:00
Justin Bollinger c87142b2d5 test: update CLI menu test strings to match recent changes
The Hashview menu has been updated:
- Old: 'Available Customers'
- New: 'What would you like to do?'

Updated test to check for the current menu text that displays
when using the --hashview flag.
2026-02-06 09:39:07 -05:00
Justin Bollinger bd7b74a11e build: add dev-install and dev-reinstall targets to Makefile
- Add 'make dev-install' to install project with [dev] dependencies
- Add 'make dev-reinstall' to uninstall and reinstall with dev deps
- Convenient way for developers to get linters and type checkers
2026-02-06 09:36:50 -05:00
Justin Bollinger da2f56bf2a docs: add Development section to README
- Document how to install dev dependencies
- Provide commands for running ruff and mypy locally
- Include pre-push hook example for automated checks
- List all included dev dependencies
- Help contributors run checks before pushing
2026-02-06 09:35:20 -05:00
Justin Bollinger c6995718dc refactor: add optional dev dependencies and mypy configuration
- Add optional [dev] dependency group with mypy, ruff, pytest, and type stubs
- Include types-requests, types-beautifulsoup4, and types-openpyxl
- Add mypy config to exclude submodule directories
- Update GitHub workflow to install with optional dev dependencies
- Remove --ignore-missing-imports flag from mypy for stricter type checking
2026-02-06 09:34:38 -05:00
Justin Bollinger ded2de4002 fix: resolve mypy import-untyped errors for requests library 2026-02-06 09:31:17 -05:00
Justin Bollinger 3a4ed72c82 ruff fixes 2026-02-06 09:29:13 -05:00
Justin Bollinger a938d57578 ruff fixes 2026-02-06 09:14:33 -05:00
Justin Bollinger 835c573158 download wordlists testing 2026-02-05 17:36:46 -05:00