Detection rules › Splunk

Splunk rules: 0k

AnyDesk Execution from Suspicious Folder (Windows Event Log)

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

Adversaries may use legitimate desktop support and remote access software to establish an interactive command and control channel to target systems within networks. These services are commonly used as legitimate technical support software, and may be allowed by application control within a target environment. This use case detects when remote access software AnyDesk is executed outside of standard install locations

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

References

Telemetry Coverage

Rule Body

id: '13702.20067'
title: AnyDesk Execution from Suspicious Folder
description: 'Adversaries may use legitimate desktop support and remote access software
  to establish an interactive command and control channel to target systems within
  networks. These services are commonly used as legitimate technical support software,
  and may be allowed by application control within a target environment. This use
  case detects when remote access software AnyDesk is executed outside of standard
  install locations. -- Threat Actor Association: Alloy Taurus/Gallium, Gamaredon
  (aka. Armageddon, UAC-0010), Muddled Libra, Scattered Spider (aka. 0ktapus, UNC3944),
  Scatter Swine, UNC2659 - Software Association: Akira, ALPHV/BlackCat, AvosLocker,
  BianLian, BlackByte, BumbleBee, Clop, Conti, Diavol, Rhysida, Royal -- Atomics T1219
  Test #2'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) TERM(AnyDesk) | regex process_path!="(?i)(AppData)|(Program\sFiles\\AnyDesk)|(Program\sFiles\s\(x86\))"|
  where match(process_name, "(?i)^anydesk.exe$") | table _time, host, user, process,
  process_* | bin span=1s | stats values(*) as * by _time, host '
techniques:
- command-and-control:remote access software
technique_id: 
- T1219
data_category:
- Windows event logs
- Process command-line parameters
references:
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1219/T1219.md#atomic-test-2---anydesk-files-detected-test-on-windows

Stages and Predicates

Stage 1: search

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

Stage 2: regex

| regex process_path!="(?i)(AppData)|(Program\sFiles\\AnyDesk)|(Program\sFiles\s\(x86\))"

Stage 3: where

| where match(process_name, "(?i)^anydesk.exe$")

Stage 4: table

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

Stage 5: bucket

| bin span=1s

Stage 6: 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"
process_nameregex_match
  • (?i)^anydesk.exe$ corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)^anydesk.exe$"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process_pathregex_match(?i)(AppData), (Program\sFiles\AnyDesk), (Program\sFiles\s(x86))excludes:process_path field:"process_path" value:"(?i)(AppData)" field:"process_path" value:"(Program\sFiles\AnyDesk)" field:"process_path" value:"(Program\sFiles\s(x86))"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1AnyDesk

Attempted Veeam Database Credential Dump (Windows Event Log)

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

Operators from the Diavol ransomware gang were observed using sqlcmd to extract encrypted credentials from Veeam databases that were decrypted using a publicly documented technique on Veeam's R+D forums. This use case detects commands targeting credentials stored in Veeam databases. While sqlcmd.exe was used in documented cases, the logic is not reliant on detecting sqlcmd.exe to account for instances where the binary has been renamed or another utility was used to interact with the database

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '25095.46535'
title: Attempted Veeam Database Credential Dump
description: 'Operators from the Diavol ransomware gang were observed using sqlcmd
  to extract encrypted credentials from Veeam databases that were decrypted using
  a publicly documented technique on Veeam''s R+D forums. This use case detects commands
  targeting credentials stored in Veeam databases. While sqlcmd.exe was used in documented
  cases, the logic is not reliant on detecting sqlcmd.exe to account for instances
  where the binary has been renamed or another utility was used to interact with the
  database. -- Threat Actor Association: UTA0178 -- Software Association: Akira'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) "SELECT" "[user_name]" "[password]" "FROM" "[VeeamBackup].[dbo].[Credentials]"
  | table _time, host, user, user, process, process_*, parent_* | bin span=1s | stats
  values(*) as * by _time, host '
techniques:
- credential-access:unsecured credentials:credentials in files
technique_id:
- T1552.001
data_category:
- Process command-line parameters
- Windows event logs
references:
- https://thedfirreport.com/2021/12/13/diavol-ransomware/
- https://forums.veeam.com/veeam-backup-replication-f2/recover-esxi-password-in-veeam-t34630.html

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) "SELECT" "[user_name]" "[password]" "FROM" "[VeeamBackup].[dbo].[Credentials]"

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: 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"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"SELECT"
1"[user_name]"
1"[password]"
1"FROM"
1"[VeeamBackup].[dbo].[Credentials]"

AWS Exfiltration via Anomalous GetObject API Activity

#
Status
production
Severity
low
Group by
aws::awsRegion, aws::recipientAccountId, aws::userAgent, dest, signature, src, user, vendor_product
Author
Bhavin Patel, Splunk
Source
github.com/splunk/security_content

The following analytic identifies anomalous GetObject API activity in AWS, indicating potential data exfiltration attempts. It leverages AWS CloudTrail logs and uses the anomalydetection command to detect unusual patterns in the frequency of GetObject API calls by analyzing fields such as "count," "user_type," and "user_arn" within a 10-minute window. This activity is significant as it may indicate unauthorized data access or exfiltration from S3 buckets. If confirmed malicious, attackers could exfiltrate sensitive data, leading to data breaches and compliance violations.

Known False Positives

  • It is possible that a user downloaded these files to use them locally and there are AWS services in configured that perform these activities for a legitimate reason. Filter is needed.

MITRE ATT&CK Coverage

TacticTechniques
Collection

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: AWS Exfiltration via Anomalous GetObject API Activity
id: e4384bbf-5835-4831-8d85-694de6ad2cc6
version: 10
creation_date: '2023-04-10'
modification_date: '2026-05-13'
author: Bhavin Patel, Splunk
status: production
type: Anomaly
description: The following analytic identifies anomalous GetObject API activity in AWS, indicating potential data exfiltration attempts. It leverages AWS CloudTrail logs and uses the `anomalydetection` command to detect unusual patterns in the frequency of GetObject API calls by analyzing fields such as "count," "user_type," and "user_arn" within a 10-minute window. This activity is significant as it may indicate unauthorized data access or exfiltration from S3 buckets. If confirmed malicious, attackers could exfiltrate sensitive data, leading to data breaches and compliance violations.
data_source:
    - AWS CloudTrail GetObject
search: |-
    `cloudtrail` eventName=GetObject
      | bin _time span=10m
      | rename user_name as user
      | stats count values(requestParameters.bucketName) as bucketName
        BY signature dest user
           user_agent src vendor_account
           vendor_region vendor_product
      | anomalydetection "count" "user" action=annotate
      | search probable_cause=*
      | `aws_exfiltration_via_anomalous_getobject_api_activity_filter`
how_to_implement: You must install splunk AWS add on and Splunk App for AWS. This search works with AWS CloudTrail logs.
known_false_positives: It is possible that a user downloaded these files to use them locally and there are AWS services in configured that perform these activities for a legitimate reason. Filter is needed.
references:
    - https://labs.nettitude.com/blog/how-to-exfiltrate-aws-ec2-data/
    - https://help.splunk.com/en/splunk-enterprise/search/spl-search-reference/9.4/search-commands/anomalydetection
    - https://www.vectra.ai/blogpost/abusing-the-replicator-silently-exfiltrating-data-with-the-aws-s3-replication-service
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: Anomalous S3 activities detected by user $user$ from $src$
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - Data Exfiltration
asset_type: AWS Account
mitre_attack_id:
    - T1119
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`cloudtrail` eventName=GetObject

Stage 2: bucket

| bin _time span=10m

Stage 3: rename

| rename user_name as user

Stage 4: stats

| stats count values(requestParameters.bucketName) as bucketName
    BY signature dest user
       user_agent src vendor_account
       vendor_region vendor_product

Stage 5: search

| anomalydetection "count" "user" action=annotate

Stage 6: search

| search probable_cause=*

Stage 7: search

| `aws_exfiltration_via_anomalous_getobject_api_activity_filter`

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
5anomalydetection
5"count"
5"user"

AWS High Number Of Failed Authentications From Ip

#
Status
production
Severity
low
Group by
_time, aws::awsRegion, aws::recipientAccountId, dest, signature, src, vendor_product
Author
Bhavin Patel, Splunk
Source
github.com/splunk/security_content

The following analytic detects an IP address with 20 or more failed authentication attempts to the AWS Web Console within a 5-minute window. This detection leverages CloudTrail logs, aggregating failed login events by IP address and time span. This activity is significant as it may indicate a brute force attack aimed at gaining unauthorized access or escalating privileges within an AWS environment. If confirmed malicious, this could lead to unauthorized access, data breaches, or further exploitation of AWS resources.

Known False Positives

  • An Ip address with more than 20 failed authentication attempts in the span of 5 minutes may also be triggered by a broken application.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: AWS High Number Of Failed Authentications From Ip
id: f75b7f1a-b8eb-4975-a214-ff3e0a944757
version: 11
creation_date: '2023-01-30'
modification_date: '2026-05-13'
author: Bhavin Patel, Splunk
status: production
type: Anomaly
description: The following analytic detects an IP address with 20 or more failed authentication attempts to the AWS Web Console within a 5-minute window. This detection leverages CloudTrail logs, aggregating failed login events by IP address and time span. This activity is significant as it may indicate a brute force attack aimed at gaining unauthorized access or escalating privileges within an AWS environment. If confirmed malicious, this could lead to unauthorized access, data breaches, or further exploitation of AWS resources.
data_source:
    - AWS CloudTrail ConsoleLogin
search: |-
    `cloudtrail` eventName=ConsoleLogin action=failure
      | bucket span=10m _time
      | rename user_name as user
      | stats dc(_raw) AS failed_attempts values(user) as user values(user_agent) as user_agent
        BY _time, src, signature,
           dest, vendor_account vendor_region,
           vendor_product
      | where failed_attempts > 20
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `aws_high_number_of_failed_authentications_from_ip_filter`
how_to_implement: You must install Splunk Add-on for AWS in order to ingest Cloudtrail. We recommend the users to try different combinations of the bucket span time and the tried account threshold to tune this search according to their environment.
known_false_positives: An Ip address with more than 20 failed authentication attempts in the span of 5 minutes may also be triggered by a broken application.
references:
    - https://attack.mitre.org/techniques/T1110/003/
    - https://www.whiteoaksecurity.com/blog/goawsconsolespray-password-spraying-tool/
    - https://softwaresecuritydotblog.wordpress.com/2019/09/28/how-to-protect-against-credential-stuffing-on-aws/
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: 'Multiple failed console login attempts (Count: $failed_attempts$) against users from IP Address - $src$'
analytic_story:
    - AWS Identity and Access Management Account Takeover
    - Compromised User Account
asset_type: AWS Account
mitre_attack_id:
    - T1110.003
    - T1110.004
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`cloudtrail` eventName=ConsoleLogin action=failure

Stage 2: bucket

| bucket span=10m _time

Stage 3: rename

| rename user_name as user

Stage 4: stats

| stats dc(_raw) AS failed_attempts values(user) as user values(user_agent) as user_agent
    BY _time, src, signature,
       dest, vendor_account vendor_region,
       vendor_product

Stage 5: where

