Detection rules › Splunk

Splunk rules: 2j

AWS Exfiltration via EC2 Snapshot

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

The following analytic detects a series of AWS API calls related to EC2 snapshots within a short time window, indicating potential exfiltration via EC2 Snapshot modifications. It leverages AWS CloudTrail logs to identify actions such as creating, describing, and modifying snapshot attributes. This activity is significant as it may indicate an attacker attempting to exfiltrate data by sharing EC2 snapshots externally. If confirmed malicious, the attacker could gain access to sensitive information stored in the snapshots, leading to data breaches and potential compliance violations.

Known False Positives

  • It is possible that an AWS admin has legitimately shared a snapshot with an other account for a specific purpose. Please check any recent change requests filed in your organization.

MITRE ATT&CK Coverage

TacticTechniques
Exfiltration

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: AWS Exfiltration via EC2 Snapshot
id: ac90b339-13fc-4f29-a18c-4abbba1f2171
version: 10
creation_date: '2023-03-22'
modification_date: '2026-05-13'
author: Bhavin Patel, Splunk
status: production
type: TTP
description: The following analytic detects a series of AWS API calls related to EC2 snapshots within a short time window, indicating potential exfiltration via EC2 Snapshot modifications. It leverages AWS CloudTrail logs to identify actions such as creating, describing, and modifying snapshot attributes. This activity is significant as it may indicate an attacker attempting to exfiltrate data by sharing EC2 snapshots externally. If confirmed malicious, the attacker could gain access to sensitive information stored in the snapshots, leading to data breaches and potential compliance violations.
data_source:
    - AWS CloudTrail CreateSnapshot
    - AWS CloudTrail DescribeSnapshotAttribute
    - AWS CloudTrail ModifySnapshotAttribute
    - AWS CloudTrail DeleteSnapshot
search: |-
    `cloudtrail` eventName IN ("CreateSnapshot", "DescribeSnapshotAttribute", "ModifySnapshotAttribute", "DeleteSnapshot") src_ip !="guardduty.amazonaws.com"
      | bin _time span=5m
      | rename user_name as user
      | stats count dc(signature) as distinct_api_calls values(signature) as signature values(dest) as dest values(requestParameters.attributeType) as attributeType values(requestParameters.createVolumePermission.add.items{}.userId) as aws_account_id_added values(user_agent) as user_agent
        BY _time user src
           vendor_account vendor_region vendor_product
      | where distinct_api_calls >= 2
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `aws_exfiltration_via_ec2_snapshot_filter`
how_to_implement: You must install splunk AWS add on and Splunk App for AWS. This search works with AWS CloudTrail logs. We have intentionally removed `guardduty.amazonaws.com` from src_ip to remove false positives caused by guard duty. We recommend you adjust the time window as per your environment.
known_false_positives: It is possible that an AWS admin has legitimately shared a snapshot with an other account for a specific purpose. Please check any recent change requests filed in your organization.
references:
    - https://labs.nettitude.com/blog/how-to-exfiltrate-aws-ec2-data/
    - https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifySnapshotAttribute.html
    - https://bleemb.medium.com/data-exfiltration-with-native-aws-s3-features-c94ae4d13436
    - https://stratus-red-team.cloud/attack-techniques/list/
finding:
    title: Potential AWS EC2 Exfiltration detected on account id - $vendor_account$ by user $user$ from src_ip $src$
    entity:
        field: user
        type: user
        score: 50
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - Suspicious Cloud Instance Activities
    - Data Exfiltration
asset_type: EC2 Snapshot
mitre_attack_id:
    - T1537
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`cloudtrail` eventName IN (
    "CreateSnapshot",
    "DescribeSnapshotAttribute",
    "ModifySnapshotAttribute",
    "DeleteSnapshot"
) src_ip !="guardduty.amazonaws.com"

Stage 2: bucket

| bin _time span=5m

Stage 3: rename

| rename user_name as user

Stage 4: stats

| stats
    count
    dc(signature) as distinct_api_calls
    values(signature) as signature
    values(dest) as dest
    values(requestParameters.attributeType) as attributeType
    values(requestParameters.createVolumePermission.add.items{}.userId) as aws_account_id_added
    values(user_agent) as user_agent
  BY _time user src
       vendor_account vendor_region vendor_product

Stage 5: where

| where distinct_api_calls >= 2

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `aws_exfiltration_via_ec2_snapshot_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
distinct_api_callsge
  • 2
field:"distinct_api_calls" kind:ge value:"2"
eventNamein
  • CreateSnapshot
  • DeleteSnapshot
  • DescribeSnapshotAttribute
  • ModifySnapshotAttribute
field:"aws::eventName" kind:in
sourcetypeeq
  • aws:cloudtrail corpus 59 (splunk 59)
field:"sourcetype" kind:eq value:"aws:cloudtrail"
src_ipne
  • guardduty.amazonaws.com
field:"src_ip" kind:ne value:"guardduty.amazonaws.com"

AWS Multiple Failed MFA Requests For User

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

The following analytic identifies multiple failed multi-factor authentication (MFA) requests to an AWS Console for a single user. It leverages AWS CloudTrail logs, specifically the additionalEventData field, to detect more than 10 failed MFA prompts within 5 minutes. This activity is significant as it may indicate an adversary attempting to bypass MFA by bombarding the user with repeated authentication requests. If confirmed malicious, this could lead to unauthorized access to the AWS environment, potentially compromising sensitive data and resources.

Known False Positives

  • Multiple Failed MFA requests may also be a sign of authentication or application issues. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: AWS Multiple Failed MFA Requests For User
id: 1fece617-e614-4329-9e61-3ba228c0f353
version: 11
creation_date: '2022-10-03'
modification_date: '2026-05-13'
author: Bhavin Patel
status: production
type: Anomaly
description: The following analytic identifies multiple failed multi-factor authentication (MFA) requests to an AWS Console for a single user. It leverages AWS CloudTrail logs, specifically the `additionalEventData` field, to detect more than 10 failed MFA prompts within 5 minutes. This activity is significant as it may indicate an adversary attempting to bypass MFA by bombarding the user with repeated authentication requests. If confirmed malicious, this could lead to unauthorized access to the AWS environment, potentially compromising sensitive data and resources.
data_source:
    - AWS CloudTrail ConsoleLogin
search: |-
    `cloudtrail` eventName= ConsoleLogin "additionalEventData.MFAUsed"=Yes errorMessage="Failed authentication"
      | bucket span=5m _time
      | rename user_name as user
      | stats dc(_raw) as mfa_prompts min(_time) as firstTime max(_time) as lastTime values(user_agent) as user_agent values(src) as src values(dest) as dest
        BY _time user signature
           vendor_account vendor_region vendor_product
           errorMessage
      | where mfa_prompts > 10
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `aws_multiple_failed_mfa_requests_for_user_filter`
how_to_implement: The Splunk AWS Add-on is required to utilize this data. The search requires AWS CloudTrail logs.
known_false_positives: Multiple Failed MFA requests may also be a sign of authentication or application issues. Filter as needed.
references:
    - https://attack.mitre.org/techniques/T1621/
    - https://aws.amazon.com/what-is/mfa/
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: User $user$ is seen to have high number of MFA prompt failures within a short period of time.
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - AWS Identity and Access Management Account Takeover
asset_type: AWS Account
mitre_attack_id:
    - T1586.003
    - T1621
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`cloudtrail` eventName= ConsoleLogin "additionalEventData.MFAUsed"=Yes
    errorMessage="Failed authentication"

Stage 2: bucket

| bucket span=5m _time

Stage 3: rename

| rename user_name as user

Stage 4: stats

| stats
    dc(_raw) as mfa_prompts
    min(_time) as firstTime
    max(_time) as lastTime
    values(user_agent) as user_agent
    values(src) as src
    values(dest) as dest
  BY _time user signature
       vendor_account vendor_region vendor_product
       errorMessage

Stage 5: where

| where mfa_prompts > 10

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `aws_multiple_failed_mfa_requests_for_user_filter`

Indicators

These rows show field, operator, and value matches.

Azure AD Privileged Role Assigned to Service Principal

#
Status
production
Severity
medium
Group by
aws::recipientAccountId, dest, displayName, initiatedBy, result, role, signature, src, user, vendor_product
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic detects the assignment of privileged roles to service principals in Azure Active Directory (AD). It leverages the AuditLogs log category from ingested Azure AD events. This activity is significant because assigning elevated permissions to non-human entities can lead to unauthorized access or malicious activities. If confirmed malicious, attackers could exploit these service principals to gain elevated access to Azure resources, potentially compromising sensitive data and critical infrastructure. Monitoring this behavior helps prevent privilege escalation and ensures the security of Azure environments.

Known False Positives

  • Administrators may legitimately assign the privileged roles to Service Principals as part of administrative tasks. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

PlatformRecord / event type
AzureAdd member to role

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: Azure AD Privileged Role Assigned to Service Principal
id: 5dfaa3d3-e2e4-4053-8252-16d9ee528c41
version: 14
creation_date: '2023-04-28'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects the assignment of privileged roles to service principals in Azure Active Directory (AD). It leverages the AuditLogs log category from ingested Azure AD events. This activity is significant because assigning elevated permissions to non-human entities can lead to unauthorized access or malicious activities. If confirmed malicious, attackers could exploit these service principals to gain elevated access to Azure resources, potentially compromising sensitive data and critical infrastructure. Monitoring this behavior helps prevent privilege escalation and ensures the security of Azure environments.
data_source:
    - Azure Active Directory Add member to role
search: |-
    `azure_monitor_aad` operationName="Add member to role"
      | rename properties.* as *
      | search "targetResources{}.type"=ServicePrincipal
      | rename initiatedBy.user.userPrincipalName as initiatedBy
      | rename targetResources{}.modifiedProperties{}.newValue as roles
      | eval role=mvindex(roles,1)
      | rename targetResources{}.displayName as apps
      | eval displayName=mvindex(apps,0)
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY dest user src
           vendor_account vendor_product displayName
           initiatedBy result role
           signature
      | lookup privileged_azure_ad_roles azureadrole AS role OUTPUT isprvilegedadrole description
      | search isprvilegedadrole = True
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `azure_ad_privileged_role_assigned_to_service_principal_filter`
how_to_implement: You must install the latest version of Splunk Add-on for Microsoft Cloud Services from Splunkbase (https://splunkbase.splunk.com/app/3110/#/details). You must be ingesting Azure Active Directory events into your Splunk environment. This analytic was written to be used with the azure:monitor:aad sourcetype leveraging the AuditLog log category.
known_false_positives: Administrators may legitimately assign the privileged roles to Service Principals as part of administrative tasks. Filter as needed.
references:
    - https://posts.specterops.io/azure-privilege-escalation-via-service-principal-abuse-210ae2be2a5
finding:
    title: A privileged Azure AD role was assigned to the Service Principal $displayName$ initiated by $initiatedBy$
    entity:
        field: initiatedBy
        type: user
        score: 50
analytic_story:
    - Azure Active Directory Privilege Escalation
    - NOBELIUM Group
    - Scattered Lapsus$ Hunters
asset_type: Azure Active Directory
mitre_attack_id:
    - T1098.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: identity

Stages and Predicates

Stage 1: search

`azure_monitor_aad` operationName="Add member to role"

Stage 2: rename

| rename properties.* as *

Stage 3: search

| search "targetResources{}.type"=ServicePrincipal

Stage 4: rename

| rename initiatedBy.user.userPrincipalName as initiatedBy

Stage 5: rename

| rename targetResources{}.modifiedProperties{}.newValue as roles

Stage 6: eval

| eval role=mvindex(roles,1)

Stage 7: rename

| rename targetResources{}.displayName as apps

Stage 8: eval

| eval displayName=mvindex(apps,0)

Stage 9: fillnull

| fillnull

Stage 10: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY dest user src
       vendor_account vendor_product displayName
       initiatedBy result role
       signature

Stage 11: lookup

| lookup privileged_azure_ad_roles azureadrole AS role OUTPUT isprvilegedadrole description
Lookup table
privileged_azure_ad_roles
Key field
azureadrole as role
Output columns
['isprvilegedadrole', 'isprvilegedadrole'], ['description', 'description']

Stage 12: search

| search isprvilegedadrole = True

Stage 13: search

| `security_content_ctime(firstTime)`

Stage 14: search

| `security_content_ctime(lastTime)`

Stage 15: search

| `azure_ad_privileged_role_assigned_to_service_principal_filter`

Indicators

These rows show field, operator, and value matches.

Cisco Secure Firewall - React Server Components RCE Attempt

#
Status
production
Severity
medium
Group by
dest
Author
Nasreddine Bencherchali, Splunk, Talos NTDR
Source
github.com/splunk/security_content

This analytic detects exploitation activity of CVE-2025-55182 using Cisco Secure Firewall Intrusion Events. It leverages Cisco Secure Firewall Threat Defense IntrusionEvent logs to identify cases where Snort signature 65554 (React Server Components remote code execution attempt) is triggered If confirmed malicious, this behavior could be indicative of a potential exploitation of CVE-2025-55182.

Known False Positives

  • Security testing or vulnerability scanners might trigger this. Investigate any potential matches to determine if they're legitimate.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access

Rule Body

name: Cisco Secure Firewall - React Server Components RCE Attempt
id: d36459b1-7901-401a-a67e-44426c15b168
version: 7
creation_date: '2025-07-17'
modification_date: '2026-05-13'
author: Nasreddine Bencherchali, Splunk, Talos NTDR
status: production
type: TTP
description: |
    This analytic detects exploitation activity of CVE-2025-55182 using Cisco Secure Firewall Intrusion Events.
    It leverages Cisco Secure Firewall Threat Defense IntrusionEvent logs to identify cases where Snort signature 65554 (React Server Components remote code execution attempt) is triggered
    If confirmed malicious, this behavior could be indicative of a potential exploitation of CVE-2025-55182.
data_source:
    - Cisco Secure Firewall Threat Defense Intrusion Event
search: |
    `cisco_secure_firewall`
    EventType=IntrusionEvent
    signature_id = 65554
    | fillnull
    | stats min(_time) as firstTime
            max(_time) as lastTime
            values(signature_id) as signature_id
            values(signature) as signature
            values(class_desc) as class_desc
            values(MitreAttackGroups) as MitreAttackGroups
            values(InlineResult) as InlineResult
            values(InlineResultReason) as InlineResultReason
            values(src) as src
            values(dest_port) as dest_port
            values(rule) as rule
            values(transport) as transport
            values(app) as app
            by dest
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `cisco_secure_firewall___react_server_components_rce_attempt_filter`
how_to_implement: |
    This search requires Cisco Secure Firewall Threat Defense Logs, which
    includes the FileEvent EventType. This search uses an input macro named `cisco_secure_firewall`.
    We strongly recommend that you specify your environment-specific configurations
    (index, source, sourcetype, etc.) for Cisco Secure Firewall Threat Defense logs. Replace the macro definition
    with configurations for your Splunk environment. The search also uses a post-filter
    macro designed to filter out known false positives.
    The logs are to be ingested using the Splunk Add-on for Cisco Security Cloud (https://splunkbase.splunk.com/app/7404).
    The malware & file access policy must also enable logging.
known_false_positives: |
    Security testing or vulnerability scanners might trigger this. Investigate any potential
    matches to determine if they're legitimate.
references:
    - https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components
    - https://nextjs.org/blog/CVE-2025-66478
    - https://nvd.nist.gov/vuln/detail/CVE-2025-55182
    - https://gist.github.com/maple3142/48bc9393f45e068cf8c90ab865c0f5f3
    - https://www.wiz.io/blog/critical-vulnerability-in-react-cve-2025-55182
finding:
    title: Potential exploitation of CVE-2025-65554 from $src$
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: src
      type: system
analytic_story:
    - React2Shell
asset_type: Endpoint
mitre_attack_id:
    - T1190
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: network
security_domain: endpoint

Stages and Predicates

Stage 1: search

`cisco_secure_firewall`
EventType=IntrusionEvent
signature_id = 65554

Stage 2: fillnull

| fillnull

Stage 3: stats

| stats min(_time) as firstTime
        max(_time) as lastTime
        values(signature_id) as signature_id
        values(signature) as signature
        values(class_desc) as class_desc
        values(MitreAttackGroups) as MitreAttackGroups
        values(InlineResult) as InlineResult
        values(InlineResultReason) as InlineResultReason
        values(src) as src
        values(dest_port) as dest_port
        values(rule) as rule
        values(transport) as transport
        values(app) as app
        by dest

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `cisco_secure_firewall___react_server_components_rce_attempt_filter`

Indicators

These rows show field, operator, and value matches.

Detect mshta inline hta execution

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

The following analytic detects the execution of "mshta.exe" with inline protocol handlers such as "JavaScript", "VBScript", and "About". It leverages data from Endpoint Detection and Response (EDR) agents, focusing on command-line arguments and process details. This activity is significant because mshta.exe can be exploited to execute malicious scripts, potentially leading to unauthorized code execution. If confirmed malicious, this could allow an attacker to execute arbitrary code, escalate privileges, or establish persistence within the environment, posing a severe security risk.

Known False Positives

  • Although unlikely, some legitimate applications may exhibit this behavior, triggering a false positive.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Detect mshta inline hta execution
id: a0873b32-5b68-11eb-ae93-0242ac130002
version: 22
creation_date: '2020-04-29'
modification_date: '2026-05-13'
author: Bhavin Patel, Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects the execution of "mshta.exe" with inline protocol handlers such as "JavaScript", "VBScript", and "About". It leverages data from Endpoint Detection and Response (EDR) agents, focusing on command-line arguments and process details. This activity is significant because mshta.exe can be exploited to execute malicious scripts, potentially leading to unauthorized code execution. If confirmed malicious, this could allow an attacker to execute arbitrary code, escalate privileges, or establish persistence within the environment, posing a severe security risk.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |
    | tstats `security_content_summariesonly` count values(Processes.process)
    as process values(Processes.parent_process) as parent_process min(_time) as firstTime
    max(_time) as lastTime from datamodel=Endpoint.Processes where

    `process_mshta`
    Processes.process IN ("*vbscript*", "*javascript*", "*about*")

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

    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `detect_mshta_inline_hta_execution_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Although unlikely, some legitimate applications may exhibit this behavior, triggering a false positive.
