T1110.003 Sumo Logic CSE · Sumo

Detect Password Spraying in Sumo Logic CSE

Adversaries may use a single or small list of commonly used passwords against many different accounts to attempt to acquire valid account credentials. Password spraying uses one password (e.g. 'Password01'), or a small list of commonly used passwords, that may match the complexity policy of the domain. Logins are attempted with that password against many different accounts on a network to avoid account lockouts that would normally occur when brute forcing a single account with many passwords. This technique is deliberately throttled to avoid triggering per-account lockout thresholds — the defining characteristic that distinguishes spraying from brute force (T1110.001). Adversaries including APT28, APT29, HAFNIUM, Storm-0940, Chimera, and APT33 have used this technique at scale against OWA, Microsoft 365, VPN portals, SSH, RDP, SMB, and LDAP. Slow-spray variants (approximately 4 attempts per account per hour) are specifically designed to evade detection thresholds, and Kerberos-based spraying is used to avoid generating the high-visibility Event ID 4625 typically alerted on.

MITRE ATT&CK

Tactic
Credential Access
Technique
T1110 Brute Force
Sub-technique
T1110.003 Password Spraying
Canonical reference
https://attack.mitre.org/techniques/T1110/003/

Sumo Detection Query

Sumo Logic CSE (Sumo)
sql
(_index=sec_record_authentication result="failure"
OR (_sourceCategory=*windows*security* EventCode=4625)
OR (_sourceCategory=*linux*secure* "Failed password"))
| where !isEmpty(srcDevice_ip) OR !isEmpty(IpAddress)
| eval src_ip = if(!isEmpty(srcDevice_ip) AND srcDevice_ip != "-", srcDevice_ip, IpAddress)
| eval acct = if(!isEmpty(user_username), user_username, TargetUserName)
| where !isEmpty(src_ip)
  AND src_ip != "127.0.0.1"
  AND src_ip != "::1"
  AND src_ip != "-"
  AND !isEmpty(acct)
  AND acct != "ANONYMOUS LOGON"
| where LogonType = "3" OR LogonType = "10" OR _index = "sec_record_authentication"
| timeslice 30m
| stats
    count as FailureCount,
    dcount(acct) as DistinctAccounts,
    values(acct) as TargetAccounts,
    min(_messageTime) as FirstSeen,
    max(_messageTime) as LastSeen,
    values(WorkstationName) as SourceWorkstations
    by src_ip, _timeslice
| where DistinctAccounts >= 10
| eval AvgFailuresPerAccount = round(FailureCount / DistinctAccounts, 2)
| where AvgFailuresPerAccount <= 5
| eval SprayDurationMinutes = round((LastSeen - FirstSeen) / 60000, 1)
| sort by DistinctAccounts desc
| fields _timeslice, src_ip, FailureCount, DistinctAccounts, AvgFailuresPerAccount, SprayDurationMinutes, TargetAccounts, SourceWorkstations
high severity high confidence

Sumo Logic query detecting password spraying across both CSE-normalized authentication records and raw Windows Security / Linux syslog sources. Uses `eval` to unify field names across schemas (CSE srcDevice_ip/user_username vs. raw IpAddress/TargetUserName), then groups into 30-minute windows via `timeslice`. Flags source IPs targeting 10 or more distinct accounts with an average failure rate of 5 or fewer per account. The LogonType filter (3=Network, 10=RemoteInteractive) restricts to remote authentication vectors; CSE records bypass this filter as they are already normalized to authentication events.

Data Sources

Sumo Logic CSE normalized authentication records (_index=sec_record_authentication)Windows Security Event Log via Sumo Logic Windows Collector (EventCode 4625)Linux SSH/PAM via Sumo Logic syslog collector (/var/log/secure)Azure AD SigninLogs via Sumo Logic Azure integrationOkta System Logs via Sumo Logic Okta app

Required Tables

sec_record_authentication_sourceCategory=*windows*security*_sourceCategory=*linux*secure*

False Positives & Tuning

  • Enterprise SSO or federated identity gateways (Okta RADIUS agent, PingFederate, ADFS proxy) that present a single IP for all authentication requests — their service IP will accumulate failures from many accounts during credential hygiene issues or integration misconfigurations
  • Authorized red team or penetration testing engagements running password spray assessments against Active Directory or OWA — correlate alert time against the security team's engagement calendar before escalating
  • Bulk user provisioning and lifecycle management scripts that test authentication for groups of accounts as part of onboarding/offboarding validation, particularly from a shared automation server IP
Download portable Sigma rule (.yml)

Other platforms for T1110.003


Testing Methodology

Validate this detection against 4 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.

  1. Test 1Local Account Password Spray via Net Use (Windows)

    Expected signal: Windows Security Event ID 4625 — one per iteration with LogonType=3, TargetUserName=each account in the list, SubStatus=0xC0000064 (unknown user) for non-existent accounts or 0xC000006A (wrong password) for existing accounts, IpAddress=127.0.0.1. SecurityEvent 4648 (Explicit Credential Logon) may also fire. With 12 accounts in the list, DistinctAccounts=12 will exceed the default threshold of 10.

  2. Test 2Azure AD Password Spray via PowerShell OAuth Token Request

    Expected signal: Azure AD SigninLogs entries (visible in Azure Portal > Azure AD > Sign-in logs within 5-15 minutes) for each request: ResultType=50126 (InvalidUserNameOrPassword) or 50057 (account disabled), IPAddress=your public egress IP, AppDisplayName='Microsoft Azure PowerShell' or 'Azure Active Directory PowerShell', UserAgent containing 'PowerShell'. With 11 accounts in the list, DistinctAccounts=11 exceeds the SprayAccountThreshold=10.

  3. Test 3Kerberos Password Spray via Rubeus (Low-Visibility Technique)

    Expected signal: Windows Security Event ID 4771 on the Domain Controller for each domain account targeted. Fields: Client Address = spray source IP, Account Name = target username, Service Name = krbtgt, Failure Code = 0x18 (KRB_AP_ERR_BAD_INTEGRITY — wrong password) or 0x6 (KDC_ERR_C_PRINCIPAL_UNKNOWN — unknown account). Event ID 4768 (TGT Request) may appear for accounts that receive AS-REQ. The /delay 2000ms and /jitter 30% simulate slow-spray behavior. Main 4625-based detection does NOT fire, demonstrating the detection gap this technique exploits.

  4. Test 4SMB Password Spray via CrackMapExec Against Subnet

    Expected signal: Windows Security Event ID 4625 on the target host for each account attempted: LogonType=3 (Network), SubStatus=0xC000006A (wrong password) for valid accounts or 0xC0000064 (unknown user) for invalid accounts, IpAddress=attacker IP, WorkstationName=blank (common CrackMapExec behavior), AuthenticationPackageName=NTLM. With 10 accounts, DistinctAccounts=10 meets the default detection threshold. EventID 7045 may appear if CrackMapExec uses service-based execution. Sysmon Event ID 3 (Network Connection) visible on attacking host.

Unlock Pro Content

Get the full detection package for T1110.003 including response playbook, investigation guide, and atomic red team tests.

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections