How-To: Crack NTLM Password Hashes with Hashcat

how to crack ntlm password hashes with hashcat

TL;DR: Once you have NTLM hashes – from a SAM dump, secretsdump, or Responder capture – Hashcat can recover plaintext passwords offline in minutes. Use mode -m 1000 for NTLM and -m 5600 for NTLMv2 (Net-NTLMv2). Start with a dictionary attack against rockyou.txt, layer on rules (best64.rule), and escalate to hybrid or brute-force if needed. Never send hashes to an online cracker on a real engagement.


Introduction

Credential-based attacks win networks. Once you have a foothold and can dump hashes – from a local SAM database, a domain controller via secretsdump, or a poisoned LLMNR/NBT-NS response via Responder – the next step is turning those hashes into usable plaintext passwords.

NTLM hashes don’t travel over the wire in most modern environments, but they’re still everywhere on disk. A domain joined host keeps a local copy of every cached credential in the SAM hive. Domain controllers hold every user’s NTLM hash in NTDS.dit. Password reuse means that one cracked hash often unlocks lateral movement across the entire environment.

Hashcat is the industry-standard GPU-accelerated password recovery tool. It runs against local hardware – no data leaves your machine – and can test billions of candidates per second against NTLM, which has no salting and no iteration count by design. This guide walks you through the full workflow from hash to plaintext.


Tools Required

ToolNotes
Hashcatv6.2.6+ recommended. hashcat.net
GPU (recommended)NVIDIA (CUDA) or AMD (OpenCL). A single RTX 3080 does ~70 GH/s on NTLM. CPU fallback works but is ~100x slower.
rockyou.txtIncluded in Kali (/usr/share/wordlists/rockyou.txt.gz). ~14 million entries.
SecListsExtended wordlists at /usr/share/seclists/Passwords/ on Kali, or from GitHub.
GPU driversNVIDIA: CUDA Toolkit. AMD: ROCm or OpenCL drivers. Must match your Hashcat binary.

Install on Kali (if not present):

sudo apt update && sudo apt install -y hashcat
gunzip /usr/share/wordlists/rockyou.txt.gz

Step-by-Step Instructions

Step 1 – Identify Your Hash Type

NTLM and Net-NTLMv2 look similar but require different Hashcat modes and cannot be cracked with each other’s mode.

Hash TypeHashcat ModeExample Format
NTLM (local/domain)-m 1000aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
Net-NTLMv2 (Responder)-m 5600user::DOMAIN:challenge:hash:blob

A pure NTLM hash is 32 hex characters (the LM portion before the colon can be ignored – it’s often a blank LM placeholder). If you captured hashes with Responder or Inveigh, those are Net-NTLMv2 and require mode 5600.

To check which mode you need, look at the hash structure:

  • Short 32-char hex string → NTLM (-m 1000)
  • Long colon-delimited string with username and challenge → Net-NTLMv2 (-m 5600)

Step 2 – Prepare Your Hash File

One hash per line. For NTLM, you can include just the NT hash (right side of the colon) or the full LM:NT string – Hashcat handles both.

# hashes.txt
31d6cfe0d16ae931b73c59d7e0c089c0
aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c

Step 3 – Dictionary Attack

Start here. Dictionary attacks against rockyou.txt recover a surprisingly high percentage of real-world hashes in under a minute.

hashcat -m 1000 -a 0 hashes.txt /usr/share/wordlists/rockyou.txt

Flags:

  • -m 1000 – NTLM hash mode
  • -a 0 – dictionary (straight) attack mode
  • hashes.txt – your hash file
  • /usr/share/wordlists/rockyou.txt – candidate wordlist

Watch output: Hashcat prints speed (H/s), estimated time, and cracked count. Results are saved automatically to the potfile (~/.hashcat/hashcat.potfile).

Step 4 – Rule-Based Attack

Rules transform wordlist candidates on the fly: add numbers, append symbols, toggle case, and more. best64.rule ships with Hashcat and covers the most common real-world mutations.

hashcat -m 1000 -a 0 hashes.txt /usr/share/wordlists/rockyou.txt \
  -r /usr/share/hashcat/rules/best64.rule

For broader coverage, chain multiple wordlists or use the OneRuleToRuleThemAll project rules.

Step 5 – Hybrid Attack

Hybrid attacks combine a wordlist with a mask (pattern). Use this when you suspect passwords like Password2024! or Summer@23.

# Wordlist + suffix mask: word followed by 1-4 digits then one symbol
hashcat -m 1000 -a 6 hashes.txt /usr/share/wordlists/rockyou.txt '?d?d?d?d'

Mask charset shortcuts:

  • ?d – digit (0–9)
  • ?l – lowercase letter
  • ?u – uppercase letter
  • ?s – special character
  • ?a – all of the above

Step 6 – Check Results and Restore

Show all cracked hashes from the potfile at any time:

hashcat -m 1000 hashes.txt --show

If a long session is interrupted, restore it:

hashcat --restore

Hashcat writes a .restore file automatically when you interrupt with Ctrl+C during a run.


Example Outputs

During a run:

Session..........: hashcat
Status...........: Running
Hash.Mode........: 1000 (NTLM)
Hash.Target......: hashes.txt
Time.Started.....: Thu Apr  3 14:22:01 2026 (0 secs)
Speed.#1.........:  9876.3 MH/s (4.12ms) @ Accel:128 Loops:1024 ...
Recovered........: 1/4 (25.00%) Digests (total), 1/4 (25.00%) ...
Progress.........: 14344385/14344385 (100.00%)

After --show:

31d6cfe0d16ae931b73c59d7e0c089c0:
8846f7eaee8fb117ad06bdd830b7586c:Password1

The hash on the left, the plaintext to the right of the colon. An empty plaintext (first line) is a blank password.


Common Mistakes

Wrong hash mode. Using -m 1000 on a Net-NTLMv2 hash (or vice versa) produces zero results with no error. Always confirm format before running.

GPU driver mismatch. Hashcat silently falls back to CPU – or crashes – if CUDA/OpenCL drivers aren’t installed or don’t match the binary. Run hashcat -I to list detected devices and confirm your GPU appears.

Wordlist encoding issues. rockyou.txt has some non-UTF-8 lines that can cause warnings. Pass --force only as a last resort; first try --encoding-from=utf8 or strip bad lines with strings rockyou.txt > rockyou_clean.txt.

Forgetting --show after a completed session. Hashcat doesn’t re-display cracked hashes on startup – it skips already-potted hashes. Always run with --show to review the full results set.

Running against the full LM:NT string when only NT matters. If your hash file contains aad3b435b51404ee:..., the LM placeholder is fine to leave in – Hashcat mode 1000 reads only the NT portion – but double-check with a known hash before a long run.


Summary

Cracking NTLM hashes offline is one of the highest-ROI steps in a credential-based intrusion path. The workflow is straightforward: dump hashes, confirm the type (NTLM mode 1000 vs. NTLMv2 mode 5600), run a dictionary attack against rockyou.txt, layer on rules for mutation coverage, and escalate to hybrid or brute-force if the target password doesn’t appear in common wordlists. GPU acceleration makes NTLM – an intentionally fast, unsalted hash – trivially crackable for any password shorter than ten characters and common enough to appear in wordlists. Use the potfile and restore features to manage long sessions, and always verify results with --show before concluding a run.