Offline credential and file cracking with hashcat and john. Use when any skill recovers hashes (NTLM, Kerberos TGS/AS-REP, shadow, MSCACHE2) or encrypted files (ZIP, Office, PDF, KeePass, SSH key, 7z, RAR). Trigger phrases: "crack this hash", "brute force the password", "offline crack", "john", "hashcat", "zip2john", "password-protected file". Do NOT use for online password attacks (spraying, brute force against services) — use password-spraying instead.
Install
npx skillscat add blacklanternsecurity/red-run/credential-cracking Install via the SkillsCat registry.
Credential Cracking
You are helping a penetration tester with offline credential and file cracking.
This skill covers hash identification, extraction from encrypted files, and
cracking with hashcat or john. All operations are local — no target interaction.
All testing is under explicit written authorization.
Engagement Logging
Check for ./engagement/ directory. If absent, proceed without logging.
When an engagement directory exists:
- Print
[credential-cracking] Activated → <target>to the screen on activation. - Evidence → save significant output to
engagement/evidence/with
descriptive filenames (e.g.,sqli-users-dump.txt,ssrf-aws-creds.json).
Do NOT write to engagement/activity.md, engagement/findings.md, or
engagement state. The orchestrator maintains these files. Report all findings
in your return summary.
Scope Boundary
This skill covers offline hash cracking and encrypted file cracking only. It
does NOT cover:
- Online password attacks (spraying, brute force) -- use password-spraying
- Credential dumping from memory/registry -- use credential-dumping
- Password guessing against services -- use password-spraying
When cracking is complete, STOP and return to the orchestrator with cracked
credentials and recommendations for where to test them.
State Management
Call get_state_summary() from the state-reader MCP server to read current
engagement state. Use it to:
- Skip re-testing targets, parameters, or vulns already confirmed
- Leverage existing credentials or access for this technique
- Understand what's been tried and failed (check Blocked section)
Do NOT write engagement state. When your work is complete, report all
findings clearly in your return summary. The orchestrator parses your summary
and records state changes. Your return summary must include:
- New targets/hosts discovered (with ports and services)
- New credentials or tokens found
- Access gained or changed (user, privilege level, method)
- Vulnerabilities confirmed (with status and severity)
- Pivot paths identified (what leads where)
- Blocked items (what failed and why, whether retryable)
Prerequisites
Hashes or encrypted files from another skill or user-provided
hashcat (preferred for GPU-accelerated cracking) or john (john-jumbo
for*2johntools)Wordlists — check these locations in order:
/usr/share/wordlists/rockyou.txt(Kali default — may be a symlink or compressed.gz)/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt(SecLists location)/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt.tar.gz(compressed — extract first:tar xzf rockyou.txt.tar.gz)/opt/seclists/Passwords/(legacy SecLists path)
Common issue:
/usr/share/wordlists/rockyou.txtis often a broken symlink
pointing to/opt/seclists/...which doesn't exist. If the symlink is broken,
check/usr/share/seclists/directly. If rockyou is only available as.tar.gz, extract to$TMPDIRbefore use.If rockyou.txt is not found at ANY of the above locations (including
compressed variants), STOP immediately. Do not create custom wordlists or
generate passwords. Report the failure:[credential-cracking] STOPPED — no wordlist found. Checked:
/usr/share/wordlists/rockyou.txt, /usr/share/seclists/Passwords/,
/opt/seclists/Passwords/. Install SecLists or provide a wordlist path.Return to the orchestrator with this message. The operator must install a
wordlist before cracking can proceed.
Sandbox — Disable for All Cracking Commands
hashcat and john need write access to multiple locations: session files
(~/.local/share/hashcat/sessions/), potfile (~/.local/share/hashcat/ hashcat.potfile), restore files (CWD), and temp working files. Redirecting
each individually with --session, --potfile-path, -o flags is fragile
and often still fails.
Always run hashcat and john with dangerouslyDisableSandbox: true.
This is the only reliable approach in Claude Code's sandboxed environment.
# CORRECT — disable sandbox for all cracking commands
Bash(command="hashcat -m MODE hash.txt wordlist.txt --force",
dangerouslyDisableSandbox=true)
Bash(command="john --wordlist=wordlist.txt hash.txt",
dangerouslyDisableSandbox=true)
# Also for --show after cracking
Bash(command="hashcat -m MODE hash.txt --show",
dangerouslyDisableSandbox=true)Do not attempt $TMPDIR workarounds first — go straight to sandbox
disable. Cracking is a local-only operation with no security implications
from disabling the sandbox.
john-jumbo Requirement
Most *2john extraction tools ship with john-jumbo, not basic john. Check:
john --version 2>&1 | head -1
# Should show "John the Ripper" with "jumbo" in the version stringIf john-jumbo is not installed:
# Debian/Ubuntu
sudo apt install john
# Or build from source (last resort)
git clone https://github.com/openwall/john.git
cd john/src && ./configure && make -s clean && make -sj$(nproc)
# Binary at ../run/johnThe *2john tools are typically in /usr/share/john/ or alongside the john
binary (e.g., /opt/john/run/zip2john). Check with:
find /usr -name "zip2john" 2>/dev/null
find /opt -name "zip2john" 2>/dev/nullStep 1: Identify Hash Type
Determine what needs cracking. This comes from one of two sources:
Source A: Hash from Another Skill
Hashes recovered during the engagement (check state.md Credentials section):
| Hash Prefix / Pattern | Type | Hashcat Mode | Notes |
|---|---|---|---|
| No prefix, 32 hex chars | NTLM | 1000 | From SAM/secretsdump |
username::domain:... |
NTLMv2 | 5600 | From Responder/relay |
$krb5tgs$23$*... |
Kerberos TGS (RC4) | 13100 | From kerberoasting |
$krb5tgs$17$*... |
Kerberos TGS (AES128) | 19600 | From kerberoasting |
$krb5tgs$18$*... |
Kerberos TGS (AES256) | 19700 | From kerberoasting |
$krb5asrep$23$... |
AS-REP | 18200 | From AS-REP roasting |
$6$... |
SHA-512 crypt | 1800 | From /etc/shadow (Linux) |
$5$... |
SHA-256 crypt | 7400 | From /etc/shadow |
$1$... |
MD5 crypt | 500 | From /etc/shadow (legacy) |
$2b$... or $2a$... |
bcrypt | 3200 | Web apps, htpasswd |
DCC2$... or $DCC2$... |
MSCACHE2 | 2100 | From cached domain creds |
| 32 hex chars (with salt context) | MD5 / MySQL / etc. | varies | Check hashcat examples |
If the hash type is unclear, use hashcat's built-in identification:
hashcat --identify hash.txtOr john:
john --list=formats | grep -i <keyword>Source B: Encrypted File
Password-protected files found during the engagement:
| Format | Extraction Tool | Notes |
|---|---|---|
| ZIP | zip2john |
Handles both PKZIP and AES-256 |
| Office 2007+ (docx/xlsx/pptx) | office2john |
OOXML format |
| Office 97-2003 (doc/xls) | office2john |
Legacy OLE format (auto-detected) |
pdf2john |
Adobe encrypted PDF | |
| KeePass (kdbx) | keepass2john |
KeePass 2.x database |
| SSH private key | ssh2john |
Encrypted id_rsa / id_ed25519 |
| 7z | 7z2john |
7-Zip archive |
| RAR | rar2john |
RAR 3/5 archive |
| GPG | gpg2john |
GPG-encrypted file |
| Ansible Vault | ansible2john |
Ansible encrypted vars/files (john-jumbo) |
Step 2: Extract Hash (File-Based Formats)
For file-based formats, extract the hash using the appropriate *2john tool.
Extraction Commands
# ZIP
zip2john protected.zip > hash.txt
# Remove the filename prefix if feeding to hashcat:
# zip2john output: archive.zip/file.txt:$pkzip$...
# hashcat needs: $pkzip$...
# Office (2007+ and 97-2003 auto-detected)
office2john protected.docx > hash.txt
# PDF
pdf2john protected.pdf > hash.txt
# KeePass
keepass2john database.kdbx > hash.txt
# SSH key
ssh2john id_rsa > hash.txt
# 7z
7z2john archive.7z > hash.txt
# RAR
rar2john archive.rar > hash.txt
# GPG
gpg2john encrypted.gpg > hash.txt
# Ansible Vault (tool name varies by installation)
ansible2john vault.yml > hash.txt
# Or: ansible2john.py, ansible-vault2john
# Common locations: /usr/share/john/, /opt/john/, alongside john binary
# If the tool is a Python script: python3 /path/to/ansible2john.py vault.yml > hash.txt
#
# For inline vault blocks (not standalone files), extract the block first:
# Copy the $ANSIBLE_VAULT;1.1;AES256 block (hex lines) to a file, then:
# ansible2john extracted_vault.yml > hash.txtPost-Extraction
- Verify the hash was extracted successfully:
cat hash.txt - For hashcat, strip the filename prefix (everything before the
$or hash):# Example: strip "archive.zip/file.txt:" prefix sed 's/^[^:]*://' hash.txt > hash_clean.txt - Save to engagement evidence:
cp hash.txt engagement/evidence/<format>-hash.txt
Step 3: STOP -- Confirm Cracking Approach
Hard stop — never auto-crack. Do not skip this step.
Present the following to the user:
Hash type: <identified type>
Hash count: <number of hashes>
Source: <file name or skill that produced it>
Recommended cracking approach:
Tool: <hashcat -m MODE | john --format=FORMAT>
Wordlist: <path to wordlist>
Rules: <if applicable>
Command: <exact command that will be run>
Options:
a) Crack locally with the command above
b) Export hash -- save to engagement/evidence/ for external cracking rigWait for the user to choose before proceeding. If the user chooses (b), save
the hash file, print its path, and return to the orchestrator.
Step 4: Crack
Run the cracking tool chosen by the user.
Sandbox reminder: All hashcat and john commands MUST usedangerouslyDisableSandbox: true. See Prerequisites for details.
CPU-only systems: If no GPU is available, hashcat requires --force
to run on CPU. Detect this upfront — don't wait for an OpenCL error:
# Check for GPU
hashcat -I 2>&1 | head -5
# If "No devices found" or only CPU listed, always add --forceHashcat (GPU-Preferred)
Hashcat is preferred for most hash types due to GPU acceleration.
Common hash modes:
| Hash Type | Mode | Command |
|---|---|---|
| NTLM | 1000 | hashcat -m 1000 hash.txt wordlist.txt |
| NTLMv2 | 5600 | hashcat -m 5600 hash.txt wordlist.txt |
| Kerberos TGS (RC4) | 13100 | hashcat -m 13100 hash.txt wordlist.txt |
| Kerberos TGS (AES128) | 19600 | hashcat -m 19600 hash.txt wordlist.txt |
| Kerberos TGS (AES256) | 19700 | hashcat -m 19700 hash.txt wordlist.txt |
| AS-REP | 18200 | hashcat -m 18200 hash.txt wordlist.txt |
| SHA-512 crypt ($6$) | 1800 | hashcat -m 1800 hash.txt wordlist.txt |
| SHA-256 crypt ($5$) | 7400 | hashcat -m 7400 hash.txt wordlist.txt |
| MD5 crypt ($1$) | 500 | hashcat -m 500 hash.txt wordlist.txt |
| bcrypt | 3200 | hashcat -m 3200 hash.txt wordlist.txt |
| MSCACHE2 | 2100 | hashcat -m 2100 hash.txt wordlist.txt |
| PKZIP (compressed) | 17200 | hashcat -m 17200 hash.txt wordlist.txt |
| PKZIP (uncompressed) | 17210 | hashcat -m 17210 hash.txt wordlist.txt |
| PKZIP (mixed) | 17220 | hashcat -m 17220 hash.txt wordlist.txt |
| PKZIP (multi-file) | 17225 | hashcat -m 17225 hash.txt wordlist.txt |
| WinZip (AES) | 13600 | hashcat -m 13600 hash.txt wordlist.txt |
| Office 2013+ | 9600 | hashcat -m 9600 hash.txt wordlist.txt |
| Office 2010 | 9500 | hashcat -m 9500 hash.txt wordlist.txt |
| Office 2007 | 9400 | hashcat -m 9400 hash.txt wordlist.txt |
| PDF 1.7 (AES-256) | 10700 | hashcat -m 10700 hash.txt wordlist.txt |
| PDF 1.4-1.6 (AES/RC4) | 10500 | hashcat -m 10500 hash.txt wordlist.txt |
| KeePass | 13400 | hashcat -m 13400 hash.txt wordlist.txt |
| SSH key (RSA/DSA) | 22911 | hashcat -m 22911 hash.txt wordlist.txt |
| SSH key (EC) | 22921 | hashcat -m 22921 hash.txt wordlist.txt |
John the Ripper
John is preferred when *2john extraction was used -- john reads the output
format directly without stripping prefixes.
# Basic wordlist attack
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
# With format specification (if auto-detect fails)
john --format=<format> --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
# Show cracked passwords
john --show hash.txtCommon john formats: NT, netntlmv2, krb5tgs, krb5asrep, sha512crypt,bcrypt, PKZIP, Office, PDF, keepass, SSH, 7z, RAR5.
Wordlists
Locate rockyou.txt (the most common general-purpose wordlist):
# Find rockyou — check all common locations
for f in /usr/share/wordlists/rockyou.txt \
/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt \
/opt/seclists/Passwords/Leaked-Databases/rockyou.txt; do
[ -f "$f" ] && echo "[+] Found: $f" && break
done
# Check for compressed versions if not found
ls /usr/share/wordlists/rockyou.txt.gz \
/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt.tar.gz \
2>/dev/null
# Extract if compressed
# .gz: gunzip /usr/share/wordlists/rockyou.txt.gz
# .tar.gz: tar xzf /usr/share/seclists/.../rockyou.txt.tar.gz -C $TMPDIRSecLists passwords (for targeted cracking):
# Find seclists base directory
SECLISTS=$([ -d /usr/share/seclists ] && echo /usr/share/seclists || echo /opt/seclists)
# Useful wordlists:
# $SECLISTS/Passwords/Common-Credentials/10-million-password-list-top-1000000.txt
# $SECLISTS/Passwords/darkweb2017-top10000.txt
# $SECLISTS/Passwords/xato-net-10-million-passwords-1000000.txtEscalation Strategy
If a straight wordlist attack fails, escalate. All commands below requiredangerouslyDisableSandbox: true and --force on CPU-only systems.
Wordlist only (fastest):
hashcat -m MODE hash.txt /usr/share/wordlists/rockyou.txt --forceWordlist + rules (catches mutations like
Password1!):# best64 — fast, covers common mutations hashcat -m MODE hash.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule # dive.rule — comprehensive, slower hashcat -m MODE hash.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/dive.rule # OneRuleToRuleThemAll (download if not present) hashcat -m MODE hash.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/OneRuleToRuleThemAll.ruleJohn equivalent:
john --wordlist=/usr/share/wordlists/rockyou.txt --rules=best64 hash.txtMask attack (for known patterns):
# 8-char lowercase + digit + special hashcat -m MODE hash.txt -a 3 '?l?l?l?l?l?l?d?s' # Company name + digits hashcat -m MODE hash.txt -a 3 'Company?d?d?d?d' # Capitalize first, lowercase, digits, special hashcat -m MODE hash.txt -a 3 '?u?l?l?l?l?l?d?d?s'Combination attack (two wordlists combined):
hashcat -m MODE hash.txt -a 1 wordlist1.txt wordlist2.txt
Monitoring Progress
# Hashcat: press 's' for status during run, or:
hashcat -m MODE hash.txt wordlist.txt --status --status-timer=30
# John: press any key for status during run, or:
john --statusStep 5: Post-Crack
Record Results
Save cracked credentials to evidence:
# Hashcat hashcat -m MODE hash.txt --show > engagement/evidence/cracked-passwords.txt # John john --show hash.txt > engagement/evidence/cracked-passwords.txtUpdate
engagement/state.mdCredentials section:## Credentials - admin:P@ssw0rd1 (cracked from NTLM, source: SAM dump on 10.10.10.5) - svc_sql:Summer2024! (cracked from kerberoasting TGS)Log to
engagement/activity.md:### [YYYY-MM-DD HH:MM:SS] credential-cracking -> NTLM hashes - Extracted 5 NTLM hashes from SAM dump - Cracked 3/5 with rockyou.txt - Credentials: admin, svc_sql, backup_user
Recommend Next Steps
Return to the orchestrator with:
- Cracked credentials and where they came from
- Recommended testing: which services/hosts to test them against (from the engagement state)
- Suggested skills:
- Credentials work on SMB/WinRM/RDP -> pass-the-hash or password-spraying
- Domain credentials recovered -> ad-discovery for further enumeration
- SSH key decrypted -> direct SSH access, then linux-discovery
- File decrypted (ZIP/Office/KeePass) -> examine contents for more credentials or sensitive data
Stall Detection
If you have spent 5 or more tool-calling rounds on the same failure with
no meaningful progress -- same error, no new information, no change in output
-- stop.
What counts as progress:
- Trying a different wordlist or rule set
- Switching between hashcat and john
- Adjusting hash format or mode based on error output
- A wordlist completing (even with no results -- that eliminates a possibility)
What does NOT count as progress:
- Retrying the same wordlist/rule combination
- Rerunning the same command after a crash without fixing the cause
- Trying to build or compile cracking tools from source
If stalled, return to the orchestrator with:
- What was attempted (wordlists, rules, modes tried)
- Assessment: password is likely too complex for available wordlists, or hash
format may be incorrect - Recommendation: export hash for external cracking rig, or try targeted
mask attack if password policy is known
Troubleshooting
hashcat: No devices found / OpenCL error
hashcat requires GPU drivers. If no GPU is available:
- Use
--forceto run on CPU (slow but works):hashcat -m MODE hash.txt wordlist.txt --force - Better: detect this upfront in Step 4 with
hashcat -Iand always
include--forceon CPU-only systems. Don't wait for the error. - Or switch to john (CPU-native):
john --wordlist=wordlist.txt hash.txt
hashcat: Permission denied / session file errors in sandbox
Do NOT try to work around with --session $TMPDIR or --potfile-path.
Use dangerouslyDisableSandbox: true on ALL hashcat/john commands. See
Prerequisites → "Sandbox" section.
john: Unknown ciphertext format
- Specify format explicitly:
john --format=<format> hash.txt - List available formats:
john --list=formats - Ensure john-jumbo is installed (basic john has limited format support)
rockyou.txt not found
# Check all common locations (including broken symlinks)
find /usr/share /opt -name "rockyou*" 2>/dev/null
ls -la /usr/share/wordlists/rockyou.txt # Check if it's a broken symlink
# SecLists location (most reliable on non-Kali systems)
ls /usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt*
# If only .tar.gz exists
tar xzf /usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt.tar.gz -C $TMPDIR
# Then use: $TMPDIR/rockyou.txt
# If only .gz exists
gunzip /usr/share/wordlists/rockyou.txt.gz
# If missing entirely (Debian/Ubuntu)
sudo apt install wordlists seclistszip2john / office2john not found
These tools ship with john-jumbo. Check:
# Debian/Ubuntu package location
ls /usr/share/john/zip2john
ls /usr/share/john/office2john.py
# Custom john build
ls /opt/john/run/zip2john
# Or find them
find / -name "zip2john" 2>/dev/nullIf the *2john tools are Python scripts, run them with python3:
python3 /usr/share/john/office2john.py protected.docx > hash.txtHash format mismatch (hashcat)
Line-length exception / Token length exception / Separator unmatched- The hash may have a filename prefix from
*2john-- strip it - Wrong hashcat mode -- verify with
hashcat --identify hash.txt - Hash may be truncated -- re-extract from source
Cracking is too slow
$6$(SHA-512 crypt), bcrypt, Office 2013+, and KeePass are intentionally
slow hashes. Even with GPU, expect low speeds.- Try a smaller, targeted wordlist first (top 10k passwords)
- Use mask attack if you know the password policy
- Consider exporting to a dedicated cracking rig