| where failed_attempts > 20

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `aws_high_number_of_failed_authentications_from_ip_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
actioneq
  • failure corpus 4 (splunk 4)
field:"action" kind:eq value:"failure"
eventNameeq
  • ConsoleLogin corpus 19 (splunk 10, sigma 6, kusto 3)
field:"aws::eventName" kind:eq value:"ConsoleLogin"
failed_attemptsgt
  • 20 corpus 2 (splunk 2)
field:"failed_attempts" kind:gt value:"20"
sourcetypeeq
  • aws:cloudtrail corpus 59 (splunk 59)
field:"sourcetype" kind:eq value:"aws:cloudtrail"

CDB Execution (Windows Event Log)

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

CDB is a legitimate Windows component that can be used, and abused, to launch 64-bit shellcode, setup network connections or attaching to any process and executing shell commands. As this is a common component on Windows, it can be leveraged to perform living-off-the-land attacks

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '13470.19295'
title: CDB Execution
description: 'CDB is a legitimate Windows component that can be used, and abused,
  to launch 64-bit shellcode, setup network connections or attaching to any process
  and executing shell commands. As this is a common component on Windows, it can be
  leveraged to perform living-off-the-land attacks. -- Threat Actor Association: Metador
  -- Living Off the Land Binary and Scripts (LOLBAS) (LOLBIN)'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) ("cdb.exe" ("-cf" OR "-cfr" OR ("-premote" ("port"
  OR "pipe")) OR ("-pd" "-pn"))) OR ("-cf" OR "-cfr" OR ("-premote" ("port" OR "pipe"))
  OR ("-pd" "-pn")) | regex process="(?i)\s+\-(cf|cfr|premote|pd.*-pn|pn.*-pd)\s+"
  | table _time, host, user process, process_*, signature_id, parent_* | bin span=1s
  | stats values(*) as * by _time, host '
techniques:
- defense-evasion:trusted developer utilities proxy execution
technique_id: 
- T1127
data_category:
- Windows event logs
- Process command-line parameters
references:
- https://lolbas-project.github.io/lolbas/OtherMSBinaries/Cdb/
- https://blog.thecybersecuritytutor.com/the-power-of-cdb-debugging-tool/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) ("cdb.exe" ("-cf" OR "-cfr" OR ("-premote" ("port" OR "pipe")) OR ("-pd" "-pn"))) OR ("-cf" OR "-cfr" OR ("-premote" ("port" OR "pipe")) OR ("-pd" "-pn"))

Stage 2: regex

| regex process="(?i)\s+\-(cf|cfr|premote|pd.*-pn|pn.*-pd)\s+"

Stage 3: table

| table _time, host, user process, process_*, signature_id, 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)\s+\-(cf|cfr|premote|pd.*-pn|pn.*-pd)\s+ corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match value:"(?i)\s+\-(cf|cfr|premote|pd.*-pn|pn.*-pd)\s+"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"cdb.exe"
1"-cf"
1"-cfr"
1"-premote"
1"port"
1"pipe"
1"-pd"
1"-pn"
1"-cf"
1"-cfr"
1"-premote"
1"port"
1"pipe"
1"-pd"
1"-pn"

Cisco IOS Suspicious Privileged Account Creation

#
Status
production
Severity
low
Group by
All_Changes.dvc, All_Changes.user
Author
Bhavin Patel, Michael Haag, Splunk
Source
github.com/splunk/security_content

This analytic detects the creation of privileged user accounts on Cisco IOS devices, which could indicate an attacker establishing backdoor access. The detection focuses on identifying when user accounts are created with privilege level 15 (the highest administrative privilege level in Cisco IOS) or when existing accounts have their privileges elevated. This type of activity is particularly concerning when performed by unauthorized users or during unusual hours, as it may represent a key step in establishing persistence following the exploitation of vulnerabilities like CVE-2018-0171 in Cisco Smart Install. Threat actors like Static Tundra have been observed creating privileged accounts as part of their attack chain after gaining initial access to network devices.

Known False Positives

  • Legitimate account creation and privilege elevation activities by authorized administrators will generate alerts with this detection. To reduce false positives, consider implementing a baseline of expected administrative activities, including approved administrative usernames, typical times for account management, and authorized administrators who regularly perform these actions. You may also want to create a lookup table of approved administrative accounts and filter out alerts for these accounts. Additionally, scheduled maintenance windows should be taken into account when evaluating alerts.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access
Persistence
Privilege Escalation
Stealth

Rule Body

name: Cisco IOS Suspicious Privileged Account Creation
id: 63e3aff9-45d7-4d41-bcdb-9da561fb4533
version: 5
creation_date: '2025-08-21'
modification_date: '2026-05-13'
author: Bhavin Patel, Michael Haag, Splunk
status: production
type: Anomaly
description: This analytic detects the creation of privileged user accounts on Cisco IOS devices, which could indicate an attacker establishing backdoor access. The detection focuses on identifying when user accounts are created with privilege level 15 (the highest administrative privilege level in Cisco IOS) or when existing accounts have their privileges elevated. This type of activity is particularly concerning when performed by unauthorized users or during unusual hours, as it may represent a key step in establishing persistence following the exploitation of vulnerabilities like CVE-2018-0171 in Cisco Smart Install. Threat actors like Static Tundra have been observed creating privileged accounts as part of their attack chain after gaining initial access to network devices.
data_source:
    - Cisco IOS Logs
search: |-
    | tstats `security_content_summariesonly` count values(All_Changes.command) as command min(_time) as firstTime max(_time) as lastTime FROM datamodel=Change.All_Changes
      WHERE (
            (All_Changes.command="*username * privilege 15*")
            OR
            (All_Changes.command="*username * password*"
            AND
            All_Changes.command="*USER TABLE MODIFIED*")
            OR
            (All_Changes.command="*USER_PRIVILEGE_UPDATE*priv-15*")
        )
      BY All_Changes.dvc All_Changes.user
    | `drop_dm_object_name("All_Changes")`
    | rename dvc as dest
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `cisco_ios_suspicious_privileged_account_creation_filter`
how_to_implement: To implement this search, you need to be ingesting Cisco IOS logs with the sourcetype "cisco:ios" and have these logs mapped to the Change datamodel, with AAA accounting and command logging enabled on your Cisco devices.
known_false_positives: Legitimate account creation and privilege elevation activities by authorized administrators will generate alerts with this detection. To reduce false positives, consider implementing a baseline of expected administrative activities, including approved administrative usernames, typical times for account management, and authorized administrators who regularly perform these actions. You may also want to create a lookup table of approved administrative accounts and filter out alerts for these accounts. Additionally, scheduled maintenance windows should be taken into account when evaluating alerts.
references:
    - https://blog.talosintelligence.com/static-tundra/
    - https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20180328-smi2
    - https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/security/a1/sec-a1-cr-book/sec-cr-a2.html#wp3796044403
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A suspicious privileged account was created or modified on Cisco IOS device $dest$ by user $user$
        - field: user
          type: user
          score: 20
          message: A suspicious privileged account was created or modified on Cisco IOS device $dest$ by user $user$
threat_objects:
    - field: command
      type: command
analytic_story:
    - Cisco Smart Install Remote Code Execution CVE-2018-0171
asset_type: Network
cve:
    - CVE-2018-0171
mitre_attack_id:
    - 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`
    count
    values(All_Changes.command) as command
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Change.All_Changes
  WHERE (
      (All_Changes.command="*username * privilege 15*")
      OR (
          All_Changes.command="*username * password*"
          AND All_Changes.command="*USER TABLE MODIFIED*"
      )
      OR (All_Changes.command="*USER_PRIVILEGE_UPDATE*priv-15*")
  )
  BY All_Changes.dvc All_Changes.user

Stage 2: search

| `drop_dm_object_name("All_Changes")`

Stage 3: rename

| rename dvc as dest

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `cisco_ios_suspicious_privileged_account_creation_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
All_Changes.commandeq
  • *USER TABLE MODIFIED*
  • *USER_PRIVILEGE_UPDATE*priv-15*
  • *username * password*
  • *username * privilege 15*
field:"All_Changes.command" kind:eq

Cisco SA - Access to Anonymizer Services

#
Status
production
Severity
low
Group by
action, category, identity_type, sourcetype, src_external_ip, src_ip, user
Author
Mahamudul Chowdhury, Bhavin Patel, Splunk
Source
github.com/splunk/security_content

This analytic detects attempts to access proxy-evasion or anonymizer services using Cisco Secure Access DNS and secure web proxy telemetry. Users who reach anonymizer or proxy-evasion infrastructure are often trying to bypass corporate controls such as secure web gateway inspection, DLP monitoring, CASB visibility, and threat-detection systems. These services frequently establish encrypted tunnels that hide subsequent traffic from inspection. Early identification helps security teams spot circumvention attempts before potential data exfiltration or follow-on malicious activity. Correlating DNS resolution and proxy session data strengthens confidence that access was intentional.

Known False Positives

  • Security research, approved privacy tools, or mis-categorized destinations may appear as anonymizer traffic. Tune this analytic with the filter macro or allow-lists for known-good users, networks, and domains after validating business justification.

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

Rule Body

name: Cisco SA - Access to Anonymizer Services
id: a7c8613a-92e2-4232-b64d-bd39d33dee8b
version: 1
creation_date: '2026-05-06'
modification_date: '2026-06-09'
author: Mahamudul Chowdhury, Bhavin Patel, Splunk
status: production
type: Anomaly
description: |
    This analytic detects attempts to access proxy-evasion or anonymizer services using Cisco Secure Access DNS and secure web proxy telemetry.
    Users who reach anonymizer or proxy-evasion infrastructure are often trying to bypass corporate controls such as secure web gateway inspection, DLP monitoring, CASB visibility, and threat-detection systems. These services frequently establish encrypted tunnels that hide subsequent traffic from inspection.
    Early identification helps security teams spot circumvention attempts before potential data exfiltration or follow-on malicious activity. Correlating DNS resolution and proxy session data strengthens confidence that access was intentional.
data_source:
    - Cisco Secure Access DNS
search: |-
    `cisco_secure_access_dns`
    action = "allowed" category= "*anonymizer*"
    | fillnull
    | stats count min(_time) as firstTime max(_time) as lastTime values(domain) as domain values(query) as query values(reply_code) as reply_code values(record_type) as record_type by src_ip src_external_ip user identity_type action category sourcetype
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `cisco_sa___access_to_anonymizer_services_filter`
how_to_implement: |
    Ingest Cisco Secure Access DNS and proxy events into Splunk using the Splunk Add-on for Cisco Security Cloud (https://splunkbase.splunk.com/app/7404).
    Update the `cisco_secure_access_dns` macro so it resolves to the indexes, sources, and sourcetypes used in your environment.
known_false_positives: |
    Security research, approved privacy tools, or mis-categorized destinations may appear as anonymizer traffic. Tune this analytic with the filter macro or allow-lists for known-good users, networks, and domains after validating business justification.
references:
    - https://attack.mitre.org/techniques/T1090/003
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: User $user$ from $src_ip$ accessed proxy-evasion or anonymizer infrastructure (domains=$domain$, categories=$category$).
threat_objects:
    - field: domain
      type: domain
analytic_story:
    - Cisco Secure Access Analytics
asset_type: Endpoint
mitre_attack_id:
    - T1090.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: network
security_domain: network

Stages and Predicates

Stage 1: search

`cisco_secure_access_dns`
action = "allowed" category= "*anonymizer*"

Stage 2: fillnull

| fillnull

Stage 3: stats

| stats
    count
    min(_time) as firstTime
    max(_time) as lastTime
    values(domain) as domain
    values(query) as query
    values(reply_code) as reply_code
    values(record_type) as record_type
  by src_ip src_external_ip user identity_type action category sourcetype

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `cisco_sa___access_to_anonymizer_services_filter`

Indicators

These rows show field, operator, and value matches.

CVE-2022-30190: Microsoft Office Code Execution Vulnerability (Sysmon)

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

Aka: Follina. A remote code execution vulnerability exists when MSDT is called using the URL protocol from a calling application such as Word. An attacker who successfully exploits this vulnerability can run arbitrary code with the privileges of the calling application. The attacker can then install programs, view, change, or delete data, or create new accounts in the context allowed by the user’s rights

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '11170.15452'
title: 'CVE-2022-30190: Microsoft Office Code Execution Vulnerability'
description: 'Aka: Follina. A remote code execution vulnerability exists when MSDT
  is called using the URL protocol from a calling application such as Word. An attacker
  who successfully exploits this vulnerability can run arbitrary code with the privileges
  of the calling application. The attacker can then install programs, view, change,
  or delete data, or create new accounts in the context allowed by the user’s rights.
  - Threat Actor Association: APT28, GoldenJackal, RomCom, TA413 - Software Association:
  CrescentImp, Qakbot/Qbot'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  ("msdt.exe" OR TERM(msdt)) (("PCWDiagnostic" and ("ms-msdt:-id" OR "ms-msdt:/id"))
  OR "invoke" OR (TERM(Microsoft) TERM(Office)) OR TERM(WINWORD.EXE) OR TERM(EXCEL.EXE)
  OR TERM(POWERPNT.EXE) OR TERM(MSACCESS.EXE) OR TERM(OUTLOOK.EXE) OR TERM(VISIO.EXE)
  OR TERM(WINPROJ.EXE) OR TERM(wordpad.exe)) | table _time, host, user process, parent_*,
  process_*, signature_id | bin span=1s | stats values(*) as * by _time, host | where
  (match(process, "(?i)PCWDiagnostic|invoke") OR match(parent_process_path, "(?i)(Microsoft
  Office)|(WINWORD\.EXE)|(EXCEL\.EXE)|(POWERPNT\.EXE)|(MSACCESS\.EXE)|(OUTLOOK\.EXE)|(VISIO\.EXE)|(WINPROJ\.EXE)|(wordpad\.exe)"))
  and match(process_name, "(?i)msdt.exe") '
techniques:
- execution:user execution:malicious file
technique_id:
- T1204.002
data_category:
- Windows Sysmon
references:
- https://www.huntress.com/blog/microsoft-office-remote-code-execution-follina-msdt-bug
- https://doublepulsar.com/follina-a-microsoft-office-code-execution-vulnerability-1a47fce5629e

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") ("msdt.exe" OR TERM(msdt)) (("PCWDiagnostic" and ("ms-msdt:-id" OR "ms-msdt:/id")) OR "invoke" OR (TERM(Microsoft) TERM(Office)) OR TERM(WINWORD.EXE) OR TERM(EXCEL.EXE) OR TERM(POWERPNT.EXE) OR TERM(MSACCESS.EXE) OR TERM(OUTLOOK.EXE) OR TERM(VISIO.EXE) OR TERM(WINPROJ.EXE) OR TERM(wordpad.exe))

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Stage 5: where

| where (
    match(process, "(?i)PCWDiagnostic|invoke")
    OR match(parent_process_path, "(?i)(Microsoft Office)|(WINWORD\.EXE)|(EXCEL\.EXE)|(POWERPNT\.EXE)|(MSACCESS\.EXE)|(OUTLOOK\.EXE)|(VISIO\.EXE)|(WINPROJ\.EXE)|(wordpad\.exe)")
) and match(process_name, "(?i)msdt.exe")

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
parent_process_pathregex_match
    • (?i)(Microsoft Office)
    • (WINWORD.EXE)
    • (EXCEL.EXE)
    • (POWERPNT.EXE)
    • (MSACCESS.EXE)
    • (OUTLOOK.EXE)
    • (VISIO.EXE)
    • (WINPROJ.EXE)
    • (wordpad.exe)
    corpus 2 (splunk 2)
field:"parent_process_name" kind:regex_match
processregex_match
    • (?i)PCWDiagnostic
    • invoke
    corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match
process_nameregex_match
  • (?i)msdt.exe corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)msdt.exe"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1"msdt.exe"
1msdt
1"PCWDiagnostic"
1"ms-msdt:-id"
1"ms-msdt:/id"
1"invoke"
1Microsoft
1Office
1WINWORD.EXE
1EXCEL.EXE
1POWERPNT.EXE
1MSACCESS.EXE
1OUTLOOK.EXE
1VISIO.EXE
1WINPROJ.EXE
1wordpad.exe

Disabling Task Manager

#
Status
production
Severity
medium
Group by
TargetObject, computer_name, details, event_type, process_guid, process_id, registry_hive, registry_path, registry_status, registry_value_name, registry_value_type, user, vendor_product
Author
Teoderick Contreras, Splunk, Steven Dick
Source
github.com/splunk/security_content

The following analytic identifies modifications to the Windows registry that disable Task Manager. It leverages data from the Endpoint.Registry data model, specifically looking for changes to the registry path "*\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr" with a value of "0x00000001". This activity is significant as it is commonly associated with malware such as RATs, Trojans, and worms, which disable Task Manager to prevent users from terminating malicious processes. If confirmed malicious, this could allow attackers to maintain persistence and control over the infected system.

Known False Positives

  • admin may disable this application for non technical user.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

Rule Body

name: Disabling Task Manager
id: dac279bc-9202-11eb-b7fb-acde48001122
version: 16
creation_date: '2021-03-31'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk, Steven Dick
status: production
type: TTP
description: The following analytic identifies modifications to the Windows registry that disable Task Manager. It leverages data from the Endpoint.Registry data model, specifically looking for changes to the registry path "*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\DisableTaskMgr" with a value of "0x00000001". This activity is significant as it is commonly associated with malware such as RATs, Trojans, and worms, which disable Task Manager to prevent users from terminating malicious processes. If confirmed malicious, this could allow attackers to maintain persistence and control over the infected system.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry WHERE (Registry.registry_path= "*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\DisableTaskMgr" Registry.registry_value_data = "0x00000001") by Registry.action Registry.dest Registry.process_guid Registry.process_id Registry.registry_hive Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.registry_value_name Registry.registry_value_type Registry.status Registry.user Registry.vendor_product | `drop_dm_object_name(Registry)` | where isnotnull(registry_value_data) | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `disabling_task_manager_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting logs with the registry value name, registry path, and registry value data from your endpoints. If you are using Sysmon, you must have at least version 2.0 of the official Sysmon TA. https://splunkbase.splunk.com/app/5709
known_false_positives: admin may disable this application for non technical user.
references:
    - https://any.run/report/ea4ea08407d4ee72e009103a3b77e5a09412b722fdef67315ea63f22011152af/a866d7b1-c236-4f26-a391-5ae32213dfc4#registry
    - https://blog.talosintelligence.com/2020/05/threat-roundup-0424-0501.html
finding:
    title: The Windows Task Manager was disabled on $dest$ by $user$.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: The Windows Task Manager was disabled on $dest$ by $user$.
analytic_story:
    - Windows Defense Evasion Tactics
    - Windows Registry Abuse
    - NjRAT
asset_type: Endpoint
mitre_attack_id:
    - T1685
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.Registry
  WHERE (
      Registry.registry_path= "*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\DisableTaskMgr"
      Registry.registry_value_data = "0x00000001"
  )
  by
    Registry.action
    Registry.dest
    Registry.process_guid
    Registry.process_id
    Registry.registry_hive
    Registry.registry_path
    Registry.registry_key_name
    Registry.registry_value_data
    Registry.registry_value_name
    Registry.registry_value_type
    Registry.status
    Registry.user
    Registry.vendor_product

Stage 2: search

| `drop_dm_object_name(Registry)`

Stage 3: where

| where isnotnull(registry_value_data)

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `disabling_task_manager_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Registry.registry_patheq
  • *\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr
field:"registry_path" kind:eq value:"*\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr"
Registry.registry_value_dataeq
  • 0x00000001 corpus 61 (splunk 52, elastic 9)
field:"Details" kind:eq value:"0x00000001"
registry_value_datais_not_null
  • (no value, null check)
field:"Details" kind:is_not_null

ESXi Bulk VM Termination

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

This detection identifies when all virtual machines on an ESXi host are abruptly terminated, which may indicate malicious activity such as a deliberate denial-of-service, ransomware staging, or an attempt to destroy critical workloads.

Known False Positives

  • Limited false positives in most environments, however tune as needed.

MITRE ATT&CK Coverage

Rule Body

name: ESXi Bulk VM Termination
id: cfe094b4-0737-4a33-9d63-e0562ce2b883
version: 4
creation_date: '2025-07-11'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: TTP
description: This detection identifies when all virtual machines on an ESXi host are abruptly terminated, which may indicate malicious activity such as a deliberate denial-of-service, ransomware staging, or an attempt to destroy critical workloads.
data_source:
    - VMWare ESXi Syslog
search: '`esxi_syslog` | rex field=_raw "\s\[(?<user>[^\]]+)\]:\s(?<shell_command>.+)$" | rex field=_raw "Z (?<dest>[\w\.]+)\s.*:\s(?<esxicli_Command>esxcli\s.+)" | eval command=mvappend(esxicli_Command, shell_Command) | where isnotnull(command) | search (command="pkill -9 vmx-*") OR ( command="*esxcli*" AND command="*--format-param*" AND command="*vm process list*" AND command="*awk*" AND command="*esxcli vm process kill*") | stats min(_time) as firstTime max(_time) as lastTime values(_time) as timeStamp values(command) as commands values(user) as user by dest | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `esxi_bulk_vm_termination_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.
finding:
    title: Bulk VM termination activity on ESXi host $dest$.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - ESXi Post Compromise
    - Black Basta Ransomware
asset_type: Infrastructure
mitre_attack_id:
    - T1673
    - T1529
    - T1499
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`esxi_syslog`

Stage 2: rex

| rex field=_raw "\s\[(?<user>[^\]]+)\]:\s(?<shell_command>.+)$"

Stage 3: rex

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

Stage 4: eval

| eval command=mvappend(esxicli_Command, shell_Command)

Stage 5: where

| where isnotnull(command)

Stage 6: search

| search (command="pkill -9 vmx-*") OR (
    command="*esxcli*"
    AND command="*--format-param*"
    AND command="*vm process list*"
    AND command="*awk*"
    AND command="*esxcli vm process kill*"
)

Stage 7: stats

| stats
    min(_time) as firstTime
    max(_time) as lastTime
    values(_time) as timeStamp
    values(command) as commands
    values(user) as user
  by dest

Stage 8: search

| `security_content_ctime(firstTime)`

Stage 9: search

| `security_content_ctime(lastTime)`

Stage 10: search

| `esxi_bulk_vm_termination_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
commandeq
  • *--format-param*
  • *awk*
  • *esxcli vm process kill*
  • *esxcli*
  • *vm process list*
  • pkill -9 vmx-*
field:"command" kind:eq
commandis_not_null
  • (no value, null check)
field:"command" kind:is_not_null
sourcetypein
  • vmw-syslog corpus 23 (splunk 23)
  • vmware:esxlog* corpus 23 (splunk 23)
field:"sourcetype" kind:in

Executable File Written in Administrative SMB Share

#
Status
production
Severity
medium
Group by
ObjectType, SourcePort, access_mask, dest, relative_target_name, share_name, signature_id, src_ip, user
Author
Teoderick Contreras, Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic detects executable files (.exe, .dll, etc.) being written to Windows administrative SMB shares (Admin$, IPC$, C$). It leverages Windows Security Event Logs with EventCode 5145 to identify this activity. This behavior is significant as it is commonly used by tools like PsExec/PaExec for staging binaries before creating and starting services on remote endpoints, a technique often employed for lateral movement and remote code execution. If confirmed malicious, this activity could allow an attacker to execute arbitrary code remotely, potentially compromising additional systems within the network.

Known False Positives

  • System Administrators may use tools like PsExec for troubleshooting or administrations tasks. However, this will typically come only from certain users and certain systems that can be added to an allow list.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Executable File Written in Administrative SMB Share
id: f63c34fe-a435-11eb-935a-acde48001122
version: 14
creation_date: '2021-04-26'
modification_date: '2026-08-05'
author: Teoderick Contreras, Mauricio Velazco, Splunk
status: production
type: TTP
description: |-
    The following analytic detects executable files (.exe, .dll, etc.) being written to Windows administrative SMB shares (Admin$, IPC$, C$). It leverages Windows Security Event Logs with EventCode 5145 to identify this activity.
    This behavior is significant as it is commonly used by tools like PsExec/PaExec for staging binaries before creating and starting services on remote endpoints, a technique often employed for lateral movement and remote code execution.
    If confirmed malicious, this activity could allow an attacker to execute arbitrary code remotely, potentially compromising additional systems within the network.
data_source:
    - Windows Event Log Security 5145
search: |-
    `wineventlog_security`
    EventCode=5145
    RelativeTargetName IN (
        "*.cpl",
        "*.dll",
        "*.exe",
        "*.sys"
    )
    ObjectType=File
    ShareName IN (
        "\\\\*\\Admin$",
        "\\\\*\\C$",
        "\\\\*\\IPC$"
    )

    | eval AccessMask_ = tonumber(AccessMask, 16)
    | where (bit_and(AccessMask_, 2) != 0) OR (bit_and(AccessMask_, 4) != 0)

    | stats min(_time) as firstTime
            max(_time) as lastTime count

      by EventCode ShareName RelativeTargetName ObjectType
         AccessMask src_user src_port IpAddress dest

    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `executable_file_written_in_administrative_smb_share_filter`
how_to_implement: |-
    To successfully implement this search, you need to be ingesting Windows Security Event Logs with 5145 EventCode enabled. The Windows TA is also required. Also enable the object Audit access success/failure in your group policy.
known_false_positives: |-
    System Administrators may use tools like PsExec for troubleshooting or administrations tasks. However, this will typically come only from certain users and certain systems that can be added to an allow list.
references:
    - https://attack.mitre.org/techniques/T1021/002/
    - https://www.rapid7.com/blog/post/2013/03/09/psexec-demystified/
    - https://labs.vipre.com/trickbot-and-its-modules/
    - https://whitehat.eu/incident-response-case-study-featuring-ryuk-and-trickbot-part-2/
    - https://thedfirreport.com/2023/05/22/icedid-macro-ends-in-nokoyawa-ransomware/
    - https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/auditing/event-5145#table-of-file-access-codes
finding:
    title: The [$src_user$] dropped or created an executable file in known sensitive SMB share. Share name=[$ShareName$], Target name=[$RelativeTargetName$], and Access mask=[$AccessMask$]
    entity:
        field: src_user
        type: user
        score: 50
analytic_story:
    - Active Directory Lateral Movement
    - BlackSuit Ransomware
    - IcedID
    - Prestige Ransomware
    - Industroyer2
    - Data Destruction
    - Graceful Wipe Out Attack
    - Compromised Windows Host
    - Hermetic Wiper
    - Trickbot
    - VanHelsing Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1021.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security`
EventCode=5145
RelativeTargetName IN (
    "*.cpl",
    "*.dll",
    "*.exe",
    "*.sys"
)
ObjectType=File
ShareName IN (
    "\\\\*\\Admin$",
    "\\\\*\\C$",
    "\\\\*\\IPC$"
)

Stage 2: eval

| eval AccessMask_ = tonumber(AccessMask, 16)

Stage 3: where

| where (bit_and(AccessMask_, 2) != 0) OR (bit_and(AccessMask_, 4) != 0)

Stage 4: stats

| stats min(_time) as firstTime
        max(_time) as lastTime count

  by EventCode ShareName RelativeTargetName ObjectType
     AccessMask src_user src_port IpAddress dest

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `executable_file_written_in_administrative_smb_share_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
AccessMask_eq
  • 2 transforms: binary_and_any corpus 2 (splunk 2)
  • 4 transforms: binary_and_any corpus 2 (splunk 2)
field:"AccessMask_" kind:eq
EventCodeeq
  • 5145 corpus 19 (splunk 17, elastic 2)
field:"EventID" kind:eq value:"5145"
ObjectTypeeq
  • File corpus 12 (sigma 8, splunk 4)
field:"ObjectType" kind:eq value:"File"
RelativeTargetNamein
  • *.cpl
  • *.dll
  • *.exe
  • *.sys
field:"RelativeTargetName" kind:in
ShareNamein
  • \\*\Admin$ corpus 3 (splunk 3)
  • \\*\C$ corpus 3 (splunk 3)
  • \\*\IPC$ corpus 3 (splunk 3)
field:"ShareName" kind:in

GPUpdate with no Command Line Arguments with Network

#
Status
production
Severity
medium
Group by
IntegrityLevel, command_line, computer_name, dest, 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 the execution of gpupdate.exe without command line arguments and with an active network connection. This behavior is identified using Endpoint Detection and Response (EDR) telemetry, focusing on process execution and network traffic data. It is significant because gpupdate.exe typically runs with specific arguments, and its execution without them, especially with network activity, is often associated with malicious software like Cobalt Strike. If confirmed malicious, this activity could indicate an attacker leveraging gpupdate.exe for lateral movement, command and control, or other nefarious purposes, potentially leading to system compromise.

Known False Positives

  • Limited false positives may be present in small environments. Tuning may be required based on parent process.

MITRE ATT&CK Coverage

TacticTechniques
Privilege Escalation
Stealth

Telemetry Coverage

Rule Body

name: GPUpdate with no Command Line Arguments with Network
id: 2c853856-a140-11eb-a5b5-acde48001122
version: 16
creation_date: '2021-04-19'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects the execution of gpupdate.exe without command line arguments and with an active network connection. This behavior is identified using Endpoint Detection and Response (EDR) telemetry, focusing on process execution and network traffic data. It is significant because gpupdate.exe typically runs with specific arguments, and its execution without them, especially with network activity, is often associated with malicious software like Cobalt Strike. If confirmed malicious, this activity could indicate an attacker leveraging gpupdate.exe for lateral movement, command and control, or other nefarious purposes, potentially leading to system compromise.
data_source:
    - Sysmon EventID 1 AND Sysmon EventID 3
search: |-
    | tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Processes
      WHERE Processes.process_name=gpupdate.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)`
    | regex process="(?i)(gpupdate\.exe.{0,4}$)"
    | join process_id dest [
    | tstats `security_content_summariesonly` count values(All_Traffic.app) as app values(All_Traffic.dest_ip) as dest_ip values(All_Traffic.direction) as direction values(All_Traffic.dvc) as dvc values(All_Traffic.protocol) as protocol values(All_Traffic.protocol_version) as protocol_version values(All_Traffic.src) as src values(All_Traffic.src_ip) as src_ip values(All_Traffic.src_port) as src_port values(All_Traffic.transport) as transport FROM datamodel=Network_Traffic.All_Traffic
      WHERE All_Traffic.dest_port != 0
      BY All_Traffic.process_id All_Traffic.src All_Traffic.dest All_Traffic.dest_port
    | `drop_dm_object_name(All_Traffic)`
    | rename dest as C2
    | rename src as dest ]
    | table _time user dest parent_process_name process_name process_path process process_id dest_port C2 app dest_ip direction dvc protocol protocol_version src src_ip src_port transport
    | `gpupdate_with_no_command_line_arguments_with_network_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: Limited false positives may be present in small environments. Tuning may be required based on parent process.
references:
    - https://raw.githubusercontent.com/xx0hcd/Malleable-C2-Profiles/0ef8cf4556e26f6d4190c56ba697c2159faa5822/crimeware/trick_ryuk.profile
    - https://www.cobaltstrike.com/blog/learn-pipe-fitting-for-all-of-your-offense-projects/
finding:
    title: Process gpupdate.exe with parent_process $parent_process_name$ is executed on $dest$ by user $user$, followed by an outbound network connection on port $dest_port$. This behaviour is seen with cobaltstrike.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: Process gpupdate.exe with parent_process $parent_process_name$ is executed on $dest$ by user $user$, followed by an outbound network connection on port $dest_port$. This behaviour is seen with cobaltstrike.
threat_objects:
    - field: parent_process_name
      type: parent_process_name
analytic_story:
    - Graceful Wipe Out Attack
    - Cobalt Strike
    - Compromised Windows Host
    - BlackByte Ransomware
    - Hellcat Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1055
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.Processes
  WHERE Processes.process_name=gpupdate.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: regex

| regex process="(?i)(gpupdate\.exe.{0,4}$)"

Stage 6: join

| join process_id dest [
    | tstats `security_content_summariesonly`
        count
        values(All_Traffic.app) as app
        values(All_Traffic.dest_ip) as dest_ip
        values(All_Traffic.direction) as direction
        values(All_Traffic.dvc) as dvc
        values(All_Traffic.protocol) as protocol
        values(All_Traffic.protocol_version) as protocol_version
        values(All_Traffic.src) as src
        values(All_Traffic.src_ip) as src_ip
        values(All_Traffic.src_port) as src_port
        values(All_Traffic.transport) as transport
      FROM datamodel=Network_Traffic.All_Traffic
      WHERE All_Traffic.dest_port != 0
      BY All_Traffic.process_id All_Traffic.src All_Traffic.dest All_Traffic.dest_port
    | `drop_dm_object_name(All_Traffic)`
    | rename dest as C2
    | rename src as dest
]

Stage 7: table

| table _time user dest parent_process_name process_name process_path process process_id dest_port
    C2 app dest_ip direction dvc protocol protocol_version src src_ip src_port transport

Stage 8: search

| `gpupdate_with_no_command_line_arguments_with_network_filter`

Indicators

These rows show field, operator, and value matches.

O365 Application Registration Owner Added

#
Status
production
Severity
medium
Group by
app_displayName, app_id, aws::recipientAccountId, dest, group.name, signature, src, user, vendor_product
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic identifies instances where a new owner is assigned to an application registration within an Azure AD and Office 365 tenant. It leverages O365 audit logs, specifically events related to changes in owner assignments within the AzureActiveDirectory workload. This activity is significant because assigning a new owner to an application registration can grant significant control over the application's configuration, permissions, and behavior. If confirmed malicious, an attacker could modify the application's settings, permissions, and behavior, leading to unauthorized data access, privilege escalation, or the introduction of malicious behavior within the application's operations.

Known False Positives

  • Application owners may be added for legitimate reasons, filter as needed.

MITRE ATT&CK Coverage

TacticTechniques
Persistence
Privilege Escalation

Telemetry Coverage

PlatformRecord / event type
Microsoft 365Add owner to application.

Rule Body

name: O365 Application Registration Owner Added
id: c068d53f-6aaa-4558-8011-3734df878266
version: 9
creation_date: '2023-12-06'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic identifies instances where a new owner is assigned to an application registration within an Azure AD and Office 365 tenant. It leverages O365 audit logs, specifically events related to changes in owner assignments within the AzureActiveDirectory workload. This activity is significant because assigning a new owner to an application registration can grant significant control over the application's configuration, permissions, and behavior. If confirmed malicious, an attacker could modify the application's settings, permissions, and behavior, leading to unauthorized data access, privilege escalation, or the introduction of malicious behavior within the application's operations.
data_source:
    - O365 Add owner to application.
search: "`o365_management_activity` Workload=AzureActiveDirectory Operation=\"Add owner to application.\" | eval app_id=mvindex('ModifiedProperties{}.NewValue', 0) | eval app_displayName=mvindex('ModifiedProperties{}.NewValue', 1) | fillnull | stats count min(_time) as firstTime max(_time) as lastTime by signature dest user src vendor_account vendor_product app_id app_displayName object | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `o365_application_registration_owner_added_filter`"
how_to_implement: You must install the Splunk Microsoft Office 365 Add-on and ingest Office 365 management activity events.
known_false_positives: Application owners may be added for legitimate reasons, filter as needed.
references:
    - https://attack.mitre.org/techniques/T1098/
    - https://learn.microsoft.com/en-us/azure/active-directory/manage-apps/overview-assign-app-owners
finding:
    title: Application registration $app_displayName$ was assigned a new owner $object$
    entity:
        field: user
        type: user
        score: 50
analytic_story:
    - Office 365 Persistence Mechanisms
    - NOBELIUM Group
asset_type: O365 Tenant
mitre_attack_id:
    - T1098
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: identity

Stages and Predicates

Stage 1: search

`o365_management_activity` Workload=AzureActiveDirectory Operation="Add owner to application."

Stage 2: eval

| eval app_id=mvindex('ModifiedProperties{}.NewValue', 0)

Stage 3: eval

| eval app_displayName=mvindex('ModifiedProperties{}.NewValue', 1)

Stage 4: fillnull

| fillnull

Stage 5: stats

| stats
    count
    min(_time) as firstTime
    max(_time) as lastTime
  by signature dest user src vendor_account vendor_product app_id app_displayName object

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `o365_application_registration_owner_added_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Operationeq
  • Add owner to application.
field:"Operation" kind:eq value:"Add owner to application."
Workloadeq
  • AzureActiveDirectory corpus 30 (splunk 30)
field:"Workload" kind:eq value:"AzureActiveDirectory"
sourcetypeeq
  • o365:management:activity corpus 80 (splunk 80)
field:"sourcetype" kind:eq value:"o365:management:activity"

O365 Multiple Users Failing To Authenticate From Ip

#
Status
production
Severity
medium
Group by
_time, aws::recipientAccountId, src, vendor_product
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic identifies instances where more than 10 unique user accounts fail to authenticate from a single IP address within a 5-minute window. This detection leverages O365 audit logs, specifically Azure Active Directory login failures (AzureActiveDirectoryStsLogon). Such activity is significant as it may indicate brute-force attacks or password spraying attempts. If confirmed malicious, this behavior suggests an external entity is attempting to breach security by targeting multiple accounts, potentially leading to unauthorized access. Immediate action is required to block or monitor the suspicious IP and notify affected users to enhance their security measures.

Known False Positives

  • A source Ip failing to authenticate with multiple users in a short period of time is not common legitimate behavior.

MITRE ATT&CK Coverage

Telemetry Coverage

PlatformRecord / event type
Microsoft 365UserLoginFailed

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: O365 Multiple Users Failing To Authenticate From Ip
id: 8d486e2e-3235-4cfe-ac35-0d042e24ecb4
version: 13
creation_date: '2023-12-06'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic identifies instances where more than 10 unique user accounts fail to authenticate from a single IP address within a 5-minute window. This detection leverages O365 audit logs, specifically Azure Active Directory login failures (AzureActiveDirectoryStsLogon). Such activity is significant as it may indicate brute-force attacks or password spraying attempts. If confirmed malicious, this behavior suggests an external entity is attempting to breach security by targeting multiple accounts, potentially leading to unauthorized access. Immediate action is required to block or monitor the suspicious IP and notify affected users to enhance their security measures.
data_source:
    - O365 UserLoginFailed
search: |-
    `o365_management_activity` Workload=AzureActiveDirectory Operation=UserLoginFailed ErrorNumber=50126
      | bucket span=5m _time
      | fillnull
      | stats dc(user) as unique_accounts values(user) as user values(LogonError) as LogonError values(signature) as signature values(UserAgent) as user_agent values(dest) as dest
        BY _time src vendor_account
           vendor_product
      | where unique_accounts > 10
      | `o365_multiple_users_failing_to_authenticate_from_ip_filter`
how_to_implement: You must install the Splunk Microsoft Office 365 Add-on and ingest Office 365 management activity events.
known_false_positives: A source Ip failing to authenticate with multiple users in a short period of time is not common legitimate behavior.
references:
    - https://attack.mitre.org/techniques/T1110/003/
    - https://docs.microsoft.com/en-us/security/compass/incident-response-playbook-password-spray
    - https://www.cisa.gov/uscert/ncas/alerts/aa21-008a
    - https://docs.microsoft.com/azure/active-directory/reports-monitoring/reference-sign-ins-error-codes
finding:
    title: Source Ip $src$ failed to authenticate with 20 users within 5 minutes.
    entity:
        field: user
        type: user
        score: 50
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - Office 365 Account Takeover
    - NOBELIUM Group
asset_type: O365 Tenant
mitre_attack_id:
    - T1110.003
    - T1110.004
    - T1586.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: identity

Stages and Predicates

Stage 1: search

`o365_management_activity` Workload=AzureActiveDirectory Operation=UserLoginFailed ErrorNumber=50126

Stage 2: bucket

| bucket span=5m _time

Stage 3: fillnull

| fillnull

Stage 4: stats

| stats
    dc(user) as unique_accounts
    values(user) as user
    values(LogonError) as LogonError
    values(signature) as signature
    values(UserAgent) as user_agent
    values(dest) as dest
  BY _time src vendor_account
       vendor_product

Stage 5: where

| where unique_accounts > 10

Stage 6: search

| `o365_multiple_users_failing_to_authenticate_from_ip_filter`

Indicators

These rows show field, operator, and value matches.

Process Creation Using Sysnative Folder (Windows Event Log)

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

Threat actors may use tools spawning processes from the Sysnative folder in an attempt to bypass the File System Redirector on 64-bit versions of Windows to execute 32-bit applications from the 64-bit system directory. This use cased detects instances where the Sysnative folder is used during process creation, a tactic often associated with CobaltStrike activities. Note: Sysnative is often referenced by legitimate processes. Allowlisting known processes is recommended to reduce false positives.

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '23146.42110'
title: Process Creation Using Sysnative Folder
description: 'Threat actors may use tools spawning processes from the Sysnative folder
  in an attempt to bypass the File System Redirector on 64-bit versions of Windows
  to execute 32-bit applications from the 64-bit system directory. This use cased
  detects instances where the Sysnative folder is used during process creation, a
  tactic often associated with CobaltStrike activities. Note: Sysnative is often referenced
  by legitimate processes. Allowlisting known processes is recommended to reduce false
  positives.'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) "Sysnative" | regex process="(?i)^[A-Z]:\x5cWindows\x5cSysnative\x5c"
  | table _time, host, user, parent_process_name, process | bin span=1s | stats values(*)
  as * by _time, host '
techniques: 
- defense-evasion:system binary proxy execution
technique_id:
- T1218
data_category:
- Process command-line parameters
- Windows event logs
references:
- https://thedfirreport.com/2021/08/29/cobalt-strike-a-defenders-guide/
- https://learn.microsoft.com/sv-se/windows/win32/winprog64/file-system-redirector

Stages and Predicates

Stage 1: search

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

Stage 2: regex

| regex process="(?i)^[A-Z]:\x5cWindows\x5cSysnative\x5c"

Stage 3: table

| table _time, host, user, parent_process_name, 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
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
processregex_match
  • (?i)^[A-Z]:\x5cWindows\x5cSysnative\x5c corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match value:"(?i)^[A-Z]:\x5cWindows\x5cSysnative\x5c"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"Sysnative"

Python Network Traffic During Package Build

#
Status
production
Severity
low
Group by
channel, dest, process_id
Author
Onur Mustafa Erdogan, Splunk
Source
github.com/splunk/security_content

The following analytic detects a Python process making an outbound network connection during package installation. Adversaries can abuse setup.py build scripts by leveraging distutils/setuptools command classes to execute arbitrary code, including network beacons to third-party domains, the moment a malicious Python package is installed. This activity is significant because it allows adversaries to establish a foothold or exfiltrate data without any direct interaction from the victim beyond running pip install. If confirmed malicious, this could indicate a successful software supply chain compromise.

Known False Positives

  • Python packages may contact software repositories, mirror sites during build time. Investigate the destination and package content to determine legitimacy.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Python Network Traffic During Package Build
id: 03c9c504-2294-44da-8180-beefe1ca8ba8
version: 1
creation_date: '2026-08-21'
modification_date: '2026-08-21'
author: Onur Mustafa Erdogan, Splunk
status: production
type: Anomaly
description: |-
    The following analytic detects a Python process making an outbound network connection during package installation.
    Adversaries can abuse `setup.py` build scripts by leveraging `distutils`/`setuptools` command classes to execute arbitrary code, including network beacons to third-party domains, the moment a malicious Python package is installed.
    This activity is significant because it allows adversaries to establish a foothold or exfiltrate data without any direct interaction from the victim beyond running `pip install`.
    If confirmed malicious, this could indicate a successful software supply chain compromise.
data_source:
    - Sysmon EventID 1 AND Sysmon EventID 3
search: |-
    `sysmon`
    (
        EventID=1
        (
            process="*_in_process.py*"
            OR
            process_name=python.exe
        )
    )
    OR
    (
        EventID=3
        dest_ip!=""
        process_name=python.exe
    )

    | eval dest=if(EventID=3, Computer, dest)

    | stats count min(_time) as firstTime
                  max(_time) as lastTime
                  values(parent_process_id) as parent_process_id
                  values(parent_process_path) as parent_process_path
                  values(parent_process_name) as parent_process_name
                  values(parent_process) as parent_process
                  values(process_path) as process_path
                  values(process_name) as process_name
                  values(process) as process
                  values(dest_ip) as dest_ip
                  values(dest_host) as dest_host

      by dest source process_id

    | search process="* build_wheel*" dest_ip=*

    | table firstTime lastTime
            parent_process_id parent_process_path parent_process_name parent_process
            process_id process_path process_name process
            dest_ip dest_host
            dest source

    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `python_network_traffic_during_package_build_filter`
how_to_implement: |-
    The detection is based on data that originates from Sysmon. To implement this search, you must ingest logs
    with process creation (EventID 1) and network connection (EventID 3) events, mapped via the appropriate
    Splunk Technology Add-on. Use the Splunk Common Information Model (CIM) to normalize the field names.
known_false_positives: |-
    Python packages may contact software repositories, mirror sites during build time.
    Investigate the destination and package content to determine legitimacy.
references:
    - https://blog.talosintelligence.com/the-serpents-tongue-luring-the-python-out-of-its-den/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A Python process [$process$] on [$dest$] made an outbound network connection to [$dest_ip$] with hostname [$dest_host$] during package installation.
threat_objects:
    - field: process
      type: process
    - field: dest_ip
      type: ip_address
    - field: dest_host
      type: domain
analytic_story:
    - Malicious Python Package Installation
    - Ingress Tool Transfer
    - Command And Control
    - Compromised Windows Host
asset_type: Endpoint
mitre_attack_id:
    - T1195.002
    - T1059.006
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon`
(
    EventID=1
    (
        process="*_in_process.py*"
        OR
        process_name=python.exe
    )
)
OR
(
    EventID=3
    dest_ip!=""
    process_name=python.exe
)

Stage 2: eval

| eval dest=if(EventID=3, Computer, dest)
dest =
ifEventID = 3Computer
elsedest

Stage 3: stats

| stats count min(_time) as firstTime
              max(_time) as lastTime
              values(parent_process_id) as parent_process_id
              values(parent_process_path) as parent_process_path
              values(parent_process_name) as parent_process_name
              values(parent_process) as parent_process
              values(process_path) as process_path
              values(process_name) as process_name
              values(process) as process
              values(dest_ip) as dest_ip
              values(dest_host) as dest_host

  by dest source process_id

Stage 4: search

| search process="* build_wheel*" dest_ip=*

Stage 5: table

| table firstTime lastTime
        parent_process_id parent_process_path parent_process_name parent_process
        process_id process_path process_name process
        dest_ip dest_host
        dest source

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `python_network_traffic_during_package_build_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventIDeq
  • 1 corpus 226 (splunk 226)
  • 3 corpus 15 (splunk 15)
field:"EventID" kind:eq
dest_ipeq
  • * corpus 2 (splunk 2)
field:"dest_ip" kind:eq value:"*"
processeq
  • * build_wheel*
  • *_in_process.py*
field:"CommandLine" kind:eq
process_nameeq
  • python.exe corpus 2 (splunk 2)
field:"process_name" kind:eq value:"python.exe"

Rare executable from Microsoft Office (Windows Event Log)

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

This use case looks for suspicious behavior from Microsoft office products. Filters for rarer executable files launched from a Microsoft Office product

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '11211.15636'
title: Rare executable from Microsoft Office
description: 'This use case looks for suspicious behavior from Microsoft office products.
  Filters for rarer executable files launched from a Microsoft Office product. - Threat
  Actor Association: Evilnum - Software Association: GlowSand.'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) ((TERM(Microsoft) TERM(Office)) OR TERM(WINWORD.EXE)
  OR TERM(EXCEL.EXE) OR TERM(POWERPNT.EXE) OR TERM(MSACCESS.EXE) OR TERM(OUTLOOK.EXE)
  OR TERM(VISIO.EXE) OR TERM(WINPROJ.EXE) OR TERM(wordpad.exe))| regex parent_process_name="(?i)((WINWORD\.EXE)|(EXCEL\.EXE)|(POWERPNT\.EXE)|(MSACCESS\.EXE)|(OUTLOOK\.EXE)|(VISIO\.EXE)|(WINPROJ\.EXE)|(wordpad\.exe)|(Microsoft\s+Office))"
  | table _time, host, user process, parent_*, process_*, signature_id | bin span=1s
  | stats values(*) as * by _time, host | eventstats c(process_name) as c_process
  by process_name| where c_process < 3 '
techniques:
- execution:user execution:malicious file
technique_id:
- T1204.002
data_category:
- Windows event logs
references:
- https://borncity.com/win/2022/06/02/searchnightmare-windows-10-search-ms-uri-handler-0-day-exploit-mit-office-2019/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) ((TERM(Microsoft) TERM(Office)) OR TERM(WINWORD.EXE) OR TERM(EXCEL.EXE) OR TERM(POWERPNT.EXE) OR TERM(MSACCESS.EXE) OR TERM(OUTLOOK.EXE) OR TERM(VISIO.EXE) OR TERM(WINPROJ.EXE) OR TERM(wordpad.exe))

Stage 2: regex

| regex
    parent_process_name="(?i)((WINWORD\.EXE)|(EXCEL\.EXE)|(POWERPNT\.EXE)|(MSACCESS\.EXE)|(OUTLOOK\.EXE)|(VISIO\.EXE)|(WINPROJ\.EXE)|(wordpad\.exe)|(Microsoft\s+Office))"

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Stage 6: eventstats

| eventstats c(process_name) as c_process by process_name

Stage 7: where

| where c_process < 3

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
c_processlt
  • 3 corpus 6 (splunk 6)
field:"c_process" kind:lt value:"3"
parent_process_nameregex_match
  • (?i)((WINWORD.EXE)|(EXCEL.EXE)|(POWERPNT.EXE)|(MSACCESS.EXE)|(OUTLOOK.EXE)|(VISIO.EXE)|(WINPROJ.EXE)|(wordpad.exe)|(Microsoft\s+Office)) corpus 2 (splunk 2)
field:"parent_process_name" kind:regex_match value:"(?i)((WINWORD.EXE)|(EXCEL.EXE)|(POWERPNT.EXE)|(MSACCESS.EXE)|(OUTLOOK.EXE)|(VISIO.EXE)|(WINPROJ.EXE)|(wordpad.exe)|(Microsoft\s+Office))"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1Microsoft
1Office
1WINWORD.EXE
1EXCEL.EXE
1POWERPNT.EXE
1MSACCESS.EXE
1OUTLOOK.EXE
1VISIO.EXE
1WINPROJ.EXE
1wordpad.exe

Windows AD Dangerous Deny ACL Modification

#
Status
production
Severity
medium
Group by
LogonId, ObjectClass, ObjectDN, OpCorrelationID, _time, user
Author
Dean Luxton
Source
github.com/splunk/security_content

This detection identifies an Active Directory access-control list (ACL) modification event, which applies permissions that deny the ability to enumerate permissions of the object.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows AD Dangerous Deny ACL Modification
id: 8e897153-2ebd-4cb2-85d3-09ad57db2fb7
version: 10
creation_date: '2024-07-01'
modification_date: '2026-05-13'
author: Dean Luxton
status: production
type: TTP
description: This detection identifies an Active Directory access-control list (ACL) modification event, which applies permissions that deny the ability to enumerate permissions of the object.
data_source:
    - Windows Event Log Security 5136
search: '`wineventlog_security` EventCode=5136 | stats min(_time) as _time values(eval(if(OperationType=="%%14675",AttributeValue,null))) as old_value values(eval(if(OperationType=="%%14674",AttributeValue,null))) as new_value values(OperationType) as OperationType values(dest) as dest by ObjectClass ObjectDN OpCorrelationID src_user SubjectLogonId  | rex field=old_value max_match=10000 "\((?P<old_values>.*?)\)"  | rex field=new_value max_match=10000 "\((?P<new_ace>.*?)\)"  | mvexpand new_ace  | where NOT new_ace IN (old_values)  | rex field=new_ace "(?P<aceType>.*?);(?P<aceFlags>.*?);(?P<aceAccessRights>.*?);(?P<aceObjectGuid>.*?);(?P<aceInheritedTypeGuid>.*?);(?P<aceSid>.*?)$"  | rex max_match=100 field=aceAccessRights "(?P<AccessRights>[A-Z]{2})"  | rex max_match=100 field=aceFlags "(?P<aceFlags>[A-Z]{2})"  | lookup msad_guid_lookup guid as aceObjectGuid OUTPUT displayName as ControlAccessRights  | lookup ace_access_rights_lookup access_rights_string as AccessRights OUTPUT access_rights_value  | lookup ace_type_lookup ace_type_string as aceType OUTPUT ace_type_value as aceType | lookup ace_flag_lookup flag_string as aceFlags OUTPUT flag_value as ace_flag_value ``` Optional SID resolution lookups | lookup identity_lookup_expanded objectSid as aceSid OUTPUT downLevelDomainName as user  | lookup admon_groups_def objectSid as aceSid OUTPUT cn as group ``` | lookup builtin_groups_lookup builtin_group_string  as aceSid OUTPUT builtin_group_name as builtin_group | eval aceType=coalesce(ace_type_value,aceType), aceFlags=coalesce(ace_flag_value,"This object only"), aceAccessRights=if(aceAccessRights="CCDCLCSWRPWPDTLOCRSDRCWDWO","Full control",coalesce(access_rights_value,AccessRights)), aceControlAccessRights=coalesce(ControlAccessRights,aceObjectGuid), user=coalesce(user, group, builtin_group, aceSid) | stats values(aceType) as aceType values(aceFlags) as aceFlags values(aceControlAccessRights) as aceControlAccessRights values(aceAccessRights) as aceAccessRights values(new_ace) as new_ace values(aceInheritedTypeGuid) as aceInheritedTypeGuid by _time ObjectClass ObjectDN src_user SubjectLogonId user OpCorrelationID | eval aceControlAccessRights=if(mvcount(aceControlAccessRights)=1 AND aceControlAccessRights="","All rights",''aceControlAccessRights'') | search aceType IN ("Access denied",D) AND aceAccessRights IN ("Full control","Read permissions",RC) | `windows_ad_dangerous_deny_acl_modification_filter`'
how_to_implement: Ensure you are ingesting Active Directory audit logs - specifically event 5136. See lantern article in references for further on how to onboard AD audit data. Ensure the wineventlog_security macro is configured with the correct indexes and include lookups for SID resolution if evt_resolve_ad_obj is set to 0.
known_false_positives: No false positives have been identified at this time.
references:
    - https://happycamper84.medium.com/sneaky-persistence-via-hidden-objects-in-ad-1c91fc37bf54
    - https://www.youtube.com/watch?v=_nGpZ1ydzS8
    - https://lantern.splunk.com/Security/Product_Tips/Enterprise_Security/Enabling_an_audit_trail_from_Active_Directory
finding:
    title: $src_user$ has added ACL rights to deny $user$ $aceControlAccessRights$ $aceAccessRights$ to $ObjectDN$
    entity:
        field: src_user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 50
          message: $src_user$ has added ACL rights to deny $user$ $aceControlAccessRights$ $aceAccessRights$ to $ObjectDN$
analytic_story:
    - Sneaky Active Directory Persistence Tricks
asset_type: Endpoint
mitre_attack_id:
    - T1222.001
    - T1484
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security` EventCode=5136

Stage 2: stats

| stats
    min(_time) as _time
    values(eval(if(OperationType=="%%14675",AttributeValue,null))) as old_value
    values(eval(if(OperationType=="%%14674",AttributeValue,null))) as new_value
    values(OperationType) as OperationType
    values(dest) as dest
  by ObjectClass ObjectDN OpCorrelationID src_user SubjectLogonId

Stage 3: rex

| rex field=old_value max_match=10000 "\((?P<old_values>.*?)\)"

Stage 4: rex

| rex field=new_value max_match=10000 "\((?P<new_ace>.*?)\)"

Stage 5: mvexpand

| mvexpand new_ace

Stage 6: where

| where NOT new_ace IN (old_values)

Stage 7: rex

| rex field=new_ace
    "(?P<aceType>.*?);(?P<aceFlags>.*?);(?P<aceAccessRights>.*?);(?P<aceObjectGuid>.*?);(?P<aceInheritedTypeGuid>.*?);(?P<aceSid>.*?)$"

Stage 8: rex

| rex max_match=100 field=aceAccessRights "(?P<AccessRights>[A-Z]{2})"

Stage 9: rex

| rex max_match=100 field=aceFlags "(?P<aceFlags>[A-Z]{2})"

Stage 10: lookup

| lookup msad_guid_lookup guid as aceObjectGuid OUTPUT displayName as ControlAccessRights
Lookup table
msad_guid_lookup
Key field
guid as aceObjectGuid
Output columns
['displayName', 'ControlAccessRights']

Stage 11: lookup

| lookup ace_access_rights_lookup access_rights_string as AccessRights OUTPUT access_rights_value
Lookup table
ace_access_rights_lookup
Key field
access_rights_string as AccessRights
Output columns
['access_rights_value', 'access_rights_value']

Stage 12: lookup

| lookup ace_type_lookup ace_type_string as aceType OUTPUT ace_type_value as aceType
Lookup table
ace_type_lookup
Key field
ace_type_string as aceType
Output columns
['ace_type_value', 'aceType']

Stage 13: lookup

| lookup ace_flag_lookup flag_string as aceFlags OUTPUT flag_value as ace_flag_value
Lookup table
ace_flag_lookup
Key field
flag_string as aceFlags
Output columns
['flag_value', 'ace_flag_value']

Stage 14: lookup

| lookup builtin_groups_lookup builtin_group_string  as aceSid OUTPUT
    builtin_group_name as builtin_group
Lookup table
builtin_groups_lookup
Key field
builtin_group_string as aceSid
Output columns
['builtin_group_name', 'builtin_group']

Stage 15: eval

| eval aceType=coalesce(ace_type_value,aceType),
    aceFlags=coalesce(ace_flag_value,"This object only"),
    aceAccessRights=if(
        aceAccessRights="CCDCLCSWRPWPDTLOCRSDRCWDWO",
        "Full control",
        coalesce(access_rights_value,AccessRights)
    ),
    aceControlAccessRights=coalesce(ControlAccessRights,aceObjectGuid),
    user=coalesce(user, group, builtin_group, aceSid)

Stage 16: stats

| stats
    values(aceType) as aceType
    values(aceFlags) as aceFlags
    values(aceControlAccessRights) as aceControlAccessRights
    values(aceAccessRights) as aceAccessRights
    values(new_ace) as new_ace
    values(aceInheritedTypeGuid) as aceInheritedTypeGuid
  by _time ObjectClass ObjectDN src_user SubjectLogonId user OpCorrelationID

Stage 17: eval

| eval
    aceControlAccessRights=if(
        mvcount(aceControlAccessRights)=1 AND aceControlAccessRights="",
        "All rights",
        'aceControlAccessRights'
    )
aceControlAccessRights =
ifmvcount(aceControlAccessRights) = 1 AND aceControlAccessRights = """All rights"
else'aceControlAccessRights'

Stage 18: search

| search aceType IN ("Access denied",D) AND aceAccessRights IN (
    "Full control",
    "Read permissions",
    RC
)

Stage 19: search

| `windows_ad_dangerous_deny_acl_modification_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 5136 corpus 25 (splunk 24, elastic 1)
field:"EventID" kind:eq value:"5136"
aceAccessRightsin
  • Full control corpus 4 (splunk 4)
  • RC
  • Read permissions
field:"aceAccessRights" kind:in
aceTypein
  • Access denied corpus 2 (splunk 2)
  • D corpus 2 (splunk 2)
field:"aceType" kind:in

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
new_aceeqold_valuesexcludes:new_ace field:"new_ace" value:"old_values"

Windows Chrome Enable Extension Loading via Command-Line

#
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
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects instances where Google Chrome is started with the --disable-features=DisableLoadExtensionCommandLineSwitch flag, effectively enabling the loading of extensions via the command line. This may indicate attempts to bypass enterprise extension policies, load unauthorized or malicious extensions, or manipulate browser behavior. Monitoring this activity helps identify potential security policy violations, malware persistence techniques, or other suspicious Chrome modifications.

Known False Positives

  • Developers or IT admins loading unpacked extensions for testing or deployment purposes.

MITRE ATT&CK Coverage

TacticTechniques
Collection

Telemetry Coverage

Rule Body

name: Windows Chrome Enable Extension Loading via Command-Line
id: da355155-1d23-48f9-bf95-e534ae273ab0
version: 4
creation_date: '2026-01-12'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: |
    The following analytic detects instances where Google Chrome is started with the --disable-features=DisableLoadExtensionCommandLineSwitch flag, effectively enabling the loading of extensions via the command line.
    This may indicate attempts to bypass enterprise extension policies, load unauthorized or malicious extensions, or manipulate browser behavior.
    Monitoring this activity helps identify potential security policy violations, malware persistence techniques, or other suspicious Chrome modifications.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |
    | tstats `security_content_summariesonly` min(_time) as firstTime max(_time) as lastTime
    from datamodel=Endpoint.Processes where
      Processes.process_name = "Chrome.exe"
      Processes.process= "*--disable-features*"
      Processes.process= "*DisableLoadExtensionCommandLineSwitch*"
    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_chrome_enable_extension_loading_via_command_line_filter`
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Processes` node. In addition, confirm the latest CIM App 4.20 or higher is installed and the latest TA for the endpoint product.
known_false_positives: Developers or IT admins loading unpacked extensions for testing or deployment purposes.
references:
    - https://www.gdatasoftware.com/blog/2025/11/38298-learning-about-browser-hijacking
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A $process_name$ process attempted to enable browser extension loading via command line $process$ on $dest$.
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process
      type: process
    - field: process_name
      type: process_name
analytic_story:
    - Browser Hijacking
asset_type: Endpoint
mitre_attack_id:
    - T1185
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    min(_time) as firstTime
    max(_time) as lastTime
  from datamodel=Endpoint.Processes
  where
  Processes.process_name = "Chrome.exe"
  Processes.process= "*--disable-features*"
  Processes.process= "*DisableLoadExtensionCommandLineSwitch*"
  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_chrome_enable_extension_loading_via_command_line_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *--disable-features*
  • *DisableLoadExtensionCommandLineSwitch*
field:"CommandLine" kind:eq
Processes.process_nameeq
  • Chrome.exe corpus 16 (elastic 14, splunk 2)
field:"process_basename" kind:eq value:"Chrome.exe"

Windows Credentials from Password Stores Query

#
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
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects the execution of the Windows OS tool cmdkey.exe, which is often abused by post-exploitation tools like winpeas, commonly used in ransomware attacks to list stored usernames, passwords, or credentials. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process execution logs. This activity is significant as it indicates potential credential harvesting, which can lead to privilege escalation and persistence. If confirmed malicious, attackers could gain unauthorized access to sensitive information and maintain control over compromised systems for further exploitation.

Known False Positives

  • network administrator can use this tool for auditing process.

MITRE ATT&CK Coverage

TacticTechniques
Credential Access

Telemetry Coverage

Rule Body

name: Windows Credentials from Password Stores Query
id: db02d6b4-5d5b-4c33-8d8f-f0577516a8c7
version: 11
creation_date: '2022-12-06'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic detects the execution of the Windows OS tool cmdkey.exe, which is often abused by post-exploitation tools like winpeas, commonly used in ransomware attacks to list stored usernames, passwords, or credentials. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process execution logs. This activity is significant as it indicates potential credential harvesting, which can lead to privilege escalation and persistence. If confirmed malicious, attackers could gain unauthorized access to sensitive information and maintain control over compromised systems for further exploitation.
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="cmdkey.exe"
        OR
        Processes.original_file_name = "cmdkey.exe"
        AND
        Processes.process = "*/list*"
      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_credentials_from_password_stores_query_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: network administrator can use this tool for auditing process.
references:
    - https://ss64.com/nt/cmdkey.html
    - https://github.com/carlospolop/PEASS-ng/tree/master/winPEAS
    - https://www.microsoft.com/en-us/security/blog/2022/10/14/new-prestige-ransomware-impacts-organizations-in-ukraine-and-poland/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: a process $process_name$ was executed on $dest$ to display stored username and credentials.
analytic_story:
    - Windows Post-Exploitation
    - Prestige Ransomware
    - DarkGate Malware
    - NetSupport RMM Tool Abuse
asset_type: Endpoint
mitre_attack_id:
    - T1555
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="cmdkey.exe"
    OR
    Processes.original_file_name = "cmdkey.exe"
    AND
    Processes.process = "*/list*"
  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_credentials_from_password_stores_query_filter`

Indicators

These rows show field, operator, and value matches.

Windows File Transfer Protocol In Non-Common Process Path

#
Status
production
Severity
low
Group by
SourcePort, action, app, dest, dest_ip, destination_port, direction, dvc, process_guid, process_id, process_name, protocol, protocol_version, src, src_ip, transport, user, vendor_product
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects FTP connections initiated by processes located in non-standard installation paths on Windows systems. It leverages Sysmon EventCode 3 to identify network connections where the process image path does not match common directories like "Program Files" or "Windows\System32". This activity is significant as FTP is often used by adversaries and malware, such as AgentTesla, for Command and Control (C2) communications to exfiltrate stolen data. If confirmed malicious, this could lead to unauthorized data transfer, exposing sensitive information and compromising the integrity of the affected host.

Known False Positives

  • Third party FTP based applications will trigger this. Apply additional filters as needed. Also consider excluding known FTP based clients installed outside of the Program Files and Windows directories.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 3: Network connection

Rule Body

name: Windows File Transfer Protocol In Non-Common Process Path
id: 0f43758f-1fe9-470a-a9e4-780acc4d5407
version: 12
creation_date: '2022-09-21'
modification_date: '2026-06-25'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic detects FTP connections initiated by processes located in non-standard installation paths on Windows systems. It leverages Sysmon EventCode 3 to identify network connections where the process image path does not match common directories like "Program Files" or "Windows\System32". This activity is significant as FTP is often used by adversaries and malware, such as AgentTesla, for Command and Control (C2) communications to exfiltrate stolen data. If confirmed malicious, this could lead to unauthorized data transfer, exposing sensitive information and compromising the integrity of the affected host.
data_source:
    - Sysmon EventID 3
search: |
    `sysmon`
    EventCode=3
    NOT Image IN(
      "C:\\Program Files \(x86\)\\*",
      "C:\\Program Files\\*",
      "C:\\Windows\\System32\\*",
      "C:\\Windows\\SysWOW64\\*"
    )
    (
      DestinationPortName="ftp"
      OR
      DestinationPort=21
    )
    | stats count min(_time) as firstTime
            max(_time) as lastTime

    by action app dest dest_ip dest_port direction dvc protocol protocol_version
       src src_ip src_port transport user vendor_product process_name
       process_exec process_guid process_id
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_file_transfer_protocol_in_non_common_process_path_filter`
how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name and sysmon eventcode = 3 connection events from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA.
known_false_positives: Third party FTP based applications will trigger this. Apply additional filters as needed. Also consider excluding known FTP based clients installed outside of the Program Files and Windows directories.
references:
    - https://malpedia.caad.fkie.fraunhofer.de/details/win.agent_tesla
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: a process $process_name$ is having a FTP connection to $dest$ in $dest_ip$
analytic_story:
    - AgentTesla
    - Snake Keylogger
    - Hellcat Ransomware
    - Phantom Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1071.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon`
EventCode=3
NOT Image IN(
  "C:\\Program Files \(x86\)\\*",
  "C:\\Program Files\\*",
  "C:\\Windows\\System32\\*",
  "C:\\Windows\\SysWOW64\\*"
)
(
  DestinationPortName="ftp"
  OR
  DestinationPort=21
)

Stage 2: stats

| stats count min(_time) as firstTime
        max(_time) as lastTime

by action app dest dest_ip dest_port direction dvc protocol protocol_version
   src src_ip src_port transport user vendor_product process_name
   process_exec process_guid process_id

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_file_transfer_protocol_in_non_common_process_path_filter`

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
ImageinC:\Program Files \(x86\)\*, C:\Program Files\*, C:\Windows\SysWOW64\*, C:\Windows\System32\*excludes:Image