references:
    - https://github.com/redcanaryco/AtomicTestHarnesses
    - https://redcanary.com/blog/introducing-atomictestharnesses/
    - https://docs.microsoft.com/en-us/windows/win32/search/-search-3x-wds-extidx-prot-implementing
finding:
    title: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ by user $user$ executing with inline HTA, indicative of defense evasion.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ by user $user$ executing with inline HTA, indicative of defense evasion.
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process_name
      type: process_name
analytic_story:
    - Compromised Windows Host
    - Gozi Malware
    - Living Off The Land
    - Suspicious MSHTA Activity
    - XWorm
    - APT37 Rustonotto and FadeStealer
    - BlankGrabber Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1218.005
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly` count values(Processes.process)
as process values(Processes.parent_process) as parent_process min(_time) as firstTime
max(_time) as lastTime from datamodel=Endpoint.Processes where

`process_mshta`
Processes.process IN ("*vbscript*", "*javascript*", "*about*")

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

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `detect_mshta_inline_hta_execution_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • MSHTA.EXE corpus 40 (elastic 21, sigma 13, splunk 6)
field:"OriginalFileName" kind:eq value:"MSHTA.EXE"
Processes.processin
  • *about*
  • *javascript*
  • *vbscript*
field:"CommandLine" kind:in
Processes.process_nameeq
  • mshta.exe corpus 84 (elastic 80, splunk 4)
field:"process_basename" kind:eq value:"mshta.exe"

Excessive Usage Of Cacls App

#
Status
production
Severity
low
Group by
_time, computer_name, parent_command_line, parent_process_basename, user
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic identifies excessive usage of cacls.exe, xcacls.exe, or icacls.exe to change file or folder permissions. It looks for 10 or more execution of the aforementioned processes in the span of 1 minute. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names and command-line executions. This activity is significant as it may indicate an adversary attempting to restrict access to malware components or artifacts on a compromised system. If confirmed malicious, this behavior could prevent users from deleting or accessing critical files, aiding in the persistence and concealment of malicious activities.

Known False Positives

  • Administrators or administrative scripts may use this application. Filter as needed.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

Rule Body

name: Excessive Usage Of Cacls App
id: 0bdf6092-af17-11eb-939a-acde48001122
version: 13
creation_date: '2021-05-07'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: |
    The following analytic identifies excessive usage of `cacls.exe`, `xcacls.exe`,
    or `icacls.exe` to change file or folder permissions.
    It looks for 10 or more execution of the aforementioned processes in the span of 1 minute.
    It leverages data from Endpoint Detection and Response (EDR) agents,
    focusing on process names and command-line executions.
    This activity is significant as it may indicate an adversary attempting
    to restrict access to malware components or artifacts on a compromised system.
    If confirmed malicious, this behavior could prevent users from deleting or accessing
    critical files, aiding in the persistence and concealment of malicious activities.
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
      values(Processes.dest) as dest
      values(Processes.user) as user
      values(Processes.action) as action
      values(Processes.original_file_name) as original_file_name
      values(Processes.parent_process_exec) as parent_process_exec
      values(Processes.parent_process_guid) as parent_process_guid
      values(Processes.parent_process_id) as parent_process_id
      values(Processes.parent_process_path) as parent_process_path
      values(Processes.process) as process
      values(Processes.process_exec) as process_exec
      values(Processes.process_guid) as process_guid
      values(Processes.process_hash) as process_hash
      values(Processes.process_id) as process_id
      values(Processes.process_integrity_level) as process_integrity_level
      values(Processes.process_name) as process_name
      values(Processes.process_path) as process_path
      values(Processes.user_id) as user_id
      values(Processes.vendor_product) as vendor_product count
    from datamodel=Endpoint.Processes where
    Processes.process_name IN( "icacls.exe", "cacls.exe", "xcacls.exe")
    by Processes.parent_process_name Processes.parent_process Processes.dest Processes.user _time span=1m
    | where count >=10
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `excessive_usage_of_cacls_app_filter`
how_to_implement: |
    The detection is based on data that originates from Endpoint Detection
    and Response (EDR) agents. These agents are designed to provide security-related
    telemetry from the endpoints where the agent is installed. To implement this search,
    you must ingest logs that contain the process GUID, process name, and parent process.
    Additionally, you must ingest complete command-line executions. These logs must
    be processed using the appropriate Splunk Technology Add-ons that are specific to
    the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint`
    data model. Use the Splunk Common Information Model (CIM) to normalize the field
    names and speed up the data modeling process.
known_false_positives: Administrators or administrative scripts may use this application. Filter as needed.
references:
    - https://thedfirreport.com/2020/04/20/sqlserver-or-the-miner-in-the-basement/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: An excessive amount of $process_name$ was executed on $dest$ attempting to modify permissions.
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - Azorult
    - Windows Post-Exploitation
    - Prestige Ransomware
    - XMRig
    - Crypto Stealer
    - Defense Evasion or Unauthorized Access Via SDDL Tampering
asset_type: Endpoint
mitre_attack_id:
    - T1222
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
    values(Processes.dest) as dest
    values(Processes.user) as user
    values(Processes.action) as action
    values(Processes.original_file_name) as original_file_name
    values(Processes.parent_process_exec) as parent_process_exec
    values(Processes.parent_process_guid) as parent_process_guid
    values(Processes.parent_process_id) as parent_process_id
    values(Processes.parent_process_path) as parent_process_path
    values(Processes.process) as process
    values(Processes.process_exec) as process_exec
    values(Processes.process_guid) as process_guid
    values(Processes.process_hash) as process_hash
    values(Processes.process_id) as process_id
    values(Processes.process_integrity_level) as process_integrity_level
    values(Processes.process_name) as process_name
    values(Processes.process_path) as process_path
    values(Processes.user_id) as user_id
    values(Processes.vendor_product) as vendor_product
    count
  from datamodel=Endpoint.Processes
  where
Processes.process_name IN( "icacls.exe", "cacls.exe", "xcacls.exe")
  by
    Processes.parent_process_name
    Processes.parent_process
    Processes.dest
    Processes.user
    _time span=1m

Stage 2: where

| where count >=10

Stage 3: search

| `drop_dm_object_name(Processes)`

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `excessive_usage_of_cacls_app_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.process_namein
  • cacls.exe corpus 8 (splunk 8)
  • icacls.exe corpus 8 (splunk 8)
  • xcacls.exe corpus 8 (splunk 8)
field:"process_basename" kind:in
countge
  • 10 corpus 7 (splunk 7)
field:"count" kind:ge value:"10"

File_Folder Hidden - Windows (PowerShell)

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

This use case detects commands setting the hidden attribute to files or folders on Windows systems. This technique is used by threat actors to evade detection and conceal malicious files from regular view

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '17782.29999'
title: File_Folder Hidden - Windows
description: 'This use case detects commands setting the hidden attribute to files
  or folders on Windows systems. This technique is used by threat actors to evade
  detection and conceal malicious files from regular view. Atomics T1222.001 Test
  #4'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4103) OR
  "<EventID>4103<" OR TERM(EventCode=4104) OR "<EventID>4104<") (TERM(attrib) OR TERM(attrib.exe))
  "+h" | regex process="(?i)\s\+h\s+" | table _time, host, user parent_*, process,
  process_* | bin span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:file and directory permissions modification:windows file and directory
  permissions modification
technique_id:
- T1222.001
data_category:
- PowerShell logs
references:
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1222.001/T1222.001.md#atomic-test-4---attrib---hide-file

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4103) OR "<EventID>4103<" OR TERM(EventCode=4104) OR "<EventID>4104<") (TERM(attrib) OR TERM(attrib.exe)) "+h"

Stage 2: regex

| regex process="(?i)\s\+h\s+"

Stage 3: table

| table _time, host, user parent_*, process, 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
  • 4103 corpus 105 (splunk 105)
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq
processregex_match
  • (?i)\s+h\s+ corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)\s+h\s+"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4103<"
1"<EventID>4104<"
1attrib
1attrib.exe
1"+h"

Kerberos Pre-Authentication Flag Disabled in UserAccountControl

#
Status
production
Severity
medium
Group by
actor, dest, user
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic detects when the Kerberos Pre-Authentication flag is disabled in a user account, using Windows Security Event 4738. This event indicates a change in the UserAccountControl property of a domain user object. Disabling this flag allows adversaries to perform offline brute force attacks on the user's password using the AS-REP Roasting technique. This activity is significant as it can be used by attackers with existing privileges to escalate their access or maintain persistence. If confirmed malicious, this could lead to unauthorized access and potential compromise of sensitive information.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Kerberos Pre-Authentication Flag Disabled in UserAccountControl
id: 0cb847ee-9423-11ec-b2df-acde48001122
version: 12
creation_date: '2022-02-23'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects when the Kerberos Pre-Authentication flag is disabled in a user account, using Windows Security Event 4738. This event indicates a change in the UserAccountControl property of a domain user object. Disabling this flag allows adversaries to perform offline brute force attacks on the user's password using the AS-REP Roasting technique. This activity is significant as it can be used by attackers with existing privileges to escalate their access or maintain persistence. If confirmed malicious, this could lead to unauthorized access and potential compromise of sensitive information.
data_source:
    - Windows Event Log Security 4738
search: >
    `wineventlog_security` EventCode=4738 UserAccountControl="*%%2096*"
    | rename TargetUserName as user, SubjectUserName as actor | stats count earliest(_time) as firstTime latest(_time) as lastTime by actor, user, dest
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `kerberos_pre_authentication_flag_disabled_in_useraccountcontrol_filter`
how_to_implement: To successfully implement this search, you need to be ingesting Domain Controller events. The Advanced Security Audit policy setting `User Account Management` within `Account Management` needs to be enabled.
known_false_positives: No false positives have been identified at this time.
references:
    - https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/useraccountcontrol-manipulate-account-properties
    - https://m0chan.github.io/2019/07/31/How-To-Attack-Kerberos-101.html
    - https://stealthbits.com/blog/cracking-active-directory-passwords-with-as-rep-roasting/
finding:
    title: Kerberos Pre Authentication was Disabled for $user$
    entity:
        field: user
        type: user
        score: 50
analytic_story:
    - Active Directory Kerberos Attacks
    - BlackSuit Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1558.004
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security` EventCode=4738 UserAccountControl="*%%2096*"

Stage 2: rename

| rename TargetUserName as user, SubjectUserName as actor

Stage 3: stats

| stats count earliest(_time) as firstTime latest(_time) as lastTime by actor, user, dest

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `kerberos_pre_authentication_flag_disabled_in_useraccountcontrol_filter`

Indicators

These rows show field, operator, and value matches.

M365 Copilot Non Compliant Devices Accessing M365 Copilot

#
Status
production
Severity
low
Group by
"deviceDetail.browser", "deviceDetail.operatingSystem", user
Author
Rod Soto
Source
github.com/splunk/security_content

Detects M365 Copilot access from non-compliant or unmanaged devices that violate corporate security policies, indicating potential shadow IT usage, BYOD policy violations, or compromised endpoint access. The detection filters M365 Copilot Graph API events where deviceDetail.isCompliant=false or deviceDetail.isManaged=false, then aggregates by user, operating system, and browser to calculate metrics including event counts, unique IPs and locations, and compliance/management status over time. Users accessing Copilot from non-compliant or unmanaged devices are flagged and sorted by activity volume and geographic spread, enabling security teams to identify unauthorized endpoints that may lack proper security controls, encryption, or MDM enrollment.

Known False Positives

  • Legitimate employees using personal devices during emergencies, new hires awaiting device provisioning, temporary workers with unmanaged equipment, or users accessing Copilot from approved but temporarily non-compliant devices may trigger false positives.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Rule Body

name: M365 Copilot Non Compliant Devices Accessing M365 Copilot
id: e26bc52d-9cbc-4743-9745-e8781d935042
version: 6
creation_date: '2025-10-13'
modification_date: '2026-05-13'
author: Rod Soto
status: production
type: Anomaly
description: Detects M365 Copilot access from non-compliant or unmanaged devices that violate corporate security policies, indicating potential shadow IT usage, BYOD policy violations, or compromised endpoint access. The detection filters M365 Copilot Graph API events where deviceDetail.isCompliant=false or deviceDetail.isManaged=false, then aggregates by user, operating system, and browser to calculate metrics including event counts, unique IPs and locations, and compliance/management status over time. Users accessing Copilot from non-compliant or unmanaged devices are flagged and sorted by activity volume and geographic spread, enabling security teams to identify unauthorized endpoints that may lack proper security controls, encryption, or MDM enrollment.
data_source:
    - M365 Copilot Graph API
search: |-
    `m365_copilot_graph_api` (appDisplayName="*Copilot*" OR appDisplayName="M365ChatClient") deviceDetail.isCompliant=false OR deviceDetail.isManaged=false
      | eval user = userPrincipalName
      | stats count as events, dc(ipAddress) as unique_ips, values(ipAddress) as ip_addresses, dc(location.city) as unique_cities, values(location.city) as cities, dc(location.countryOrRegion) as unique_countries, values(location.countryOrRegion) as countries, values(deviceDetail.isCompliant) as compliance_status, values(deviceDetail.isManaged) as management_status, min(_time) as first_seen, max(_time) as last_seen
        BY user, deviceDetail.operatingSystem, deviceDetail.browser
      | eval days_active = round((last_seen - first_seen)/86400, 1)
      | eval first_seen = strftime(first_seen, "%Y-%m-%d %H:%M:%S")
      | eval last_seen = strftime(last_seen, "%Y-%m-%d %H:%M:%S")
      | sort -events, -unique_countries
      | `m365_copilot_non_compliant_devices_accessing_m365_copilot_filter`
how_to_implement: This detection requires ingesting M365 Copilot access logs via the Splunk Add-on for Microsoft Office 365. Configure the add-on to collect Azure AD Sign-in logs (AuditLogs.SignIns) through the Graph API data input. Ensure proper authentication and permissions are configured to access sign-in audit logs. The `m365_copilot_graph_api` macro should be defined to filter for sourcetype o365:graph:api data containing Copilot application activity.
known_false_positives: Legitimate employees using personal devices during emergencies, new hires awaiting device provisioning, temporary workers with unmanaged equipment, or users accessing Copilot from approved but temporarily non-compliant devices may trigger false positives.
references:
    - https://www.splunk.com/en_us/blog/artificial-intelligence/m365-copilot-log-analysis-splunk.html
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: User $user$ accessed M365 Copilot from non-compliant or unmanaged devices accross $unique_countries$ countries, violating corporate security policies and creating potential data exposure risks.
analytic_story:
    - Suspicious Microsoft 365 Copilot Activities
asset_type: Web Application
mitre_attack_id:
    - T1685
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`m365_copilot_graph_api` (appDisplayName="*Copilot*" OR appDisplayName="M365ChatClient")
    deviceDetail.isCompliant=false OR deviceDetail.isManaged=false

Stage 2: eval

| eval user = userPrincipalName

Stage 3: stats

| stats
    count as events,
    dc(ipAddress) as unique_ips,
    values(ipAddress) as ip_addresses,
    dc(location.city) as unique_cities,
    values(location.city) as cities,
    dc(location.countryOrRegion) as unique_countries,
    values(location.countryOrRegion) as countries,
    values(deviceDetail.isCompliant) as compliance_status,
    values(deviceDetail.isManaged) as management_status,
    min(_time) as first_seen,
    max(_time) as last_seen
  BY user, deviceDetail.operatingSystem, deviceDetail.browser

Stage 4: eval

| eval days_active = round((last_seen - first_seen)/86400, 1)

Stage 5: eval

| eval first_seen = strftime(first_seen, "%Y-%m-%d %H:%M:%S")

Stage 6: eval

| eval last_seen = strftime(last_seen, "%Y-%m-%d %H:%M:%S")

Stage 7: sort

| sort -events, -unique_countries

Stage 8: search

| `m365_copilot_non_compliant_devices_accessing_m365_copilot_filter`

Indicators

These rows show field, operator, and value matches.

Modify Windows Defender (PowerShell)

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

Adversaries may modify security tools to avoid possible detection of their tools and activities. This use case looks for abnormalities commonly associated with a large number of modifications to windows defender in a short period of time

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

References

Telemetry Coverage

Rule Body

id: '5996.6372'
title: Modify Windows Defender
description: 'Adversaries may modify security tools to avoid possible detection of
  their tools and activities. This use case looks for abnormalities commonly associated
  with a large number of modifications to windows defender in a short period of time.
  -- Threat Actor Association: BlackByte, Lazarus, Magic Hound (aka APT35, Charming
  Kitten, Phosphorus, and Mint Sandstorm), Memento Team, Muddled Libra, REvil, Vice
  Society - Software Association: Akira, BianLian, Black Basta, Lockbit, Snake, Vice
  Society, XingLocker, Zloader'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` TERM(EventCode=4104) (TERM(Set-MpPreference)
  OR TERM(Add-MpPreference)) | table _time, host, user process, process_*, singature_id
  | bin span=60s | stats values(*) as * by _time, host | eventstats dc(process) as
  dc_process by process, host, _time | where dc_process > 2 '
techniques:
- defense-evasion:impair defenses:disable or modify tools
technique_id:
- T1562.001
data_category:
- PowerShell logs
- Process command-line parameters
references:
- https://unit42.paloaltonetworks.com/unit42-gorgon-group-slithering-nation-state-cybercrime/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` TERM(EventCode=4104) (
    TERM(Set-MpPreference)
    OR TERM(Add-MpPreference)
)

Stage 2: table

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

Stage 3: bucket

| bin span=60s

Stage 4: stats

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

Stage 5: eventstats

| eventstats dc(process) as dc_process by process, host, _time

Stage 6: where

| where dc_process > 2

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"Set-MpPreference"
1"Add-MpPreference"

MSHTA.exe execution (Sysmon)

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

Detect use of MSHTA

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '5982.18112'
title: MSHTA.exe execution
description: 'Detect use of MSHTA. -- Threat Actor Association: Actinium/Gamaredon/Primitive
  Bear, APT37, APT43, FIN7, Kimsuky, MuddyWater, TA551, TA576, UAC-0057 (GhostWriter),
  Wizard Spider -- Software Association: Bazar, Conti, PYSA/Mespinoza, Trickbot, XingLocker,
  Zloader Atomics T1218.005 Test#1 Atomics T1218.005 Test#2 Atomics T1218.005 Test#3
  Atomics T1218.005 Test#4 Atomics T1218.005 Test#5 Atomics T1218.005 Test#6 Atomics
  T1218.005 Test#7 Atomics T1218.005 Test#8 Atomics T1218.005 Test#9 Atomics T1218.005
  Test#10 Atomics T1059.001 Test #9 - #TrendingThreat #Russia #Ukraine'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  (TERM(mshta.exe) OR TERM(mshta)) | table _time, host, user process, process_*, parent_*,
  signature_id, src_*, dest_* | bin span=1s | stats values(*) as * by _time, host
  | where match(process_name, "(?i)mshta") OR match(process, "(?i)mshta") OR (match(parent_process_name,
  "(?i)mshta") and match(process_name, "(?i)cmd|powershell")) '
techniques:
- defense-evasion:system binary proxy execution:mshta
technique_id:
- T1218.005
data_category:
- Windows Sysmon
references:
- https://lolbas-project.github.io/lolbas/Binaries/Mshta/
- ired.team/offensive-security/code-execution/t1170-mshta-code-execution
- https://attackiq.com/2020/04/20/fingerprinting-fin7/

Stages and Predicates

Stage 1: search

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

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Stage 5: where

| where match(process_name, "(?i)mshta") OR match(process, "(?i)mshta") OR (
    match(parent_process_name, "(?i)mshta")
    and match(process_name, "(?i)cmd|powershell")
)

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
parent_process_nameregex_match
  • (?i)mshta corpus 3 (splunk 3)
field:"parent_process_name" kind:regex_match value:"(?i)mshta"
processregex_match
  • (?i)mshta corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)mshta"
process_nameregex_match
    • (?i)cmd
    • powershell
    corpus 3 (splunk 3)
  • (?i)mshta corpus 3 (splunk 3)
field:"process_name" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1mshta.exe
1mshta

Potential Executable Masquerading as Document - Windows (Sysmon)

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

Adversaries may abuse double extensions to attempt to conceal dangerous file types of payloads. This use case detects executions of files that appear to be document or image files but execute as script or executable files, or executable/script files with 3 or more spaces or underscores preceding the extension in an effort to obscure the file's actual extension. CVE-2023-38831

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '21579.38122'
title: Potential Executable Masquerading as Document - Windows
description: 'Adversaries may abuse double extensions to attempt to conceal dangerous
  file types of payloads. This use case detects executions of files that appear to
  be document or image files but execute as script or executable files, or executable/script
  files with 3 or more spaces or underscores preceding the extension in an effort
  to obscure the file''s actual extension. CVE-2023-38831 -- Threat Actor Association:
  APT28, APT40, Sandworm Team, UAC-0057 (GhostWriter)'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  (".pdf" OR ".jpg" OR ".jpeg" OR "gif" OR ".ico" OR ".doc" OR ".xls" OR ".docx" OR
  ".xlsx" OR ".png" OR ".xml" OR ".csv" OR ".ppt" OR ".pptx" OR ".rtf" OR ".txt")
  (".cmd" OR ".bat" OR ".ps1" OR ".vbs" OR ".js" OR ".py" OR ".exe" OR ".msi" OR ".vbe"
  OR ".lnk" OR ".scr") | regex process="(?i)((\s{3,}|_{3,})|(\.(pdf|jpg|jpeg|gif|ico|doc|xls|docx|xlsx|png|xml|csv|ppt|pptx|rtf|txt)(\s+)?))\.(cmd|bat|ps1|vbs|js|py|exe|msi|vbe|lnk|scr)"
  | table _time, host, user, process, process_*, parent_process_* | bin span=1s |
  stats values(*) as * by _time, host '
techniques:
- defense-evasion:masquerading:double file extension
technique_id:
- T1036.007
data_category:
- Windows Sysmon
- Process command-line parameters
references:
- https://www.group-ib.com/blog/cve-2023-38831-winrar-zero-day/
- https://www.microsoft.com/en-us/security/blog/2024/01/17/new-ttps-observed-in-mint-sandstorm-campaign-targeting-high-profile-individuals-at-universities-and-research-orgs/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") (".pdf" OR ".jpg" OR ".jpeg" OR "gif" OR ".ico" OR ".doc" OR ".xls" OR ".docx" OR ".xlsx" OR ".png" OR ".xml" OR ".csv" OR ".ppt" OR ".pptx" OR ".rtf" OR ".txt") (".cmd" OR ".bat" OR ".ps1" OR ".vbs" OR ".js" OR ".py" OR ".exe" OR ".msi" OR ".vbe" OR ".lnk" OR ".scr")

Stage 2: regex

| regex
    process="(?i)((\s{3,}|_{3,})|(\.(pdf|jpg|jpeg|gif|ico|doc|xls|docx|xlsx|png|xml|csv|ppt|pptx|rtf|txt)(\s+)?))\.(cmd|bat|ps1|vbs|js|py|exe|msi|vbe|lnk|scr)"

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
processregex_match
  • (?i)((\s{3,}|_{3,})|(.(pdf|jpg|jpeg|gif|ico|doc|xls|docx|xlsx|png|xml|csv|ppt|pptx|rtf|txt)(\s+)?)).(cmd|bat|ps1|vbs|js|py|exe|msi|vbe|lnk|scr) corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match value:"(?i)((\s{3,}|_{3,})|(.(pdf|jpg|jpeg|gif|ico|doc|xls|docx|xlsx|png|xml|csv|ppt|pptx|rtf|txt)(\s+)?)).(cmd|bat|ps1|vbs|js|py|exe|msi|vbe|lnk|scr)"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1".pdf"
1".jpg"
1".jpeg"
1"gif"
1".ico"
1".doc"
1".xls"
1".docx"
1".xlsx"
1".png"
1".xml"
1".csv"
1".ppt"
1".pptx"
1".rtf"
1".txt"
1".cmd"
1".bat"
1".ps1"
1".vbs"
1".js"
1".py"
1".exe"
1".msi"
1".vbe"
1".lnk"
1".scr"

Potential ngrok Tunnel - Windows (Windows Event Log)

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

ngrok is a reverse proxy utility with the ability to establish tunnels on targets using reverse SSH, even if the target does not have ngrok installed. Attackers have been observed abusing ngrok to establish persistence and perform lateral movement on compromised targets by exposing RDP services. This use case detects artifacts specific to RDP sessions established using ngrok

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

References

Telemetry Coverage

Rule Body

id: '20681.36836'
title: Potential ngrok Tunnel - Windows
description: 'ngrok is a reverse proxy utility with the ability to establish tunnels
  on targets using reverse SSH, even if the target does not have ngrok installed.
  Attackers have been observed abusing ngrok to establish persistence and perform
  lateral movement on compromised targets by exposing RDP services. This use case
  detects artifacts specific to RDP sessions established using ngrok. -- Threat Actor
  Association: Scattered Spider (aka. Muddled Libra, Scatter Swine, Starfraud, UNC3944)'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4779) OR
  "<EventID>4779<") "%16777216" | table _time, host, user, process_*, src_ip, src_port,
  dest_ip, dest_port | bin span=1s | stats values(*) as * by _time, host '
techniques:
- command-and-control:protocol tunneling
technique_id: 
- T1572
data_category:
- Windows event logs
references:
- https://www.logpoint.com/en/blog/a-deep-look-at-the-darkside-ransomware-operators-and-their-affiliates/
- https://ngrok.com/docs/secure-tunnels/tunnels/ssh-reverse-tunnel-agent/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4779) OR "<EventID>4779<") "%16777216"

Stage 2: table

| table _time, host, user, process_*, src_ip, src_port, dest_ip, dest_port

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
  • 4779 corpus 3 (splunk 3)
field:"EventID" kind:eq value:"4779"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4779<"
1"%16777216"

PowerShell Start-BitsTransfer

#
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 the execution of the PowerShell command Start-BitsTransfer, which can be used for file transfers, including potential data exfiltration. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process creation events and command-line arguments. This activity is significant because Start-BitsTransfer can be abused by adversaries to upload sensitive files to remote locations, posing a risk of data loss. If confirmed malicious, this could lead to unauthorized data exfiltration, compromising sensitive information and potentially leading to further exploitation of the network.

Known False Positives

  • Limited false positives. It is possible administrators will utilize Start-BitsTransfer for administrative tasks, otherwise filter based parent process or command-line arguments.

MITRE ATT&CK Coverage

TacticTechniques
Execution
Persistence
Stealth

Telemetry Coverage

Rule Body

name: PowerShell Start-BitsTransfer
id: 39e2605a-90d8-11eb-899e-acde48001122
version: 12
creation_date: '2021-03-30'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects the execution of the PowerShell command `Start-BitsTransfer`, which can be used for file transfers, including potential data exfiltration. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process creation events and command-line arguments. This activity is significant because `Start-BitsTransfer` can be abused by adversaries to upload sensitive files to remote locations, posing a risk of data loss. If confirmed malicious, this could lead to unauthorized data exfiltration, compromising sensitive information and potentially leading to further exploitation of 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 `process_powershell` Processes.process=*start-bitstransfer*
      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)`
    | `powershell_start_bitstransfer_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. It is possible administrators will utilize Start-BitsTransfer for administrative tasks, otherwise filter based parent process or command-line arguments.
references:
    - https://isc.sans.edu/diary/Investigating+Microsoft+BITS+Activity/23281
    - https://docs.microsoft.com/en-us/windows/win32/bits/using-windows-powershell-to-create-bits-transfer-jobs
finding:
    title: A suspicious process $process_name$ with commandline $process$ that are related to bittransfer functionality in host $dest$
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: A suspicious process $process_name$ with commandline $process$ that are related to bittransfer functionality in host $dest$
analytic_story:
    - BITS Jobs
    - Gozi Malware
asset_type: Endpoint
mitre_attack_id:
    - T1197
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 `process_powershell` Processes.process=*start-bitstransfer*
  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

| `powershell_start_bitstransfer_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • 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.processeq
  • *start-bitstransfer* corpus 5 (sigma 3, elastic 1, splunk 1)
field:"CommandLine" kind:eq value:"*start-bitstransfer*"
Processes.process_nameeq
  • 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

Powersploit SPN Enumeration (PowerShell)

#
Source
github.com/anvilogic-forge/armory

Kerberoast is a series of tools for attacking MS Kerberos implementations

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '1078.1116'
title: Powersploit SPN Enumeration
description: 'Kerberoast is a series of tools for attacking MS Kerberos implementations.
  Threat Actor Association: APT29/Nobelium/Cozy Bear Software Association: Cuba, Vice
  Society #TrendingThreat #Russia #Ukraine Atomics T1558.003 #Test1'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` ("Kerberoast.ps1" OR "GetUserSPNS.ps1"
  "KERBEROAST" OR "INVOKE-KERBEROAST" OR "Get-DomainSPNTicket" OR ("Get-NetUser" AND
  "-SPN") OR "Get-SPNTicket" OR "Convert-LDAPProperty" OR ("Get-DomainUser" AND "-SPN"))
  OR ( TERM(System.IdentityModel.Tokens.KerberosRequestorSecurityToken) OR (TERM(System.DirectoryServices.SearchResult)
  AND TERM(System.Collections.Hashtable))OR(TERM(System.IdentityModel) AND TERM(System.DirectoryServices.ActiveDirectory.Forest)
  AND TERM(GetCurrentForest)) OR (TERM(System.IdentityModel) AND TERM(LoadWithPartialName)
  AND TERM(Reflection.Assembly)) OR (TERM(setspn.exe) AND TERM(System.IdentityModel.Tokens.KerberosRequestorSecurityToken))
  OR (TERM(System.DirectoryServices.ActiveDirectory.Domain) AND TERM(System.DirectoryServices.ActiveDirectory.DirectoryContext)
  AND (TERM(GetDomain))) OR (TERM(System.DirectoryServices.DirectorySearcher) AND
  TERM(servicePrincipalName) OR TERM(servicePrincipalName)) OR (TERM(System.DirectoryServices.SecurityMasks)
  AND (TERM(Dacl) OR TERM(GROUP) OR TERM(OWNER) OR TERM(SACL) OR TERM(NONE))) OR (TERM(System.DirectoryServices.ReferralChasingOption)
  AND TERM(ALL)) OR (TERM(Security.AccessControl.RawSecurityDescriptor) OR (TERM(System.Security.Principal.SecurityIdentifier)
  AND (TERM(System.MarshalByRefObject)) AND TERM(System.Reflection.BindingFlags) AND
  TERM(GetProperty))) OR TERM(Diagnostics.CodeAnalysis.SuppressMessageAttribute) OR
  (TERM(adminCount=1) ) OR TERM(Management.Automation.PSCredential) OR (TERM(System.IdentityModel.Tokens.KerberosRequestorSecurityToken)
  AND TERM(System.BitConverter) AND TERM(ToString)) ) | rex field=_raw max_match=5
  (?<known_ioc>"(?i)Kerberoast|GetUserSPNS|Get-DomainSPNTicket|Get-NetUser.+-SPN|Get-SPNTicket|Convert-LDAPProperty|Get-DomainUser.+-SPN")|
  rex field=_raw max_match=1 (?<keywords_spn>"(?i)ServicePrincipalName") | rex field=_raw
  max_match=5 (?<file>"[a-zA-Z0-9_]+.ps1")| rex field=_raw (?<identity>"(?i)System.IdentityModel")
  | rex field=_raw (?<token>"(?i)System.IdentityModel.Tokens.KerberosRequestorSecurityToken")|
  rex field=_raw (?<forest>"(?i)System.DirectoryServices.ActiveDirectory.Forest.+")
  | rex field=_raw (?<setspn>"(?i)setspn.exe") | rex field=_raw (?<ad>"(?i)System.DirectoryServices.ActiveDirectory")
  | rex field=_raw (?<convert>"(?i)System.BitConverter.+ToString") | rex field=_raw
  (?<credential>"(?i)Management.Automation.PSCredential") | rex field=_raw (?<privilege>"(?i)adminCount=1")|
  rex field=_raw (?<error>"(?i)Diagnostics.CodeAnalysis.SuppressMessageAttribute.+")|
  rex field=_raw (?<security1>"(?i)Security.AccessControl.RawSecurityDescriptor")|
  rex field=_raw (?<security2>"(?i)System.Security.Principal.SecurityIdentifier")|
  rex field=_raw (?<properties>"(?i)System.Reflection.BindingFlags.+GetProperty")|
  rename ScriptBlock_ID as scriptblock_id | eval user=mvfilter(NOT match(user, "(?i)convert|_")),
  kerberoast_request=mvappend(keywords_spn, identity, token, forest, setspn, ad, convert,
  credential, privilege, error, security1, security2, properties) | table _time, host,
  user_time, file, host, scriptblock_id, signature_id, event_id, kerberoast_request,
  known_ioc, error | bin span=120s | stats values(*) as * by _time, host '
techniques:
- credential-access:steal or forge kerberos tickets:kerberoasting
technique_id:
- T1558.003
data_category:
- PowerShell logs
references:
- https://github.com/nidem/kerberoast
- https://attack.mitre.org/techniques/T1558/003/

Prohibited Network Traffic Allowed

#
Status
production
Severity
medium
Group by
All_Traffic.action, All_Traffic.dvc, All_Traffic.rule, All_Traffic.src_port, All_Traffic.vendor_product, dest_ip, destination_port, src_ip
Author
Rico Valdez, Splunk
Source
github.com/splunk/security_content

The following analytic detects instances where network traffic, identified by port and transport layer protocol as prohibited in the "lookup_interesting_ports" table, is allowed. It uses the Network_Traffic data model to cross-reference traffic data against predefined security policies. This activity is significant for a SOC as it highlights potential misconfigurations or policy violations that could lead to unauthorized access or data exfiltration. If confirmed malicious, this could allow attackers to bypass network defenses, leading to potential data breaches and compromising the organization's security posture.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Rule Body

name: Prohibited Network Traffic Allowed
id: ce5a0962-849f-4720-a678-753fe6674479
version: 14
creation_date: '2020-04-29'
modification_date: '2026-05-13'
author: Rico Valdez, Splunk
status: production
type: TTP
description: The following analytic detects instances where network traffic, identified by port and transport layer protocol as prohibited in the "lookup_interesting_ports" table, is allowed. It uses the Network_Traffic data model to cross-reference traffic data against predefined security policies. This activity is significant for a SOC as it highlights potential misconfigurations or policy violations that could lead to unauthorized access or data exfiltration. If confirmed malicious, this could allow attackers to bypass network defenses, leading to potential data breaches and compromising the organization's security posture.
data_source:
    - Cisco Secure Firewall Threat Defense Connection Event
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Network_Traffic
      WHERE All_Traffic.action IN ("allowed", "allow") [
    | inputlookup interesting_ports_lookup where is_prohibited="true"
    | table dest_port transport
    | dedup dest_port transport
    | rename dest_port as All_Traffic.dest_port
    | rename transport as All_Traffic.transport] by All_Traffic.src_ip All_Traffic.dest_ip All_Traffic.dest_port All_Traffic.action All_Traffic.dvc All_Traffic.src_port All_Traffic.vendor_product All_Traffic.rule
    | lookup update=true interesting_ports_lookup dest_port as All_Traffic.dest_port transport as All_Traffic.transport OUTPUT app is_prohibited note
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `drop_dm_object_name("All_Traffic")`
    | `prohibited_network_traffic_allowed_filter`
how_to_implement: In order to properly run this search, Splunk needs to ingest data from firewalls or other network control devices that mediate the traffic allowed into an environment. This is necessary so that the search can identify an 'action' taken on the traffic of interest. The search requires the Network_Traffic data model be populated.
known_false_positives: No false positives have been identified at this time.
references: []
finding:
    title: Potentially Prohibited Network Traffic allowed from $src_ip$
    entity:
        field: src_ip
        type: system
        score: 50
threat_objects:
    - field: dest_ip
      type: ip_address
analytic_story:
    - Prohibited Traffic Allowed or Protocol Mismatch
    - Ransomware
    - Command And Control
    - Cisco Secure Firewall Threat Defense Analytics
asset_type: Endpoint
mitre_attack_id:
    - T1048
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: network
security_domain: network
baselines:
    - Count of Unique IPs Connecting to Ports

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Network_Traffic
  WHERE All_Traffic.action IN ("allowed", "allow") [
| inputlookup interesting_ports_lookup where is_prohibited="true"
| table dest_port transport
| dedup dest_port transport
| rename dest_port as All_Traffic.dest_port
| rename transport as All_Traffic.transport]
  by
    All_Traffic.src_ip
    All_Traffic.dest_ip
    All_Traffic.dest_port
    All_Traffic.action
    All_Traffic.dvc
    All_Traffic.src_port
    All_Traffic.vendor_product
    All_Traffic.rule

Stage 2: lookup

| lookup update=true interesting_ports_lookup dest_port as All_Traffic.dest_port
    transport as All_Traffic.transport OUTPUT app is_prohibited note
Lookup table
interesting_ports_lookup
Key field
dest_port as All_Traffic.dest_port
Output columns
['app', 'app'], ['is_prohibited', 'is_prohibited'], ['note', 'note']

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `drop_dm_object_name("All_Traffic")`

Stage 6: search

| `prohibited_network_traffic_allowed_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
All_Traffic.actionin
  • allow
  • allowed
field:"All_Traffic.action" kind:in

Ransomware Notes bulk creation

#
Status
production
Severity
low
Group by
dest, file_name
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic identifies the bulk creation of ransomware notes (e.g., .txt, .html, .hta files) on an infected machine. It leverages Sysmon EventCode 11 to detect multiple instances of these file types being created within a short time frame. This activity is significant as it often indicates an active ransomware attack, where the attacker is notifying the victim of the encryption. If confirmed malicious, this behavior could lead to widespread data encryption, rendering critical files inaccessible and potentially causing significant operational disruption.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Impact

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 11: FileCreate

Rule Body

name: Ransomware Notes bulk creation
id: eff7919a-8330-11eb-83f8-acde48001122
version: 16
creation_date: '2021-03-19'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic identifies the bulk creation of ransomware notes (e.g., .txt, .html, .hta files) on an infected machine. It leverages Sysmon EventCode 11 to detect multiple instances of these file types being created within a short time frame. This activity is significant as it often indicates an active ransomware attack, where the attacker is notifying the victim of the encryption. If confirmed malicious, this behavior could lead to widespread data encryption, rendering critical files inaccessible and potentially causing significant operational disruption.
data_source:
    - Sysmon EventID 11
search: |-
    `sysmon` EventCode=11 file_name IN ("*\.txt","*\.html","*\.hta")
      | bin _time span=10s
      | stats min(_time) as firstTime max(_time) as lastTime dc(TargetFilename) as unique_readme_path_count values(TargetFilename) as list_of_readme_path values(action) as action values(file_access_time) as file_access_time values(file_create_time) as file_create_time values(file_hash) as file_hash values(file_modify_time) as file_modify_time values(file_path) as file_path values(file_acl) as file_acl values(file_size) as file_size values(process_guid) as process_guid values(process_id) as process_id values(user) as user values(vendor_product) as vendor_product
        BY dest file_name
      | where unique_readme_path_count >= 15
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `ransomware_notes_bulk_creation_filter`
how_to_implement: You must be ingesting data that records the filesystem activity from your hosts to populate the Endpoint file-system data model node. If you are using Sysmon, you will need a Splunk Universal Forwarder on each endpoint from which you want to collect data.
known_false_positives: No false positives have been identified at this time.
references:
    - https://www.mandiant.com/resources/fin11-email-campaigns-precursor-for-ransomware-data-theft
    - https://blog.virustotal.com/2020/11/keep-your-friends-close-keep-ransomware.html
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A high frequency file creation of $file_name$ in different file path in host $dest$
analytic_story:
    - BlackMatter Ransomware
    - DarkSide Ransomware
    - Chaos Ransomware
    - Rhysida Ransomware
    - LockBit Ransomware
    - Medusa Ransomware
    - Black Basta Ransomware
    - Clop Ransomware
    - Cactus Ransomware
    - Termite Ransomware
    - Interlock Ransomware
    - NailaoLocker Ransomware
    - Hellcat Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1486
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon` EventCode=11 file_name IN ("*\.txt","*\.html","*\.hta")

Stage 2: bucket

| bin _time span=10s

Stage 3: stats

| stats
    min(_time) as firstTime
    max(_time) as lastTime
    dc(TargetFilename) as unique_readme_path_count
    values(TargetFilename) as list_of_readme_path
    values(action) as action
    values(file_access_time) as file_access_time
    values(file_create_time) as file_create_time
    values(file_hash) as file_hash
    values(file_modify_time) as file_modify_time
    values(file_path) as file_path
    values(file_acl) as file_acl
    values(file_size) as file_size
    values(process_guid) as process_guid
    values(process_id) as process_id
    values(user) as user
    values(vendor_product) as vendor_product
  BY dest file_name

Stage 4: where

| where unique_readme_path_count >= 15

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `ransomware_notes_bulk_creation_filter`

Indicators

These rows show field, operator, and value matches.

Schedule Task with HTTP Command Arguments

#
Status
production
Severity
medium
Group by
Arguments, Author, Command, Enabled, Hidden, dest, task_name
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects the creation of scheduled tasks on Windows systems that include HTTP command arguments, using Windows Security EventCode 4698. It identifies tasks registered via schtasks.exe or TaskService with HTTP in their command arguments. This behavior is significant as it often indicates malware activity or the use of Living off the Land binaries (lolbins) to download additional payloads. If confirmed malicious, this activity could lead to data exfiltration, malware propagation, or unauthorized access to sensitive information, necessitating immediate investigation and mitigation.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Execution
Persistence
Privilege Escalation

Telemetry Coverage

Rule Body

name: Schedule Task with HTTP Command Arguments
id: 523c2684-a101-11eb-916b-acde48001122
version: 12
creation_date: '2021-04-26'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects the creation of scheduled tasks on Windows systems that include HTTP command arguments, using Windows Security EventCode 4698. It identifies tasks registered via schtasks.exe or TaskService with HTTP in their command arguments. This behavior is significant as it often indicates malware activity or the use of Living off the Land binaries (lolbins) to download additional payloads. If confirmed malicious, this activity could lead to data exfiltration, malware propagation, or unauthorized access to sensitive information, necessitating immediate investigation and mitigation.
data_source:
    - Windows Event Log Security 4698
search: |-
    `wineventlog_security` EventCode=4698
      | xmlkv Message
      | search Arguments IN ("*http*")
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY dest, Task_Name, Command,
           Author, Enabled, Hidden,
           Arguments
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `schedule_task_with_http_command_arguments_filter`
how_to_implement: To successfully implement this search, you need to be ingesting logs with the task schedule (Exa. Security Log EventCode 4698) endpoints. Tune and filter known instances of Task schedule used in your environment.
known_false_positives: No false positives have been identified at this time.
references:
    - https://app.any.run/tasks/92d7ef61-bfd7-4c92-bc15-322172b4ebec/
finding:
    title: A scheduled task process commandline arguments $Arguments$ with http string in it on host $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Windows Persistence Techniques
    - Living Off The Land
    - Compromised Windows Host
    - Scheduled Tasks
    - Winter Vivern
    - Hellcat Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1053
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security` EventCode=4698

Stage 2: xmlkv

| xmlkv Message

Stage 3: search

| search Arguments IN ("*http*")

Stage 4: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY dest, Task_Name, Command,
       Author, Enabled, Hidden,
       Arguments

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `schedule_task_with_http_command_arguments_filter`

Indicators

These rows show field, operator, and value matches.

Visio.exe File Download (PowerShell)

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

Visio.exe is a diagramming and vector graphics application developed by Microsoft, used for creating flowcharts, organizational charts, and other visual representations of information. Threat actors can abuse visio.exe to download files. This use case detects executions of visio.exe followed by URLs in the command line

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

References

Telemetry Coverage

Rule Body

id: '33361.59030'
title: Visio.exe File Download
description: Visio.exe is a diagramming and vector graphics application developed
  by Microsoft, used for creating flowcharts, organizational charts, and other visual
  representations of information. Threat actors can abuse visio.exe to download files.
  This use case detects executions of visio.exe followed by URLs in the command line.
  Living Off the Land Binary and Scripts (LOLBAS) (LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell`(TERM(EventCode=4103) OR
  "<EventID>4103<" OR TERM(EventCode=4104) OR "<EventID>4104<") TERM(visio) | regex
  process="(?i)visio(\.exe(\"|\'')?)?\s+(\"|\'')?[A-Za-z0-9]{2,6}:\/\/[^\s]+" | table
  _time, host, user, process, process_* | bin span=1s | stats values(*) as * by _time,
  host '
techniques:
- command-and-control:ingress tool transfer
technique_id: 
- T1105
data_category:
- PowerShell logs
references:
- https://attack.mitre.org/techniques/T1105/
- https://lolbas-project.github.io/lolbas/OtherMSBinaries/Visio/

Stages and Predicates

Stage 1: search

`get_endpoint_data`
    `get_endpoint_data_powershell`(TERM(EventCode=4103) OR "<EventID>4103<" OR TERM(EventCode=4104) OR "<EventID>4104<")
    TERM(visio)

Stage 2: regex

| regex process="(?i)visio(\.exe(\"|\')?)?\s+(\"|\')?[A-Za-z0-9]{2,6}:\/\/[^\s]+"

Stage 3: table

| table _time, host, user, process, 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
  • 4103 corpus 105 (splunk 105)
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq
processregex_match
  • (?i)visio(.exe("|\')?)?\s+("|\')?[A-Za-z0-9]{2,6}:\/\/[^\s]+ corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4103<"
1"<EventID>4104<"
1visio

Windows - Service Stop (PowerShell)

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

This use case detects any service stop commands on Windows endpoints. Adversaries may stop or disable services on a system to render those services unavailable to legitimate users. Stopping critical services or processes can inhibit or stop response to an incident or aid in the adversary's overall objectives to cause damage to the environment. Adversaries may accomplish this by disabling individual services of high importance to an organization, such as MSExchangeIS, which will make Exchange content inaccessible. In some cases, adversaries may stop or disable many or all services to render systems unusable. Services or processes may not allow for modification of their data stores while running. Adversaries may stop services or processes in order to conduct Data Destruction or Data Encrypted for Impact on the data stores of services like Exchange and SQL Server

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment
Impact

References

Telemetry Coverage

Rule Body

id: '12724.31085'
title: Windows - Service Stop
description: 'This use case detects any service stop commands on Windows endpoints.
  Adversaries may stop or disable services on a system to render those services unavailable
  to legitimate users. Stopping critical services or processes can inhibit or stop
  response to an incident or aid in the adversary''s overall objectives to cause damage
  to the environment. Adversaries may accomplish this by disabling individual services
  of high importance to an organization, such as MSExchangeIS, which will make Exchange
  content inaccessible. In some cases, adversaries may stop or disable many or all
  services to render systems unusable. Services or processes may not allow for modification
  of their data stores while running. Adversaries may stop services or processes in
  order to conduct Data Destruction or Data Encrypted for Impact on the data stores
  of services like Exchange and SQL Server. -- Threat Actor Association: APT28 (aka.Fancy
  Bear, Fighting Ursa, Forest Blizzard, Pawn Storm, TA422, STRONTIUM), APT29/Nobelium/Cozy
  Bear, Cadet Blizzard, FIN6, GoldenJackal, Kimsuky, Lapsus$, Magic Hound (aka APT35,
  Charming Kitten, Phosphorus, and Mint Sandstorm) , TA2541, Traveling Spider - Software
  Association: AvosLocker, BianLian, BlackByte, Blackcat/ALPHV, Black Basta, Conti,
  Cring, Cuba, GhostShell, Hive, Lockbit, Nefilim, Prestige, Prometheus / Spook, Rhysida,
  Royal, Ryuk, Snatch, TeamTNT, Trigona, WatchDog, WhisperGate, XingLocker -- Atomics
  T1489 Test #1 Atomics T1489 Test #2 Atomics T1489 Test #3'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4103) OR
  "<EventID>4103<" OR TERM(EventCode=4104) OR "<EventID>4104<") ((TERM(sc.exe) OR
  TERM(sc) OR TERM(net) OR TERM(net.exe)) AND TERM(stop)) OR ( TERM(taskkill) AND
  ( TERM(/IM) OR TERM(/PID) OR TERM(/T) ) AND TERM(/F)) OR ((TERM(sc.exe) OR TERM(sc))
  AND TERM(CONFIG) AND TERM(START=) AND TERM(DISABLED)) OR ((TERM(Stop-Process) OR
  TERM(kill) OR TERM(spps)) (TERM(-name) OR TERM(-ProcessName) OR TERM(-id))) OR (TERM(Win32_Process)
  AND ".terminate") | table _time, host, user parent_process*, process, process_*,
  signature_id, user_id | bin span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:impair defenses:disable or modify tools
- impact:service stop
technique_id:
- T1562.001
- T1489
data_category:
- PowerShell logs
references:
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1489/T1489.md#atomic-test-1---windows---stop-service-using-service-controller

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4103) OR "<EventID>4103<" OR TERM(EventCode=4104) OR "<EventID>4104<") ((TERM(sc.exe) OR TERM(sc) OR TERM(net) OR TERM(net.exe)) AND TERM(stop)) OR ( TERM(taskkill) AND ( TERM(/IM) OR TERM(/PID) OR TERM(/T) ) AND TERM(/F)) OR ((TERM(sc.exe) OR TERM(sc)) AND TERM(CONFIG) AND TERM(START=) AND TERM(DISABLED)) OR ((TERM(Stop-Process) OR TERM(kill) OR TERM(spps)) (TERM(-name) OR TERM(-ProcessName) OR TERM(-id))) OR (TERM(Win32_Process) AND ".terminate")

Stage 2: table

| table _time, host, user parent_process*, process, process_*, signature_id, user_id

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
  • 4103 corpus 105 (splunk 105)
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4103<"
1"<EventID>4104<"
1sc.exe
1sc
1net
1net.exe
1stop
1taskkill
1"/IM"
1"/PID"
1"/T"
1"/F"
1sc.exe
1sc
1CONFIG
1"START="
1DISABLED
1"Stop-Process"
1kill
1spps
1"-name"
1"-ProcessName"
1"-id"
1Win32_Process
1".terminate"

Windows Cloud Files Filter Log Created by Non-System Process

#
Status
production
Severity
medium
Group by
action, dest, file_name, process_guid, process_id, process_name, target_filename, user_id, vendor_product
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

Detects a non-system process causing creation of CldFlt0.etl under C:\Windows\System32\LogFiles\CloudFiles. This path is initialised by the CldFlt driver when a process calls CfRegisterSyncRoot() or CfConnectSyncRoot(). In the RedSun exploit this is a side-effect of the DoCloudStuff() function that registers a fake sync provider to create the cloud-tagged bait file. Legitimate cloud providers (OneDrive etc.) register sync roots from SYSTEM-level service processes, not from user-context executables.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Privilege Escalation

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 11: FileCreate

Rule Body

name: Windows Cloud Files Filter Log Created by Non-System Process
id: 2e0042b9-8a75-49ca-b3a2-948f04b752bf
version: 1
creation_date: '2026-05-01'
modification_date: '2026-05-01'
author: Raven Tait, Splunk
status: production
type: TTP
description: |-
    Detects a non-system process causing creation of CldFlt0.etl under C:\Windows\System32\LogFiles\CloudFiles\.
    This path is initialised by the CldFlt driver when a process calls CfRegisterSyncRoot() or CfConnectSyncRoot().
    In the RedSun exploit this is a side-effect of the DoCloudStuff() function that registers a fake sync provider to create the cloud-tagged bait file.
    Legitimate cloud providers (OneDrive etc.) register sync roots from SYSTEM-level service processes, not from user-context executables.
data_source:
    - Sysmon EventID 11
search: |-
    `sysmon`
    EventCode=11
    TargetFilename = "*\\Windows\\System32\\LogFiles\\CloudFiles\\*"
    NOT Image IN (
        "*:\\Windows\\System32*",
        "*:\\Windows\\SysWOW64*",
        "*:\\Program Files\\WindowsApps\\*"
    )
    | stats count min(_time) as firstTime
                  max(_time) as lastTime
      by action dest file_name file_path Image process_guid
         process_id user_id vendor_product
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_cloud_files_filter_log_created_by_non_system_process_filter`
how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA.
known_false_positives: No false positives have been identified at this time.
references:
    - https://github.com/Nightmare-Eclipse/RedSun
    - https://www.huntress.com/blog/nightmare-eclipse-intrusion
finding:
    title: Non-System process $Image$ created a cloud files filter $file_name$ on host $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - RedSun
    - Windows Privilege Escalation
asset_type: Endpoint
cve:
    - CVE-2026-33825
mitre_attack_id:
    - T1068
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon`
EventCode=11
TargetFilename = "*\\Windows\\System32\\LogFiles\\CloudFiles\\*"
NOT Image IN (
    "*:\\Windows\\System32*",
    "*:\\Windows\\SysWOW64*",
    "*:\\Program Files\\WindowsApps\\*"
)

Stage 2: stats

| stats count min(_time) as firstTime
              max(_time) as lastTime
  by action dest file_name file_path Image process_guid
     process_id user_id vendor_product

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_cloud_files_filter_log_created_by_non_system_process_filter`

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
Imagein*:\Program Files\WindowsApps\*, *:\Windows\SysWOW64*, *:\Windows\System32*excludes:Image field:"Image" value:"*:\Program Files\WindowsApps\*" field:"Image" value:"*:\Windows\SysWOW64*" field:"Image" value:"*:\Windows\System32*"

Windows Credentials from Password Stores Chrome Extension Access

#
Status
production
Severity
low
Group by
dest, object_file_name, process_id, process_name, signature_id, target_filename
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects non-Chrome processes attempting to access the Chrome extensions file. It leverages Windows Security Event logs, specifically event code 4663, to identify this behavior. This activity is significant because adversaries may exploit this file to extract sensitive information from the Chrome browser, posing a security risk. If confirmed malicious, this could lead to unauthorized access to stored credentials and other sensitive data, potentially compromising the security of the affected system and broader network.

Known False Positives

  • The chrome uninstaller will access these set of files and folders. Filter as needed.

MITRE ATT&CK Coverage

TacticTechniques
Discovery

Telemetry Coverage

Rule Body

name: Windows Credentials from Password Stores Chrome Extension Access
id: 2e65afe0-9a75-4487-bd87-ada9a9f1b9af
version: 14
creation_date: '2023-05-02'
modification_date: '2026-08-14'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: |-
    The following analytic detects non-Chrome processes attempting to access the Chrome extensions file.
    It leverages Windows Security Event logs, specifically event code 4663, to identify this behavior.
    This activity is significant because adversaries may exploit this file to extract sensitive information from the Chrome browser, posing a security risk.
    If confirmed malicious, this could lead to unauthorized access to stored credentials and other sensitive data, potentially compromising the security of the affected system and broader network.
data_source:
    - Windows Event Log Security 4663
search: |
    `wineventlog_security`
    EventCode=4663
    object_file_path="*\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Local Extension Settings\\*"
    NOT process_path IN (
        "*:\\Windows\\explorer.exe",
        "*\\AppData\\Local\\Google\\Chrome Beta\\Application\\chrome.exe",
        "*\\AppData\\Local\\Google\\Chrome Dev\\Application\\chrome.exe",
        "*\\AppData\\Local\\Google\\Chrome SxS\\Application\\chrome.exe",
        "*\\AppData\\Local\\Google\\Chrome Unstable\\Application\\chrome.exe",
        "*\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"
    )
    | stats count min(_time) as firstTime
                  max(_time) as lastTime

      by object_file_name object_file_path
         process_name process_path
         process_id EventCode dest

    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_credentials_from_password_stores_chrome_extension_access_filter`
how_to_implement: |-
    To successfully implement this search, you must ingest Windows Security Event logs and track event code 4663.
    For 4663, enable "Audit Object Access" in Group Policy. Then check the two boxes listed for both "Success" and "Failure."
known_false_positives: |-
    The chrome uninstaller will access these set of files and folders. Filter as needed.
