Detection rules › Splunk

Unusual Number of Remote Endpoint Authentication Events

Status
experimental
Group by
Source_Account, Source_Network_Address, _time
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic identifies an unusual number of remote authentication attempts from a single source by leveraging Windows Event ID 4624, which logs successful account logons. It uses statistical analysis, specifically the 3-sigma rule, to detect deviations from normal behavior. This activity is significant for a SOC as it may indicate lateral movement, malware staging, or reconnaissance. If confirmed malicious, this behavior could allow an attacker to move laterally within the network, escalate privileges, or gather information for further attacks.

Known false positives

  • An single endpoint authenticating to a large number of hosts is not common behavior. Possible false positive scenarios include but are not limited to vulnerability scanners, jump servers and missconfigured systems.

MITRE ATT&CK coverage

TacticTechniques
Initial Access
Persistence
Privilege Escalation
Stealth

Telemetry coverage

Rule body

name: Unusual Number of Remote Endpoint Authentication Events
id: acb5dc74-5324-11ec-a36d-acde48001122
version: 8
creation_date: '2021-12-03'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: experimental
type: Hunting
description: The following analytic identifies an unusual number of remote authentication attempts from a single source by leveraging Windows Event ID 4624, which logs successful account logons. It uses statistical analysis, specifically the 3-sigma rule, to detect deviations from normal behavior. This activity is significant for a SOC as it may indicate lateral movement, malware staging, or reconnaissance. If confirmed malicious, this behavior could allow an attacker to move laterally within the network, escalate privileges, or gather information for further attacks.
data_source:
    - Windows Event Log Security 4624
search: |-
    `wineventlog_security` EventCode=4624 Logon_Type=3 Account_Name!="*$"
      | eval Source_Account = mvindex(Account_Name, 1)
      | bucket span=2m _time
      | stats dc(ComputerName) AS unique_targets values(ComputerName) as target_hosts
        BY _time, Source_Network_Address, Source_Account
      | eventstats avg(unique_targets) as comp_avg , stdev(unique_targets) as comp_std
        BY Source_Network_Address, Source_Account
      | eval upperBound=(comp_avg+comp_std*3)
      | eval isOutlier=if(unique_targets >10 and unique_targets >= upperBound, 1, 0)
      | `unusual_number_of_remote_endpoint_authentication_events_filter`
how_to_implement: To successfully implement this search, you need to be ingesting Windows Event Logs from domain controllers as well as member servers and workstations. The Advanced Security Audit policy setting `Audit Logon` within `Logon/Logoff` needs to be enabled.
known_false_positives: An single endpoint authenticating to a large number of hosts is not common behavior. Possible false positive scenarios include but are not limited to vulnerability scanners, jump servers and missconfigured systems.
references:
    - https://attack.mitre.org/techniques/T1078/
analytic_story:
    - Active Directory Lateral Movement
    - Active Directory Privilege Escalation
asset_type: Endpoint
mitre_attack_id:
    - T1078
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security` EventCode=4624 Logon_Type=3 Account_Name!="*$"

Stage 2: eval

| eval Source_Account = mvindex(Account_Name, 1)

Stage 3: bucket

| bucket span=2m _time

Stage 4: stats

| stats dc(ComputerName) AS unique_targets values(ComputerName) as target_hosts
    BY _time, Source_Network_Address, Source_Account

Stage 5: eventstats

| eventstats avg(unique_targets) as comp_avg , stdev(unique_targets) as comp_std
    BY Source_Network_Address, Source_Account

Stage 6: eval

| eval upperBound=(comp_avg+comp_std*3)

Stage 7: eval

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

Stage 8: search

| `unusual_number_of_remote_endpoint_authentication_events_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Account_Namene
  • "*$" corpus 3 (splunk 3)
field:"user" kind:ne
EventCodeeq
  • 4624 corpus 29 (splunk 13, kusto 11, chronicle 4, elastic 1)
field:"EventID" kind:eq value:"4624"
Logon_Typeeq
  • 3 corpus 41 (splunk 13, sigma 12, elastic 9, kusto 7)
field:"LogonType" kind:eq value:"3"