Windows MSIExec Spawn Discovery Command

#
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
Michael Haag, Nasreddine Bencherchali, Splunk
Source
github.com/splunk/security_content

The following analytic detects MSIExec spawning multiple discovery commands. This behavior is identified using data from Endpoint Detection and Response (EDR) agents, focusing on process creation events where MSIExec is the parent process. If confirmed malicious, an attacker could use these discovery commands to gather system information, potentially leading to further exploitation or lateral movement within the network.

Known False Positives

  • False positives might still be present, depending on the installer. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows MSIExec Spawn Discovery Command
id: e9d05aa2-32f0-411b-930c-5b8ca5c4fcee
version: 16
creation_date: '2022-06-17'
modification_date: '2026-05-13'
author: Michael Haag, Nasreddine Bencherchali, Splunk
status: production
type: Anomaly
description: |-
    The following analytic detects MSIExec spawning multiple discovery commands.
    This behavior is identified using data from Endpoint Detection and Response (EDR) agents, focusing on process creation events where MSIExec is the parent process.
    If confirmed malicious, an attacker could use these discovery commands to gather system information, potentially leading to further exploitation or lateral movement within the network.
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.parent_process_name=msiexec.exe

    (
        Processes.process_name IN (
            "arp.exe"
            "dsget.exe",
            "hostname.exe",
            "ipconfig.exe",
            "nbtstat.exe",
            "netdom.exe",
            "nltest.exe",
            "ntdsutil.exe",
            "qprocess.exe",
            "qwinsta.exe",
            "systeminfo.exe"
            "wmic.exe"
        )
        OR
        (
            Processes.process_name IN (
                "bash.exe",
                "cmd.exe",
                "powershell.exe",
                "powershell_ise.exe",
                "pwsh.exe"
            )

            (
                Processes.process IN (
                    "*arp *",
                    "*dsget*",
                    "*hostname*",
                    "*ipconfig*",
                    "*nbtstat*",
                    "*netdom*",
                    "*nltest*",
                    "*ntdsutil*",
                    "*qprocess *",
                    "*qwinsta*",
                    "*systeminfo*",
                    "*wmic *"
                )
                OR
                (
                    (
                        Processes.process IN (
                            "*net *",
                            "*net.exe *",
                            "*net1*"
                            "*net1.exe*"
                        )
                        OR
                        Processes.process_name IN (
                            "net.exe",
                            "net1.exe"
                        )
                    )
                    Processes.process = "*view*"
                )
                OR
                (
                    (
                        Processes.process IN (
                            "*reg *",
                            "*reg.exe *"
                            "*sc *",
                            "*sc.exe *",
                        )
                        OR
                        Processes.process_name IN (
                            "reg.exe",
                            "sc.exe"
                        )
                    )
                    Processes.process = "*query*"
                    NOT Processes.process = "* /SC *"
                )
                OR
                (
                    (
                        Processes.process IN (
                            "*query *",
                            "*query.exe*"
                        )
                        OR
                        Processes.process_name = "query.exe"
                    )
                    Processes.process IN (
                        "* process",
                        "* session",
                        "* user",
                    )
                )
            )
        )
    )
    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_msiexec_spawn_discovery_command_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: False positives might still be present, depending on the installer. Filter as needed.
references:
    - https://thedfirreport.com/2022/06/06/will-the-real-msiexec-please-stand-up-exploit-leads-to-data-exfiltration/
    - https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218.007/T1218.007.md
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 30
          message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ by user $user$ running different discovery commands.
        - field: dest
          type: system
          score: 30
          message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ by user $user$ running different discovery commands.
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process_name
      type: process_name
analytic_story:
    - Windows System Binary Proxy Execution MSIExec
    - Medusa Ransomware
    - Water Gamayun
    - StealC Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1218.007
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.parent_process_name=msiexec.exe

(
    Processes.process_name IN (
        "arp.exe"
        "dsget.exe",
        "hostname.exe",
        "ipconfig.exe",
        "nbtstat.exe",
        "netdom.exe",
        "nltest.exe",
        "ntdsutil.exe",
        "qprocess.exe",
        "qwinsta.exe",
        "systeminfo.exe"
        "wmic.exe"
    )
    OR
    (
        Processes.process_name IN (
            "bash.exe",
            "cmd.exe",
            "powershell.exe",
            "powershell_ise.exe",
            "pwsh.exe"
        )

        (
            Processes.process IN (
                "*arp *",
                "*dsget*",
                "*hostname*",
                "*ipconfig*",
                "*nbtstat*",
                "*netdom*",
                "*nltest*",
                "*ntdsutil*",
                "*qprocess *",
                "*qwinsta*",
                "*systeminfo*",
                "*wmic *"
            )
            OR
            (
                (
                    Processes.process IN (
                        "*net *",
                        "*net.exe *",
                        "*net1*"
                        "*net1.exe*"
                    )
                    OR
                    Processes.process_name IN (
                        "net.exe",
                        "net1.exe"
                    )
                )
                Processes.process = "*view*"
            )
            OR
            (
                (
                    Processes.process IN (
                        "*reg *",
                        "*reg.exe *"
                        "*sc *",
                        "*sc.exe *",
                    )
                    OR
                    Processes.process_name IN (
                        "reg.exe",
                        "sc.exe"
                    )
                )
                Processes.process = "*query*"
                NOT Processes.process = "* /SC *"
            )
            OR
            (
                (
                    Processes.process IN (
                        "*query *",
                        "*query.exe*"
                    )
                    OR
                    Processes.process_name = "query.exe"
                )
                Processes.process IN (
                    "* process",
                    "* session",
                    "* user",
                )
            )
        )
    )
)
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_msiexec_spawn_discovery_command_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.parent_process_nameeq
  • msiexec.exe corpus 18 (elastic 14, splunk 3, kusto 1)
field:"parent_process_basename" kind:eq value:"msiexec.exe"
Processes.processeq
  • *query* corpus 8 (sigma 7, splunk 1)
  • *view* corpus 2 (sigma 1, splunk 1)
field:"CommandLine" kind:eq
Processes.processin
  • * process
  • * session
  • * user
  • *arp *
  • *dsget*
  • *hostname*
  • *ipconfig*
  • *nbtstat*
  • *net *
  • *net.exe *
  • *net1*
  • *net1.exe*
  • *netdom*
  • *nltest*
  • *ntdsutil*
  • *qprocess *
  • *query *
  • *query.exe*
  • *qwinsta*
  • *reg *
  • *reg.exe *
  • *sc *
  • *sc.exe *
  • *systeminfo*
  • *wmic *
field:"CommandLine" kind:in
Processes.process_nameeq
  • query.exe corpus 5 (splunk 3, elastic 2)
field:"process_basename" kind:eq value:"query.exe"
Processes.process_namein
  • arp.exe corpus 3 (splunk 3)
  • bash.exe corpus 15 (splunk 15)
  • cmd.exe corpus 24 (splunk 17, elastic 6, kusto 1)
  • dsget.exe corpus 2 (splunk 2)
  • hostname.exe corpus 3 (splunk 3)
  • ipconfig.exe corpus 4 (splunk 4)
  • nbtstat.exe
  • net.exe corpus 5 (splunk 3, elastic 1, kusto 1)
  • net1.exe corpus 5 (splunk 4, kusto 1)
  • netdom.exe corpus 2 (splunk 2)
  • nltest.exe corpus 2 (splunk 2)
  • ntdsutil.exe corpus 2 (splunk 2)
  • 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)
  • qprocess.exe corpus 2 (splunk 2)
  • qwinsta.exe corpus 2 (splunk 2)
  • reg.exe corpus 3 (splunk 3)
  • sc.exe corpus 5 (splunk 3, elastic 2)
  • systeminfo.exe corpus 3 (splunk 3)
  • wmic.exe corpus 15 (splunk 14, elastic 1)
field:"process_basename" kind:in

Windows PaperCut NG Spawn Shell

#
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 where the PaperCut NG application (pc-app.exe) spawns a Windows shell, such as cmd.exe or PowerShell. This behavior is identified using Endpoint Detection and Response (EDR) telemetry, focusing on process creation events where the parent process is pc-app.exe. This activity is significant as it may indicate an attacker attempting to gain unauthorized access or execute malicious commands on the system. If confirmed malicious, this could lead to unauthorized code execution, privilege escalation, or further compromise of the affected environment.

Known False Positives

  • False positives may be present, but most likely not. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows PaperCut NG Spawn Shell
id: a602d9a2-aaea-45f8-bf0f-d851168d61ca
version: 13
creation_date: '2022-06-17'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects instances where the PaperCut NG application (pc-app.exe) spawns a Windows shell, such as cmd.exe or PowerShell. This behavior is identified using Endpoint Detection and Response (EDR) telemetry, focusing on process creation events where the parent process is pc-app.exe. This activity is significant as it may indicate an attacker attempting to gain unauthorized access or execute malicious commands on the system. If confirmed malicious, this could lead to unauthorized code execution, privilege escalation, or further compromise of the affected environment.
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.parent_process_name=pc-app.exe `process_cmd`
        OR
        `process_powershell`
        OR
        Processes.process_name=java.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_papercut_ng_spawn_shell_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: False positives may be present, but most likely not. Filter as needed.
references:
    - https://www.cisa.gov/news-events/alerts/2023/05/11/cisa-and-fbi-release-joint-advisory-response-active-exploitation-papercut-vulnerability
    - https://www.papercut.com/kb/Main/PO-1216-and-PO-1219
finding:
    title: The PaperCut NG application has spawned a shell $process_name$ on endpoint $dest$ by $user$.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: The PaperCut NG application has spawned a shell $process_name$ on endpoint $dest$ by $user$.
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - PaperCut MF NG Vulnerability
    - Compromised Windows Host
asset_type: Endpoint
mitre_attack_id:
    - T1059
    - T1190
    - T1133
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.parent_process_name=pc-app.exe `process_cmd`
    OR
    `process_powershell`
    OR
    Processes.process_name=java.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_papercut_ng_spawn_shell_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • Cmd.Exe corpus 75 (sigma 43, splunk 17, elastic 15)
  • PowerShell.EXE corpus 134 (sigma 86, splunk 30, elastic 18)
  • powershell_ise.EXE corpus 52 (splunk 30, sigma 18, elastic 4)
  • pwsh.dll corpus 115 (sigma 81, splunk 30, elastic 4)
field:"OriginalFileName" kind:eq
Processes.parent_process_nameeq
  • pc-app.exe corpus 2 (elastic 1, splunk 1)
field:"parent_process_basename" kind:eq value:"pc-app.exe"
Processes.process_nameeq
  • cmd.exe corpus 122 (elastic 93, splunk 29)
  • java.exe corpus 2 (elastic 1, splunk 1)
  • powershell.exe corpus 187 (elastic 140, splunk 44, kusto 3)
  • powershell_ise.exe corpus 53 (splunk 29, elastic 24)
  • pwsh.exe corpus 78 (elastic 49, splunk 29)
field:"process_basename" kind:eq

Windows SCCM Adsource DLL Was Planted In SMS Provider Directory

#
Status
production
Severity
medium
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
Raven Tait, Splunk
Source
github.com/splunk/security_content

The following analytic detects the creation or modification of adsource.dll or other staging files with the name adsource_*.dll within the SCCM SMS Provider bin directory, consistent with exploitation of CVE-2026-47301. This abuses a DLL side-loading vulnerability in the Microsoft Configuration Manager SMS Provider component. An attacker can plant a malicious adsource.dll in the SCCMProvider bin\X64 path, causing the SMS Provider service to load the attacker-controlled library in a privileged context. The presence of renamed dlls alongside adsource.dll is a strong indicator of the classic DLL hijacking pattern where the legitimate library has been renamed so the malicious replacement can proxy calls to it. If confirmed malicious, this activity represents a privilege escalation vector that can result in SYSTEM-level code execution on any host running the SCCM SMS Provider role.

Known False Positives

  • Legitimate SCCM upgrades or hotfix installations may create or replace adsource.dll in the bin\X64 directory. Validate the file hash and digital signature of any detected adsource.dll against the expected version for the installed SCCM build before tuning.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 11: FileCreate

Rule Body

name: Windows SCCM Adsource DLL Was Planted In SMS Provider Directory
id: 4f55b07b-7aeb-47f4-a234-b222a902276b
version: 1
creation_date: '2026-08-20'
modification_date: '2026-08-20'
author: Raven Tait, Splunk
status: production
type: TTP
description: |-
    The following analytic detects the creation or modification of adsource.dll or other staging files with the name adsource_*.dll within the SCCM SMS Provider bin directory, consistent with exploitation of CVE-2026-47301.
    This abuses a DLL side-loading vulnerability in the Microsoft Configuration Manager SMS Provider component.
    An attacker can plant a malicious adsource.dll in the SCCMProvider bin\X64 path, causing the SMS Provider service to load the attacker-controlled library in a privileged context.
    The presence of renamed dlls alongside adsource.dll is a strong indicator of the classic DLL hijacking pattern where the legitimate library has been renamed so the malicious replacement can proxy calls to it.
    If confirmed malicious, this activity represents a privilege escalation vector that can result in SYSTEM-level code execution on any host running the SCCM SMS Provider role.
