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/Spray

Overview

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 /domain or 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 /domain ou 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