Playbook: Brute Force / Password Spray
ID: PB-04
Severity: Low/Medium/High | Category: Identity & Access
MITRE ATT&CK: T1110 (Brute Force), T1110.001 (Password Guessing), T1110.003 (Password Spraying)
Trigger: SIEM alert ("Multiple failed logins"), IdP risk detection, Firewall/WAF logs
Attack Patterns
graph TD
Attacker["🔨 Attacker"] --> Type{"📋 Type?"}
Type -->|Brute Force| BF["🔑 Try all passwords"]
Type -->|Password Spray| PS["🌊 1 password × many accounts"]
Type -->|Credential Stuffing| CS["📦 Use leaked creds"]
BF --> Target["🎯 Single account"]
PS --> Target2["🎯 Multiple accounts"]
CS --> Target2
style Attacker fill:#e74c3c,color:#fff
style BF fill:#f39c12,color:#fff
style PS fill:#e67e22,color:#fff
style CS fill:#8e44ad,color:#fff
Smart Lockout Flow
sequenceDiagram
participant Attacker
participant IdP
participant SOC
participant User as Legitimate User
Attacker->>IdP: ❌ Login fail ×5
IdP->>IdP: 🔒 Smart lockout (attacker only)
User->>IdP: ✅ Login success (not locked)
IdP->>SOC: 🚨 Alert: failed attempts
SOC->>SOC: Check IP + success/fail ratio
Decision Flow
graph TD
Alert["🚨 Failed Login Spike"] --> Type{"🔍 Attack Type?"}
Type -->|Many fails → 1 account| Brute["🔨 Brute Force"]
Type -->|1 password → Many accounts| Spray["🌧️ Password Spray"]
Type -->|Credential list tested| Stuffing["📋 Credential Stuffing"]
Brute --> Success{"✅ Any Success After Fails?"}
Spray --> Success
Stuffing --> Success
Success -->|Yes, Login Succeeded| Compromised["🔴 Account Compromised!"]
Success -->|No, All Failed| Attempt["🟡 Attack Attempt"]
Compromised --> Reset["🔄 Reset + Investigate"]
Attempt --> Block["🚫 Block Source + Monitor"]
1. Analysis
1.1 Attack Type Identification
| Type |
Pattern |
Detection |
| Brute Force |
100+ attempts against ONE account in minutes |
SIEM: high fail count per user |
| Password Spray |
1-2 attempts per account across MANY accounts |
SIEM: same source, many targets |
| Credential Stuffing |
Leaked credential pairs tested |
Multiple users, different passwords |
| Slow & Low |
Spread attempts over hours/days to avoid lockout |
UEBA baseline deviation |
| Distributed |
Same attack from many IPs (botnet) |
Correlation: same target, many sources |
1.2 Investigation Checklist
| Check |
How |
Done |
| Source IP(s) — internal or external? |
SIEM / Firewall |
☐ |
| IP reputation |
AbuseIPDB, VirusTotal |
☐ |
| Target account(s) — VIP, admin, service? |
AD / IdP |
☐ |
| Volume — how many attempts? |
SIEM query |
☐ |
| Any SUCCESSFUL login after failures? |
CRITICAL — Event ID 4624 after 4625s |
☐ |
| Protocol used (RDP, SSH, OWA, VPN, API) |
Authentication logs |
☐ |
| Account lockout triggered? |
AD / IdP |
☐ |
| Is the target exposed externally? |
Firewall rules, Shodan |
☐ |
1.3 Severity Assessment
| Scenario |
Severity |
Action |
| External IP, all failures, non-admin accounts |
Low |
Block IP, monitor |
| External IP, all failures, admin/VIP accounts |
Medium |
Block IP, alert account owner |
| Successful login after failed attempts |
High |
Treat as PB-05 Account Compromise |
| Password spray hitting many accounts |
High |
Block IP, org-wide password assessment |
| Internal source IP |
High |
Compromised host investigation |
2. Containment
2.1 Attack Attempt (No Success)
| # |
Action |
Tool |
Done |
| 1 |
Block source IP(s) at firewall/WAF |
Firewall |
☐ |
| 2 |
GeoIP block if source is from non-business country |
Firewall / IdP |
☐ |
| 3 |
Lock accounts only if lockout threshold wasn't auto-triggered |
AD |
☐ |
| 4 |
Alert account owners (especially VIP/admins) |
Email / Chat |
☐ |
2.2 Successful Login Detected (CRITICAL)
| # |
Action |
Tool |
Done |
| 1 |
Immediately reset password of compromised account |
AD / IdP |
☐ |
| 2 |
Terminate all sessions |
IdP |
☐ |
| 3 |
Enforce MFA before re-enabling |
IdP |
☐ |
| 4 |
Block source IP |
Firewall |
☐ |
| 5 |
Audit account activity from successful login onward |
SIEM |
☐ |
| 6 |
Escalate to PB-05 Account Compromise |
SOC |
☐ |
2.3 If Internal Source
| # |
Action |
Done |
| 1 |
Isolate source host — likely compromised |
☐ |
| 2 |
Investigate what's running on source host |
☐ |
| 3 |
Check for malware / attacker tooling |
☐ |
3. Eradication
| # |
Action |
Done |
| 1 |
Remove attacker IP from any Allow lists |
☐ |
| 2 |
If internal source: clean/re-image compromised host |
☐ |
| 3 |
Check if any other accounts were compromised |
☐ |
| 4 |
Verify all targeted accounts have strong, unique passwords |
☐ |
4. Recovery
| # |
Action |
Done |
| 1 |
Unlock legitimately locked accounts after verification |
☐ |
| 2 |
Enforce MFA on all targeted accounts |
☐ |
| 3 |
Implement smart lockout (Azure AD) or progressive delays |
☐ |
| 4 |
Review and reduce externally exposed auth endpoints |
☐ |
| 5 |
Deploy password banned list (common passwords) |
☐ |
| 6 |
Consider passwordless authentication for high-risk accounts |
☐ |
| 7 |
Monitor targeted accounts for 30 days |
☐ |
5. IoC Collection
| Type |
Value |
Source |
| Attacker IP(s) |
|
Firewall / SIEM |
| Targeted account(s) |
|
Auth logs |
| Attempted passwords (if visible) |
|
Auth logs |
| Attack duration |
|
SIEM |
| Successful login timestamp |
|
Auth logs |
| Protocol targeted |
|
Auth logs |
6. Escalation Criteria
| Condition |
Escalate To |
| Successful login after brute force |
PB-05 Account Compromise |
| Admin / service account targeted |
SOC Lead + Identity team |
| Password spray > 100 accounts |
SOC Lead |
| Internal source IP |
Tier 2 + Endpoint team |
| Distributed attack (botnet) |
SOC Lead + Network team |
| Externally exposed RDP targeted |
Network team — disable external RDP |
Password Policy Hardening
graph TD
Policy["🔐 Password Policy"] --> Length["📏 Min 14 chars"]
Policy --> Complex["🔤 Complexity required"]
Policy --> History["📋 Remember 24"]
Policy --> Lockout["🔒 Lockout 10 fails"]
Lockout --> Duration["⏱️ 30 min lockout"]
Length --> MFA["📱 MFA required"]
Complex --> MFA
style MFA fill:#27ae60,color:#fff
style Lockout fill:#e74c3c,color:#fff
Credential Source Tracking
graph LR
Source{"🔑 Source?"} --> Dark["🌑 Dark Web dump"]
Source --> Phish["🎣 Phishing"]
Source --> Reuse["♻️ Password reuse"]
Source --> Keylog["⌨️ Keylogger"]
Dark --> Check["✅ Check HaveIBeenPwned"]
Phish --> Check
Reuse --> Check
Keylog --> EDR["🛡️ EDR scan"]
style Dark fill:#2c3e50,color:#fff
style Phish fill:#e74c3c,color:#fff
Detection Rules (Sigma)
References