data_source:
    - Sysmon EventID 11
search: |-
    | tstats `security_content_summariesonly`
      count min(_time) as firstTime
            max(_time) as lastTime

    from datamodel=Endpoint.Filesystem where

    Filesystem.action IN ("created", "modified")
    Filesystem.file_name IN (
        "adsource.dll",
        "adsource_*.dll"
    )
    Filesystem.file_path="*Microsoft Configuration Manager\\bin\\X64\\*"

    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)`
    | `windows_sccm_adsource_dll_was_planted_in_sms_provider_directory_filter`
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Filesystem` node. In addition, confirm the latest CIM App 4.20 or higher is installed and the latest TA for the endpoint product. If you are using Sysmon, you must have EventID 11 (FileCreate) enabled, and the FileCreate section of the configuration must include TargetFilename paths ending in .dll or "Microsoft Configuration Manager\bin\X64\" folder.
known_false_positives: |-
    Legitimate SCCM upgrades or hotfix installations may create or replace adsource.dll in the bin\X64 directory.
    Validate the file hash and digital signature of any detected adsource.dll against the expected version for the installed SCCM build before tuning.
references:
    - https://medium.com/@omribaso/from-domain-user-to-enterprise-control-microsoft-configuration-manager-rce-0-day-exploit-chain-393c63c680ca
    - https://nvd.nist.gov/vuln/detail/cve-2026-47301
    - https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/81d92bba-d22b-4a8c-908a-554ab29148ab?source=recommendations
finding:
    title: Suspicious SCCM adsource DLL [$file_name$] detected at [$file_path$] on [$dest$]
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: file_name
      type: file_name
    - field: file_path
      type: file_path
analytic_story:
    - Windows Privilege Escalation
asset_type: Endpoint
cve:
    - CVE-2026-47301
mitre_attack_id:
    - T1574.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.Filesystem where

Filesystem.action IN ("created", "modified")
Filesystem.file_name IN (
    "adsource.dll",
    "adsource_*.dll"
)
Filesystem.file_path="*Microsoft Configuration Manager\\bin\\X64\\*"

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

| `windows_sccm_adsource_dll_was_planted_in_sms_provider_directory_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Filesystem.actionin
  • created corpus 10 (splunk 10)
  • modified corpus 10 (splunk 10)
field:"event_action" kind:in
Filesystem.file_namein
  • adsource.dll
  • adsource_*.dll
field:"file_name" kind:in
Filesystem.file_patheq
  • *Microsoft Configuration Manager\bin\X64\*
field:"TargetFilename" kind:eq value:"*Microsoft Configuration Manager\bin\X64\*"

Windows Unusual NTLM Authentication Users By Source

#
Status
production
Severity
low
Group by
src
Author
Steven Dick
Source
github.com/splunk/security_content

The following analytic detects when an unusual number of NTLM authentications is attempted by the same source. This activity generally results when an attacker attempts to brute force, password spray, or otherwise authenticate to a domain joined Windows device using an NTLM based process/attack. This same activity may also generate a large number of EventID 4776 events in as well.

Known False Positives

  • Vulnerability scanners, print servers, and applications that deal with non-domain joined authentications. Recommend adjusting the upperBound_unique eval for tailoring the correlation to your environment, running with a 24hr search window will smooth out some statistical noise.

MITRE ATT&CK Coverage

TacticTechniques
Credential Access

Telemetry Coverage

Rule Body

name: Windows Unusual NTLM Authentication Users By Source
id: 80fcc4d4-fd90-488e-b55a-4e7190ae6ce2
version: 10
creation_date: '2024-03-16'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: Anomaly
description: The following analytic detects when an unusual number of NTLM authentications is attempted by the same source. This activity generally results when an attacker attempts to brute force, password spray, or otherwise authenticate to a domain joined Windows device using an NTLM based process/attack. This same activity may also generate a large number of EventID 4776 events in as well.
data_source:
    - NTLM Operational 8004
    - NTLM Operational 8005
    - NTLM Operational 8006
search: |
    `ntlm_audit`
    EventCode = 8004
    SChannelName=*
    WorkstationName=*

    ```CIM alignment, remove leading \\ from some auth attempts```
    | eval src = replace(WorkstationName,"\\\\","")
    | eval dest = SChannelName, user = UserName

    ``` Remove NTLM auths to self, improves accuracy for certain applications```
    | where SChannelName!=src

    | stats count min(_time) as firstTime
                  max(_time) as lastTime
                  dc(eval(upper(user))) as unique_count by src
    | eventstats avg(unique_count) as unique_avg
                 stdev(unique_count) as unique_std

    ``` adjust formula for sensitivity```
    | eval upperBound_unique=(1+unique_avg+unique_std*3)

    | eval isOutlier=CASE(unique_count > upperBound_unique, 1, true(), 0)
    | where isOutlier==1
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_unusual_ntlm_authentication_users_by_source_filter`
how_to_implement: The following analytic requires that NTLM Operational logs to be imported from the environment Domain Controllers. This requires configuration of specific auditing settings, see Microsoft references for further guidance. This analytic is specific to EventID 8004~8006.
known_false_positives: Vulnerability scanners, print servers, and applications that deal with non-domain joined authentications. Recommend adjusting the upperBound_unique eval for tailoring the correlation to your environment, running with a 24hr search window will smooth out some statistical noise.
references:
    - https://attack.mitre.org/techniques/T1110/003/
    - https://techcommunity.microsoft.com/t5/ask-the-directory-services-team/ntlm-blocking-and-you-application-analysis-and-auditing/ba-p/397191
    - https://techcommunity.microsoft.com/t5/microsoft-defender-for-identity/enriched-ntlm-authentication-data-using-windows-event-8004/m-p/871827
    - https://www.varonis.com/blog/investigate-ntlm-brute-force
    - https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/4d1235e3-2c96-4e9f-a147-3cb338a0d09f
intermediate_findings:
    entities:
        - field: src
          type: system
          score: 20
          message: The device [$src$] attempted $count$ NTLM authentications using $unique_count$ user accounts.
analytic_story:
    - Active Directory Password Spraying
asset_type: Endpoint
mitre_attack_id:
    - T1110.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`ntlm_audit`
EventCode = 8004
SChannelName=*
WorkstationName=*

Stage 2: eval

| eval src = replace(WorkstationName,"\\\\","")

Stage 3: eval

| eval dest = SChannelName, user = UserName

Stage 4: where

| where SChannelName!=src

Stage 5: stats

| stats count min(_time) as firstTime
              max(_time) as lastTime
              dc(eval(upper(user))) as unique_count by src

Stage 6: eventstats

| eventstats avg(unique_count) as unique_avg
             stdev(unique_count) as unique_std

Stage 7: eval

| eval upperBound_unique=(1+unique_avg+unique_std*3)

Stage 8: eval

| eval isOutlier=CASE(unique_count > upperBound_unique, 1, true(), 0)
isOutlier =
ifunique_count > upperBound_unique1
else0

Stage 9: where

| where isOutlier==1

Stage 10: search

| `security_content_ctime(firstTime)`

Stage 11: search

| `security_content_ctime(lastTime)`

Stage 12: search

| `windows_unusual_ntlm_authentication_users_by_source_filter`

Indicators

These rows show field, operator, and value matches.

Wscript_Cscript Execution (Windows Event Log)

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

Monitor the execution of wscript or cscript processes as these are commonly utilized by threat actors to run malicious VBScript or JScript code

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '1029.1034'
title: Wscript_Cscript Execution
description: 'Monitor the execution of wscript or cscript processes as these are commonly
  utilized by threat actors to run malicious VBScript or JScript code Threat Actor
  Association: Actinium/Gamaredon/Primitive Bear, Andariel, Antlion, APT10/menuPass,
  APT28/Fancy Bear, APT29/Nobelium/Cozy Bear, APT31, APT33, APT35, APT37/Chinotto,
  APT43, Blind Eagle/APT-C-36, Carbanak, Evilnum, FIN7, Gamaredon Group/Shuckworm,
  Kimsuky, Mustang Panda (aka. Stately Taurus//Earth Preta/BRONZE PRESIDENT/TA416/RedDelta),
  NewsPenguin, Prophet Spider, TA2541, TA428, TA551, UAC-0057 (GhostWriter), WIRTE,
  Witchetty Software Association: Agent Tesla, Astaroth, Avaddon, Black Basta, BazarLoader,
  Cring, DarkGate, MirrorBlast, NanoCore, PoetRAT, QakBot, RATDispenser, SquirrelWaffle,
  Trickbot, Remcos RAT, WhisperGate, Zloader Atomics T1105 Test #11 Atomics T1059.005
  Test #1 Atomics T1082 Test #9 Atomics T1547.001 Test #5 -- #TrendingThreat #Russia
  #Ukraine'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) ("cscript.exe" OR "WScript.exe" OR "cscript" OR
  "wscript") | regex process="(?i)(w|c)script.{1,}?\.\w{2,4}" | table _time, host,
  user process, process_*, parent_*, signature_id | bin span=1s | stats values(*)
  as * by _time, host '
techniques:
- execution:command and scripting interpreter:visual basic
- execution:command and scripting interpreter:javascript
technique_id:
- T1059.007
- T1059.005
data_category:
- Windows event logs
references:
- https://secure.anvilogic.com/use_cases?id=AVL_UC1029

Stages and Predicates

Stage 1: search

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

Stage 2: regex

| regex process="(?i)(w|c)script.{1,}?\.\w{2,4}"

Stage 3: table

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

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)(w|c)script.{1,}?.\w{2,4} corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match value:"(?i)(w|c)script.{1,}?.\w{2,4}"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"cscript.exe"
1"WScript.exe"
1"cscript"
1"wscript"

Zeek x509 Certificate with Punycode

#
Status
experimental
Group by
"basic_constraints.ca", channel, host
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

The following analytic detects the presence of punycode within x509 certificates using Zeek x509 logs. It identifies punycode in the subject alternative name email and other fields by searching for the "xn--" prefix. This activity is significant as punycode can be used in phishing attacks or to bypass domain filters, posing a security risk. If confirmed malicious, attackers could use these certificates to impersonate legitimate domains, potentially leading to unauthorized access or data breaches.

Known False Positives

  • False positives may be present if the organization works with international businesses. Filter as needed.

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

Rule Body

name: Zeek x509 Certificate with Punycode
id: 029d6fe4-a5fe-43af-827e-c78c50e81d81
version: 7
creation_date: '2022-12-19'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: experimental
type: Hunting
description: The following analytic detects the presence of punycode within x509 certificates using Zeek x509 logs. It identifies punycode in the subject alternative name email and other fields by searching for the "xn--" prefix. This activity is significant as punycode can be used in phishing attacks or to bypass domain filters, posing a security risk. If confirmed malicious, attackers could use these certificates to impersonate legitimate domains, potentially leading to unauthorized access or data breaches.
data_source: []
search: |-
    `zeek_x509`
      | rex field=san.email{} "\@(?<domain_detected>xn--.*)"
      | rex field=san.other_fields{} "\@(?<domain_detected>xn--.*)"
      | stats values(domain_detected)
        BY basic_constraints.ca source host
      | `zeek_x509_certificate_with_punycode_filter`
how_to_implement: The following analytic requires x509 certificate data to be logged entirely. In particular, for CVE-2022-3602, the punycode will be within the leaf certificate. The analytic may be modified to look for all xn--, or utilize a network IDS/monitoring tool like Zeek or Suricata to drill down into cert captured. Note for Suricata, the certificate is base64 encoded and will need to be decoded to capture the punycode (punycode will need to be decoded after).
known_false_positives: False positives may be present if the organization works with international businesses. Filter as needed.
references:
    - https://community.emergingthreats.net/t/out-of-band-ruleset-update-summary-2022-11-01/117
    - https://github.com/corelight/CVE-2022-3602/tree/master/scripts
    - https://docs.zeek.org/en/master/logs/x509.html
    - https://www.splunk.com/en_us/blog/security/nothing-puny-about-cve-2022-3602.html
    - https://www.openssl.org/blog/blog/2022/11/01/email-address-overflows/
    - https://docs.zeek.org/en/master/scripts/base/init-bare.zeek.html#type-X509::SubjectAlternativeName
analytic_story:
    - OpenSSL CVE-2022-3602
asset_type: Network
mitre_attack_id:
    - T1573
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: network
security_domain: network

Stages and Predicates

Stage 1: search

`zeek_x509`

Stage 2: rex

| rex field=san.email{} "\@(?<domain_detected>xn--.*)"

Stage 3: rex

| rex field=san.other_fields{} "\@(?<domain_detected>xn--.*)"

Stage 4: stats

| stats values(domain_detected)
    BY basic_constraints.ca source host

Stage 5: search

| `zeek_x509_certificate_with_punycode_filter`

Indicators

These rows show field, operator, and value matches.

Back to all Splunk rules