Pentest

Ethical Password Cracking with Hashcat: What It Teaches About Security

📅 October 5, 2025 ⏱ 7 min read 👤 Sagar Bidari

Passwords are the most attacked credential type in the world. Understanding how they get cracked makes you dramatically better at defending them. This project ran Hashcat against a set of extracted hashes in a lab environment — and the results were eye-opening.

Ethics first: Only ever run Hashcat against hashes you generated yourself or have explicit authorisation to test. Cracking hashes from systems you do not own is illegal. This project used hashes generated from known test passwords in an isolated VirtualBox lab.

How Password Hashing Works

When you set a password, the system does not store the password itself — it stores a hash: the output of a one-way mathematical function. When you log in, the system hashes your input and compares it to the stored hash. If they match, you're in.

Common hash types you will encounter:

Setting Up Hashcat

Hashcat runs on GPU, which is dramatically faster than CPU for cracking. On a modern GPU, it can test billions of MD5 hashes per second. Install from hashcat.net — it runs on Windows, Linux, and macOS.

Generate some test hashes in your lab:

# Generate NTLM hashes for known passwords (Linux)
echo -n "Password123" | iconv -t utf-16le | openssl md4

# Or use Python
python3 -c "import hashlib; print(hashlib.new('md4', 'Password123'.encode('utf-16le')).hexdigest())"

Attack Mode 0 — Wordlist Attack

The simplest and most effective attack. Hashcat takes a list of common passwords, hashes each one, and compares against your target hash.

hashcat -m 1000 -a 0 hashes.txt rockyou.txt

Where -m 1000 is the NTLM hash mode and rockyou.txt is the 14-million-entry password list from the 2009 RockYou breach. In my lab test, every "common" password (Password123, Summer2023!, Welcome1) cracked in under 2 seconds against NTLM.

Attack Mode 3 — Brute Force with Rules

Rules apply transformations to wordlist entries — capitalise the first letter, append a number, substitute letters for symbols. This is how "password" becomes "P@ssw0rd1!":

hashcat -m 1000 -a 0 hashes.txt rockyou.txt -r rules/best64.rule

The best64.rule file applies the 64 most statistically effective transformations. This cracked every "leetspeak" variation of common words in my test set within minutes.

Attack Mode 6 — Hybrid (Wordlist + Mask)

Appends or prepends a pattern to each wordlist entry. Many corporate password policies require a number and symbol at the end — users comply with the minimum, creating predictable patterns:

# Try wordlist entries with 2 digits and 1 symbol appended
hashcat -m 1000 -a 6 hashes.txt rockyou.txt ?d?d?s

This cracked "summer23!" in 4 minutes despite it technically meeting a "strong" 9-character policy.

What the Results Revealed

Every hash I tested that used a real English word as its base — regardless of complexity rules applied — cracked within an hour. The passwords that did not crack quickly had two things in common:

Why This Matters for Security Policy

Most corporate password policies are security theatre. Requiring "at least 8 characters with uppercase, number, and symbol" produces passwords like Summer23! — which cracks in minutes. The actual recommendations from NIST SP 800-63B (now adopted in Australian cybersecurity guidance) are:

Running this project gave me first-hand evidence to back these recommendations in any interview or workplace conversation. It is one thing to read NIST guidance; it is another to watch "P@ssw0rd1" crack in 3 seconds.

Related Articles