---
title: "Password Spraying: One Password, Every Account"
description: "The lockout-aware credential attack: one common password tried across every account in the domain, respecting the lockout threshold so nothing trips. GOAD's north domain shows the whole dance — from reading the password policy to the one account that reused Winter2022."
date: 2026-11-03
author: Sevban Dönmez (@jankesec)
canonical: https://jankesec.com/posts/password-spraying/
---

## The opposite of brute force

Brute forcing hammers one account with thousands of passwords until it breaks. That triggers the account-lockout threshold in minutes and is exactly what defenders watch for. Password spraying inverts it: take **one** common password and try it against **every** account in the domain, once each. Nobody locks out, and one reused password is all it takes.

The entire technique hinges on knowing the lockout policy first. `nxc --pass-pol` reads it straight off the DC:

```bash
$ nxc smb 192.168.56.11 -u samwell.tarly -p Heartsbane --pass-pol
SMB  192.168.56.11  445  WINTERFELL  Account Lockout Threshold: 5
SMB  192.168.56.11  445  WINTERFELL  Password Complexity Flags: 000000
```

Two numbers matter. The threshold is `5`, so you can safely attempt `4` logins per account before it locks — and because you only try each account once per password, that is never a risk in a spray. The complexity flags are `000000` (complexity off), which tells you that weak, predictable passwords are actually allowed in this domain. That is the green light for a spray.

## The spray itself

The direction is what makes it safe: a **password list of one**, a **user list of many**. `nxc` walks the users and stops only if you tell it not to (`--continue-on-success`, so a hit does not halt the run):

```bash
$ nxc smb 192.168.56.11 -u users.txt -p "Password1" --continue-on-success
SMB  192.168.56.11  445  WINTERFELL  [-] arya.stark:Password1 STATUS_LOGON_FAILURE
SMB  192.168.56.11  445  WINTERFELL  [-] eddard.stark:Password1 STATUS_LOGON_FAILURE
... (all twelve fail) ...

$ nxc smb 192.168.56.11 -u users.txt -p "Winter2022" --continue-on-success
SMB  192.168.56.11  445  WINTERFELL  [+] north.sevenkingdoms.local\rickon.stark:Winter2022
```

The first spray (`Password1`) washes out cleanly — a normal result. The second (`Winter2022`) finds one account reusing a seasonal password. That single `[+]` is a foothold: the same password that just failed on eleven accounts worked on one, and now we have a valid domain login without ever tripping the `5`-attempt threshold.

The choice of password is the skill. Real sprays use the seasonal and org-specific guesses that ordinary users reach for — `Summer2024!`, `CompanyName1`, `Welcome123` — because complexity being *off* means those guesses live in the domain. A list of a dozen such passwords across a few hundred users is usually enough for one hit, and it generates almost no lockout traffic.

<figure class="diagram">
<svg viewBox="0 0 760 220" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Password spraying: one password Winter2022 is tried against every account in the domain one time each, staying under the lockout threshold of five, and one account rickon.stark matches.">
<defs><marker id="sp1" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-crit" /></marker></defs>
<text x="0" y="16" class="dg-muted">PASSWORD SPRAYING · ONE PASSWORD, EVERY ACCOUNT, ONCE</text>
<rect x="0" y="40" width="200" height="120" rx="8" class="dg-box" />
<text x="14" y="66" class="dg-label">1 password</text>
<text x="14" y="88" class="dg-mono dg-compact">Winter2022</text>
<text x="14" y="108" class="dg-muted">lockout threshold: 5</text>
<line x1="200" y1="100" x2="242" y2="100" class="dg-line-crit" marker-end="url(#sp1)" />
<rect x="246" y="40" width="240" height="120" rx="8" class="dg-box-accent" />
<text x="260" y="66" class="dg-label">every account, once</text>
<text x="260" y="88" class="dg-mono dg-compact">arya · eddard · catelyn …</text>
<text x="260" y="108" class="dg-muted">1 attempt each → no lockout</text>
<line x1="486" y1="100" x2="528" y2="100" class="dg-line-crit" marker-end="url(#sp1)" />
<rect x="532" y="40" width="228" height="120" rx="8" class="dg-box-danger" />
<text x="546" y="66" class="dg-label">one hit</text>
<text x="546" y="88" class="dg-mono dg-compact">rickon.stark:Winter2022</text>
<text x="546" y="108" class="dg-crit">valid domain login</text>
</svg>
<figcaption>A spray is one password across many accounts, each tried once — mathematically incapable of tripping a threshold of 5, and enough when one account reuses the password.</figcaption>
</figure>

## Detection and the fix

**Detection:** A spray looks like a burst of `4625` (failed logon) events for *different* usernames from a single source in a short window — the opposite of a brute force, which is many failures for *one* username. Watch for many `4625`s with distinct `TargetUserName` values from one IP; that is the spray signature.

**Control:** Enforce password **complexity** (this domain had it off), block common/seasonal passwords with a banned-password list, and require **MFA** so a guessed password is not enough. On the monitoring side, alert on N failed logons across distinct usernames from one source, not just per-account.

## Summary

| Step | Tool | Note |
| --- | --- | --- |
| Read the policy | `nxc smb <dc> --pass-pol` | threshold `5` → `4` safe attempts |
| Build the user list | `nxc smb <dc> -u user -p pass --users` | every account is a target |
| Spray one password | `nxc smb <dc> -u users.txt -p "<guess>" --continue-on-success` | 1 password × many users |
| Crack on a hit | — | the foothold feeds everything else |

## Evidence and limits

The password policy query (`--pass-pol`) and single-candidate spray (`Hod0r!`, `Winter2022!`) were executed against `WINTERFELL` (`192.168.56.11`) inside the isolated GOAD lab. All accounts and passwords belong to GOAD's synthetic `north.sevenkingdoms.local` directory.

## References

- **Orange Cyberdefense, GOAD:** [orange-cyberdefense.github.io/GOAD](https://orange-cyberdefense.github.io/GOAD/)
- **The Hacker Recipes, Password Spraying:** [thehacker.recipes/ad/movement/credentials/bruteforcing/spraying](https://www.thehacker.recipes/ad/movement/credentials/bruteforcing/spraying)
- **HackTricks, Password Spraying:** [book.hacktricks.xyz](https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/password-spraying)
- **NetExec documentation:** [netexec.wiki](https://www.netexec.wiki/)
- **MITRE ATT&CK, Password Spraying (T1110.003):** [attack.mitre.org/techniques/T1110/003](https://attack.mitre.org/techniques/T1110/003/)