Detection rules › Splunk

Windows Unusual Count Of Users Failed To Auth Using Kerberos

Status
production
Severity
low
Group by
_time, src_ip
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic identifies a source endpoint failing to authenticate multiple valid users using the Kerberos protocol, potentially indicating a Password Spraying attack. It leverages Event 4771, which is generated when the Key Distribution Center fails to issue a Kerberos Ticket Granting Ticket (TGT) due to a wrong password (failure code 0x18). This detection uses statistical analysis, specifically the 3-sigma rule, to identify unusual authentication failures. If confirmed malicious, this activity could allow an attacker to gain initial access or elevate privileges within an Active Directory environment.

Known false positives

  • A host failing to authenticate with multiple valid domain users is not a common behavior for legitimate systems. Possible false positive scenarios include but are not limited to vulnerability scanners, missconfigured systems and multi-user systems like Citrix farms.

MITRE ATT&CK coverage

TacticTechniques
Credential Access

Telemetry coverage

Rule body

name: Windows Unusual Count Of Users Failed To Auth Using Kerberos
id: bc9cb715-08ba-40c3-9758-6e2b26e455cb
version: 11
creation_date: '2021-04-14'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: Anomaly
description: The following analytic identifies a source endpoint failing to authenticate multiple valid users using the Kerberos protocol, potentially indicating a Password Spraying attack. It leverages Event 4771, which is generated when the Key Distribution Center fails to issue a Kerberos Ticket Granting Ticket (TGT) due to a wrong password (failure code 0x18). This detection uses statistical analysis, specifically the 3-sigma rule, to identify unusual authentication failures. If confirmed malicious, this activity could allow an attacker to gain initial access or elevate privileges within an Active Directory environment.
data_source:
    - Windows Event Log Security 4771
search: |-
    `wineventlog_security` EventCode=4771 TargetUserName!="*$" Status=0x18
      | bucket span=5m _time
      | stats dc(TargetUserName) AS unique_accounts values(TargetUserName) as user values(dest) as dest
        BY _time, IpAddress
      | eventstats avg(unique_accounts) as comp_avg , stdev(unique_accounts) as comp_std
        BY IpAddress
      | eval upperBound=(comp_avg+comp_std*3)
      | eval isOutlier=if(unique_accounts > 10 and unique_accounts >= upperBound, 1, 0)
      | search isOutlier=1
      | `windows_unusual_count_of_users_failed_to_auth_using_kerberos_filter`
how_to_implement: To successfully implement this search, you need to be ingesting Domain Controller and Kerberos events. The Advanced Security Audit policy setting `Audit Kerberos Authentication Service` within `Account Logon` needs to be enabled.
known_false_positives: A host failing to authenticate with multiple valid domain users is not a common behavior for legitimate systems. Possible false positive scenarios include but are not limited to vulnerability scanners, missconfigured systems and multi-user systems like Citrix farms.
references:
    - https://attack.mitre.org/techniques/T1110/003/
    - https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn319109(v=ws.11)
    - https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4771
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: Potential Kerberos based password spraying attack from $IpAddress$
threat_objects:
    - field: IpAddress
      type: ip_address
analytic_story:
    - Active Directory Password Spraying
    - Active Directory Kerberos Attacks
    - Volt Typhoon
asset_type: Endpoint
mitre_attack_id:
    - T1110.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security` EventCode=4771 TargetUserName!="*$" Status=0x18

Stage 2: bucket

| bucket span=5m _time

Stage 3: stats

| stats dc(TargetUserName) AS unique_accounts values(TargetUserName) as user values(dest) as dest
    BY _time, IpAddress

Stage 4: eventstats

| eventstats avg(unique_accounts) as comp_avg , stdev(unique_accounts) as comp_std
    BY IpAddress

Stage 5: eval

| eval upperBound=(comp_avg+comp_std*3)

Stage 6: eval

| eval isOutlier=if(unique_accounts > 10 and unique_accounts >= upperBound, 1, 0)
isOutlier =
ifunique_accounts > 10 AND unique_accounts >= upperBound1
else0

Stage 7: search

| search isOutlier=1

Stage 8: search

| `windows_unusual_count_of_users_failed_to_auth_using_kerberos_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4771 corpus 2 (splunk 2)
field:"EventID" kind:eq value:"4771"
Statuseq
  • 0x18 corpus 2 (splunk 2)
field:"Status" kind:eq value:"0x18"
TargetUserNamene
  • "*$" corpus 14 (splunk 14)
field:"TargetUserName" kind:ne
isOutliereq
  • 1 corpus 33 (splunk 33)
field:"isOutlier" kind:eq value:"1"