Spray
Outil générique et temporisé de password spraying pour Active Directory et d'autres services réseau, conçu pour rester sous les seuils de verrouillage de compte. Generic, throttled password spraying tool for Active Directory and other network services, designed to stay under lockout thresholds.
↗ https://github.com/Greenwolf/SprayOverview
Spray is a shell-script wrapper that automates password spraying while respecting a target’s account lockout policy — it works out the safe number of attempts per user given the observed lockout threshold and window, then paces requests accordingly so accounts don’t get locked out mid-engagement. It ships with a dedicated SMB/Active Directory mode plus a generic mode that can spray against any login form or service by matching a failure/success string in the response.
Common Usage
Spray a single password against a userlist over SMB (Active Directory)
./spray.sh -smb <target_ip> userlist.txt 'Summer2026!' 3 CORP "engagement notes"
Spray a password list (one attempt per user per run) over SMB
./spray.sh -smb <target_ip> userlist.txt passwordlist.txt 3 CORP "engagement notes"
Generic mode against an arbitrary HTTP login endpoint
./spray.sh -generic <target_ip>:443 userlist.txt 'Summer2026!' 3 \
"invalid credentials" "welcome back" "engagement notes"
Tips
- The lockout threshold argument is the single most important input — pull it from the domain password policy (
net accounts /domainor via a null/authenticated SMB session) before spraying - Spread attempts across the observed lockout window, not just the threshold count — spraying too fast still trips smart-lockout/Azure AD Identity Protection even under the raw on-prem threshold
- Always keep a copy of the engagement notes/comment field populated — it timestamps and labels each spray run in the tool’s logs for later reporting
Help / Man page
Usage:
./spray.sh -smb <target_ip/range> <userlist> <password_or_passlist> <lockout_threshold> <domain> <comment>
./spray.sh -generic <target_ip:port> <userlist> <password_or_passlist> <lockout_threshold> <fail_string> <success_string> <comment>
target_ip/range IP, CIDR, or file of hosts (SMB mode)
userlist file with one username per line
password_or_passlist single password, or file with one password per line
lockout_threshold number of bad attempts allowed before lockout
domain AD domain (SMB mode only)
fail_string/success_string response substrings identifying failure/success (generic mode)
comment free-text note logged with this spray run
Vue d’ensemble
Spray est un wrapper shell qui automatise le password spraying en respectant la politique de verrouillage de compte d’une cible : il calcule le nombre d’essais sûr par utilisateur en fonction du seuil et de la fenêtre de verrouillage observés, puis cadence les requêtes en conséquence pour que les comptes ne se verrouillent pas en cours de mission. Il embarque un mode dédié SMB/Active Directory ainsi qu’un mode générique capable de sprayer n’importe quel formulaire de connexion ou service en repérant une chaîne d’échec/succès dans la réponse.
Utilisation courante
# Sprayer un seul mot de passe contre une liste d'utilisateurs via SMB (Active Directory)
./spray.sh -smb <target_ip> userlist.txt 'Summer2026!' 3 CORP "engagement notes"
# Sprayer une liste de mots de passe (un essai par utilisateur et par exécution) via SMB
./spray.sh -smb <target_ip> userlist.txt passwordlist.txt 3 CORP "engagement notes"
# Mode générique contre un point de terminaison HTTP arbitraire
./spray.sh -generic <target_ip>:443 userlist.txt 'Summer2026!' 3 \
"invalid credentials" "welcome back" "engagement notes"
Conseils
- L’argument de seuil de verrouillage est l’entrée la plus importante : le récupérer depuis la politique de mot de passe du domaine (
net accounts /domainou via une session SMB null/authentifiée) avant de sprayer - Étaler les essais sur toute la fenêtre de verrouillage observée, pas seulement sur le seuil : sprayer trop vite déclenche quand même le smart-lockout/Azure AD Identity Protection même sous le seuil brut on-prem
- Toujours garder rempli le champ de notes/commentaire de la mission : il horodate et labellise chaque exécution de spray dans les logs de l’outil pour le reporting ultérieur
Aide / Page de manuel
Usage:
./spray.sh -smb <target_ip/range> <userlist> <password_or_passlist> <lockout_threshold> <domain> <comment>
./spray.sh -generic <target_ip:port> <userlist> <password_or_passlist> <lockout_threshold> <fail_string> <success_string> <comment>
target_ip/range IP, CIDR, or file of hosts (SMB mode)
userlist file with one username per line
password_or_passlist single password, or file with one password per line
lockout_threshold number of bad attempts allowed before lockout
domain AD domain (SMB mode only)
fail_string/success_string response substrings identifying failure/success (generic mode)
comment free-text note logged with this spray run