Password Spraying
Overview
Password spraying attempts to log into an exposed service using one common password and a longer list of usernames
Less likely to lock out accounts than brute force
Must always respect the domain password policy lockout threshold
If you don't know the password policy, wait a few hours between attempts or limit to one attempt as a "hail mary"
Enumerating the Password Policy
From Linux - Credentialed
nxc smb 172.16.5.5 -u avazquez -p Password123 --pass-polFrom Linux - SMB NULL Session
# rpcclient
rpcclient -U '%' -N 172.16.5.5
getdompwinfo
# enum4linux
enum4linux -P 172.16.5.5
# enum4linux-ng (better output, JSON/YAML export)
python3 enum4linux-ng.py 192.168.125.131 -u Tester -p 'Start123!' -oY outFrom Linux - LDAP Anonymous Bind
From Windows
Building a Target User List
Public Website Names
Company websites often expose staff names on pages such as /Team. Convert those names to likely AD usernames and validate them with Kerberos user enumeration:
If one naming format is valid, generate the same pattern for all names. For example, first.last:
SMB NULL Session
LDAP Anonymous Bind
Kerbrute (No Domain Access Required)
Does not generate event ID 4625 (failed logon)
Generates event ID 4768 (TGT requested)
Use wordlists from https://github.com/insidetrust/statistically-likely-usernames
Output format: kerbrute returns
username@domain.local- strip the domain part when building wordlists for other toolsKDC_ERR_ETYPE_NOSUPP: This error does NOT mean invalid creds - the credential may still be valid. Verify with netexec or rpcclient
With Valid Credentials
Performing the Attack
From Linux
rpcclient Bash One-Liner
Kerbrute
NetExec
Validate Credentials
From Windows
DomainPasswordSpray.ps1
Automatically generates user list from AD
Queries the domain password policy
Excludes accounts within one attempt of locking out
Local Admin Password Reuse
If you obtain the local admin NTLM hash, spray it across the subnet
Use
--local-authflag to avoid domain account lockout
Common Passwords to Try
Season+Year (Spring2022, Winter2021, Fall@21)
Welcome1, Password1, Password123
Company name + numbers/special chars
Month + Year patterns
Build Season+Year Lists from Site Dates
If the target website exposes a copyright or build year, generate seasonal passwords around that year. For example, a © 2023 footer led to Summer2023.
Simple rule for SeasonYYYY, plus a few common suffix variants:
Generate and spray carefully:
Mitigations
Multi-factor authentication
Restrict application access (principle of least privilege)
Separate admin accounts for administrative activities
Password filters to restrict common dictionary words
Monitor event ID 4625 (failed logon) and 4771 (Kerberos pre-authentication failed)
External Password Spraying Targets
Microsoft 365 / Outlook Web Exchange
VPN portals (Citrix, SonicWall, OpenVPN, Fortinet)
Citrix portals, RDS portals
VDI implementations (VMware Horizon)
Custom web applications using AD authentication
Last updated