references:
    - https://malpedia.caad.fkie.fraunhofer.de/details/win.redline_stealer
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A non-chrome process $process_name$ accessing chrome browser extension folder files on $dest$
analytic_story:
    - StealC Stealer
    - DarkGate Malware
    - Amadey
    - Meduza Stealer
    - Malicious Inno Setup Loader
    - Phemedrone Stealer
    - CISA AA23-347A
    - RedLine Stealer
    - Braodo Stealer
    - MoonPeak
    - 0bj3ctivity Stealer
    - BlankGrabber Stealer
    - Phantom Stealer
    - Vidar Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1012
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security`
EventCode=4663
object_file_path="*\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Local Extension Settings\\*"
NOT process_path IN (
    "*:\\Windows\\explorer.exe",
    "*\\AppData\\Local\\Google\\Chrome Beta\\Application\\chrome.exe",
    "*\\AppData\\Local\\Google\\Chrome Dev\\Application\\chrome.exe",
    "*\\AppData\\Local\\Google\\Chrome SxS\\Application\\chrome.exe",
    "*\\AppData\\Local\\Google\\Chrome Unstable\\Application\\chrome.exe",
    "*\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"
)

Stage 2: stats

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

  by object_file_name object_file_path
     process_name process_path
     process_id EventCode dest

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_credentials_from_password_stores_chrome_extension_access_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4663 corpus 31 (splunk 31)
field:"EventID" kind:eq value:"4663"
object_file_patheq
  • *\AppData\Local\Google\Chrome\User Data\Default\Local Extension Settings\*
field:"TargetFilename" kind:eq value:"*\AppData\Local\Google\Chrome\User Data\Default\Local Extension Settings\*"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process_pathin*:\Windows\explorer.exe, *\AppData\Local\Google\Chrome Beta\Application\chrome.exe, *\AppData\Local\Google\Chrome Dev\Application\chrome.exe, *\AppData\Local\Google\Chrome SxS\Application\chrome.exe, *\AppData\Local\Google\Chrome Unstable\Application\chrome.exe, *\AppData\Local\Google\Chrome\Application\chrome.exeexcludes:process_path

Windows Indicator Removal Via Rmdir

#
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 'rmdir' command with '/s' and '/q' options to delete files and directory trees. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on command-line executions and process metadata. This activity is significant as it may indicate malware attempting to remove traces or components during cleanup operations. If confirmed malicious, this behavior could allow attackers to eliminate forensic evidence, hinder incident response efforts, and maintain persistence by removing indicators of compromise.

Known False Positives

  • user and network administrator can execute this command.

MITRE ATT&CK Coverage

TacticTechniques
Stealth

Telemetry Coverage

Rule Body

name: Windows Indicator Removal Via Rmdir
id: c4566d2c-b094-48a1-9c59-d66e22065560
version: 13
creation_date: '2022-12-06'
modification_date: '2026-08-14'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic detects the execution of the 'rmdir' command with '/s' and '/q' options to delete files and directory trees. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on command-line executions and process metadata. This activity is significant as it may indicate malware attempting to remove traces or components during cleanup operations. If confirmed malicious, this behavior could allow attackers to eliminate forensic evidence, hinder incident response efforts, and maintain persistence by removing indicators of compromise.
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 = "*rmdir*" Processes.process = "* /s *" Processes.process = "* /q *" NOT Processes.parent_process_name IN ("explorer.exe", "*HPDock*") 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_indicator_removal_via_rmdir_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: user and network administrator can execute this command.
references:
    - https://malpedia.caad.fkie.fraunhofer.de/details/win.darkgate
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: a process execute rmdir command to delete files and directory tree on $dest$.
analytic_story:
    - DarkGate Malware
    - APT37 Rustonotto and FadeStealer
    - ZOVWiper
    - Vidar Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1070
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 = "*rmdir*" Processes.process = "* /s *" Processes.process = "* /q *"
    NOT Processes.parent_process_name IN (
        "explorer.exe",
        "*HPDock*"
    )
  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_indicator_removal_via_rmdir_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • * /q * corpus 3 (sigma 2, splunk 1)
  • * /s * corpus 7 (sigma 4, splunk 3)
  • *rmdir* corpus 2 (sigma 1, splunk 1)
field:"CommandLine" kind:eq

Exclusions

The rule actively suppresses these predicates.

Windows Modify Registry ValleyRAT C2 Config

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

The following analytic detects modifications to theregistry related to ValleyRAT C2 configuration. Specifically, it monitors changes in registry keys where ValleyRAT saves the IP address and port information of its command-and-control (C2) server. This activity is a key indicator of ValleyRAT attempting to establish persistent communication with its C2 infrastructure. By identifying these unauthorized registry modifications, security analysts can quickly detect malicious configurations and investigate the associated threats. Early detection of these changes helps prevent further exploitation and limits the malware’s ability to exfiltrate data or control infected systems.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Persistence
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows Modify Registry ValleyRAT C2 Config
id: ac59298a-8d81-4c02-8c9b-ffdac993891f
version: 12
creation_date: '2024-09-18'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: "The following analytic detects modifications to theregistry related to ValleyRAT C2 configuration. Specifically,  it monitors changes in registry keys where ValleyRAT saves the IP address and port information of its command-and-control (C2) server. This activity is a key indicator of ValleyRAT attempting to establish persistent communication with its C2 infrastructure. By identifying these unauthorized registry modifications, security analysts can quickly detect malicious configurations and investigate the associated threats. Early detection of these changes helps prevent further exploitation and limits the malware’s ability to exfiltrate data or control infected systems."
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Registry WHERE (Registry.registry_path= "*\\Console\\IpDateInfo" AND Registry.registry_value_data="Binary Data") OR (Registry.registry_path= "*\\Console\\SelfPath" AND Registry.registry_value_data="*.exe") 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)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_modify_registry_valleyrat_c2_config_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: No false positives have been identified at this time.
references:
    - https://www.proofpoint.com/us/blog/threat-insight/chinese-malware-appears-earnest-across-cybercrime-threat-landscape
    - https://www.fortinet.com/blog/threat-research/valleyrat-campaign-targeting-chinese-speakers
finding:
    title: A registry modification related to ValleyRAT on [$dest$]
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: A registry modification related to ValleyRAT on [$dest$]
analytic_story:
    - ValleyRAT
asset_type: Endpoint
mitre_attack_id:
    - T1112
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.Registry
  WHERE (
      Registry.registry_path= "*\\Console\\IpDateInfo"
      AND Registry.registry_value_data="Binary Data"
  ) OR (Registry.registry_path= "*\\Console\\SelfPath" AND Registry.registry_value_data="*.exe")
  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: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_modify_registry_valleyrat_c2_config_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Registry.registry_patheq
  • *\Console\IpDateInfo
  • *\Console\SelfPath
field:"registry_path" kind:eq
Registry.registry_value_dataeq
  • *.exe
  • Binary Data corpus 5 (splunk 3, sigma 2)
field:"Details" kind:eq

Windows Network Share Interaction Via Net

#
Status
production
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
Dean Luxton
Source
github.com/splunk/security_content

The following analytic identifies network share discovery and collection activities performed on Windows systems using the Net command. Attackers often use network share discovery to identify accessible shared resources within a network, which can be a precursor to privilege escalation or data exfiltration. By monitoring Windows Event Logs for the usage of the Net command to list and interact with network shares, this detection helps identify potential reconnaissance and collection activities.

Known False Positives

  • Administrators or power users may use this command. Additional filters needs to be applied.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Network Share Interaction Via Net
id: e51fbdb0-0be0-474f-92ea-d289f71a695e
version: 7
creation_date: '2024-07-11'
modification_date: '2026-05-13'
author: Dean Luxton
status: production
type: Hunting
description: The following analytic identifies network share discovery and collection activities performed on Windows systems using the Net command. Attackers often use network share discovery to identify accessible shared resources within a network, which can be a precursor to privilege escalation or data exfiltration. By monitoring Windows Event Logs for the usage of the Net command to list and interact with network shares, this detection helps identify potential reconnaissance and collection activities.
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 (
            `process_net`
            OR
            (Processes.process_name="net.exe"
            OR
            Processes.original_file_name="net.exe")
        )
        AND Processes.process IN ("*use *", "*view*")
      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_network_share_interaction_via_net_filter`
how_to_implement: The detection is based on data originating from either Endpoint Detection and Response (EDR) telemetry or EventCode 4688 with process command line logging enabled. These sources provide security-related telemetry from the endpoints. To implement this search, you must ingest logs that contain the process name, parent process, and complete command-line executions. These logs must be mapped to the Splunk Common Information Model (CIM) to normalize the field names capture the data within the datamodel schema.
known_false_positives: Administrators or power users may use this command. Additional filters needs to be applied.
references:
    - https://attack.mitre.org/techniques/T1135/
analytic_story:
    - Active Directory Discovery
    - Active Directory Privilege Escalation
    - Network Discovery
asset_type: Endpoint
atomic_guid:
    - ab39a04f-0c93-4540-9ff2-83f862c385ae
mitre_attack_id:
    - T1135
    - T1039
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 (
      `process_net`
      OR (
          Processes.process_name="net.exe"
          OR Processes.original_file_name="net.exe"
      )
  )
    AND Processes.process IN ("*use *", "*view*")
  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_network_share_interaction_via_net_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • net.exe corpus 25 (sigma 19, elastic 4, splunk 2)
  • net1.exe corpus 39 (sigma 19, splunk 19, elastic 1)
field:"OriginalFileName" kind:eq
Processes.processin
  • *use *
  • *view*
field:"CommandLine" kind:in
Processes.process_nameeq
  • net.exe corpus 30 (elastic 27, splunk 2, kusto 1)
  • net1.exe corpus 40 (elastic 21, splunk 19)
field:"process_basename" kind:eq

Windows Potential Web Shell Creation For VMware Workspace ONE

#
Status
production
Severity
medium
Group by
CreationUtcTime, computer_name, event_action, file_name, process_guid, process_id, process_name, target_filename, user, vendor_product
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

This analytic looks for evidence of web shells being created in the VMware Workspace ONE path on Windows or Linux systems, which has been actively exploited by attackers via CVE-2022-22954.

Known False Positives

  • Some legitimate software updates or administrative scripts may create files in the VMware Workspace ONE path, triggering alerts. Review and allow trusted processes to reduce false positives.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 11: FileCreate

Rule Body

