Detection rules › Splunk

Splunk rules: 2x

Cisco Privileged Account Creation with HTTP Command Execution

#
Status
production
Severity
informational
Group by
All_Risk.normalized_risk_object
Author
Nasreddine Bencherchali, Splunk
Source
github.com/splunk/security_content

This analytic correlates risk events between privileged account creation on Cisco IOS devices and HTTP requests to privileged execution paths such as /level/15/exec/-/*. APT actors have been observed creating privileged accounts and then running commands on routers via HTTP GET or POST requests that target privileged execution paths. These requests allow attackers to execute commands with the highest privilege level (15) on Cisco devices without requiring interactive SSH access. This correlation identifies when both "Cisco IOS Suspicious Privileged Account Creation" and "Privileged Command Execution via HTTP" Snort detections fire for the same network device. This behavior indicates an attacker leveraging the newly created account to execute commands remotely via HTTP.

Known False Positives

  • No false positives have been identified yet.

MITRE ATT&CK Coverage

Rule Body

name: Cisco Privileged Account Creation with HTTP Command Execution
id: 2c9d4f5a-8b6e-4c7f-9d8e-1a2b3c4d5e6f
version: 4
creation_date: '2026-01-12'
modification_date: '2026-05-13'
author: Nasreddine Bencherchali, Splunk
status: production
type: Correlation
description: |
    This analytic correlates risk events between privileged account creation on Cisco IOS devices and HTTP requests to privileged execution paths such as `/level/15/exec/-/*`.
    APT actors have been observed creating privileged accounts and then running commands on routers via HTTP GET or POST requests that target privileged execution paths.
    These requests allow attackers to execute commands with the highest privilege level (15) on Cisco devices without requiring interactive SSH access.
    This correlation identifies when both "Cisco IOS Suspicious Privileged Account Creation" and "Privileged Command Execution via HTTP" Snort detections fire for the same network device.
    This behavior indicates an attacker leveraging the newly created account to execute commands remotely via HTTP.
data_source: []
search: |
    | tstats `security_content_summariesonly`
      min(_time) as firstTime
      max(_time) as lastTime
      sum(All_Risk.calculated_risk_score) as risk_score
      count(All_Risk.calculated_risk_score) as risk_event_count

      values(All_Risk.annotations.mitre_attack.mitre_tactic_id) as annotations.mitre_attack.mitre_tactic_id
      dc(All_Risk.annotations.mitre_attack.mitre_tactic_id) as mitre_tactic_id_count

      values(All_Risk.annotations.mitre_attack.mitre_technique_id) as annotations.mitre_attack.mitre_technique_id
      dc(All_Risk.annotations.mitre_attack.mitre_technique_id) as mitre_technique_id_count

      values(All_Risk.tag) as tag
      values(source) as source
      dc(source) as source_count

      values(contributing_events_search)

      values(All_Risk.threat_object)

      from datamodel=Risk.All_Risk where

      source IN (
        "*Cisco IOS Suspicious Privileged Account Creation*",
        "*Cisco Secure Firewall - Privileged Command Execution via HTTP*"
      )
      by All_Risk.normalized_risk_object
    | `drop_dm_object_name(All_Risk)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | where source_count >= 2
    | `cisco_privileged_account_creation_with_http_command_execution_filter`
how_to_implement: |
    This correlation search requires that the following detections are enabled and generating risk events - "Cisco IOS Suspicious Privileged Account Creation" and "Cisco Secure Firewall - Privileged Command Execution via HTTP". These detections must be configured to generate risk on the same entity field (the network device IP). The search correlates risk events within a 24-hour time window. Ensure that both Cisco IOS logs (sourcetype "cisco:ios") and Cisco Secure Firewall Threat Defense Intrusion Event logs are being ingested and that the underlying detections are properly configured.
known_false_positives: |
    No false positives have been identified yet.
references:
    - https://www.cisa.gov/news-events/cybersecurity-advisories/aa25-239a
finding:
    title: Cisco Privileged Account Creation with HTTP Command Execution - $risk_object$
    entity:
        field: risk_object
        type: other
        score: 0
analytic_story:
    - Cisco Secure Firewall Threat Defense Analytics
    - Salt Typhoon
asset_type: Network
mitre_attack_id:
    - T1021.004
    - T1136
    - T1078
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: network
security_domain: network

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    min(_time) as firstTime
    max(_time) as lastTime
    sum(All_Risk.calculated_risk_score) as risk_score
    count(All_Risk.calculated_risk_score) as risk_event_count
    values(All_Risk.annotations.mitre_attack.mitre_tactic_id) as annotations.mitre_attack.mitre_tactic_id
    dc(All_Risk.annotations.mitre_attack.mitre_tactic_id) as mitre_tactic_id_count
    values(All_Risk.annotations.mitre_attack.mitre_technique_id) as annotations.mitre_attack.mitre_technique_id
    dc(All_Risk.annotations.mitre_attack.mitre_technique_id) as mitre_technique_id_count
    values(All_Risk.tag) as tag
    values(source) as source
    dc(source) as source_count
    values(contributing_events_search)
    values(All_Risk.threat_object)
  from datamodel=Risk.All_Risk
  where

  source IN (
      "*Cisco IOS Suspicious Privileged Account Creation*",
      "*Cisco Secure Firewall - Privileged Command Execution via HTTP*"
  )
  by All_Risk.normalized_risk_object

Stage 2: search

| `drop_dm_object_name(All_Risk)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: where

| where source_count >= 2

Stage 6: search

| `cisco_privileged_account_creation_with_http_command_execution_filter`

Indicators

These rows show field, operator, and value matches.

CrowdStrike Falcon Stream Alerts

#

This is a third-party alert feed, not a detection over modeled telemetry. Another security product raised the finding; this rule forwards or reshapes it into the SIEM. It is searchable for reference but is excluded from the detection-rule browse and the ATT&CK coverage matrix.

Status
production
Severity
low
Group by
mitre_technique
Author
Bryan Pluta, Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic is to leverage alerts from CrowdStrike Falcon Event Stream. This query aggregates and summarizes DetectionSummaryEvent and IdpDetectionSummaryEvent alerts from CrowdStrike Falcon Event Stream, providing details such as destination, user, severity, MITRE information, and Crowdstrike id and links. The evals in the search do multiple things to include align the severity, ensure the user, dest, title, description, MITRE fields are set properly, and the drilldowns are defined based on the type of alert. The search is highly dynamic to account for different alert types in which some fields may or may not be populated. Having all these fields properly set ensure the appropriate risk and analyst queue fields are correctly populated.

Known False Positives

  • False positives may vary based on Crowdstrike configuration; monitor and filter out the alerts that are not relevant to your environment.

Rule Body

name: CrowdStrike Falcon Stream Alerts
id: cb6af2b3-29ab-441c-8d8d-679811c8b014
version: 6
creation_date: '2025-06-02'
modification_date: '2026-05-13'
author: Bryan Pluta, Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic is to leverage alerts from CrowdStrike Falcon Event Stream. This query aggregates and summarizes DetectionSummaryEvent and IdpDetectionSummaryEvent alerts from CrowdStrike Falcon Event Stream, providing details such as destination, user, severity, MITRE information, and Crowdstrike id and links. The evals in the search do multiple things to include align the severity, ensure the user, dest, title, description, MITRE fields are set properly, and the drilldowns are defined based on the type of alert. The search is highly dynamic to account for different alert types in which some fields may or may not be populated. Having all these fields properly set ensure the appropriate risk and analyst queue fields are correctly populated.
data_source:
    - CrowdStrike Falcon Stream Alert
search: |
    `crowdstrike_stream` metadata.eventType IN (XdrDetectionSummaryEvent,IdpDetectionSummaryEvent,EppDetectionSummaryEvent)
    | rename event.* as *
    | eval risk_score=case(Severity<20, 0, Severity<40 AND Severity>=20, 25, Severity<60 AND Severity>=40, 100, Severity<80 AND Severity>=60, 250, Severity>=80, 500)
    | eval user=coalesce(lower(SourceAccountName),lower(UserName))
    | eval dest=coalesce(HostNames,SourceEndpointHostName)
    | eval mitre_technique = case(!match(Name, "(NGAV
    |Intel Detection)"), Technique)
    | join type=left mitre_technique
     [| inputlookup append=t mitre_attack_lookup
      | fields mitre_technique mitre_technique_id ]
    | eval annotations.mitre_attack = mitre_technique_id
    | eval drilldown_user = if(NOT isnull(user), if(NOT isnull(SourceAccountName),("event.SourceAccountName=" + $SourceAccountName$),"event.UserName=" + $UserName$ ),"")
    | eval drilldown_dest = if(NOT isnull(dest), if(NOT isnull(SourceEndpointHostName),("event.SourceEndpointHostName=" + $SourceEndpointHostName$ +"*"),"event.HostNames=" + $HostNames$ +"*"),"")
    | eval drilldown_dest2 = if( NOT isnull(dest) AND NOT isnull(IOARuleInstanceID) AND Tactic=="Custom Intelligence", if(NOT isnull(SourceEndpointHostName),("dest=" + $SourceEndpointHostName$ +"*"),"dest=" + $HostNames$ +"*"),"")
    | eval annotations.drilldown_search = if(isnull(IOARuleInstanceID) AND Tactic!="Custom Intelligence", "`crowdstrike_stream` metadata.eventType=" + $metadata.eventType$ + " " + drilldown_user + " " + drilldown_dest, "`crowdstrike_stream` ((metadata.eventType=" + $metadata.eventType$ + " " + drilldown_user + " " + drilldown_dest + ") OR (event_simpleName IN (CustomIOABasicProcessDetectionInfoEvent,CustomIOADomainNameDetectionInfoEvent,CustomIOAFileWrittenDetectionInfoEvent,CustomIOANetworkConnectionDetectionInfoEvent) TemplateInstanceId=" + IOARuleInstanceID + " " + drilldown_dest2 + "))")
    | rename "metadata.eventType" as eventType
    | eval title = case(Name=="NGAV", ("RR - CS - " + Tactic + " - " + Technique),Name=="Intel Detection", ("RR - CS - " + Name),eventType=="IdpDetectionSummaryEvent", ("RR - CS - Identity Protection"),1==1, ("RR - CS - " + Name + " - " + Technique) )
    | eval user_append = if(NOT isnull(user)," by " + user,"")
    | eval dest_append = if(NOT isnull(dest)," on " + dest,"")
    | eval description = case(Name=="NGAV", ("CS " + Tactic + " - " + Technique + ": " + FileName),eventType=="IdpDetectionSummaryEvent", ("CS IdP" + " - " + Name),Name=="Intel Detection", ("CS " + Name + " - " + IOCType + ": " + IOCValue),1==1, (Objective + " - " + DetectDescription) )
    | eval description = description + user_append + dest_append
    | eval gid=id, display_id=FalconHostLink, file_hash=SHA256String, hash=MD5String, signature=IOCValue, ip='NetworkAccesses{}.RemoteAddress', process=CommandLine, pid=ProcessId
    | eval file_name = if(isnull('ExecutablesWritten{}.FileName'), FileName, 'ExecutablesWritten{}.FileName')
    | rename id as detection_id, FalconHostLink as detection_url
    | table _time source detection_id detection_url title risk_score description Severity severity HostNames dest Tactic Technique user UserName Objective Name DetectDescription gid, display_id, mitre_technique annotations.mitre_attack annotations.drilldown_search file_hash hash signature ip process pid file_name
    | `crowdstrike_falcon_stream_alerts_filter`
how_to_implement: In order to properly run this search, you need to ingest alerts data from CrowdStrike Event Stream, specifcally using the CrowdStrike Falcon Event Streams Technical Add-On. This add-on will collect alerts using the CrowdStrike:Event:Streams:JSON sourcetype. You will need to define the `crowdstrike_stream` macro to point to the proper index that contains the CrowdStrike:Event:Streams:JSON sourcetype.
known_false_positives: False positives may vary based on Crowdstrike configuration; monitor and filter out the alerts that are not relevant to your environment.
references:
    - https://www.crowdstrike.com/en-us/resources/guides/crowdstrike-falcon-event-streams-add-on-for-splunk-guide-v3/
    - https://splunkbase.splunk.com/app/5082
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: $description$
        - field: user
          type: user
          score: 20
          message: $description$
threat_objects:
    - field: file_hash
      type: file_hash
    - field: file_name
      type: file_name
    - field: hash
      type: file_hash
    - field: ip
      type: ip_address
    - field: process
      type: process_name
    - field: signature
      type: file_hash
analytic_story:
    - Critical Alerts
asset_type: Endpoint
mitre_attack_id: []
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`crowdstrike_stream` metadata.eventType IN (
    XdrDetectionSummaryEvent,
    IdpDetectionSummaryEvent,
    EppDetectionSummaryEvent
)

Stage 2: rename

| rename event.* as *

Stage 3: eval

| eval
    risk_score=case(
        Severity<20, 0,
        Severity<40 AND Severity>=20, 25,
        Severity<60 AND Severity>=40, 100,
        Severity<80 AND Severity>=60, 250,
        Severity>=80, 500
    )
risk_score =
ifSeverity < 200
elifSeverity < 40 AND Severity >= 2025
elifSeverity < 60 AND Severity >= 40100
elifSeverity < 80 AND Severity >= 60250
else500

Stage 4: eval

| eval user=coalesce(lower(SourceAccountName),lower(UserName))

Stage 5: eval

| eval dest=coalesce(HostNames,SourceEndpointHostName)

Stage 6: eval

| eval mitre_technique = case(!match(Name, "(NGAV
|Intel Detection)"), Technique)
mitre_technique =
elseTechnique

Stage 7: join

| join type=left mitre_technique
 [| inputlookup append=t mitre_attack_lookup
  | fields mitre_technique mitre_technique_id ]

Stage 8: eval

| eval annotations.mitre_attack = mitre_technique_id

Stage 9: eval

| eval
    drilldown_user = if(
        NOT isnull(user),
        if(
            NOT isnull(SourceAccountName),
            ("event.SourceAccountName=" + $SourceAccountName$),
            "event.UserName=" + $UserName$
        ),
        ""
    )

Stage 10: eval

| eval
    drilldown_dest = if(
        NOT isnull(dest),
        if(
            NOT isnull(SourceEndpointHostName),
            ("event.SourceEndpointHostName=" + $SourceEndpointHostName$ +"*"),
            "event.HostNames=" + $HostNames$ +"*"
        ),
        ""
    )

Stage 11: eval

| eval
    drilldown_dest2 = if(
        NOT isnull(dest) AND NOT isnull(IOARuleInstanceID) AND Tactic=="Custom Intelligence",
        if(
            NOT isnull(SourceEndpointHostName),
            ("dest=" + $SourceEndpointHostName$ +"*"),
            "dest=" + $HostNames$ +"*"
        ),
        ""
    )

Stage 12: eval

| eval
    annotations.drilldown_search = if(
        isnull(IOARuleInstanceID) AND Tactic!="Custom Intelligence",
        "`crowdstrike_stream` metadata.eventType=" + $metadata.eventType$ + " " + drilldown_user + " " + drilldown_dest,
        "`crowdstrike_stream` ((metadata.eventType=" + $metadata.eventType$ + " " + drilldown_user + " " + drilldown_dest + ") OR (event_simpleName IN (CustomIOABasicProcessDetectionInfoEvent,CustomIOADomainNameDetectionInfoEvent,CustomIOAFileWrittenDetectionInfoEvent,CustomIOANetworkConnectionDetectionInfoEvent) TemplateInstanceId=" + IOARuleInstanceID + " " + drilldown_dest2 + "))"
    )

Stage 13: rename

| rename "metadata.eventType" as eventType

Stage 14: eval

| eval
    title = case(
        Name=="NGAV", ("RR - CS - " + Tactic + " - " + Technique),
        Name=="Intel Detection", ("RR - CS - " + Name),
        eventType=="IdpDetectionSummaryEvent", ("RR - CS - Identity Protection"),
        1==1, ("RR - CS - " + Name + " - " + Technique)
    )
title =
1.concat("RR - CS - ", Tactic, " - ", Technique)
2.concat("RR - CS - ", Name)
3."RR - CS - Identity Protection"
-concat("RR - CS - ", Name, " - ", Technique)(default)

Stage 15: eval

| eval user_append = if(NOT isnull(user)," by " + user,"")

Stage 16: eval

| eval dest_append = if(NOT isnull(dest)," on " + dest,"")

Stage 17: eval

| eval
    description = case(
        Name=="NGAV", ("CS " + Tactic + " - " + Technique + ": " + FileName),
        eventType=="IdpDetectionSummaryEvent", ("CS IdP" + " - " + Name),
        Name=="Intel Detection", ("CS " + Name + " - " + IOCType + ": " + IOCValue),
        1==1, (Objective + " - " + DetectDescription)
    )
description =
1.concat("CS ", Tactic, " - ", Technique, ": ", FileName)
2.concat("CS IdP", " - ", Name)
3.concat("CS ", Name, " - ", IOCType, ": ", IOCValue)
-concat(Objective, " - ", DetectDescription)(default)

Stage 18: eval

| eval description = description + user_append + dest_append

Stage 19: eval

| eval gid=id, display_id=FalconHostLink, file_hash=SHA256String, hash=MD5String,
    signature=IOCValue, ip='NetworkAccesses{}.RemoteAddress', process=CommandLine, pid=ProcessId

Stage 20: eval

| eval
    file_name = if(
        isnull('ExecutablesWritten{}.FileName'),
        FileName,
        'ExecutablesWritten{}.FileName'
    )
file_name =
ifisnull('ExecutablesWritten{}.FileName')FileName
else'ExecutablesWritten{}.FileName'

Stage 21: rename

| rename id as detection_id, FalconHostLink as detection_url

Stage 22: table

| table _time source detection_id detection_url title risk_score description Severity severity
    HostNames dest Tactic Technique user UserName Objective Name DetectDescription gid, display_id,
    mitre_technique annotations.mitre_attack annotations.drilldown_search file_hash hash signature
    ip process pid file_name

Stage 23: search

| `crowdstrike_falcon_stream_alerts_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
metadata.eventTypein
  • EppDetectionSummaryEvent
  • IdpDetectionSummaryEvent
  • XdrDetectionSummaryEvent
field:"metadata.eventType" kind:in
sourcetypeeq
  • CrowdStrike:Event:Streams:JSON corpus 4 (splunk 4)
field:"sourcetype" kind:eq value:"CrowdStrike:Event:Streams:JSON"

Data Staged to File (PowerShell)

#
Group by
_time, host
Source
github.com/anvilogic-forge/armory

Adversaries may stage collected data in a central location or directory on the local system prior to Exfiltration. Data may be kept in separate files or combined into one file through techniques such as Archive Collected Data. This use case looks for common output commands followed by a potential file extension

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '5691.6112'
title: Data Staged to File
description: 'Adversaries may stage collected data in a central location or directory
  on the local system prior to Exfiltration. Data may be kept in separate files or
  combined into one file through techniques such as Archive Collected Data. This use
  case looks for common output commands followed by a potential file extension. --
  Threat Actor Association: Actinium/Gamaredon/Primitive Bear, APT29/Nobelium, APT37,
  Arid Viper/APT C-23, Gorgon Group, Kimsuky, Memento Team, Wizard Spider, WIRTE --
  Software Association: Bazar, Conti, Remcos - #TrendingThreat #Russia #Ukraine'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` TERM(EventCode=4104)| regex
  Message="(?i)\s(\>(\>)?|Out\-File)\s.{1,}\.\w{2,5}" | table _time, host, user signature_id,
  process, process_name | bin span=1s | stats values(*) as * by _time, host '
techniques:
- collection:data staged:local data staging
technique_id:
- T1074.001
data_category:
- Process command-line parameters
- Linux audit logs
- PowerShell logs
references:
- https://www.volexity.com/blog/2020/12/14/dark-halo-leverages-solarwinds-compromise-to-breach-organizations/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` TERM(EventCode=4104)

Stage 2: regex

| regex Message="(?i)\s(\>(\>)?|Out\-File)\s.{1,}\.\w{2,5}"

Stage 3: table

| table _time, host, user signature_id, process, process_name

Stage 4: bucket

| bin span=1s

Stage 5: stats

| stats values(*) as * by _time, host

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
Messageregex_match
  • (?i)\s(\>(\>)?|Out\-File)\s.{1,}.\w{2,5}
field:"Message" kind:regex_match value:"(?i)\s(\>(\>)?|Out\-File)\s.{1,}.\w{2,5}"

Detect Regsvcs with No Command Line Arguments

#
Status
production
Severity
medium
Group by
IntegrityLevel, command_line, computer_name, event_action, original_file_name, parent_command_line, parent_process_basename, parent_process_guid, parent_process_id, parent_process_name, process_basename, process_guid, process_hash, process_id, process_name, user, user_id, vendor_product
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

The following analytic detects instances of regsvcs.exe running without command line arguments. This behavior typically indicates process injection, where another process manipulates regsvcs.exe. The detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names, IDs, and command-line executions. This activity is significant as it may signal an attempt to evade detection and execute malicious code. If confirmed malicious, the attacker could achieve code execution, potentially leading to privilege escalation, persistence, or access to sensitive information.

Known False Positives

  • Although unlikely, limited instances of regsvcs.exe may cause a false positive. Filter based endpoint usage, command line arguments, or process lineage.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Detect Regsvcs with No Command Line Arguments
id: 6b74d578-a02e-4e94-a0d1-39440d0bf254
version: 15
creation_date: '2021-02-16'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects instances of regsvcs.exe running without command line arguments. This behavior typically indicates process injection, where another process manipulates regsvcs.exe. The detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names, IDs, and command-line executions. This activity is significant as it may signal an attempt to evade detection and execute malicious code. If confirmed malicious, the attacker could achieve code execution, potentially leading to privilege escalation, persistence, or access to sensitive information.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time)
    as lastTime FROM datamodel=Endpoint.Processes where
    (Processes.process_name=regsvcs.exe OR Processes.original_file_name=RegSvcs.exe)
    Processes.process IN ("*regsvcs","*regsvcs.exe", "*regsvcs.exe\"")
    by Processes.action Processes.dest Processes.original_file_name Processes.parent_process Processes.parent_process_exec
       Processes.parent_process_guid Processes.parent_process_id Processes.parent_process_name
       Processes.parent_process_path Processes.process Processes.process_exec Processes.process_guid
       Processes.process_hash Processes.process_id Processes.process_integrity_level Processes.process_name
       Processes.process_path Processes.user Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `detect_regsvcs_with_no_command_line_arguments_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Although unlikely, limited instances of regsvcs.exe may cause a false positive. Filter based endpoint usage, command line arguments, or process lineage.
references:
    - https://attack.mitre.org/techniques/T1218/009/
    - https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218.009/T1218.009.md
    - https://lolbas-project.github.io/lolbas/Binaries/Regsvcs/
finding:
    title: The process $process_name$ was spawned by $parent_process_name$ without any command-line arguments on $dest$ by $user$.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: The process $process_name$ was spawned by $parent_process_name$ without any command-line arguments on $dest$ by $user$.
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process_name
      type: process_name
analytic_story:
    - Suspicious Regsvcs Regasm Activity
    - Living Off The Land
asset_type: Endpoint
mitre_attack_id:
    - T1218.009
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time)
as lastTime
  FROM datamodel=Endpoint.Processes
  where
(Processes.process_name=regsvcs.exe OR Processes.original_file_name=RegSvcs.exe)
Processes.process IN ("*regsvcs","*regsvcs.exe", "*regsvcs.exe\"")
  by
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `detect_regsvcs_with_no_command_line_arguments_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • RegSvcs.exe corpus 12 (elastic 6, sigma 5, splunk 1)
field:"OriginalFileName" kind:eq value:"RegSvcs.exe"
Processes.processin
  • *regsvcs
  • *regsvcs.exe
  • *regsvcs.exe"
field:"CommandLine" kind:in
Processes.process_nameeq
  • regsvcs.exe corpus 22 (elastic 21, splunk 1)
field:"process_basename" kind:eq value:"regsvcs.exe"

DNS Kerberos Coercion

#
Status
production
Severity
medium
Group by
DNS.answer_count, DNS.query_count, DNS.vendor_product, QueryName, dns.answers.name, dns.response.code, src_ip
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

Detects DNS-based Kerberos coercion attacks where adversaries inject marshaled credential structures into DNS records to spoof SPNs and redirect authentication such as in CVE-2025-33073. This detection leverages suricata looking for specific CREDENTIAL_TARGET_INFORMATION structures in DNS queries.

Known False Positives

  • It's unlikely that a DNS entry contains the specific structure used by this attack. Filter as needed for your organization.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 22: DNSEvent (DNS query)

Rule Body

name: DNS Kerberos Coercion
id: 8551252d-b5b6-4b6e-8a82-51460aeb29a3
version: 5
creation_date: '2025-11-18'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: TTP
description: Detects DNS-based Kerberos coercion attacks where adversaries inject marshaled credential structures into DNS records to spoof SPNs and redirect authentication such as in CVE-2025-33073. This detection leverages suricata looking for specific CREDENTIAL_TARGET_INFORMATION structures in DNS queries.
data_source:
    - Suricata
    - Sysmon EventID 22
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(DNS.src) as src values(DNS.dest) as dest FROM datamodel=Network_Resolution
      WHERE DNS.query="*1UWhRC*" DNS.query="*AAAAA*" DNS.query="*YBAAAA*"
      BY DNS.answer DNS.answer_count DNS.query
         DNS.query_count DNS.reply_code_id DNS.src
         DNS.vendor_product
    | `drop_dm_object_name(DNS)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | table firstTime lastTime query count src dest
    | `dns_kerberos_coercion_filter`
how_to_implement: To successfully implement this search, you will need to ensure that DNS data is populating the Network_Resolution data model.
known_false_positives: It's unlikely that a DNS entry contains the specific structure used by this attack. Filter as needed for your organization.
references:
    - https://web.archive.org/web/20250617122747/https://www.synacktiv.com/publications/ntlm-reflection-is-dead-long-live-ntlm-reflection-an-in-depth-analysis-of-cve-2025
    - https://www.synacktiv.com/publications/relaying-kerberos-over-smb-using-krbrelayx
    - https://www.guidepointsecurity.com/blog/the-birth-and-death-of-loopyticket/
finding:
    title: A dns query $query$ with marshalled CREDENTIAL_TARGET_INFORMATION seen from $src$
    entity:
        field: src
        type: system
        score: 50
analytic_story:
    - Compromised Windows Host
    - Suspicious DNS Traffic
    - Local Privilege Escalation With KrbRelayUp
    - Kerberos Coercion with DNS
asset_type: Endpoint
cve:
    - CVE-2025-33073
mitre_attack_id:
    - T1557.001
    - T1187
    - T1071.004
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: network
security_domain: network

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
    values(DNS.src) as src
    values(DNS.dest) as dest
  FROM datamodel=Network_Resolution
  WHERE DNS.query="*1UWhRC*" DNS.query="*AAAAA*" DNS.query="*YBAAAA*"
  BY
    DNS.answer
    DNS.answer_count
    DNS.query
    DNS.query_count
    DNS.reply_code_id
    DNS.src
    DNS.vendor_product

Stage 2: search

| `drop_dm_object_name(DNS)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: table

| table firstTime lastTime query count src dest

Stage 6: search

| `dns_kerberos_coercion_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
DNS.queryeq
  • *1UWhRC*
  • *AAAAA*
  • *YBAAAA*
field:"QueryName" kind:eq

Domain Group Discovery With Dsquery

#
Status
production
Severity
low
Group by
IntegrityLevel, command_line, computer_name, event_action, original_file_name, parent_command_line, parent_process_basename, parent_process_guid, parent_process_id, parent_process_name, process_basename, process_guid, process_hash, process_id, process_name, user, user_id, vendor_product
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic identifies the execution of dsquery.exe with command-line arguments used to query for domain groups. It leverages Endpoint Detection and Response (EDR) data, focusing on process names and command-line arguments. This activity is significant because both Red Teams and adversaries use dsquery.exe to enumerate domain groups, gaining situational awareness and facilitating further Active Directory discovery. If confirmed malicious, this behavior could allow attackers to map out the domain structure, identify high-value targets, and plan subsequent attacks, potentially leading to privilege escalation or data exfiltration.

Known False Positives

  • Administrators or power users may use this command for troubleshooting.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Domain Group Discovery With Dsquery
id: f0c9d62f-a232-4edd-b17e-bc409fb133d4
version: 12
creation_date: '2021-08-26'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: Anomaly
description: The following analytic identifies the execution of `dsquery.exe` with command-line arguments used to query for domain groups. It leverages Endpoint Detection and Response (EDR) data, focusing on process names and command-line arguments. This activity is significant because both Red Teams and adversaries use `dsquery.exe` to enumerate domain groups, gaining situational awareness and facilitating further Active Directory discovery. If confirmed malicious, this behavior could allow attackers to map out the domain structure, identify high-value targets, and plan subsequent attacks, potentially leading to privilege escalation or data exfiltration.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE (
            Processes.process_name="dsquery.exe"
        )
        (Processes.process="*group*")
      BY Processes.action Processes.dest Processes.original_file_name
         Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
         Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
         Processes.process Processes.process_exec Processes.process_guid
         Processes.process_hash Processes.process_id Processes.process_integrity_level
         Processes.process_name Processes.process_path Processes.user
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `domain_group_discovery_with_dsquery_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Administrators or power users may use this command for troubleshooting.
references:
    - https://attack.mitre.org/techniques/T1069/002/
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ by user $user$.
        - field: dest
          type: system
          score: 20
          message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ by user $user$.
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process_name
      type: process_name
analytic_story:
    - Active Directory Discovery
    - LAMEHUG
asset_type: Endpoint
mitre_attack_id:
    - T1069.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE (
      Processes.process_name="dsquery.exe"
  )
    (Processes.process="*group*")
  BY
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `domain_group_discovery_with_dsquery_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *group* corpus 7 (splunk 4, sigma 3)
field:"CommandLine" kind:eq value:"*group*"
Processes.process_nameeq
  • dsquery.exe corpus 12 (elastic 8, splunk 4)
field:"process_basename" kind:eq value:"dsquery.exe"

ESXi External Root Login Activity

#
Status
production
Severity
low
Group by
dest, src_ip
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

This detection identifies instances where the ESXi UI is accessed using the root account instead of a delegated administrative user. Direct root access to the UI bypasses role-based access controls and auditing practices, and may indicate risky behavior, misconfiguration, or unauthorized activity by a malicious actor using compromised credentials.

Known False Positives

  • Limited false positives in most environments, however tune as needed. Administrators may use the root account for troubleshooting or initial user creation.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access
Persistence
Privilege Escalation
Stealth

Rule Body

name: ESXi External Root Login Activity
id: 218bf991-6c63-4c26-a682-6ac1a53ad8f8
version: 4
creation_date: '2025-07-11'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: Anomaly
description: This detection identifies instances where the ESXi UI is accessed using the root account instead of a delegated administrative user. Direct root access to the UI bypasses role-based access controls and auditing practices, and may indicate risky behavior, misconfiguration, or unauthorized activity by a malicious actor using compromised credentials.
data_source:
    - VMWare ESXi Syslog
search: '`esxi_syslog` Message="*root*" AND Message="*logged in*" | rex field=_raw "root@(?<SrcIpAddr>\d{1,3}(?:\.\d{1,3}){3})" | rex field=_raw "Z (?<dest>[\w\.]+)\s" | search SrcIpAddr != "127.0.0.1" AND SrcIpAddr != 192.168.0.0/16 AND SrcIpAddr != 172.16.0.0/12 AND SrcIpAddr != 10.0.0.0/8 | stats min(_time) as firstTime max(_time) as lastTime count by dest SrcIpAddr | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `esxi_external_root_login_activity_filter`'
how_to_implement: This is based on syslog data generated by VMware ESXi hosts. To implement this search, you must configure your ESXi systems to forward syslog output to your Splunk deployment. These logs must be ingested with the appropriate Splunk Technology Add-on for VMware ESXi Logs, which provides field extractions and CIM compatibility.
known_false_positives: Limited false positives in most environments, however tune as needed. Administrators may use the root account for troubleshooting or initial user creation.
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Root logged in on ESXi host $dest$ from $SrcIpAddr$.
        - field: SrcIpAddr
          type: system
          score: 20
          message: Root logged in on ESXi host $dest$ from $SrcIpAddr$.
analytic_story:
    - ESXi Post Compromise
    - Black Basta Ransomware
asset_type: Infrastructure
mitre_attack_id:
    - T1078
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`esxi_syslog` Message="*root*" AND Message="*logged in*"

Stage 2: rex

| rex field=_raw "root@(?<SrcIpAddr>\d{1,3}(?:\.\d{1,3}){3})"

Stage 3: rex

| rex field=_raw "Z (?<dest>[\w\.]+)\s"

Stage 4: search

| search SrcIpAddr != "127.0.0.1" AND SrcIpAddr != 192.168.0.0/16 AND SrcIpAddr != 172.16.0.0/12
    AND SrcIpAddr != 10.0.0.0/8

Stage 5: stats

| stats min(_time) as firstTime max(_time) as lastTime count by dest SrcIpAddr

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `esxi_external_root_login_activity_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Messageeq
  • *logged in* corpus 2 (splunk 2)
  • *root* corpus 2 (splunk 2)
field:"Message" kind:eq
SrcIpAddrne
  • 10.0.0.0/8
  • 127.0.0.1
  • 172.16.0.0/12
  • 192.168.0.0/16
field:"src_ip" kind:ne
sourcetypein
  • vmw-syslog corpus 23 (splunk 23)
  • vmware:esxlog* corpus 23 (splunk 23)
field:"sourcetype" kind:in

Gsuite suspicious calendar invite

#
Status
experimental
Group by
_time, email
Author
Rod Soto, Teoderick Contreras
Source
github.com/splunk/security_content

The following analytic detects suspicious calendar invites sent via GSuite, potentially indicating compromised accounts or malicious internal activity. It leverages GSuite calendar logs, focusing on events where a high volume of invites (over 100) is sent within a 5-minute window. This behavior is significant as it may involve the distribution of malicious links or attachments, posing a security risk. If confirmed malicious, this activity could lead to widespread phishing attacks, unauthorized access, or malware distribution within the organization.

Known False Positives

  • This search will also produce normal activity statistics. Fields such as email, ip address, name, parameters.organizer_calendar_id, parameters.target_calendar_id and parameters.event_title may give away phishing intent.For more specific results use email parameter.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access

Rule Body

name: Gsuite suspicious calendar invite
id: 03cdd68a-34fb-11ec-9bd3-acde48001122
version: 7
creation_date: '2021-10-24'
modification_date: '2026-05-13'
author: Rod Soto, Teoderick Contreras
status: experimental
type: Hunting
description: The following analytic detects suspicious calendar invites sent via GSuite, potentially indicating compromised accounts or malicious internal activity. It leverages GSuite calendar logs, focusing on events where a high volume of invites (over 100) is sent within a 5-minute window. This behavior is significant as it may involve the distribution of malicious links or attachments, posing a security risk. If confirmed malicious, this activity could lead to widespread phishing attacks, unauthorized access, or malware distribution within the organization.
data_source: []
search: |-
    `gsuite_calendar`
      | bin span=5m _time
      | rename parameters.* as *
      | search target_calendar_id!=null email="*yourdomain.com"
      | stats  count values(target_calendar_id) values(event_title) values(event_guest)
        BY email _time
      | where count >100
      | `gsuite_suspicious_calendar_invite_filter`
how_to_implement: In order to successfully implement this search, you need to be ingesting logs related to gsuite (gsuite:calendar:json) having the file sharing metadata like file type, source owner, destination target user, description, etc. This search can also be made more specific by selecting specific emails, subdomains timeframe, organizational units, targeted user, etc. In order for the search to work for your environment please update `yourdomain.com` value in the query with the domain relavant for your organization.
known_false_positives: This search will also produce normal activity statistics. Fields such as email, ip address, name, parameters.organizer_calendar_id, parameters.target_calendar_id and parameters.event_title may give away phishing intent.For more specific results use email parameter.
references:
    - https://www.techrepublic.com/article/how-to-avoid-the-dreaded-google-calendar-malicious-invite-issue/
    - https://gcn.com/cybersecurity/2012/09/the-20-most-common-words-in-phishing-attacks/280956/
analytic_story:
    - Spearphishing Attachments
asset_type: GSuite
mitre_attack_id:
    - T1566
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`gsuite_calendar`

Stage 2: bucket

| bin span=5m _time

Stage 3: rename

| rename parameters.* as *

Stage 4: search

| search target_calendar_id!=null email="*yourdomain.com"

Stage 5: stats

| stats  count values(target_calendar_id) values(event_title) values(event_guest)
    BY email _time

Stage 6: where

| where count >100

Stage 7: search

| `gsuite_suspicious_calendar_invite_filter`

Indicators

These rows show field, operator, and value matches.

hh.exe Execution (Windows Event Log)

#
Group by
_time, host
Source
github.com/anvilogic-forge/armory

Adversaries may abuse Compiled HTML files (.chm) to conceal malicious code. CHM files are commonly distributed as part of the Microsoft HTML Help system. A custom CHM file containing embedded payloads could be delivered to a victim then triggered by User Execution

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '17974.30261'
title: hh.exe Execution
description: 'Adversaries may abuse Compiled HTML files (.chm) to conceal malicious
  code. CHM files are commonly distributed as part of the Microsoft HTML Help system.
  A custom CHM file containing embedded payloads could be delivered to a victim then
  triggered by User Execution. -- Threat Actor Association: APT-K-47/Mysterious Elephant,
  Gamaredon (aka. Armageddon, UAC-0010), Kimsuky -- LOLBAS Atomics T1218.001 Test
  #1 Atomics T1218.001 Test #2 Atomics T1218.001 Test #3 Atomics T1218.001 Test #4
  Atomics T1218.001 Test #5 Atomics T1218.001 Test #6 Atomics T1218.001 Test #7 Atomics
  T1218.001 Test #8'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) (TERM(hh) OR TERM(hh.exe)) | where match(process_name,
  "(?i)hh\.exe") OR match(process, "(?i)hh\.exe") | table _time, host, user process,
  process_*, parent_* | bin span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:system binary proxy execution:compiled html file
technique_id:
- T1218.001
data_category:
- Windows event logs
references:
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218.001/T1218.001.md#atomic-test-8---decompile-local-chm-file
- https://www.ptsecurity.com/ww-en/analytics/pt-esc-threat-intelligence/higaisa-or-winnti-apt-41-backdoors-old-and-new/
- https://asec.ahnlab.com/en/51746/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) (TERM(hh) OR TERM(hh.exe))

Stage 2: where

| where match(process_name, "(?i)hh\.exe") OR match(process, "(?i)hh\.exe")

Stage 3: table

| table _time, host, user process, process_*, parent_*

Stage 4: bucket

| bin span=1s

Stage 5: stats

| stats values(*) as * by _time, host

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
processregex_match
  • (?i)hh.exe corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)hh.exe"
process_nameregex_match
  • (?i)hh.exe corpus 6 (splunk 6)
field:"process_name" kind:regex_match value:"(?i)hh.exe"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1hh
1hh.exe

Linux Auditd At Application Execution

#
Status
production
Severity
low
Group by
comm, dest, exe, parent_process_id, process_id, syscall, uid
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects the execution of the "At" application in Linux, which can be used by attackers to create persistence entries on a compromised host. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names and parent process names associated with "at" or "atd". This activity is significant because the "At" application can be exploited to maintain unauthorized access or deliver additional malicious payloads. If confirmed malicious, this behavior could lead to data theft, ransomware attacks, or other severe consequences. Immediate investigation is required to determine the legitimacy of the execution and mitigate potential risks.

Known False Positives

  • Administrator or network operator can use this application for automation purposes. Please update the filter macros to remove false positives.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Linux Auditd At Application Execution
id: 9f306e0a-1c36-469e-8892-968ca12470dd
version: 10
creation_date: '2021-12-21'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic detects the execution of the "At" application in Linux, which can be used by attackers to create persistence entries on a compromised host. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names and parent process names associated with "at" or "atd". This activity is significant because the "At" application can be exploited to maintain unauthorized access or deliver additional malicious payloads. If confirmed malicious, this behavior could lead to data theft, ransomware attacks, or other severe consequences. Immediate investigation is required to determine the legitimacy of the execution and mitigate potential risks.
data_source:
    - Linux Auditd Syscall
search: |-
    `linux_auditd` type=SYSCALL comm IN ("at", "atd") OR exe IN ("/usr/bin/at","/usr/bin/atd") AND NOT (uid IN ("daemon"))
      | rename host as dest
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY comm exe syscall
           uid ppid pid
           dest
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `linux_auditd_at_application_execution_filter`
how_to_implement: To implement this detection, the process begins by ingesting auditd data, that consist SYSCALL, TYPE, EXECVE and PROCTITLE events, which captures command-line executions and process details on Unix/Linux systems. These logs should be ingested and processed using Splunk Add-on for Unix and Linux (https://splunkbase.splunk.com/app/833), which is essential for correctly parsing and categorizing the data. The next step involves normalizing the field names  to match the field names set by the Splunk Common Information Model (CIM) to ensure consistency across different data sources and enhance the efficiency of data modeling. This approach enables effective monitoring and detection of linux endpoints where auditd is deployed
known_false_positives: Administrator or network operator can use this application for automation purposes. Please update the filter macros to remove false positives.
references:
    - https://attack.mitre.org/techniques/T1053/001/
    - https://www.linkedin.com/pulse/getting-attacker-ip-address-from-malicious-linux-job-craig-rowland/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A SYSCALL - [$comm$] event was executed on host - [$dest$] to execute the "at" application.
analytic_story:
    - Scheduled Tasks
    - Linux Privilege Escalation
    - Linux Persistence Techniques
    - Linux Living Off The Land
    - Compromised Linux Host
asset_type: Endpoint
mitre_attack_id:
    - T1053.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`linux_auditd` type=SYSCALL comm IN ("at", "atd") OR exe IN ("/usr/bin/at","/usr/bin/atd") AND NOT (
    uid IN ("daemon")
)

Stage 2: rename

| rename host as dest

Stage 3: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY comm exe syscall
       uid ppid pid
       dest

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `linux_auditd_at_application_execution_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
commin
  • at
  • atd
field:"comm" kind:in
exein
  • /usr/bin/at
  • /usr/bin/atd
field:"exe" kind:in
sourcetypeeq
  • auditd corpus 58 (splunk 58)
field:"sourcetype" kind:eq value:"auditd"
typeeq
  • SYSCALL corpus 27 (splunk 15, sigma 12)
field:"type" kind:eq value:"SYSCALL"

Linux Deletion of SSL Certificate

#
Status
production
Severity
low
Group by
CreationUtcTime, computer_name, event_action, file_access_time, file_acl, file_hash, file_modify_time, file_name, file_size, process_guid, process_id, target_filename, user, vendor_product
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects the deletion of SSL certificates on a Linux machine. It leverages filesystem event logs to identify when files with extensions .pem or .crt are deleted from the /etc/ssl/certs/ directory. This activity is significant because attackers may delete or modify SSL certificates to disable security features or evade defenses on a compromised system. If confirmed malicious, this behavior could indicate an attempt to disrupt secure communications, evade detection, or execute a destructive payload, potentially leading to significant security breaches and data loss.

Known False Positives

  • Administrator or network operator can execute this command. Please update the filter macros to remove false positives.

MITRE ATT&CK Coverage

Telemetry Coverage

PlatformRecord / event type
LinuxEvent ID 11: File created

Rule Body

name: Linux Deletion of SSL Certificate
id: 839ab790-a60a-4f81-bfb3-02567063f615
version: 12
creation_date: '2022-04-12'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic detects the deletion of SSL certificates on a Linux machine. It leverages filesystem event logs to identify when files with extensions .pem or .crt are deleted from the /etc/ssl/certs/ directory. This activity is significant because attackers may delete or modify SSL certificates to disable security features or evade defenses on a compromised system. If confirmed malicious, this behavior could indicate an attempt to disrupt secure communications, evade detection, or execute a destructive payload, potentially leading to significant security breaches and data loss.
data_source:
    - Sysmon for Linux EventID 11
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem
      WHERE Filesystem.action=deleted Filesystem.file_path = "/etc/ssl/certs/*" Filesystem.file_path IN ("*.pem", "*.crt")
      BY Filesystem.action Filesystem.dest Filesystem.file_access_time
         Filesystem.file_create_time Filesystem.file_hash Filesystem.file_modify_time
         Filesystem.file_name Filesystem.file_path Filesystem.file_acl
         Filesystem.file_size Filesystem.process_guid Filesystem.process_id
         Filesystem.user Filesystem.vendor_product
    | `drop_dm_object_name(Filesystem)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `linux_deletion_of_ssl_certificate_filter`
how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase.
known_false_positives: Administrator or network operator can execute this command. Please update the filter macros to remove false positives.
references:
    - https://www.sentinelone.com/labs/acidrain-a-modem-wiper-rains-down-on-europe/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: SSL certificate deleted on host $dest$ by process GUID- $process_guid$
threat_objects:
    - field: file_name
      type: file_name
analytic_story:
    - AcidRain
    - AcidPour
asset_type: Endpoint
mitre_attack_id:
    - T1070.004
    - T1485
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Filesystem
  WHERE Filesystem.action=deleted Filesystem.file_path = "/etc/ssl/certs/*"
    Filesystem.file_path IN (
        "*.pem",
        "*.crt"
    )
  BY
    Filesystem.action
    Filesystem.dest
    Filesystem.file_access_time
    Filesystem.file_create_time
    Filesystem.file_hash
    Filesystem.file_modify_time
    Filesystem.file_name
    Filesystem.file_path
    Filesystem.file_acl
    Filesystem.file_size
    Filesystem.process_guid
    Filesystem.process_id
    Filesystem.user
    Filesystem.vendor_product

Stage 2: search

| `drop_dm_object_name(Filesystem)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `linux_deletion_of_ssl_certificate_filter`

Indicators

These rows show field, operator, and value matches.

ngrok Execution - Windows (PowerShell)

#
Group by
_time, host
Source
github.com/anvilogic-forge/armory

Ngrok is a legitimate reverse proxy tool that can create a secure tunnel to servers located behind firewalls or on local machines that do not have a public IP. Ngrok has been leveraged by threat actors in several campaigns including use for lateral movement and data exfiltration. This use case detects process creation events for ngrok.exe or command patterns likely to be unique to ngrok in the event of a renamed executable

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

References

Telemetry Coverage

Rule Body

id: '20685.36865'
title: ngrok Execution - Windows
description: 'Ngrok is a legitimate reverse proxy tool that can create a secure tunnel
  to servers located behind firewalls or on local machines that do not have a public
  IP. Ngrok has been leveraged by threat actors in several campaigns including use
  for lateral movement and data exfiltration. This use case detects process creation
  events for ngrok.exe or command patterns likely to be unique to ngrok in the event
  of a renamed executable. -- Threat Actor Association: Scattered Spider (aka. Muddled
  Libra, Scatter Swine, Starfraud, UNC3944)'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104) OR
  "<EventID>4104<") TERM(ngrok) OR (TERM(start) "--all" "--config" ".yml") OR (TERM(tcp)
  ("139" OR "445" OR "3389" OR "5985" OR "5986")) | where match(process, "(?i)(tcp\s+(139|445|3389|5985|5986))|(\.exe\s+|(authtoken\s|start\s+--all))|(start\s.*\s--all\s.*\s--config\s.+\.yml)")
  OR match(process_path, "(?i)ngrok\.exe") | table _time, host, user, signature_id,
  process, process_*, parent_process_* | bin span=1s | stats values(*) as * by _time,
  host '
techniques:
- command-and-control:protocol tunneling
technique_id: 
- T1572
data_category:
- PowerShell logs
references:
- https://www.logpoint.com/en/blog/a-deep-look-at-the-darkside-ransomware-operators-and-their-affiliates/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104) OR "<EventID>4104<") TERM(ngrok) OR (TERM(start) "--all" "--config" ".yml") OR (TERM(tcp) ("139" OR "445" OR "3389" OR "5985" OR "5986"))

Stage 2: where

| where
    match(
        process,
        "(?i)(tcp\s+(139|445|3389|5985|5986))|(\.exe\s+|(authtoken\s|start\s+--all))|(start\s.*\s--all\s.*\s--config\s.+\.yml)"
    )
    OR match(process_path, "(?i)ngrok\.exe")

Stage 3: table

| table _time, host, user, signature_id, process, process_*, parent_process_*

Stage 4: bucket

| bin span=1s

Stage 5: stats

| stats values(*) as * by _time, host

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
processregex_match
    • (?i)(tcp\s+(139|445|3389|5985|5986))
    • (.exe\s+|(authtoken\s|start\s+--all))
    • (start\s.*\s--all\s.*\s--config\s.+.yml)
    corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match
process_pathregex_match
  • (?i)ngrok.exe corpus 3 (splunk 3)
field:"process_name" kind:regex_match value:"(?i)ngrok.exe"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4104<"
1ngrok
1start
1"--all"
1"--config"
1".yml"
1tcp
1"139"
1"445"
1"3389"
1"5985"
1"5986"

Package installation (Windows Event Log)

#
Group by
_time, host
Source
github.com/anvilogic-forge/armory

Some programming languages, like Python, come with an easy, more or less official method of installing dependencies for your projects. These installers are usually tied to public code repositories where anyone can freely upload code packages for others to use. The intent of this use case is to identify installation of packages, with common repositories using pip, gem and npm. Use case will be used to with additional threat identifiers to potentially identify Dependency confusion style attacks.

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

References

Telemetry Coverage

Rule Body

id: '5987.6349'
title: Package installation
description: 'Some programming languages, like Python, come with an easy, more or
  less official method of installing dependencies for your projects. These installers
  are usually tied to public code repositories where anyone can freely upload code
  packages for others to use. The intent of this use case is to identify installation
  of packages, with common repositories using pip, gem and npm. Use case will be used
  to with additional threat identifiers to potentially identify Dependency confusion
  style attacks. '
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<") (TERM(npm) OR TERM(pip) OR TERM(gem)) TERM(install) | regex process="(?i)install\s"
  | rex field=process "(?<reqs>(?i)requirements\.txt") | rex field=process "(?<extra>(?i)(\-{2}extra)?\-index\-url(\s+\S+)")
  | rex field=process "(?<source1>(?i)\-{2}source(\s+\S+)") | eval keywords=mvappend(reqs,
  extra, source1) | table _time, host, user, signature_id, process, process_*, parent_*,
  keyword | bin span=1s | stats values(*) as * by _time, host '
techniques:
- command-and-control:ingress tool transfer
technique_id: 
- T1105
data_category:
- Windows event logs
references:
- https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<") (TERM(npm) OR TERM(pip) OR TERM(gem)) TERM(install)

Stage 2: regex

| regex process="(?i)install\s"

Stage 3: rex

| rex field=process "(?<reqs>(?i)requirements\.txt")

The parser skipped this rex command.

Stage 4: rex

| rex field=process "(?<extra>(?i)(\-{2}extra)?\-index\-url(\s+\S+)")

The parser skipped this rex command.

Stage 5: rex

| rex field=process "(?<source1>(?i)\-{2}source(\s+\S+)")

The parser skipped this rex command.

Stage 6: eval

| eval keywords=mvappend(reqs, extra, source1)

Stage 7: table

| table _time, host, user, signature_id, process, process_*, parent_*, keyword

Stage 8: bucket

| bin span=1s

Stage 9: stats

| stats values(*) as * by _time, host

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
processregex_match
  • (?i)install\s corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)install\s"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1npm
1pip
1gem
1install

Potential Sysinternals Tool Execution (PowerShell)

#
Group by
_time, host
Source
github.com/anvilogic-forge/armory

Sysinternals is a widely-used set of utilities for endpoint management, troubleshooting, and monitoring and is available for free from Microsoft. While not installed by default, it can be considered a LOLBAS due to its ubiquity in enterprise environments. Threat actors can abuse these utilities in a variety of ways including information gathering, remote command execution, memory dumping, and many more. This use case detects command line executions including the accepteula flag. The names of individual SysInternal tools have not been included to account for instances where the process has been renamed. Allowlisting by process path for known benign executables using -accepteula or /accepteula combined with usernames expected to use Sysinternals is recommended to reduce false positives

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '22594.40844'
title: Potential Sysinternals Tool Execution
description: 'Sysinternals is a widely-used set of utilities for endpoint management,
  troubleshooting, and monitoring and is available for free from Microsoft. While
  not installed by default, it can be considered a LOLBAS due to its ubiquity in enterprise
  environments. Threat actors can abuse these utilities in a variety of ways including
  information gathering, remote command execution, memory dumping, and many more.
  This use case detects command line executions including the accepteula flag. The
  names of individual SysInternal tools have not been included to account for instances
  where the process has been renamed. Allowlisting by process path for known benign
  executables using -accepteula or /accepteula combined with usernames expected to
  use Sysinternals is recommended to reduce false positives. -- Threat Actor Association:
  Cluster Alpha (STAC1248) - Software Association: Fog -- LOLBINS/LOLBAS'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104) OR
  "<EventID>4104<") "-accepteula" OR "/accepteula" | regex process="(?i)\s(-|\/)accepteula"
  | table _time, host, user host, process, parent_process_path | bin span=1s | stats
  values(*) as * by _time, host '
techniques:
- defense-evasion:system binary proxy execution
technique_id: 
- T1218
data_category:
- PowerShell logs
references:
- https://learn.microsoft.com/en-us/sysinternals/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104) OR "<EventID>4104<") "-accepteula" OR "/accepteula"

Stage 2: regex

| regex process="(?i)\s(-|\/)accepteula"

Stage 3: table

| table _time, host, user host, process, parent_process_path

Stage 4: bucket

| bin span=1s

Stage 5: stats

| stats values(*) as * by _time, host

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
processregex_match
  • (?i)\s(-|\/)accepteula corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)\s(-|\/)accepteula"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4104<"
1"-accepteula"
1"/accepteula"

Proxy Execution via Appcert (Sysmon)

#
Group by
_time, host
Source
github.com/anvilogic-forge/armory

Threat actors may exploit legitimate developer utilities to execute malicious payloads by proxy. One such utility is appcert.exe, a command-line tool included in the Windows Application Certification Kit, which is typically used to verify the compliance of Windows applications with Microsoft's certification standards. This use case detects appcert executions with commands to proxy execution of another binary

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '32821.58285'
title: Proxy Execution via Appcert
description: Threat actors may exploit legitimate developer utilities to execute malicious
  payloads by proxy. One such utility is appcert.exe, a command-line tool included
  in the Windows Application Certification Kit, which is typically used to verify
  the compliance of Windows applications with Microsoft's certification standards.
  This use case detects appcert executions with commands to proxy execution of another
  binary. Living Off the Land Binary and Scripts (LOLBAS) (LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  (TERM(appcert) OR "appcert.exe") TERM(test) | regex process!="(?i)\-setupcommandline"|
  regex process="(?i)\stest\s"| rex field=process "(?i)-setuppath\s+(?:\"|'')?(?<proxy_exec>[^\s\"'']+\.exe)(?:\"|'')?"
  | table _time, host, user, process, parent_*, process_*, proxy_exec | bin span=1s
  | stats values(*) as * by _time, host '
techniques:
- defense-evasion:trusted developer utilities proxy execution
technique_id: 
- T1127
data_category:
- Windows Sysmon
- Process command-line parameters
references:
- https://attack.mitre.org/techniques/T1127/
- https://attack.mitre.org/techniques/T1218/007/
- https://lolbas-project.github.io/lolbas/OtherMSBinaries/Appcert/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") (TERM(appcert) OR "appcert.exe") TERM(test)

Stage 2: regex

| regex process!="(?i)\-setupcommandline"

Stage 3: regex

| regex process="(?i)\stest\s"

Stage 4: rex

| rex field=process "(?i)-setuppath\s+(?:\"|')?(?<proxy_exec>[^\s\"']+\.exe)(?:\"|')?"

Stage 5: table

| table _time, host, user, process, parent_*, process_*, proxy_exec

Stage 6: bucket

| bin span=1s

Stage 7: stats

| stats values(*) as * by _time, host

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
processregex_match
  • (?i)\stest\s corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)\stest\s"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
processregex_match(?i)\-setupcommandlineexcludes:process field:"process" value:"(?i)\-setupcommandline"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1appcert
1"appcert.exe"
1test

Spike in File Writes

#
Status
experimental
Severity
low
Group by
"dest", _time, computer_name
Author
David Dorsey, Splunk
Source
github.com/splunk/security_content

The following analytic detects a sharp increase in the number of files written to a specific host. It leverages the Endpoint.Filesystem data model, focusing on 'created' actions and comparing current file write counts against historical averages and standard deviations. This activity is significant as a sudden spike in file writes can indicate malicious activities such as ransomware encryption or data exfiltration. If confirmed malicious, this behavior could lead to significant data loss, system compromise, or further propagation of malware within the network.

Known False Positives

  • It is important to understand that if you happen to install any new applications on your hosts or are copying a large number of files, you can expect to see a large increase of file modifications.

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 11: FileCreate

Rule Body

name: Spike in File Writes
id: fdb0f805-74e4-4539-8c00-618927333aae
version: 10
creation_date: '2020-04-29'
modification_date: '2026-05-13'
author: David Dorsey, Splunk
status: experimental
type: Anomaly
description: The following analytic detects a sharp increase in the number of files written to a specific host. It leverages the Endpoint.Filesystem data model, focusing on 'created' actions and comparing current file write counts against historical averages and standard deviations. This activity is significant as a sudden spike in file writes can indicate malicious activities such as ransomware encryption or data exfiltration. If confirmed malicious, this behavior could lead to significant data loss, system compromise, or further propagation of malware within the network.
data_source:
    - Sysmon EventID 11
search: |-
    | tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Filesystem
      WHERE Filesystem.action=created
      BY _time span=1h, Filesystem.dest
    | `drop_dm_object_name(Filesystem)`
    | eventstats max(_time) as maxtime
    | stats count as num_data_samples max(eval(if(_time >= relative_time(maxtime, "-1d@d"), count, null))) as "count" avg(eval(if(_time<relative_time(maxtime, "-1d@d"), count,null))) as avg stdev(eval(if(_time<relative_time(maxtime, "-1d@d"), count, null))) as stdev
      BY "dest"
    | eval upperBound=(avg+stdev*4), isOutlier=if((count > upperBound) AND num_data_samples >=20, 1, 0)
    | search isOutlier=1
    | `spike_in_file_writes_filter`
how_to_implement: In order to implement this search, you must populate the Endpoint file-system data model node. This is typically populated via endpoint detection and response product, such as Carbon Black or endpoint data sources such as Sysmon. The data used for this search is typically generated via logs that report reads and writes to the file system.
known_false_positives: It is important to understand that if you happen to install any new applications on your hosts or are copying a large number of files, you can expect to see a large increase of file modifications.
references: []
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Spike in File Writes observed on $dest$
analytic_story:
    - SamSam Ransomware
    - Ryuk Ransomware
    - Ransomware
    - Rhysida Ransomware
asset_type: Endpoint
mitre_attack_id: []
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Filesystem
  WHERE Filesystem.action=created
  BY _time span=1h, Filesystem.dest

Stage 2: search

| `drop_dm_object_name(Filesystem)`

Stage 3: eventstats

| eventstats max(_time) as maxtime

Stage 4: stats

| stats
    count as num_data_samples
    max(eval(if(_time >= relative_time(maxtime, "-1d@d"), count, null))) as "count"
    avg(eval(if(_time<relative_time(maxtime, "-1d@d"), count,null))) as avg
    stdev(eval(if(_time<relative_time(maxtime, "-1d@d"), count, null))) as stdev
  BY "dest"

Stage 5: eval

| eval upperBound=(avg+stdev*4), isOutlier=if((count > upperBound) AND num_data_samples >=20, 1, 0)
isOutlier =
ifcount > upperBound AND num_data_samples >= 201
else0

Stage 6: search

| search isOutlier=1

Stage 7: search

| `spike_in_file_writes_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Filesystem.actioneq
  • created corpus 11 (splunk 11)
field:"event_action" kind:eq value:"created"
isOutliereq
  • 1 corpus 33 (splunk 33)
field:"isOutlier" kind:eq value:"1"

Suspicious Kerberos Service Ticket Request

#
Status
production
Severity
medium
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic detects suspicious Kerberos Service Ticket (TGS) requests where the requesting account name matches the service name, potentially indicating an exploitation attempt of CVE-2021-42278 and CVE-2021-42287. This detection leverages Event ID 4769 from Domain Controller and Kerberos events. Such activity is significant as it may represent an adversary attempting to escalate privileges by impersonating a domain controller. If confirmed malicious, this could allow an attacker to take control of the domain controller, leading to complete domain compromise and unauthorized access to sensitive information.

Known False Positives

  • We have tested this detection logic with ~2 million 4769 events and did not identify false positives. However, they may be possible in certain environments. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Suspicious Kerberos Service Ticket Request
id: 8b1297bc-6204-11ec-b7c4-acde48001122
version: 12
creation_date: '2021-12-20'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects suspicious Kerberos Service Ticket (TGS) requests where the requesting account name matches the service name, potentially indicating an exploitation attempt of CVE-2021-42278 and CVE-2021-42287. This detection leverages Event ID 4769 from Domain Controller and Kerberos events. Such activity is significant as it may represent an adversary attempting to escalate privileges by impersonating a domain controller. If confirmed malicious, this could allow an attacker to take control of the domain controller, leading to complete domain compromise and unauthorized access to sensitive information.
data_source:
    - Windows Event Log Security 4769
search: |-
    `wineventlog_security` EventCode=4769
      | eval isSuspicious = if(lower(ServiceName) = lower(mvindex(split(TargetUserName,"@"),0)),1,0)
      | where isSuspicious = 1
      | rename Computer as dest
      | rename TargetUserName as user
      | table _time, dest, src_ip, user, ServiceName, Error_Code, isSuspicious
      | `suspicious_kerberos_service_ticket_request_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: We have tested this detection logic with ~2 million 4769 events and did not identify false positives. However, they may be possible in certain environments. Filter as needed.
references:
    - https://exploit.ph/cve-2021-42287-cve-2021-42278-weaponisation.html
    - https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-42278
    - https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-42287
    - https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-sfu/02636893-7a1f-4357-af9a-b672e3e3de13
finding:
    title: A suspicious Kerberos Service Ticket was requested by $user$ on host $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - sAMAccountName Spoofing and Domain Controller Impersonation
    - Active Directory Kerberos Attacks
    - Active Directory Privilege Escalation
asset_type: Endpoint
cve:
    - CVE-2021-42287
    - CVE-2021-42278
mitre_attack_id:
    - T1078.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security` EventCode=4769

Stage 2: eval

| eval isSuspicious = if(lower(ServiceName) = lower(mvindex(split(TargetUserName,"@"),0)),1,0)
isSuspicious =
iflower(ServiceName) = lower(mvindex(<FUNCTION:split>, 0))1
else0

Stage 3: where

| where isSuspicious = 1

Stage 4: rename

| rename Computer as dest

Stage 5: rename

| rename TargetUserName as user

Stage 6: table

| table _time, dest, src_ip, user, ServiceName, Error_Code, isSuspicious

Stage 7: search

| `suspicious_kerberos_service_ticket_request_filter`

Indicators

These rows show field, operator, and value matches.

Windows Admon Default Group Policy Object Modified

#
Status
production
Severity
medium
Group by
dcName, displayName
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic detects modifications to the default Group Policy Objects (GPOs) in an Active Directory environment. It leverages Splunk's Admon to monitor updates to the "Default Domain Policy" and "Default Domain Controllers Policy." This activity is significant because changes to these default GPOs can indicate an adversary with privileged access attempting to gain further control, establish persistence, or deploy malware across multiple hosts. If confirmed malicious, such modifications could lead to widespread policy enforcement changes, unauthorized access, and potential compromise of the entire domain environment.

Known False Positives

  • The default Group Policy Objects within an AD network may be legitimately updated for administrative operations, filter as needed.

MITRE ATT&CK Coverage

Rule Body

name: Windows Admon Default Group Policy Object Modified
id: 83458004-db60-4170-857d-8572f16f070b
version: 12
creation_date: '2023-03-28'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects modifications to the default Group Policy Objects (GPOs) in an Active Directory environment. It leverages Splunk's Admon to monitor updates to the "Default Domain Policy" and "Default Domain Controllers Policy." This activity is significant because changes to these default GPOs can indicate an adversary with privileged access attempting to gain further control, establish persistence, or deploy malware across multiple hosts. If confirmed malicious, such modifications could lead to widespread policy enforcement changes, unauthorized access, and potential compromise of the entire domain environment.
data_source:
    - Windows Active Directory Admon
search: |-
    `admon` admonEventType=Update objectCategory="CN=Group-Policy-Container,CN=Schema,CN=Configuration,DC=*" (displayName="Default Domain Policy" OR displayName="Default Domain Controllers Policy")
      | stats min(_time) as firstTime max(_time) as lastTime values(gPCFileSysPath)
        BY dcName, displayName
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `windows_admon_default_group_policy_object_modified_filter`
how_to_implement: To successfully implement this search, you need to be monitoring Active Directory logs using Admon. Details can be found here https://help.splunk.com/en/splunk-cloud-platform/get-started/get-data-in/9.3.2411/get-windows-data/monitor-active-directory
known_false_positives: The default Group Policy Objects within an AD network may be legitimately updated for administrative operations, filter as needed.
references:
    - https://attack.mitre.org/techniques/T1484/
    - https://attack.mitre.org/techniques/T1484/001
    - https://www.trustedsec.com/blog/weaponizing-group-policy-objects-access/
    - https://adsecurity.org/?p=2716
    - https://help.splunk.com/en/splunk-cloud-platform/get-started/get-data-in/9.3.2411/get-windows-data/monitor-active-directory
finding:
    title: A default domain group policy was updated on $dcName$
    entity:
        field: dcName
        type: system
        score: 50
analytic_story:
    - Active Directory Privilege Escalation
    - Sneaky Active Directory Persistence Tricks
asset_type: Endpoint
mitre_attack_id:
    - T1484.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`admon` admonEventType=Update
    objectCategory="CN=Group-Policy-Container,CN=Schema,CN=Configuration,DC=*" (
        displayName="Default Domain Policy"
        OR displayName="Default Domain Controllers Policy"
    )

Stage 2: stats

| stats min(_time) as firstTime max(_time) as lastTime values(gPCFileSysPath)
    BY dcName, displayName

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_admon_default_group_policy_object_modified_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
admonEventTypeeq
  • Update corpus 5 (splunk 5)
field:"admonEventType" kind:eq value:"Update"
displayNameeq
  • Default Domain Controllers Policy
  • Default Domain Policy
field:"displayName" kind:eq
objectCategoryeq
  • CN=Group-Policy-Container,CN=Schema,CN=Configuration,DC=* corpus 2 (splunk 2)
field:"objectCategory" kind:eq value:"CN=Group-Policy-Container,CN=Schema,CN=Configuration,DC=*"

Windows Alternate DataStream - Process Execution

#
Status
production
Severity
medium
Group by
IntegrityLevel, command_line, computer_name, event_action, original_file_name, parent_command_line, parent_process_basename, parent_process_guid, parent_process_id, parent_process_name, process_basename, process_guid, process_hash, process_id, process_name, user, user_id, vendor_product
Author
Steven Dick
Source
github.com/splunk/security_content

The following analytic detects when a process attempts to execute a file from within an NTFS file system alternate data stream. This detection leverages process execution data from sources like Windows process monitoring or Sysmon Event ID 1, focusing on specific processes known for such behavior. This activity is significant because alternate data streams can be used by threat actors to hide malicious code, making it difficult to detect. If confirmed malicious, this could allow an attacker to execute hidden code, potentially leading to unauthorized actions and further compromise of the system.

Known False Positives

  • False positives may be generated by process executions within the commandline, regex has been provided to minimize the possibilty.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Alternate DataStream - Process Execution
id: 30c32c5c-41fe-45db-84fe-275e4320da3f
version: 13
creation_date: '2024-01-10'
modification_date: '2026-06-04'
author: Steven Dick
status: production
type: TTP
description: The following analytic detects when a process attempts to execute a file from within an NTFS file system alternate data stream. This detection leverages process execution data from sources like Windows process monitoring or Sysmon Event ID 1, focusing on specific processes known for such behavior. This activity is significant because alternate data streams can be used by threat actors to hide malicious code, making it difficult to detect. If confirmed malicious, this could allow an attacker to execute hidden code, potentially leading to unauthorized actions and further compromise of the system.
data_source:
    - Windows Event Log Security 4688
    - Sysmon EventID 1
search: |-
    | tstats count min(_time) as firstTime max(_time) as lastTime values(Processes.process_current_directory) as directory
    from datamodel=Endpoint.Processes where
    Processes.parent_process_name != "unknown"
    Processes.process_name IN (
        "appvlp.exe",
        "bitsadmin.exe",
        "control.exe",
        "cscript.exe",
        "forfiles.exe",
        "ftp.exe",
        "mavinject.exe",
        "mshta.exe",
        "powershell_ise.exe",
        "powershell.exe",
        "pwsh.exe",
        "regini.exe",
        "regsvr32.exe",
        "rundll32.exe",
        "sc.exe",
        "wmic.exe",
        "wscript.exe"
    )

    by Processes.action Processes.dest Processes.original_file_name Processes.parent_process
       Processes.parent_process_exec Processes.parent_process_guid Processes.parent_process_id
       Processes.parent_process_name Processes.parent_process_path Processes.process
       Processes.process_exec Processes.process_guid Processes.process_hash
       Processes.process_id Processes.process_integrity_level Processes.process_name
       Processes.process_path Processes.user Processes.user_id Processes.vendor_product

    | `drop_dm_object_name(Processes)`
    | regex process="(\b)\w+(\.\w+)?:\w+(\.\w{2,4})(?!\.)(\b|\s|&)"
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_alternate_datastream___process_execution_filter`
how_to_implement: Target environment must ingest process execution data sources such as Windows process monitoring and/or Sysmon EventID 1.
known_false_positives: False positives may be generated by process executions within the commandline, regex has been provided to minimize the possibilty.
references:
    - https://gist.github.com/api0cradle/cdd2d0d0ec9abb686f0e89306e277b8f
    - https://car.mitre.org/analytics/CAR-2020-08-001/
    - https://blogs.juniper.net/en-us/threat-research/bitpaymer-ransomware-hides-behind-windows-alternate-data-streams
    - https://blog.netwrix.com/2022/12/16/alternate_data_stream/
finding:
    title: The $process_name$ process was executed by $user$ using data from an NTFS alternate data stream.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: The $process_name$ process was executed by $user$ using data from an NTFS alternate data stream.
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - Compromised Windows Host
    - Windows Defense Evasion Tactics
asset_type: Endpoint
mitre_attack_id:
    - T1564.004
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats
    count
    min(_time) as firstTime
    max(_time) as lastTime
    values(Processes.process_current_directory) as directory
  from datamodel=Endpoint.Processes
  where
Processes.parent_process_name != "unknown"
Processes.process_name IN (
    "appvlp.exe",
    "bitsadmin.exe",
    "control.exe",
    "cscript.exe",
    "forfiles.exe",
    "ftp.exe",
    "mavinject.exe",
    "mshta.exe",
    "powershell_ise.exe",
    "powershell.exe",
    "pwsh.exe",
    "regini.exe",
    "regsvr32.exe",
    "rundll32.exe",
    "sc.exe",
    "wmic.exe",
    "wscript.exe"
)
  by
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: regex

| regex process="(\b)\w+(\.\w+)?:\w+(\.\w{2,4})(?!\.)(\b|\s|&)"

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `windows_alternate_datastream___process_execution_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.parent_process_namene
  • unknown
field:"parent_process_basename" kind:ne value:"unknown"
Processes.process_namein
  • appvlp.exe
  • bitsadmin.exe corpus 17 (splunk 15, elastic 2)
  • control.exe corpus 2 (splunk 2)
  • cscript.exe corpus 24 (splunk 16, elastic 8)
  • forfiles.exe corpus 6 (splunk 6)
  • ftp.exe corpus 7 (splunk 7)
  • mavinject.exe corpus 6 (splunk 6)
  • mshta.exe corpus 27 (splunk 15, elastic 12)
  • powershell.exe corpus 31 (splunk 19, elastic 11, kusto 1)
  • powershell_ise.exe corpus 9 (splunk 7, elastic 2)
  • pwsh.exe corpus 22 (splunk 19, elastic 3)
  • regini.exe
  • regsvr32.exe corpus 14 (splunk 10, elastic 4)
  • rundll32.exe corpus 17 (splunk 12, elastic 5)
  • sc.exe corpus 5 (splunk 3, elastic 2)
  • wmic.exe corpus 15 (splunk 14, elastic 1)
  • wscript.exe corpus 28 (elastic 14, splunk 14)
field:"process_basename" kind:in
processregex_match
  • (\b)\w+(.\w+)?:\w+(.\w{2,4})(?!.)(\b|\s|&)
field:"CommandLine" kind:regex_match value:"(\b)\w+(.\w+)?:\w+(.\w{2,4})(?!.)(\b|\s|&)"

Windows Cobalt Strike PowerShell Loader

#
Status
production
Severity
medium
Group by
Guid, Name, Opcode, Path, ScriptBlockId, ScriptBlockText, computer_name, dest, process_id, signature, signature_id, user_id, vendor_product
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

Detects the PowerShell pattern used at the end of a Cobalt Strike PowerShell loader to perform the decompression of the executable. This loader is used in attacks such as scripted web delivery. Cobalt Strike is a legitimate, commercial penetration testing tool that has been largely co-opted by ransomware gangs to launch attacks. Cobalt Strike's popularity is mainly due to its beacons or payload being stealthy, and easily customizable. Cobalt Strike Beacon provides encrypted communication with the C&C server to send information and receive commands.

Known False Positives

  • Some legitimate penetration testing activities and authorized red team exercises may use this PowerShell loader pattern. Verify and whitelist approved security testing tools to reduce false alerts.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Cobalt Strike PowerShell Loader
id: a6351724-06dc-42dd-939f-679add826e76
version: 2
creation_date: '2026-05-05'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: TTP
description: |-
    Detects the PowerShell pattern used at the end of a Cobalt Strike PowerShell loader to perform the decompression of the executable.
    This loader is used in attacks such as scripted web delivery.
    Cobalt Strike is a legitimate, commercial penetration testing tool that has been largely co-opted by ransomware gangs to launch attacks.
    Cobalt Strike's popularity is mainly due to its beacons or payload being stealthy, and easily customizable.
    Cobalt Strike Beacon provides encrypted communication with the C&C server to send information and receive commands.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell`
    EventID="4104"
    ScriptBlockText="*));IEX (New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s,[IO.Compression.CompressionMode]::Decompress))).ReadToEnd();"
    | fillnull
    | stats count min(_time) as firstTime
                  max(_time) as lastTime
      by Computer EventID ScriptBlockText dest signature signature_id user_id vendor_product
         Guid Opcode Name Path ProcessID ScriptBlockId

    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_cobalt_strike_powershell_loader_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Some legitimate penetration testing activities and authorized red team exercises may use this PowerShell loader pattern. Verify and whitelist approved security testing tools to reduce false alerts.
finding:
    title: Cobalt Strike PowerShell loader pattern observed on $dest$ via script block $ScriptBlockId$.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Cobalt Strike
asset_type: Endpoint
mitre_attack_id:
    - T1608
    - T1059.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`powershell`
EventID="4104"
ScriptBlockText="*));IEX (New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s,[IO.Compression.CompressionMode]::Decompress))).ReadToEnd();"

Stage 2: fillnull

| fillnull

Stage 3: stats

| stats count min(_time) as firstTime
              max(_time) as lastTime
  by Computer EventID ScriptBlockText dest signature signature_id user_id vendor_product
     Guid Opcode Name Path ProcessID ScriptBlockId

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `windows_cobalt_strike_powershell_loader_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventIDeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTexteq
  • *));IEX (New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s,[IO.Compression.CompressionMode]::Decompress))).ReadToEnd();
field:"ScriptBlockText" kind:eq value:"*));IEX (New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s,[IO.Compression.CompressionMode]::Decompress))).ReadToEnd();"

Windows LOLBAS Executed Outside Expected Path

#
Status
production
Severity
low
Group by
IntegrityLevel, command_line, computer_name, event_action, original_file_name, parent_command_line, parent_process_basename, parent_process_guid, parent_process_id, parent_process_name, process_basename, process_guid, process_hash, process_id, process_name, user, user_id, vendor_product
Author
Steven Dick
Source
github.com/splunk/security_content

The following analytic identifies a LOLBAS process being executed outside of it's expected location. Processes being executed outside of expected locations may be an indicator that an adversary is attempting to evade defenses or execute malicious code. The LOLBAS project documents Windows native binaries that can be abused by threat actors to perform tasks like executing malicious code.

Known False Positives

  • Vendors, third party software or update processes may use versions of the binaries listed in the lookup table from non-standard paths. It is recommended to tune this analytic to exclude any known legitimate software or paths in your environment

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows LOLBAS Executed Outside Expected Path
id: 326fdf44-b90c-4d2e-adca-1fd140b10536
version: 10
creation_date: '2024-05-03'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: Anomaly
description: |
    The following analytic identifies a LOLBAS process being executed outside of it's expected location.
    Processes being executed outside of expected locations may be an indicator that an adversary is attempting to evade defenses or execute malicious code.
    The LOLBAS project documents Windows native binaries that can be abused by threat actors to perform tasks like executing malicious code.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
search: |
    | tstats `security_content_summariesonly`
      count min(_time) as firstTime
            max(_time) as lastTime
      FROM datamodel=Endpoint.Processes where

      NOT Processes.process_path IN (
        "*\\PROGRA~*",
        "*\\Program Files \(x86\)\\",
        "*\\Program Files\\",
        "*:\\Windows\\System32\\*",
        "*:\\Windows\\SysWOW64\\*",
        "*:\\Windows\\WinSxS\\*"
      )

    by Processes.action Processes.dest Processes.original_file_name Processes.parent_process
       Processes.parent_process_exec Processes.parent_process_guid Processes.parent_process_id
       Processes.parent_process_name Processes.parent_process_path Processes.process
       Processes.process_exec Processes.process_guid Processes.process_hash
       Processes.process_id Processes.process_integrity_level Processes.process_name
       Processes.process_path Processes.user Processes.user_id Processes.vendor_product

    |`drop_dm_object_name(Processes)`
    | lookup lolbas_file_path lolbas_file_name as process_name OUTPUT description as desc
    | lookup lolbas_file_path lolbas_file_name as process_name lolbas_file_path as process_path OUTPUT description as is_lolbas_path
    | search desc!="false" AND is_lolbas_path="false"
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_lolbas_executed_outside_expected_path_filter`
how_to_implement: To implement this search, you must ingest logs that contain the process name and process path, such as with Sysmon EID 1.
known_false_positives: |
    Vendors, third party software or update processes may use versions of the binaries listed in the lookup table from non-standard paths.
    It is recommended to tune this analytic to exclude any known legitimate software or paths in your environment
references:
    - https://attack.mitre.org/techniques/T1036/
    - https://attack.mitre.org/techniques/T1036/005/
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: The user $user$ executed a LOLBAS [$process_name$] from an unexpected location [$process_path$] with CommandLine [$process$] on $dest$
        - field: dest
          type: system
          score: 20
          message: The user $user$ executed a LOLBAS [$process_name$] from an unexpected location [$process_path$] with CommandLine [$process$] on $dest$
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - Living Off The Land
    - Masquerading - Rename System Utilities
    - Windows Defense Evasion Tactics
asset_type: Endpoint
mitre_attack_id:
    - T1036.005
    - T1218.011
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
  count min(_time) as firstTime
        max(_time) as lastTime
  FROM datamodel=Endpoint.Processes where

  NOT Processes.process_path IN (
    "*\\PROGRA~*",
    "*\\Program Files \(x86\)\\",
    "*\\Program Files\\",
    "*:\\Windows\\System32\\*",
    "*:\\Windows\\SysWOW64\\*",
    "*:\\Windows\\WinSxS\\*"
  )

by Processes.action Processes.dest Processes.original_file_name Processes.parent_process
   Processes.parent_process_exec Processes.parent_process_guid Processes.parent_process_id
   Processes.parent_process_name Processes.parent_process_path Processes.process
   Processes.process_exec Processes.process_guid Processes.process_hash
   Processes.process_id Processes.process_integrity_level Processes.process_name
   Processes.process_path Processes.user Processes.user_id Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: lookup

| lookup lolbas_file_path lolbas_file_name as process_name OUTPUT description as desc
Lookup table
lolbas_file_path
Key field
lolbas_file_name as process_name
Output columns
['description', 'desc']

Stage 4: lookup

| lookup lolbas_file_path lolbas_file_name as process_name lolbas_file_path as process_path OUTPUT
    description as is_lolbas_path
Lookup table
lolbas_file_path
Key field
lolbas_file_name as process_name
Output columns
['description', 'is_lolbas_path']

Stage 5: search

| search desc!="false" AND is_lolbas_path="false"

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `windows_lolbas_executed_outside_expected_path_filter`

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
Processes.process_pathin*:\Windows\SysWOW64\*, *:\Windows\System32\*, *:\Windows\WinSxS\*, *\PROGRA~*, *\Program Files \(x86\)\, *\Program Files\excludes:Processes.process_path

Windows SubInAcl Execution

#
Status
production
Severity
low
Group by
IntegrityLevel, command_line, computer_name, event_action, original_file_name, parent_command_line, parent_process_basename, parent_process_guid, parent_process_id, parent_process_name, process_basename, process_guid, process_hash, process_id, process_name, user, user_id, vendor_product
Author
Nasreddine Bencherchali, Michael Haag, Splunk
Source
github.com/splunk/security_content

The following analytic detects the execution of the SubInAcl utility. SubInAcl is a legacy Windows Resource Kit tool from the Windows 2003 era, used to manipulate security descriptors of securable objects. It leverages data from Endpoint Detection and Response (EDR) agents, specifically searching for any process execution involving "SubInAcl.exe" binary. This activity can be significant because the utility should be rarely found on modern Windows machines, which mean any execution could potentially be considered suspicious. If confirmed malicious, this could allow an attacker to blind defenses by tampering with EventLog ACLs or modifying the access to a previously denied resource.

Known False Positives

  • No false positives have been identified at this time. should be identified and understood.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows SubInAcl Execution
id: 12491419-1a6f-4af4-afc3-4e2052f0610e
version: 9
creation_date: '2020-04-29'
modification_date: '2026-05-13'
author: Nasreddine Bencherchali, Michael Haag, Splunk
status: production
type: Anomaly
description: The following analytic detects the execution of the SubInAcl utility. SubInAcl is a legacy Windows Resource Kit tool from the Windows 2003 era, used to manipulate security descriptors of securable objects. It leverages data from Endpoint Detection and Response (EDR) agents, specifically searching for any process execution involving "SubInAcl.exe" binary. This activity can be significant because the utility should be rarely found on modern Windows machines, which mean any execution could potentially be considered suspicious. If confirmed malicious, this could allow an attacker to blind defenses by tampering with EventLog ACLs or modifying the access to a previously denied resource.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` values(Processes.process) as process min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE (
            Processes.process_name=subinacl.exe
            OR
            Processes.original_file_name=SubInAcl.exe
        )
      BY Processes.action Processes.dest Processes.original_file_name
         Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
         Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
         Processes.process Processes.process_exec Processes.process_guid
         Processes.process_hash Processes.process_id Processes.process_integrity_level
         Processes.process_name Processes.process_path Processes.user
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_subinacl_execution_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process name, and process original file name. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: No false positives have been identified at this time. should be identified and understood.
references:
    - https://www.pwc.com/gx/en/issues/cybersecurity/cyber-threat-intelligence/cyber-year-in-retrospect/yir-cyber-threats-report-download.pdf
    - https://attack.mitre.org/techniques/T1222/001/
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: An instance of $parent_process_name$ spawning $process_name$ was identified attempting to disable security services on endpoint $dest$ by user $user$.
        - field: dest
          type: system
          score: 20
          message: An instance of $parent_process_name$ spawning $process_name$ was identified attempting to disable security services on endpoint $dest$ by user $user$.
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - Defense Evasion or Unauthorized Access Via SDDL Tampering
asset_type: Endpoint
mitre_attack_id:
    - T1222.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    values(Processes.process) as process
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE (
      Processes.process_name=subinacl.exe
      OR Processes.original_file_name=SubInAcl.exe
  )
  BY
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_subinacl_execution_filter`

Indicators

These rows show field, operator, and value matches.

Back to all Splunk rules