PMKID Attack
pmkid / pm — PMKID Capture + Crack
Captures the PMKID from a single EAPOL M1 frame and optionally cracks the WPA2 password on-device. No client required.
By default pm is active (clientless): it spoofs a client MAC and sends the AP an open Authentication + Association Request, so the AP immediately replies with M1 carrying the PMKID — no waiting for a real client. Add passive for a silent, transmit-nothing sniff that only waits for a real client to associate.
CMD> pm <index|bssid> [channel] ← active (forces the PMKID)
CMD> pm passive <index|bssid> [channel] ← silent, no-TX sniff
CMD> pm 2
CMD> pm AA:BB:CC:DD:EE:FF 6
CMD> pm passive 2
| Mode | Command | Transmits? | Needs a real client? |
|---|---|---|---|
| Active (default) | pm <idx> | Yes (auth + assoc) | No — forces M1 on demand |
| Passive | pm passive <idx> | No | Yes — waits for one to associate |
How PMKID works
The AP embeds a PMKID in every EAPOL M1 frame it sends to associating clients:
PMKID = HMAC-SHA1-128(PMK, "PMK Name" || AP_MAC || STA_MAC)
Because the PMKID is derived directly from the PMK (which comes from the password), cracking it only requires one M1 frame — no M2, no deauth, no client interaction needed.
Step 1 — Capture
CMD> sw ← scan first to build index
CMD> pm 2 ← target AP at index 2
In the default active mode, Al-Anqa spoof-associates to the AP to force it to send M1 straight away (retried every 800 ms until captured). In passive mode it just listens and the AP sends M1 whenever any client naturally associates. When a PMKID is found in the Key Data, the screen shows:
[PMKID CAPTURED!]
A1B2C3D4E5F6A7B8 ← first 8 bytes preview
[c] crack [q] stop
Note: Not all APs include the PMKID KDE in M1. If you see
M1 seen — no PMKID in Key Data, that AP does not embed a PMKID — usewsinstead. (Software APs such as hostapd deliberately omit the PSK PMKID; most consumer routers include it.)
Step 2 — Crack
Press c after capture to start on-device cracking.
Al-Anqa computes PBKDF2-SHA1(passphrase, SSID, 4096) → PMK → HMAC-SHA1-128("PMK Name"||AP||STA) and compares against the captured PMKID.
| Wordlist source | Path | Behaviour |
|---|---|---|
| SD wordlist | /apps/pmkid/wordlist.txt | Tried first, unlimited size |
| Built-in list | (embedded) | 101 common WPA passwords, used as fallback |
Results are saved to /apps/pmkid/cracked.csv with a PMKID tag to distinguish from handshake cracks.
Offline cracking with hashcat
Pull the PCAP from SD and convert:
hcxpcapngtool -o hash.hc22000 /apps/pmkid/AA-BB-CC-DD-EE-FF.cap
hashcat -m 22000 hash.hc22000 wordlist.txt
Keys
| Key | Action |
|---|---|
c | Start cracking (after PMKID captured) |
q | Stop capture or cracking |
Files
| Path | Contents |
|---|---|
/apps/pmkid/<BSSID>.cap | Raw 802.11 PCAP (libpcap, linktype 105) |
/apps/pmkid/cracked.csv | Cracked PMKID passwords |
/apps/pmkid/wordlist.txt | Custom wordlist (one password per line, ≥8 chars) |
vs WPA Sniff (ws)
pm (PMKID) | ws (Handshake) | |
|---|---|---|
| Frames needed | M1 only | M1 + M2 |
| Client required | No | Yes (or deauth to force) |
| Deauth sent | No | Yes, every 4s |
| Router support | ~80% of modern routers | Universal |
| Stealth | Higher | Lower |