name: Windows Potential Web Shell Creation For VMware Workspace ONE
id: 7d15f645-58cc-4cb7-a9bf-2dcf15bc4b28
version: 2
creation_date: '2026-05-05'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: Anomaly
description: |-
    This analytic looks for evidence of web shells being created in the VMware Workspace ONE path on Windows or Linux systems, which has been actively exploited by attackers via CVE-2022-22954.
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.file_path IN (
        "*/vmware/horizon/workspace/webapps/*",
        "*\\vmware\\horizon\\workspace\\webapps\\*"
    )
    Filesystem.file_path="*.jsp"

    by Filesystem.dest Filesystem.file_create_time Filesystem.process_path
       Filesystem.process_guid Filesystem.process_id Filesystem.file_path Filesystem.file_name
       Filesystem.user Filesystem.vendor_product Filesystem.action

    | `drop_dm_object_name(Filesystem)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_potential_web_shell_creation_for_vmware_workspace_one_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Some legitimate software updates or administrative scripts may create files in the VMware Workspace ONE path, triggering alerts. Review and allow trusted processes to reduce false positives.
references:
    - https://unit42.paloaltonetworks.com/cve-2022-22954-vmware-vulnerabilities/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: Potential VMware Workspace ONE web shell file created at $file_path$ on $dest$.
threat_objects:
    - field: file_path
      type: file_path
analytic_story:
    - VMware Aria Operations vRealize CVE-2023-20887
    - VMware Server Side Injection and Privilege Escalation
    - VMware ESXi AD Integration Authentication Bypass CVE-2024-37085
asset_type: Endpoint
mitre_attack_id:
    - T1505.003
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.file_path IN (
    "*/vmware/horizon/workspace/webapps/*",
    "*\\vmware\\horizon\\workspace\\webapps\\*"
)
Filesystem.file_path="*.jsp"

by Filesystem.dest Filesystem.file_create_time Filesystem.process_path
   Filesystem.process_guid Filesystem.process_id Filesystem.file_path Filesystem.file_name
   Filesystem.user Filesystem.vendor_product Filesystem.action

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_potential_web_shell_creation_for_vmware_workspace_one_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Filesystem.file_patheq
  • *.jsp corpus 5 (sigma 4, splunk 1)
field:"TargetFilename" kind:eq value:"*.jsp"
Filesystem.file_pathin
  • */vmware/horizon/workspace/webapps/*
  • *\vmware\horizon\workspace\webapps\*
field:"TargetFilename" kind:in

Windows Process Outside of System Folder (Sysmon)

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

Adversaries may match or approximate the name or location of legitimate files or resources when naming/placing them. This is done for the sake of evading defenses and observation. This may be done by giving it the name of a legitimate, trusted program (ex: svchost.exe). This use case detects Windows processes commonly targeted for abuse operating outside of expected file paths \Windows\system32 and \Windows\SysWOW64

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '13077.18833'
title: Windows Process Outside of System Folder
description: 'Adversaries may match or approximate the name or location of legitimate
  files or resources when naming/placing them. This is done for the sake of evading
  defenses and observation. This may be done by giving it the name of a legitimate,
  trusted program (ex: svchost.exe). This use case detects Windows processes commonly
  targeted for abuse operating outside of expected file paths \Windows\system32 and
  \Windows\SysWOW64. -- Threat Actor Association: Flax Typhoon, Vice Society, UNC4990
  - Software Association: XWorm -- Atomics T1036.005 Test #2 Atomics T1218 Test #12'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "EventID>1<")
  ("svchost.exe" OR "rundll32.exe" OR "services.exe" OR "powershell.exe" OR "pwsh.exe"
  OR "regsvr32.exe" OR "spoolsv.exe" OR "lsass.exe" OR "smss.exe" OR "csrss.exe" OR
  "conhost.exe" OR "wininit.exe" OR "lsm.exe" OR "winlogon.exe" OR "taskhost.exe"
  OR "taskmgr.exe" OR "sihost.exe" OR "RuntimeBroker.exe" OR "smartscreen.exe" OR
  "dllhost.exe" OR "audiodg.exe" OR "wlanext.exe" OR "cmd.exe" OR "wmiprvse.exe" OR
  "powershell_ise.exe" OR "ie4uinit.exe" OR "mshta.exe" OR "printui.exe") | regex process_path!="(?i)(\x5cWindows\x5c(system32|SysWOW64))|Program\sFiles\x5cPowerShell"|
  where match(process_name, "(?i)^(svchost\.exe|rundll32\.exe|services\.exe|powershell\.exe|pwsh\.exe|regsvr32\.exe|spoolsv\.exe|lsass\.exe|smss\.exe|csrss\.exe|conhost\.exe|wininit\.exe|lsm\.exe|winlogon\.exe|taskhost\.exe|taskmgr\.exe|sihost\.exe|RuntimeBroker\.exe|smartscreen\.exe|dllhost\.exe|audiodg\.exe|wlanext\.exe|cmd\.exe|wmiprvse\.exe|powershell_ise\.exe|ie4uinit\.exe|mshta\.exe|printui\.exe)$")
  | table _time, host, user, process, process_* | bin span=1s | stats values(*) as
  * by _time, host '
techniques:
- defense-evasion:masquerading:masquerade task or service
- defense-evasion:masquerading:match legitimate name or location
technique_id:
- T1036.004
- T1036.005
data_category:
- Windows Sysmon
references:
- https://redcanary.com/threat-detection-report/techniques/match-legitimate-name-or-location/
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1036.005/T1036.005.md#atomic-test-2---masquerade-as-a-built-in-system-executable

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "EventID>1<") ("svchost.exe" OR "rundll32.exe" OR "services.exe" OR "powershell.exe" OR "pwsh.exe" OR "regsvr32.exe" OR "spoolsv.exe" OR "lsass.exe" OR "smss.exe" OR "csrss.exe" OR "conhost.exe" OR "wininit.exe" OR "lsm.exe" OR "winlogon.exe" OR "taskhost.exe" OR "taskmgr.exe" OR "sihost.exe" OR "RuntimeBroker.exe" OR "smartscreen.exe" OR "dllhost.exe" OR "audiodg.exe" OR "wlanext.exe" OR "cmd.exe" OR "wmiprvse.exe" OR "powershell_ise.exe" OR "ie4uinit.exe" OR "mshta.exe" OR "printui.exe")

Stage 2: regex

| regex process_path!="(?i)(\x5cWindows\x5c(system32|SysWOW64))|Program\sFiles\x5cPowerShell"

Stage 3: where

| where
    match(
        process_name,
        "(?i)^(svchost\.exe|rundll32\.exe|services\.exe|powershell\.exe|pwsh\.exe|regsvr32\.exe|spoolsv\.exe|lsass\.exe|smss\.exe|csrss\.exe|conhost\.exe|wininit\.exe|lsm\.exe|winlogon\.exe|taskhost\.exe|taskmgr\.exe|sihost\.exe|RuntimeBroker\.exe|smartscreen\.exe|dllhost\.exe|audiodg\.exe|wlanext\.exe|cmd\.exe|wmiprvse\.exe|powershell_ise\.exe|ie4uinit\.exe|mshta\.exe|printui\.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
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
process_nameregex_match
  • (?i)^(svchost.exe|rundll32.exe|services.exe|powershell.exe|pwsh.exe|regsvr32.exe|spoolsv.exe|lsass.exe|smss.exe|csrss.exe|conhost.exe|wininit.exe|lsm.exe|winlogon.exe|taskhost.exe|taskmgr.exe|sihost.exe|RuntimeBroker.exe|smartscreen.exe|dllhost.exe|audiodg.exe|wlanext.exe|cmd.exe|wmiprvse.exe|powershell_ise.exe|ie4uinit.exe|mshta.exe|printui.exe)$ corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)^(svchost.exe|rundll32.exe|services.exe|powershell.exe|pwsh.exe|regsvr32.exe|spoolsv.exe|lsass.exe|smss.exe|csrss.exe|conhost.exe|wininit.exe|lsm.exe|winlogon.exe|taskhost.exe|taskmgr.exe|sihost.exe|RuntimeBroker.exe|smartscreen.exe|dllhost.exe|audiodg.exe|wlanext.exe|cmd.exe|wmiprvse.exe|powershell_ise.exe|ie4uinit.exe|mshta.exe|printui.exe)$"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process_pathregex_match(?i)(\x5cWindows\x5c(system32|SysWOW64)), Program\sFiles\x5cPowerShellexcludes:process_path field:"process_path" value:"(?i)(\x5cWindows\x5c(system32|SysWOW64))" field:"process_path" value:"Program\sFiles\x5cPowerShell"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"EventID>1<"
1"svchost.exe"
1"rundll32.exe"
1"services.exe"
1"powershell.exe"
1"pwsh.exe"
1"regsvr32.exe"
1"spoolsv.exe"
1"lsass.exe"
1"smss.exe"
1"csrss.exe"
1"conhost.exe"
1"wininit.exe"
1"lsm.exe"
1"winlogon.exe"
1"taskhost.exe"
1"taskmgr.exe"
1"sihost.exe"
1"RuntimeBroker.exe"
1"smartscreen.exe"
1"dllhost.exe"
1"audiodg.exe"
1"wlanext.exe"
1"cmd.exe"
1"wmiprvse.exe"
1"powershell_ise.exe"
1"ie4uinit.exe"
1"mshta.exe"
1"printui.exe"

Windows Rundll32 with Non-Standard File Extension

#
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

This analytic identifies the instance of rundll32.exe process loading a non-standard Windows modules file extension. This behavior is not common and can be associated with malicious activities, such as the Gh0st RAT backdoor. This technique is to evade possible detection by security tools that monitors a suspicious dll loading activity.

Known False Positives

  • Certain legitimate Windows components, third-party applications, or administrative scripts may use rundll32.exe with non-standard or extensionless inputs during normal operation. Filtering and contextual analysis are required, focus on command-line arguments, parent process, file location, and prevalence across the environment before determining malicious intent.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Rundll32 with Non-Standard File Extension
id: f52b55ce-41ad-4802-9909-fbd7cc8410a5
version: 3
creation_date: '2026-03-30'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: |-
    This analytic identifies the instance of rundll32.exe process loading a non-standard Windows modules file extension.
    This behavior is not common and can be associated with malicious activities, such as the Gh0st RAT backdoor. This technique is to evade possible detection by security tools that monitors a suspicious dll loading activity.
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

    `process_rundll32`
    (
        Processes.parent_process_path IN (
            "*:\\PerfLogs\\*",
            "*:\\ProgramData\\*",
            "*:\\Recycle.bin\\*",
            "*:\\Users\\Administrator\\Music\\*",
            "*:\\Users\\Public\\*",
            "*:\\Windows\\Cursors\\*",
            "*:\\Windows\\debug\\*",
            "*:\\Windows\\fonts\\*",
            "*:\\Windows\\INF\\*",
            "*:\\Windows\\Media\\*",
            "*:\\Windows\\Prefetch\\*",
            "*:\\Windows\\repair\\*",
            "*:\\Windows\\Tasks\\*",
            "*\\Temp\\*"
        )
        OR
        Processes.parent_process_name IN (
            "*cmd.exe*",
            "*cscript.exe*",
            "*mshta.exe*",
            "*powershell.exe*",
            "*pwsh.exe*",
            "*regsvr32.exe*",
            "*wscript.exe*"
        )
    )
    NOT Processes.process IN (
            "*.cpl*",
            "*.dll*",
            "*.drv*",
            "*.inf*",
            "*.mui*",
            "*.ocx*"
        )

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

    | `drop_dm_object_name(Processes)`

    | rex field=process "^(?<cmd_base_process>[^\s]+)\s+\"?(?<cmd_base_first_param>[^,^\"^\s]+).*?,(?<cmd_args>.*)$"

    | rex field=cmd_base_first_param "^(?<root>[^\\\\]+)\\\\(?<subdirs>[^\\\\]+)"

    | eval folder_count = mvcount(split(cmd_base_first_param, "\\"))

    | where (
                folder_count = 3
                AND
                NOT lower(subdirs) IN (
                                        "windows",
                                        "program files",
                                        "program files (x86)"
                                    )
            )
            OR
            like(cmd_base_first_param, "%:\\ProgramData\\%")
            OR
            like(cmd_base_first_param, "%:\\Users\\Public\\%")
            OR
            like(cmd_base_first_param, "%\\AppData\\Local\\Temp\\%")
            OR
            like(cmd_base_first_param, "%\\AppData\\Roaming\\%")

    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_rundll32_with_non_standard_file_extension_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: |-
    Certain legitimate Windows components, third-party applications, or administrative scripts may use rundll32.exe with non-standard or extensionless inputs during normal operation.
    Filtering and contextual analysis are required, focus on command-line arguments, parent process, file location, and prevalence across the environment before determining malicious intent.
references:
    - https://malpedia.caad.fkie.fraunhofer.de/details/win.ghost_rat
    - https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-rrasm/22ad9f0e-4349-43e0-92b3-37f7a9c7ca41
    - https://s7d2.scene7.com/is/content/cylance/prod/cylance-web/en-us/resources/knowledge-center/resource-library/reports/Op_Dust_Storm_Report.pdf
    - https://www.sentinelone.com/blog/the-curious-case-of-gh0st-malware/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: An instance of [$parent_process_path$] launched [$process_name$] loading a non-standard DLL extension [$process$] in host [$dest$]
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process
      type: process
analytic_story:
    - Living Off The Land
    - Suspicious Rundll32 Activity
    - Gh0st RAT
asset_type: Endpoint
mitre_attack_id:
    - T1218.011
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
  count min(_time) as firstTime
        max(_time) as lastTime

FROM datamodel=Endpoint.Processes WHERE

`process_rundll32`
(
    Processes.parent_process_path IN (
        "*:\\PerfLogs\\*",
        "*:\\ProgramData\\*",
        "*:\\Recycle.bin\\*",
        "*:\\Users\\Administrator\\Music\\*",
        "*:\\Users\\Public\\*",
        "*:\\Windows\\Cursors\\*",
        "*:\\Windows\\debug\\*",
        "*:\\Windows\\fonts\\*",
        "*:\\Windows\\INF\\*",
        "*:\\Windows\\Media\\*",
        "*:\\Windows\\Prefetch\\*",
        "*:\\Windows\\repair\\*",
        "*:\\Windows\\Tasks\\*",
        "*\\Temp\\*"
    )
    OR
    Processes.parent_process_name IN (
        "*cmd.exe*",
        "*cscript.exe*",
        "*mshta.exe*",
        "*powershell.exe*",
        "*pwsh.exe*",
        "*regsvr32.exe*",
        "*wscript.exe*"
    )
)
NOT Processes.process IN (
        "*.cpl*",
        "*.dll*",
        "*.drv*",
        "*.inf*",
        "*.mui*",
        "*.ocx*"
    )

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

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: rex

| rex field=process
    "^(?<cmd_base_process>[^\s]+)\s+\"?(?<cmd_base_first_param>[^,^\"^\s]+).*?,(?<cmd_args>.*)$"

Stage 4: rex

| rex field=cmd_base_first_param "^(?<root>[^\\\\]+)\\\\(?<subdirs>[^\\\\]+)"

Stage 5: eval

| eval folder_count = mvcount(split(cmd_base_first_param, "\\"))

Stage 6: where

| where (
            folder_count = 3
            AND
            NOT lower(subdirs) IN (
                                    "windows",
                                    "program files",
                                    "program files (x86)"
                                )
        )
        OR
        like(cmd_base_first_param, "%:\\ProgramData\\%")
        OR
        like(cmd_base_first_param, "%:\\Users\\Public\\%")
        OR
        like(cmd_base_first_param, "%\\AppData\\Local\\Temp\\%")
        OR
        like(cmd_base_first_param, "%\\AppData\\Roaming\\%")

Stage 7: search

| `security_content_ctime(firstTime)`

Stage 8: search

| `security_content_ctime(lastTime)`

Stage 9: search

| `windows_rundll32_with_non_standard_file_extension_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • RUNDLL32.EXE corpus 72 (sigma 35, splunk 21, elastic 16)
field:"OriginalFileName" kind:eq value:"RUNDLL32.EXE"
Processes.parent_process_namein
  • *cmd.exe*
  • *cscript.exe*
  • *mshta.exe*
  • *powershell.exe*
  • *pwsh.exe*
  • *regsvr32.exe*
  • *wscript.exe*
field:"parent_process_basename" kind:in
Processes.parent_process_pathin
  • *:\PerfLogs\*
  • *:\ProgramData\*
  • *:\Recycle.bin\*
  • *:\Users\Administrator\Music\*
  • *:\Users\Public\*
  • *:\Windows\Cursors\*
  • *:\Windows\INF\*
  • *:\Windows\Media\*
  • *:\Windows\Prefetch\*
  • *:\Windows\Tasks\*
  • *:\Windows\debug\*
  • *:\Windows\fonts\*
  • *:\Windows\repair\*
  • *\Temp\* corpus 3 (splunk 3)
field:"ParentImage" kind:in
Processes.process_nameeq
  • rundll32.exe corpus 123 (elastic 100, splunk 23)
field:"process_basename" kind:eq value:"rundll32.exe"
cmd_base_first_paramlike
  • %:\ProgramData\%
  • %:\Users\Public\%
  • %\AppData\Local\Temp\%
  • %\AppData\Roaming\%
field:"cmd_base_first_param" kind:like
folder_counteq
  • 3
field:"folder_count" kind:eq value:"3"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
Processes.processin*.cpl*, *.dll*, *.drv*, *.inf*, *.mui*, *.ocx*excludes:Processes.process

Back to all Splunk rules