Detection rules › Splunk

Splunk rules: 0l

ASL AWS UpdateLoginProfile

#
Status
production
Severity
medium
Group by
"actor.user.account.uid", "actor.user.uid", "api.operation", "api.service.name", "cloud.provider", "cloud.region", "http_request.user_agent", "src_endpoint.ip"
Author
Patrick Bareiss, Splunk
Source
github.com/splunk/security_content

The following analytic detects an AWS CloudTrail event where a user with permissions updates the login profile of another user. It leverages CloudTrail logs to identify instances where the user making the change is different from the user whose profile is being updated. This activity is significant because it can indicate privilege escalation attempts, where an attacker uses a compromised account to gain higher privileges. If confirmed malicious, this could allow the attacker to escalate their privileges, potentially leading to unauthorized access and control over sensitive resources within the AWS environment.

Known False Positives

  • While this search has no known false positives, it is possible that an AWS admin has legitimately created keys for another user.

MITRE ATT&CK Coverage

TacticTechniques
Persistence

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: ASL AWS UpdateLoginProfile
id: 5b3f63a3-865b-4637-9941-f98bd1a50c0d
version: 8
creation_date: '2022-10-04'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: TTP
description: The following analytic detects an AWS CloudTrail event where a user with permissions updates the login profile of another user. It leverages CloudTrail logs to identify instances where the user making the change is different from the user whose profile is being updated. This activity is significant because it can indicate privilege escalation attempts, where an attacker uses a compromised account to gain higher privileges. If confirmed malicious, this could allow the attacker to escalate their privileges, potentially leading to unauthorized access and control over sensitive resources within the AWS environment.
data_source:
    - ASL AWS CloudTrail
search: |-
    `amazon_security_lake` api.operation=UpdateLoginProfile
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY actor.user.uid api.operation api.service.name
           http_request.user_agent src_endpoint.ip actor.user.account.uid
           cloud.provider cloud.region
      | rename actor.user.uid as user api.operation as action api.service.name as dest http_request.user_agent as user_agent src_endpoint.ip as src actor.user.account.uid as vendor_account cloud.provider as vendor_product cloud.region as vendor_region
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `asl_aws_updateloginprofile_filter`
how_to_implement: The detection is based on Amazon Security Lake events from Amazon Web Services (AWS), which is a centralized data lake that provides security-related data from AWS services. To use this detection, you must ingest CloudTrail logs from Amazon Security Lake into Splunk. To run this search, ensure that you ingest events using the latest version of Splunk Add-on for Amazon Web Services (https://splunkbase.splunk.com/app/1876) or the Federated Analytics App.
known_false_positives: While this search has no known false positives, it is possible that an AWS admin has legitimately created keys for another user.
references:
    - https://bishopfox.com/blog/privilege-escalation-in-aws
    - https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/
finding:
    title: User $user$ from IP address $src$ updated the login profile of another user
    entity:
        field: user
        type: user
        score: 50
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - AWS IAM Privilege Escalation
asset_type: AWS Account
mitre_attack_id:
    - T1136.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`amazon_security_lake` api.operation=UpdateLoginProfile

Stage 2: fillnull

| fillnull

Stage 3: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY actor.user.uid api.operation api.service.name
       http_request.user_agent src_endpoint.ip actor.user.account.uid
       cloud.provider cloud.region

Stage 4: rename

| rename actor.user.uid as user api.operation as action api.service.name as dest
    http_request.user_agent as user_agent src_endpoint.ip as src
    actor.user.account.uid as vendor_account cloud.provider as vendor_product
    cloud.region as vendor_region

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `asl_aws_updateloginprofile_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
api.operationeq
  • UpdateLoginProfile corpus 3 (splunk 2, sigma 1)
field:"aws::eventName" kind:eq value:"UpdateLoginProfile"
sourcetypeeq
  • aws:asl corpus 27 (splunk 27)
field:"sourcetype" kind:eq value:"aws:asl"

AWS Bedrock High Number List Foundation Model Failures

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

The following analytic identifies an high number of AccessDenied attempts to list AWS Bedrock foundation models. It leverages AWS CloudTrail logs to detect when a user or service experiences multiple failures when calling the ListFoundationModels API. This activity is significant as it may indicate an adversary performing reconnaissance of available AI models after compromising credentials with limited permissions. Repeated failures could suggest brute force attempts to enumerate accessible resources or misconfigured access controls. If confirmed malicious, this could represent early-stage reconnaissance before attempting to access or manipulate Bedrock models or knowledge bases.

Known False Positives

  • Legitimate users may encounter multiple failures during permission testing, role transitions, or when service permissions are being reconfigured. High volumes of API errors may also occur during automated processes with misconfigured IAM policies or when new Bedrock features are being explored through API testing.

MITRE ATT&CK Coverage

TacticTechniques
Discovery

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: AWS Bedrock High Number List Foundation Model Failures
id: e84b3c74-f742-11ee-9f6e-acde48001122
version: 6
creation_date: '2025-03-25'
modification_date: '2026-05-13'
author: Bhavin Patel, Splunk
status: production
type: TTP
description: The following analytic identifies an high number of AccessDenied attempts to list AWS Bedrock foundation models. It leverages AWS CloudTrail logs to detect when a user or service experiences multiple failures when calling the ListFoundationModels API. This activity is significant as it may indicate an adversary performing reconnaissance of available AI models after compromising credentials with limited permissions. Repeated failures could suggest brute force attempts to enumerate accessible resources or misconfigured access controls. If confirmed malicious, this could represent early-stage reconnaissance before attempting to access or manipulate Bedrock models or knowledge bases.
data_source:
    - AWS CloudTrail
search: >-
    `cloudtrail` eventSource=bedrock.amazonaws.com eventName=ListFoundationModels errorCode=AccessDenied  | rename user_name as user
    | stats count min(_time) as firstTime max(_time) as lastTime values(errorCode) as errorCodes values(errorMessage) as errorMessages by src user user_agent vendor_account vendor_product dest signature vendor_region
    | where count > 9
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `aws_bedrock_high_number_list_foundation_model_failures_filter`
how_to_implement: The Splunk AWS Add-on is required to utilize this data. The search requires AWS CloudTrail logs with Bedrock service events enabled. You must install and configure the AWS App for Splunk (version 6.0.0 or later) and Splunk Add-on for AWS (version 5.1.0 or later) to collect CloudTrail logs from AWS.
known_false_positives: Legitimate users may encounter multiple failures during permission testing, role transitions, or when service permissions are being reconfigured. High volumes of API errors may also occur during automated processes with misconfigured IAM policies or when new Bedrock features are being explored through API testing.
references:
    - https://docs.aws.amazon.com/bedrock/latest/APIReference/API_ListFoundationModels.html
    - https://trustoncloud.com/blog/exposing-the-weakness-how-we-identified-a-flaw-in-bedrocks-foundation-model-access-control/
    - https://attack.mitre.org/techniques/T1595/
finding:
    title: User $user$ attempted to list AWS Bedrock foundation models $count$ times with failures from $src$
    entity:
        field: user
        type: user
        score: 50
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - AWS Bedrock Security
asset_type: AWS Account
mitre_attack_id:
    - T1580
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`cloudtrail` eventSource=bedrock.amazonaws.com eventName=ListFoundationModels errorCode=AccessDenied

Stage 2: rename

| rename user_name as user

Stage 3: stats

| stats
    count
    min(_time) as firstTime
    max(_time) as lastTime
    values(errorCode) as errorCodes
    values(errorMessage) as errorMessages
  by src user user_agent vendor_account vendor_product dest signature vendor_region

Stage 4: where

| where count > 9

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `aws_bedrock_high_number_list_foundation_model_failures_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
countgt
  • 9 corpus 2 (splunk 2)
field:"count" kind:gt value:"9"
errorCodeeq
  • AccessDenied corpus 16 (sigma 11, splunk 3, elastic 1, panther 1)
field:"aws::errorCode" kind:eq value:"AccessDenied"
eventNameeq
  • ListFoundationModels
field:"aws::eventName" kind:eq value:"ListFoundationModels"
eventSourceeq
  • bedrock.amazonaws.com corpus 7 (splunk 5, sigma 2)
field:"aws::eventSource" kind:eq value:"bedrock.amazonaws.com"
sourcetypeeq
  • aws:cloudtrail corpus 59 (splunk 59)
field:"sourcetype" kind:eq value:"aws:cloudtrail"

Azure AD Multiple Failed MFA Requests For User

#
Status
production
Severity
medium
Group by
"status.additionalDetails", appDisplayName, aws::recipientAccountId, aws::userAgent, signature, user, vendor_product
Author
Mauricio Velazco, Gowthamaraj Rajendran, Splunk
Source
github.com/splunk/security_content

The following analytic identifies multiple failed multi-factor authentication (MFA) requests for a single user within an Azure AD tenant. It leverages Azure AD Sign-in Logs, specifically error code 500121, to detect more than 10 failed MFA attempts within 10 minutes. This behavior is significant as it may indicate an adversary attempting to bypass MFA by bombarding the user with repeated authentication prompts. If confirmed malicious, this activity could lead to unauthorized access, allowing attackers to compromise user accounts and potentially escalate their privileges within the environment.

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: Azure AD Multiple Failed MFA Requests For User
id: 264ea131-ab1f-41b8-90e0-33ad1a1888ea
version: 14
creation_date: '2022-08-25'
modification_date: '2026-05-13'
author: Mauricio Velazco, Gowthamaraj Rajendran, Splunk
status: production
type: TTP
description: The following analytic identifies multiple failed multi-factor authentication (MFA) requests for a single user within an Azure AD tenant. It leverages Azure AD Sign-in Logs, specifically error code 500121, to detect more than 10 failed MFA attempts within 10 minutes. This behavior is significant as it may indicate an adversary attempting to bypass MFA by bombarding the user with repeated authentication prompts. If confirmed malicious, this activity could lead to unauthorized access, allowing attackers to compromise user accounts and potentially escalate their privileges within the environment.
data_source:
    - Azure Active Directory Sign-in activity
search: |-
    `azure_monitor_aad` category=SignInLogs operationName="Sign-in activity" properties.status.errorCode=500121 properties.status.additionalDetails!="MFA denied; user declined the authentication"
      | rename properties.* as *
      | bucket span=10m _time
      | rename userAgent as user_agent
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime values(dest) as dest values(src) as src
        BY user, status.additionalDetails, appDisplayName,
           user_agent, vendor_account, vendor_product,
           signature
      | where count > 10
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `azure_ad_multiple_failed_mfa_requests_for_user_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 through an EventHub. This analytic was written to be used with the azure:monitor:aad sourcetype leveraging the Signin log category.
known_false_positives: Multiple Failed MFA requests may also be a sign of authentication or application issues. Filter as needed.
references:
    - https://www.mandiant.com/resources/blog/russian-targeting-gov-business
    - https://arstechnica.com/information-technology/2022/03/lapsus-and-solar-winds-hackers-both-use-the-same-old-trick-to-bypass-mfa/
    - https://therecord.media/russian-hackers-bypass-2fa-by-annoying-victims-with-repeated-push-notifications/
    - https://attack.mitre.org/techniques/T1621/
    - https://attack.mitre.org/techniques/T1078/004/
    - https://www.cisa.gov/sites/default/files/publications/fact-sheet-implement-number-matching-in-mfa-applications-508c.pdf
finding:
    title: User $user$ failed to complete MFA authentication more than 9 times in a timespan of 10 minutes.
    entity:
        field: user
        type: user
        score: 50
analytic_story:
    - Azure Active Directory Account Takeover
asset_type: Azure Active Directory
mitre_attack_id:
    - T1078.004
    - T1586.003
    - T1621
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: identity

Stages and Predicates

Stage 1: search

`azure_monitor_aad` category=SignInLogs operationName="Sign-in activity"
    properties.status.errorCode=500121
    properties.status.additionalDetails!="MFA denied; user declined the authentication"

Stage 2: rename

| rename properties.* as *

Stage 3: bucket

| bucket span=10m _time

Stage 4: rename

| rename userAgent as user_agent

Stage 5: fillnull

| fillnull

Stage 6: stats

| stats count min(_time) as firstTime max(_time) as lastTime values(dest) as dest values(src) as src
    BY user, status.additionalDetails, appDisplayName,
       user_agent, vendor_account, vendor_product,
       signature

Stage 7: where

| where count > 10

Stage 8: search

| `security_content_ctime(firstTime)`

Stage 9: search

| `security_content_ctime(lastTime)`

Stage 10: search

| `azure_ad_multiple_failed_mfa_requests_for_user_filter`

Indicators

These rows show field, operator, and value matches.

Cisco Isovalent - Pods Running Offensive Tools

#
Status
production
Severity
low
Group by
cluster_name, container_id, node_name, parent_process_name, pod_image_name, pod_name, pod_namespace, process_id, process_name
Author
Bhavin Patel, Splunk
Source
github.com/splunk/security_content

The following analytic detects execution of known offensive tooling from within Kubernetes pods, including network scanners and post-exploitation frameworks (e.g., nmap, masscan, zmap, impacket-*, hashcat, john, SharpHound, kube-hunter, peirates). We have created a macro named linux_offsec_tool_processes that contains the list of known offensive tooling found on linux systems. Adversaries commonly introduce these tools into compromised workloads to conduct discovery, lateral movement, credential access, or cluster reconnaissance. This behavior may indicate a compromised container or supply-chain abuse. Extra scrutiny is warranted for namespaces that do not typically run diagnostic scanners and for pods that suddenly begin invoking these binaries outside of normal maintenance activity.

Known False Positives

  • Security testing, approved red team exercises, or sanctioned diagnostics can trigger this analytic. Coordinate allowlists and maintenance windows with platform/SecOps teams. Please update a macro named `linux_offsec_tool_processes` that contains the list of known offensive tooling found on linux systems if your environment has additional known offensive tools that are not included in the macro.

MITRE ATT&CK Coverage

Rule Body

name: Cisco Isovalent - Pods Running Offensive Tools
id: e9d0b9e6-2f3c-4a8a-9d61-2b6f4a9c1c2e
version: 5
creation_date: '2026-01-05'
modification_date: '2026-05-13'
author: Bhavin Patel, Splunk
status: production
type: Anomaly
description: The following analytic detects execution of known offensive tooling from within Kubernetes pods, including network scanners and post-exploitation frameworks (e.g., nmap, masscan, zmap, impacket-*, hashcat, john, SharpHound, kube-hunter, peirates). We have created a macro named `linux_offsec_tool_processes` that contains the list of known offensive tooling found on linux systems. Adversaries commonly introduce these tools into compromised workloads to conduct discovery, lateral movement, credential access, or cluster reconnaissance. This behavior may indicate a compromised container or supply-chain abuse. Extra scrutiny is warranted for namespaces that do not typically run diagnostic scanners and for pods that suddenly begin invoking these binaries outside of normal maintenance activity.
data_source:
    - Cisco Isovalent Process Exec
search: |
    `cisco_isovalent_process_exec`  `linux_offsec_tool_processes`
    | stats count
            min(_time) as firstTime
            max(_time) as lastTime
            values(process) as process
        by cluster_name container_id pod_name pod_namespace pod_image_name parent_process_name process_name process_exec process_id node_name
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `cisco_isovalent___pods_running_offensive_tools_filter`
how_to_implement: The detection is based on process execution data generated by Cisco Isovalent Runtime Security. Ensure that Isovalent Runtime Security is deployed and configured in your Kubernetes environment to emit process_exec events. Configure the Cisco Security Cloud TA to collect these logs via HTTP Event Collector (HEC) and normalize them into the Splunk Common Information Model. This integration ensures that all relevant pod, container, and process activity is captured for monitoring and detection of suspicious behavior.
known_false_positives: Security testing, approved red team exercises, or sanctioned diagnostics can trigger this analytic. Coordinate allowlists and maintenance windows with platform/SecOps teams. Please update a macro named `linux_offsec_tool_processes` that contains the list of known offensive tooling found on linux systems if your environment has additional known offensive tools that are not included in the macro.
references:
    - https://dev.to/thenjdevopsguy/attacking-a-kubernetes-cluster-enter-red-team-mode-2onj
    - https://www.reddit.com/r/kubernetes/comments/l6e5yr/one_of_our_kubernetes_containers_was_compromised/
intermediate_findings:
    entities:
        - field: pod_name
          type: system
          score: 20
          message: Offensive tool execution [$process_name$] detected in pod [$pod_name$] on cluster [$cluster_name$]
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - Cisco Isovalent Suspicious Activity
asset_type: Endpoint
mitre_attack_id:
    - T1204.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`cisco_isovalent_process_exec`  `linux_offsec_tool_processes`

Stage 2: stats

| stats
    count
    min(_time) as firstTime
    max(_time) as lastTime
    values(process) as process
  by
    cluster_name
    container_id
    pod_name
    pod_namespace
    pod_image_name
    parent_process_name
    process_name
    process_exec
    process_id
    node_name

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `cisco_isovalent___pods_running_offensive_tools_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
process_namein
  • */
  • ---
  • /
  • /*
  • Access
  • Cracking
  • Credential
  • Enumeration
  • Escalation
  • Exploitation
  • Frameworks
  • Network
  • Persistence
  • Privilege
  • Reconnaissance
  • Scanning
  • amap
  • beef-xss
  • bloodhound
  • covenant
  • crackmapexec
  • crowbar
  • dirtycow
  • dirtypipe
  • dnsenum
  • dnsrecon
  • empire
  • enum4linux
  • evilginx
  • exploitdb
  • fierce
  • hashcat
  • havoc
  • hping3
  • hydra
  • ike-scan
  • impacket-
  • john
  • ldapdomaindump
  • ldpreload
  • +29 more values (see full rule source)
field:"process_name" kind:in
sourcetypeeq
  • cisco:isovalent:processExec
field:"sourcetype" kind:eq value:"cisco:isovalent:processExec"

Executable Process from Suspicious Folder (PowerShell)

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

Detects the execution of executable process spawned by powershell or similar processes from suspicious file locations like temp, appdata, and downloads

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '5746.6449'
title: Executable Process from Suspicious Folder
description: 'Detects the execution of executable process spawned by powershell or
  similar processes from suspicious file locations like temp, appdata, and downloads.
  - Threat Actor Association: Andariel, APT10/menuPass, APT28 (aka.Fancy Bear, Fighting
  Ursa, Forest Blizzard, Pawn Storm, TA422, STRONTIUM), APT34/OilRig, Blind Eagle/APT-C-36,
  Carbanak, Evilnum, FIN7, FIN8, GoldenJackal, Gorgon Group, Kimsuky, Lazarus, Magic
  Hound (aka APT35, Charming Kitten, Phosphorus, and Mint Sandstorm), Mustang Panda
  (aka. Stately Taurus//Earth Preta/BRONZE PRESIDENT/TA416/RedDelta), Redfly, TA505,
  TA551, UNC2465, Volt Typhoon, WinterVivern/UAC-0114 -- Software Association: Babuk,
  BadHatch, Bazar, Blackbyte, Clop, IcedID, Lockbit, MagicRAT, PowerShortShell, PYSA/Mespinoza,
  SmokedHAM, SolidBit, RATDispenser, Remcos, TA413, TargetCompany, Trickbot, Trigona,
  Yellow Cockatoo/Jupiter Infostealer, Vidar Stealer, WhisperGate - #TrendingThreat
  #Russia #Ukraine - Atomics T1574.001 Test#1'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` TERM(EventCode=4104) ("Temporary
  Internet Files" OR TERM("TEMP") OR TERM("Downloads") OR TERM("Appdata"))| regex
  Path="(?i)Temp|Downloads|Appdata" | eval process_path=Path | table _time, host,
  user process, process_*, signature_id, user | bin span=1s | stats values(*) as *
  by _time, host '
techniques:
- execution:command and scripting interpreter
- execution:user execution
- execution:command and scripting interpreter:visual basic
- defense-evasion:system binary proxy execution:rundll32
- execution:command and scripting interpreter:javascript
technique_id:
- T1059
- T1204
- T1059.007
- T1218.011
- T1059.005
data_category:
- Process command-line parameters
- PowerShell logs
references:
- https://www.microsoft.com/security/blog/2021/03/02/hafnium-targeting-exchange-servers/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` TERM(EventCode=4104) (
    "Temporary Internet Files"
    OR TERM("TEMP")
    OR TERM("Downloads")
    OR TERM("Appdata")
)

Stage 2: regex

| regex Path="(?i)Temp|Downloads|Appdata"

Stage 3: eval

| eval process_path=Path

Stage 4: table

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

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
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
Pathregex_match
    • (?i)Temp
    • Downloads
    • Appdata
field:"Path" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"Temporary Internet Files"
1"\"TEMP\""
1"\"Downloads\""
1"\"Appdata\""

Firewall Allowed Program Enable

#
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 modification of a firewall rule to allow the execution of a specific application. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process creation events with command-line arguments related to firewall rule changes. This activity is significant as it may indicate an attempt to bypass firewall restrictions, potentially allowing unauthorized applications to communicate over the network. If confirmed malicious, this could enable an attacker to execute arbitrary code, escalate privileges, or maintain persistence within the target environment.

Known False Positives

  • A network operator or systems administrator may utilize an automated or manual execution of this firewall rule that may generate false positives. Filter as needed.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

Rule Body

name: Firewall Allowed Program Enable
id: 9a8f63a8-43ac-11ec-904c-acde48001122
version: 13
creation_date: '2021-11-17'
modification_date: '2026-06-08'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic detects the modification of a firewall rule to allow the execution of a specific application. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process creation events with command-line arguments related to firewall rule changes. This activity is significant as it may indicate an attempt to bypass firewall restrictions, potentially allowing unauthorized applications to communicate over the network. If confirmed malicious, this could enable an attacker to execute arbitrary code, escalate privileges, or maintain persistence within the target environment.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.process = "*firewall*" Processes.process = "*allow*" Processes.process = "*add*" Processes.process = "*ENABLE*"
      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)`
    | `firewall_allowed_program_enable_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: A network operator or systems administrator may utilize an automated or manual execution of this firewall rule that may generate false positives. Filter as needed.
references:
    - https://app.any.run/tasks/ad4c3cda-41f2-4401-8dba-56cc2d245488/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: firewall allowed program commandline $process$ of $process_name$ on $dest$ by $user$
analytic_story:
    - BlackByte Ransomware
    - NjRAT
    - PlugX
    - Windows Defense Evasion Tactics
    - Medusa Ransomware
    - Azorult
    - Salat Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1686
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 = "*firewall*" Processes.process = "*allow*" Processes.process = "*add*"
    Processes.process = "*ENABLE*"
  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

| `firewall_allowed_program_enable_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *ENABLE* corpus 3 (splunk 3)
  • *add* corpus 30 (sigma 26, splunk 4)
  • *allow* corpus 6 (sigma 4, splunk 2)
  • *firewall* corpus 13 (sigma 7, splunk 6)
field:"CommandLine" kind:eq

GCP Multi-Factor Authentication Disabled

#
Status
production
Severity
medium
Group by
"actor.email", "event.name", "id.applicationName", action, aws::recipientAccountId, command, status, user
Author
Bhavin Patel, Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic detects an attempt to disable multi-factor authentication (MFA) for a Google Cloud Platform (GCP) user. It leverages Google Workspace Admin log events, specifically the UNENROLL_USER_FROM_STRONG_AUTH command. This activity is significant because disabling MFA can allow an adversary to maintain persistence within the environment using a compromised account without raising suspicion. If confirmed malicious, this action could enable attackers to bypass additional security layers, potentially leading to unauthorized access, data exfiltration, or further exploitation of the compromised account.

Known False Positives

  • Legitimate use case may require for users to disable MFA. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: GCP Multi-Factor Authentication Disabled
id: b9bc5513-6fc1-4821-85a3-e1d81e451c83
version: 13
creation_date: '2022-10-14'
modification_date: '2026-05-13'
author: Bhavin Patel, Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects an attempt to disable multi-factor authentication (MFA) for a Google Cloud Platform (GCP) user. It leverages Google Workspace Admin log events, specifically the `UNENROLL_USER_FROM_STRONG_AUTH` command. This activity is significant because disabling MFA can allow an adversary to maintain persistence within the environment using a compromised account without raising suspicion. If confirmed malicious, this action could enable attackers to bypass additional security layers, potentially leading to unauthorized access, data exfiltration, or further exploitation of the compromised account.
data_source:
    - Google Workspace
search: |-
    `gws_reports_admin` command=UNENROLL_USER_FROM_STRONG_AUTH
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY user, command, actor.email,
           status, id.applicationName, event.name,
           vendor_account, action
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `gcp_multi_factor_authentication_disabled_filter`
how_to_implement: You must install the latest version of Splunk Add-on for Google Workspace from Splunkbase (https://splunkbase.splunk.com/app/5556) which allows Splunk administrators to collect Google Workspace event data in Splunk using Google Workspace APIs. Specifically, this analytic leverages the Admin log events.
known_false_positives: Legitimate use case may require for users to disable MFA. Filter as needed.
references:
    - https://support.google.com/cloudidentity/answer/2537800?hl=en
    - https://attack.mitre.org/tactics/TA0005/
    - https://attack.mitre.org/techniques/T1556/
finding:
    title: MFA disabled for User $user$ initiated by $actor.email$
    entity:
        field: actor.email
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 50
          message: MFA disabled for User $user$ initiated by $actor.email$
analytic_story:
    - GCP Account Takeover
    - Scattered Lapsus$ Hunters
asset_type: GCP
mitre_attack_id:
    - T1556.006
    - T1586.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: identity

Stages and Predicates

Stage 1: search

`gws_reports_admin` command=UNENROLL_USER_FROM_STRONG_AUTH

Stage 2: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY user, command, actor.email,
       status, id.applicationName, event.name,
       vendor_account, action

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `gcp_multi_factor_authentication_disabled_filter`

Indicators

These rows show field, operator, and value matches.

Invoke-DCOM.ps1 - PowerShell (Sysmon)

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

Adversaries may use Valid Accounts to interact with remote machines by taking advantage of Distributed Component Object Model (DCOM). The adversary may then perform actions as the logged-on user. This use case detects the usage of Invoke-DCOM PowerShell script to remotely obtain arbitrary and direct shellcode execution through Office applications as well as other Windows objects that contain insecure methods. Note: PowerShell logging is recommended for best detection. Detection using other log sources is dependent on commands being run in manner that creates a new process, such as powershell -c.

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '31900.56999'
title: Invoke-DCOM.ps1 - PowerShell
description: 'Adversaries may use Valid Accounts to interact with remote machines
  by taking advantage of Distributed Component Object Model (DCOM). The adversary
  may then perform actions as the logged-on user. This use case detects the usage
  of Invoke-DCOM PowerShell script to remotely obtain arbitrary and direct shellcode
  execution through Office applications as well as other Windows objects that contain
  insecure methods. Note: PowerShell logging is recommended for best detection. Detection
  using other log sources is dependent on commands being run in manner that creates
  a new process, such as powershell -c.'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  ((("MMC20.Application" OR "ShellWindows" OR "ShellBrowserWindow" OR "CheckDomain"
  OR "ServiceCheck" OR "MinimizeAll" OR "ServiceStop" OR "ServiceStart" OR "DetectOffice"
  OR "RegisterXLL" OR "ExcelDDE") OR ("9BA05972-F6A8-11CF-A442-00A0C90A8F39" OR "C08AFD90-F2A1-11D1-8455-00A0C91F3880"
  OR "7e0423cd-1119-0928-900c-e6d4a52a0715")) OR ("Application.ServiceStart" OR "Application.ServiceStop"
  OR "Application.IsServiceRunning" OR "Application.ShutDownWindows" OR "Application.GetSystemInformation"
  OR "DDEInitiate" OR "Application.RegisterXLL" OR "Application.ProductCode" OR "Application.MinimizeAll"
  OR "ActiveView.ExecuteShellCommand") ("cmd.exe" OR "powershell.exe" OR "pwsh.exe"))
  AND NOT ("rundll32.exe" OR TERM(rundll32)) | table _time, host, user, process, parent_process
  | bin span=1s | stats values(*) as * by _time, host '
techniques:
- lateral-movement:remote services:distributed component object model
technique_id:
- T1021.003
data_category:
- Windows Sysmon
references:
- https://attack.mitre.org/techniques/T1021/003/
- https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1
- https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") ((("MMC20.Application" OR "ShellWindows" OR "ShellBrowserWindow" OR "CheckDomain" OR "ServiceCheck" OR "MinimizeAll" OR "ServiceStop" OR "ServiceStart" OR "DetectOffice" OR "RegisterXLL" OR "ExcelDDE") OR ("9BA05972-F6A8-11CF-A442-00A0C90A8F39" OR "C08AFD90-F2A1-11D1-8455-00A0C91F3880" OR "7e0423cd-1119-0928-900c-e6d4a52a0715")) OR ("Application.ServiceStart" OR "Application.ServiceStop" OR "Application.IsServiceRunning" OR "Application.ShutDownWindows" OR "Application.GetSystemInformation" OR "DDEInitiate" OR "Application.RegisterXLL" OR "Application.ProductCode" OR "Application.MinimizeAll" OR "ActiveView.ExecuteShellCommand") ("cmd.exe" OR "powershell.exe" OR "pwsh.exe")) AND NOT ("rundll32.exe" OR TERM(rundll32))

Stage 2: table

| table _time, host, user, process, parent_process

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

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1"MMC20.Application"
1"ShellWindows"
1"ShellBrowserWindow"
1"CheckDomain"
1"ServiceCheck"
1"MinimizeAll"
1"ServiceStop"
1"ServiceStart"
1"DetectOffice"
1"RegisterXLL"
1"ExcelDDE"
1"9BA05972-F6A8-11CF-A442-00A0C90A8F39"
1"C08AFD90-F2A1-11D1-8455-00A0C91F3880"
1"7e0423cd-1119-0928-900c-e6d4a52a0715"
1"Application.ServiceStart"
1"Application.ServiceStop"
1"Application.IsServiceRunning"
1"Application.ShutDownWindows"
1"Application.GetSystemInformation"
1"DDEInitiate"
1"Application.RegisterXLL"
1"Application.ProductCode"
1"Application.MinimizeAll"
1"ActiveView.ExecuteShellCommand"
1"cmd.exe"
1"powershell.exe"
1"pwsh.exe"

Kubernetes Suspicious Image Pulling

#
Status
production
Severity
low
Group by
"objectRef.name", "objectRef.namespace", "objectRef.resource", "responseStatus.code", "sourceIPs{}", "user.groups{}", "user.uid", "user.username", requestReceivedTimestamp, requestURI, stage, userAgent, verb
Author
Patrick Bareiss, Splunk
Source
github.com/splunk/security_content

The following analytic detects suspicious image pulling in Kubernetes environments. It identifies this activity by monitoring Kubernetes audit logs for image pull requests that do not match a predefined list of allowed images. This behavior is significant for a SOC as it may indicate an attacker attempting to deploy malicious software or infiltrate the system. If confirmed malicious, the impact could be severe, potentially leading to unauthorized access to sensitive systems or data, and enabling further malicious activities within the cluster.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Discovery

Rule Body

name: Kubernetes Suspicious Image Pulling
id: 4d3a17b3-0a6d-4ae0-9421-46623a69c122
version: 10
creation_date: '2023-12-20'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: Anomaly
description: The following analytic detects suspicious image pulling in Kubernetes environments. It identifies this activity by monitoring Kubernetes audit logs for image pull requests that do not match a predefined list of allowed images. This behavior is significant for a SOC as it may indicate an attacker attempting to deploy malicious software or infiltrate the system. If confirmed malicious, the impact could be severe, potentially leading to unauthorized access to sensitive systems or data, and enabling further malicious activities within the cluster.
data_source:
    - Kubernetes Audit
search: |-
    `kube_audit` requestObject.message="Pulling image*"
      | search NOT `kube_allowed_images`
      | fillnull
      | stats count
        BY objectRef.name objectRef.namespace objectRef.resource
           requestReceivedTimestamp requestURI responseStatus.code
           sourceIPs{} stage user.groups{}
           user.uid user.username userAgent
           verb
      | rename sourceIPs{} as src_ip, user.username as user
      | `kubernetes_suspicious_image_pulling_filter`
how_to_implement: The detection is based on data that originates from Kubernetes Audit logs. Ensure that audit logging is enabled in your Kubernetes cluster. Kubernetes audit logs provide a record of the requests made to the Kubernetes API server, which is crucial for monitoring and detecting suspicious activities. Configure the audit policy in Kubernetes to determine what kind of activities are logged. This is done by creating an Audit Policy and providing it to the API server. Use the Splunk OpenTelemetry Collector for Kubernetes to collect the logs. This doc will describe how to collect the audit log file https://github.com/signalfx/splunk-otel-collector-chart/blob/main/docs/migration-from-sck.md. When you want to use this detection with AWS EKS, you need to enable EKS control plane logging https://docs.aws.amazon.com/eks/latest/userguide/control-plane-logs.html. Then you can collect the logs from Cloudwatch using the AWS TA https://splunk.github.io/splunk-add-on-for-amazon-web-services/CloudWatchLogs/.
known_false_positives: No false positives have been identified at this time.
references:
    - https://kubernetes.io/docs/tasks/debug/debug-cluster/audit/
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: Suspicious image $objectRef.name$ pulled in Kubernetes from ip $src_ip$ by user $user$
threat_objects:
    - field: src_ip
      type: ip_address
analytic_story:
    - Kubernetes Security
asset_type: Kubernetes
mitre_attack_id:
    - T1526
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: network

Stages and Predicates

Stage 1: search

`kube_audit` requestObject.message="Pulling image*"

Stage 2: search

| search NOT `kube_allowed_images`

Stage 3: fillnull

| fillnull

Stage 4: stats

| stats count
    BY objectRef.name objectRef.namespace objectRef.resource
       requestReceivedTimestamp requestURI responseStatus.code
       sourceIPs{} stage user.groups{}
       user.uid user.username userAgent
       verb

Stage 5: rename

| rename sourceIPs{} as src_ip, user.username as user

Stage 6: search

| `kubernetes_suspicious_image_pulling_filter`

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

Mavinject Execution (Sysmon)

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

Mavinject is a legitimate Windows component that can be used, and abused, to perform arbitrary code injections inside any running process. As this is a common component on Windows, it can be leveraged to perform living-off-the-land attacks

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '7825.17910'
title: Mavinject Execution
description: 'Mavinject is a legitimate Windows component that can be used, and abused,
  to perform arbitrary code injections inside any running process. As this is a common
  component on Windows, it can be leveraged to perform living-off-the-land attacks.
  Living Off the Land Binary and Scripts (LOLBAS) (LOLBIN) -- Threat Actor Assocaition:
  Lancefly -- Atomics T1218 Test #1 Atomics T1055.001 Test#1 Atomics T1056.004 Test#1'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<"
  OR Type=Process) ("mavinject.exe") OR TERM(/INJECTRUNNING) | table _time, host,
  user process, process_*, signature_id, parent_* | bin span=1s | stats values(*)
  as * by _time, host '
techniques:
- defense-evasion:process injection:dynamic-link library injection
- collection:input capture:credential api hooking
- defense-evasion:system binary proxy execution
- credential-access:input capture:credential api hooking
- privilege-escalation:process injection:dynamic-link library injection
technique_id:
- T1056.004
- T1218
- T1055.001
data_category:
- Windows Sysmon
references:
- https://lolbas-project.github.io/lolbas/Binaries/Mavinject/
- https://posts.specterops.io/mavinject-exe-functionality-deconstructed-c29ab2cf5c0e

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<" OR Type=Process) ("mavinject.exe") OR TERM(/INJECTRUNNING)

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1"mavinject.exe"
1"/INJECTRUNNING"

Net.exe Use with URL (Sysmon)

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

This use case detects net share commands mapping a drive to a URL as observed by the BumbleBee loader.

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '21865.38560'
title: Net.exe Use with URL
description: This use case detects net share commands mapping a drive to a URL as
  observed by the BumbleBee loader.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  TERM(net) TERM(use) | regex process="://" | table _time, host, user process, process_*
  | bin span=1s | stats values(*) as * by _time, host '
techniques:
- lateral-movement:remote services:smb/windows admin shares
technique_id:
- T1021.002
data_category:
- Windows Sysmon
- Process command-line parameters
references:
- https://twitter.com/Kostastsale/status/1701111694611898446

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") TERM(net) TERM(use)

Stage 2: regex

| regex process="://"

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
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
processregex_match
  • :// corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match value:"://"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1net
1use

O365 Email Send and Hard Delete Suspicious Behavior

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

The following analytic identifies when an O365 email account sends and then hard deletes email with within a short period (within 1 hour). This behavior may indicate a compromised account where the threat actor is attempting to remove forensic artifacts or evidence of activity. Threat actors often use this technique to prevent defenders and victims from knowing the account has been compromised. --- Some account owner legitimate behaviors can trigger this alert, however these actions may not be aligned with organizational expectations / best practice behaviors.

Known False Positives

  • Users that habitually/proactively cleaning the recoverable items folder may trigger this alert.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: O365 Email Send and Hard Delete Suspicious Behavior
id: c97b3d72-0a47-46f9-b742-b89f1cc2d551
version: 6
creation_date: '2025-01-23'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: Anomaly
description: The following analytic identifies when an O365 email account sends and then hard deletes email with within a short period (within 1 hour). This behavior may indicate a compromised account where the threat actor is attempting to remove forensic artifacts or evidence of activity. Threat actors often use this technique to prevent defenders and victims from knowing the account has been compromised. --- Some account owner legitimate behaviors can trigger this alert, however these actions may not be aligned with organizational expectations / best practice behaviors.
data_source:
    - Office 365 Universal Audit Log
search: |-
    `o365_management_activity` Workload=Exchange (Operation IN ("Send*")) OR (Operation IN ("HardDelete") AND Folder.Path IN ("\\Sent Items","\\Recoverable Items\\Deletions"))
    | eval user = lower(UserId), sender = lower(CASE(isnotnull(SendAsUserSmtp),SendAsUserSmtp,isnotnull(SendOnBehalfOfUserSmtp),SendOnBehalfOfUserSmtp,true(),MailboxOwnerUPN)), subject = trim(CASE(Operation IN ("Send","SendAs","SendOnBehalf"),'Item.Subject',Operation IN ("SoftDelete","HardDelete"),'AffectedItems{}.Subject')), -time = _time,file_name = CASE(Operation IN ("Send","SendAs","SendOnBehalf"),split('Item.Attachments',"; "),Operation IN ("SoftDelete","HardDelete"),split('AffectedItems{}.Attachments',"; ")), file_size = CASE(Operation IN ("Send","SendAs","SendOnBehalf"),round(tonumber('Item.SizeInBytes')/1024/1024,2),true(),round(tonumber(replace(file_name, "(.+)\s\((\d+)(b\)$)", "\2"))/1024/1024,2))
    | eval sendtime = CASE(Operation IN ("Send","SendAs","SendOnBehalf"),_time)
    | eval deltime = CASE(Operation IN ("SoftDelete","HardDelete"),_time)
    | stats values(sender) as sender, values(ClientIPAddress) as src, values(ClientInfoString) as http_user_agent, values(Operation) as signature, values(file_name) as file_name, sum(file_size) as file_size, values(Folder.Path) as file_path, min(sendtime) as firstTime, max(deltime) as lastTime, dc(Operation) as opcount, count by subject,user
    | eval timediff = tonumber(lastTime) - tonumber(firstTime)
    | where opcount > 1 AND firstTime < lastTime  AND timediff < 3600
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `o365_email_send_and_hard_delete_suspicious_behavior_filter`
how_to_implement: You must install the Splunk Microsoft Office 365 Add-on and ingest Office 365 management activity events.
known_false_positives: Users that habitually/proactively cleaning the recoverable items folder may trigger this alert.
references:
    - https://attack.mitre.org/techniques/T1114/
    - https://www.hhs.gov/sites/default/files/help-desk-social-engineering-sector-alert-tlpclear.pdf
    - https://intelligence.abnormalsecurity.com/attack-library/threat-actor-convincingly-impersonates-employee-requesting-direct-deposit-update-in-likely-ai-generated-attack
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: The user $user$ sent and hard deleted an email within a short timeframe
threat_objects:
    - field: src
      type: ip_address
    - field: subject
      type: email_subject
analytic_story:
    - Office 365 Account Takeover
    - Office 365 Collection Techniques
    - Suspicious Emails
    - Data Destruction
asset_type: O365 Tenant
mitre_attack_id:
    - T1114.001
    - T1070.008
    - T1485
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`o365_management_activity` Workload=Exchange (Operation IN ("Send*")) OR (Operation IN ("HardDelete") AND Folder.Path IN ("\\Sent Items","\\Recoverable Items\\Deletions"))

Stage 2: eval

| eval user = lower(UserId),
    sender = lower(
        CASE(
            isnotnull(SendAsUserSmtp), SendAsUserSmtp,
            isnotnull(SendOnBehalfOfUserSmtp), SendOnBehalfOfUserSmtp,
            true(), MailboxOwnerUPN
        )
    ),
    subject = trim(
        CASE(
            Operation IN ("Send","SendAs","SendOnBehalf"), 'Item.Subject',
            Operation IN ("SoftDelete","HardDelete"), 'AffectedItems{}.Subject'
        )
    ),
    -time = _time,
    file_name = CASE(
        Operation IN ("Send","SendAs","SendOnBehalf"), split('Item.Attachments',"; "),
        Operation IN ("SoftDelete","HardDelete"), split('AffectedItems{}.Attachments',"; ")
    ),
    file_size = CASE(
        Operation IN ("Send","SendAs","SendOnBehalf"),
        round(tonumber('Item.SizeInBytes')/1024/1024,2),
        true(), round(tonumber(replace(file_name, "(.+)\s\((\d+)(b\)$)", "\2"))/1024/1024,2)
    )
file_size =
ifin(Operation, "Send", "SendAs", "SendOnBehalf")round(<FUNCTION:divides>, 2)
elseround(<FUNCTION:divides>, 2)

Stage 3: eval

| eval sendtime = CASE(Operation IN ("Send","SendAs","SendOnBehalf"),_time)
sendtime =
else_time

Stage 4: eval

| eval deltime = CASE(Operation IN ("SoftDelete","HardDelete"),_time)
deltime =
else_time

Stage 5: stats

| stats
    values(sender) as sender,
    values(ClientIPAddress) as src,
    values(ClientInfoString) as http_user_agent,
    values(Operation) as signature,
    values(file_name) as file_name,
    sum(file_size) as file_size,
    values(Folder.Path) as file_path,
    min(sendtime) as firstTime,
    max(deltime) as lastTime,
    dc(Operation) as opcount,
    count
  by subject,user

Stage 6: eval

| eval timediff = tonumber(lastTime) - tonumber(firstTime)

Stage 7: where

| where opcount > 1 AND firstTime < lastTime  AND timediff < 3600

Stage 8: search

| `security_content_ctime(firstTime)`

Stage 9: search

| `security_content_ctime(lastTime)`

Stage 10: search

| `o365_email_send_and_hard_delete_suspicious_behavior_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Folder.Pathin
  • \Recoverable Items\Deletions corpus 4 (splunk 4)
  • \Sent Items corpus 4 (splunk 4)
field:"m365::Folder.Path" kind:in
Operationin
  • HardDelete corpus 4 (splunk 4)
  • Send* corpus 2 (splunk 2)
field:"Operation" kind:in
Workloadeq
  • Exchange corpus 20 (splunk 20)
field:"Workload" kind:eq value:"Exchange"
opcountgt
  • 1
field:"opcount" kind:gt value:"1"
sourcetypeeq
  • o365:management:activity corpus 80 (splunk 80)
field:"sourcetype" kind:eq value:"o365:management:activity"
timedifflt
  • 3600
field:"timediff" kind:lt value:"3600"

O365 Email Transport Rule Changed

#
Status
production
Severity
low
Group by
Operation, group.id, signature, user
Author
Steven Dick
Source
github.com/splunk/security_content

The following analytic identifies when a user with sufficient access to Exchange Online alters the mail flow/transport rule configuration of the organization. Transport rules are a set of rules that can be used by attackers to modify or delete emails based on specific conditions, this activity could indicate an attacker hiding or exfiltrated data.

Known False Positives

  • Legitimate administrative changes for business needs.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: O365 Email Transport Rule Changed
id: 11ebb7c2-46bd-41c9-81e1-d0b4b34583a2
version: 7
creation_date: '2025-01-15'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: Anomaly
description: The following analytic identifies when a user with sufficient access to Exchange Online alters the mail flow/transport rule configuration of the organization. Transport rules are a set of rules that can be used by attackers to modify or delete emails based on specific conditions, this activity could indicate an attacker hiding or exfiltrated data.
data_source:
    - Office 365 Universal Audit Log
search: |-
    `o365_management_activity` Workload=Exchange AND Operation IN ("Set-*","Disable-*","New-*","Remove-*") AND Operation="*TransportRule"
    | eval object_name = case('Parameters{}.Name'=="Name",mvindex('Parameters{}.Value',mvfind('Parameters{}.Name',"^Name$")),true(),ObjectId), object_id = case('Parameters{}.Name'=="Identity",mvindex('Parameters{}.Value',mvfind('Parameters{}.Name',"^Identity$")),true(),Id)
    | stats values(object_name) as object_name, min(_time) as firstTime, max(_time) as lastTime, count by object_id, UserId, Operation, signature
    | rename UserId as user
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `o365_email_transport_rule_changed_filter`
how_to_implement: You must install the Splunk Microsoft Office 365 Add-on and ingest Office 365 management activity events.
known_false_positives: Legitimate administrative changes for business needs.
references:
    - https://attack.mitre.org/techniques/T1114/003/
    - https://cardinalops.com/blog/cardinalops-contributes-new-mitre-attck-techniques-related-to-abuse-of-mail-transport-rules/
    - https://www.microsoft.com/en-us/security/blog/2022/09/22/malicious-OAuth-applications-used-to-compromise-email-servers-and-spread-spam/
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: The user [$user$] altered the exchange transport rule id [$object_name$]
threat_objects:
    - field: object_id
      type: signature
    - field: object_name
      type: signature
analytic_story:
    - Data Exfiltration
    - Office 365 Account Takeover
asset_type: O365 Tenant
mitre_attack_id:
    - T1114.003
    - T1564.008
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`o365_management_activity` Workload=Exchange AND Operation IN (
    "Set-*",
    "Disable-*",
    "New-*",
    "Remove-*"
) AND Operation="*TransportRule"

Stage 2: eval

| eval
    object_name = case(
        'Parameters{}.Name'=="Name",
        mvindex('Parameters{}.Value',mvfind('Parameters{}.Name',"^Name$")),
        true(), ObjectId
    ),
    object_id = case(
        'Parameters{}.Name'=="Identity",
        mvindex('Parameters{}.Value',mvfind('Parameters{}.Name',"^Identity$")),
        true(), Id
    )
object_id =
ifParameters{}.Name="Identity"mvindex('Parameters{}.Value', <FUNCTION:mvfind>)
elseId
object_name =
ifParameters{}.Name="Name"mvindex('Parameters{}.Value', <FUNCTION:mvfind>)
elseObjectId

Stage 3: stats

| stats
    values(object_name) as object_name,
    min(_time) as firstTime,
    max(_time) as lastTime,
    count
  by object_id, UserId, Operation, signature

Stage 4: rename

| rename UserId as user

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `o365_email_transport_rule_changed_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Operationeq
  • *TransportRule
field:"Operation" kind:eq value:"*TransportRule"
Operationin
  • Disable-* corpus 2 (splunk 2)
  • New-* corpus 2 (splunk 2)
  • Remove-* corpus 2 (splunk 2)
  • Set-* corpus 2 (splunk 2)
field:"Operation" kind:in
Workloadeq
  • Exchange corpus 20 (splunk 20)
field:"Workload" kind:eq value:"Exchange"
sourcetypeeq
  • o365:management:activity corpus 80 (splunk 80)
field:"sourcetype" kind:eq value:"o365:management:activity"

O365 New Forwarding Mailflow Rule Created

#
Status
production
Severity
medium
Group by
ForwardTo, Name, aws::recipientAccountId, dest, signature, user, vendor_product
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic detects the creation of new mail flow rules in Office 365 that may redirect or copy emails to unauthorized or external addresses. It leverages Office 365 Management Activity logs, specifically querying for the "New-TransportRule" operation and parameters like "BlindCopyTo", "CopyTo", and "RedirectMessageTo". This activity is significant as it can indicate potential data exfiltration or unauthorized access to sensitive information. If confirmed malicious, attackers could intercept or redirect email communications, leading to data breaches or information leakage.

Known False Positives

  • Forwarding mail flow rules may be created for legitimate reasons, filter as needed.

MITRE ATT&CK Coverage

TacticTechniques
Collection

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: O365 New Forwarding Mailflow Rule Created
id: 289ed0a1-4c78-4a43-9321-44ea2e089c14
version: 9
creation_date: '2024-04-17'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects the creation of new mail flow rules in Office 365 that may redirect or copy emails to unauthorized or external addresses. It leverages Office 365 Management Activity logs, specifically querying for the "New-TransportRule" operation and parameters like "BlindCopyTo", "CopyTo", and "RedirectMessageTo". This activity is significant as it can indicate potential data exfiltration or unauthorized access to sensitive information. If confirmed malicious, attackers could intercept or redirect email communications, leading to data breaches or information leakage.
data_source: []
search: "`o365_management_activity` Workload=Exchange Operation=\"New-TransportRule\" | eval match1=mvfind('Parameters{}.Name',\"BlindCopyTo\") | eval match2=mvfind('Parameters{}.Name',\"CopyTo\") | eval match3=mvfind('Parameters{}.Name', \"RedirectMessageTo\") | where match1>= 0 OR match2>= 0 OR match3>=0 | eval ForwardTo=coalesce(BlindCopyTo, CopyTo, RedirectMessageTo) | search ForwardTo!=\"\" | rename UserId as user | fillnull | stats count earliest(_time) as firstTime latest(_time) as lastTime by user, Name, ForwardTo, vendor_account, vendor_product, dest, signature | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `o365_new_forwarding_mailflow_rule_created_filter`"
how_to_implement: You must install the Splunk Microsoft Office 365 Add-on and ingest Office 365 management activity events.
known_false_positives: Forwarding mail flow rules may be created for legitimate reasons, filter as needed.
references:
    - https://attack.mitre.org/techniques/T1114/
    - https://learn.microsoft.com/en-us/exchange/security-and-compliance/mail-flow-rules/mail-flow-rules
    - https://learn.microsoft.com/en-us/exchange/security-and-compliance/mail-flow-rules/mail-flow-rule-actions
finding:
    title: A new forwarding mailflow rule was created by $user$
    entity:
        field: user
        type: user
        score: 50
analytic_story:
    - Office 365 Collection Techniques
asset_type: O365 Tenant
mitre_attack_id:
    - T1114
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: audit

Stages and Predicates

Stage 1: search

`o365_management_activity` Workload=Exchange Operation="New-TransportRule"

Stage 2: eval

| eval match1=mvfind('Parameters{}.Name',"BlindCopyTo")

Stage 3: eval

| eval match2=mvfind('Parameters{}.Name',"CopyTo")

Stage 4: eval

| eval match3=mvfind('Parameters{}.Name', "RedirectMessageTo")

Stage 5: where

| where match1>= 0 OR match2>= 0 OR match3>=0

Stage 6: eval

| eval ForwardTo=coalesce(BlindCopyTo, CopyTo, RedirectMessageTo)

Stage 7: search

| search ForwardTo!=""

Stage 8: rename

| rename UserId as user

Stage 9: fillnull

| fillnull

Stage 10: stats

| stats
    count
    earliest(_time) as firstTime
    latest(_time) as lastTime
  by user, Name, ForwardTo, vendor_account, vendor_product, dest, signature

Stage 11: search

| `security_content_ctime(firstTime)`

Stage 12: search

| `security_content_ctime(lastTime)`

Stage 13: search

| `o365_new_forwarding_mailflow_rule_created_filter`

Indicators

These rows show field, operator, and value matches.

ProcDump Credential Harvest (Sysmon)

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

Mimikatz is largely detected by AntiVirus software.As Procdump is a legitimate Microsoft tool, it's not detected by AntiVirus. The goal is to dump the lsass.exe process, which contains the credentials, and then give this dump to mimikatz.You need Admin rights to use it. Dump the lsass process which contains credentials

MITRE ATT&CK Coverage

TacticTechniques
Credential Access

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '1083.1127'
title: ProcDump Credential Harvest
description: 'Mimikatz is largely detected by AntiVirus software.As Procdump is a
  legitimate Microsoft tool, it''s not detected by AntiVirus. The goal is to dump
  the lsass.exe process, which contains the credentials, and then give this dump to
  mimikatz.You need Admin rights to use it. Dump the lsass process which contains
  credentials. -- Threat Actor Association: Agrius, Alloy Taurus/Gallium, Antlion,
  BlackCat, FamousSparrow, FIN12, FIN13, Hydrochasma, Lazarus, MuddyWater, TA551,
  Wizard Spider - Software Association: Bazarloader, Conti, Hafnium , IcedID, LockBit,
  NetWalker, Rhysida -- Atomics T1003.001 Test #2 Atomics T1003.001 Test #9'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` "procdump" "lsass" | rex field=_raw
  max_match=2 "(?<file>[a-zA-Z0-9]+\.dmp") | table _time, host, user, process, parent_process_name,
  file| bin span=30s | stats values(*) as * by _time, host | where match(process,
  "(?i)procdump") AND match(process, "(?i)lsass") | table _time, host, user process,
  parent_process_name, file `hec_collect`'
techniques:
- credential-access:os credential dumping:lsass memory
technique_id:
- T1003.001
data_category:
- Windows Sysmon
references:
- https://attack.mitre.org/techniques/T1003/001/
- https://github.com/LOLBAS-Project/LOLBAS/pull/182/commits/e14a01bbb5c0b06990cd8f6fc85ee5908ae3da32

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` "procdump" "lsass"

Stage 2: rex

| rex field=_raw max_match=2 "(?<file>[a-zA-Z0-9]+\.dmp")

The parser skipped this rex command.

Stage 3: table

| table _time, host, user, process, parent_process_name, file

Stage 4: bucket

| bin span=30s

Stage 5: stats

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

Stage 6: where

| where match(process, "(?i)procdump") AND match(process, "(?i)lsass")

Stage 7: table

| table _time, host, user process, parent_process_name, file `hec_collect`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
processregex_match
  • (?i)lsass corpus 2 (splunk 2)
  • (?i)procdump
field:"CommandLine" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"procdump"
1"lsass"

Rclone Execution (PowerShell)

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

Rclone is a command line program to manage files on cloud storage. It is a feature rich alternative to cloud vendors' web storage interfaces. Adversaries have been known to use rclone in order to exfiltrate data

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '6357.18233'
title: Rclone Execution
description: 'Rclone is a command line program to manage files on cloud storage. It
  is a feature rich alternative to cloud vendors'' web storage interfaces. Adversaries
  have been known to use rclone in order to exfiltrate data. -- Threat Actor Association:
  ALPHV/BlackCat, BlackMatter, DarkSide, Daixin Team, FIN7, FIN8 (Syssphinx), Hello
  Kitty / Five Hands, Karakurt, LockBit, Scattered Spider (aka. 0ktapus, UNC3944),
  Turla (akaSecret Blizzard, KRYPTON, and UAC-0003), UNC2628, Wizard Spider - Software
  Association: Akira, AvosLocker, BazarLoader, BianLian, Blackbyte, Blackcat/ALPHV,
  Black Basta, Conti, Lockbit, Ransom Cartel, Royal, Vice Society'
logic_format: Splunk
logic: ' `get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104)
  OR "<EventID>4104<" OR TERM(EventCode=4103) OR "<EventID>4103<") ("rclone.exe" OR
  "rclone32.exe" OR "rclone") | table _time, host, user process, process_*, signature_id,
  parent_* | bin span=1s | stats values(*) as * by _time, host | where match(process,
  "(?i)rclone") `hec_collect`'
techniques:
- exfiltration:exfiltration over web service:exfiltration to cloud storage
- exfiltration:data transfer size limits
- exfiltration:exfiltration over alternative protocol:exfiltration over unencrypted
  non-c2 protocol
technique_id:
- T1567.002
- T1030
- T1048.003
data_category:
- PowerShell logs
references:
- https://rclone.org/
- https://www.mcafee.com/blogs/other-blogs/mcafee-labs/darkside-ransomware-victims-sold-short/
- https://www.fireeye.com/blog/threat-research/2021/05/shining-a-light-on-darkside-ransomware-operations.html
- https://unit42.paloaltonetworks.com/royal-ransomware/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104) OR "<EventID>4104<" OR TERM(EventCode=4103) OR "<EventID>4103<") ("rclone.exe" OR "rclone32.exe" OR "rclone")

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Stage 5: where

| where match(process, "(?i)rclone") `hec_collect`

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)rclone
field:"CommandLine" kind:regex_match value:"(?i)rclone"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4104<"
1"<EventID>4103<"
1"rclone.exe"
1"rclone32.exe"
1"rclone"

Rundll32.exe as Parent Process (Sysmon)

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

Adversaries may abuse rundll32.exe to proxy execution of malicious code. Using rundll32.exe, may avoid triggering security tools that may not monitor execution of the rundll32.exe process because of allowlists or false positives from normal operations. Rundll32.exe is commonly associated with executing DLL payloads

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '5850.18101'
title: Rundll32.exe as Parent Process
description: 'Adversaries may abuse rundll32.exe to proxy execution of malicious code.
  Using rundll32.exe, may avoid triggering security tools that may not monitor execution
  of the rundll32.exe process because of allowlists or false positives from normal
  operations. Rundll32.exe is commonly associated with executing DLL payloads. Threat
  Actor Association: MuddyWater, TA505, Wizard Spider - Software Association: Bazar,
  Clop, Conti, Quantum, Rhysida, Trickbot'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` ("EventCode=1" OR "<EventID>1<")
  TERM(rundll32) | regex parent_process_name="(?i)(rundll32)" | table _time, host,
  user parent_*, process, process_*, signature_id | bin span=1s | stats values(*)
  as * by _time, host '
techniques:
- defense-evasion:system binary proxy execution:rundll32
technique_id:
- T1218.011
data_category:
- Windows Sysmon
references:
- https://redcanary.com/threat-detection-report/techniques/rundll32/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` ("EventCode=1" OR "<EventID>1<") TERM(rundll32)

Stage 2: regex

| regex parent_process_name="(?i)(rundll32)"

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
parent_process_nameregex_match
  • (?i)(rundll32) corpus 2 (splunk 2)
field:"parent_process_name" kind:regex_match value:"(?i)(rundll32)"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"EventCode=1"
1"<EventID>1<"
1rundll32

SoftPerfect Network Scanner Execution (Sysmon)

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

SoftPerfect Network Scanner is a free port scanner that can be run without installation. Due to its portability, it is an attractive tool for threat actors during post-compromise discovery activities as reported by DFIR. This use case detects executions of netscan.exe, netscan32.exe, or netscan64.exe. While the tool itself is not considered malicious, unexpected use should be investigated as it may indicate unauthorized discovery activity

MITRE ATT&CK Coverage

TacticTechniques
Discovery

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '24804.45867'
title: SoftPerfect Network Scanner Execution
description: 'SoftPerfect Network Scanner is a free port scanner that can be run without
  installation. Due to its portability, it is an attractive tool for threat actors
  during post-compromise discovery activities as reported by DFIR. This use case detects
  executions of netscan.exe, netscan32.exe, or netscan64.exe. While the tool itself
  is not considered malicious, unexpected use should be investigated as it may indicate
  unauthorized discovery activity. -- Software Association: Akira'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  "netscan" | where match(process_name, "(?i)\x5cnetscan(32|64)?\.exe") or match(process_path,
  "(?i)\x5cnetscan_portable") | table _time, host, user, process, process_*, parent_process,
  parent_process_*, user | bin span=1s | stats values(*) as * by _time, host '
techniques:
- discovery:network service discovery
technique_id: 
- T1046
data_category:
- Windows Sysmon
references:
- https://www.softperfect.com/products/networkscanner/
- https://thedfirreport.com/2023/10/30/netsupport-intrusion-results-in-domain-compromise/
- https://thedfirreport.com/2020/07/13/ransomware-again-but-we-changed-the-rdp-port/
- https://thedfirreport.com/2023/08/28/html-smuggling-leads-to-domain-wide-ransomware/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") "netscan"

Stage 2: where

| where match(process_name, "(?i)\x5cnetscan(32|64)?\.exe")
    or match(process_path, "(?i)\x5cnetscan_portable")

Stage 3: table

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

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"
process_nameregex_match
  • (?i)\x5cnetscan(32|64)?.exe corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)\x5cnetscan(32|64)?.exe"
process_pathregex_match
  • (?i)\x5cnetscan_portable corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)\x5cnetscan_portable"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1"netscan"

Unusual Number of Computer Service Tickets Requested

#
Status
experimental
Group by
Client_Address, _time, user
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic identifies an unusual number of computer service ticket requests from a single source, leveraging Event ID 4769, "A Kerberos service ticket was requested." It uses statistical analysis, including standard deviation and the 3-sigma rule, to detect anomalies in service ticket requests. This activity is significant as it may indicate malicious behavior such as lateral movement, malware staging, or reconnaissance. If confirmed malicious, an attacker could gain unauthorized access to multiple endpoints, facilitating further compromise and potential data exfiltration.

Known False Positives

  • An single endpoint requesting a large number of computer service tickets is not common behavior. Possible false positive scenarios include but are not limited to vulnerability scanners, administration systeams and missconfigured systems.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access
Persistence
Privilege Escalation
Stealth

Telemetry Coverage

Rule Body

name: Unusual Number of Computer Service Tickets Requested
id: ac3b81c0-52f4-11ec-ac44-acde48001122
version: 9
creation_date: '2021-12-03'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: experimental
type: Hunting
description: The following analytic identifies an unusual number of computer service ticket requests from a single source, leveraging Event ID 4769, "A Kerberos service ticket was requested." It uses statistical analysis, including standard deviation and the 3-sigma rule, to detect anomalies in service ticket requests. This activity is significant as it may indicate malicious behavior such as lateral movement, malware staging, or reconnaissance. If confirmed malicious, an attacker could gain unauthorized access to multiple endpoints, facilitating further compromise and potential data exfiltration.
data_source:
    - Windows Event Log Security 4769
search: |-
    `wineventlog_security` EventCode=4769 Service_Name="*$" Account_Name!="*$*"
      | bucket span=2m _time
      | stats dc(Service_Name) AS unique_targets values(Service_Name) as host_targets
        BY _time, Client_Address, Account_Name
      | eventstats avg(unique_targets) as comp_avg , stdev(unique_targets) as comp_std
        BY Client_Address, Account_Name
      | eval upperBound=(comp_avg+comp_std*3)
      | eval isOutlier=if(unique_targets >10 and unique_targets >= upperBound, 1, 0)
      | `unusual_number_of_computer_service_tickets_requested_filter`
how_to_implement: To successfully implement this search, you need to be ingesting Domain Controller and Kerberos events. The Advanced Security Audit policy setting `Audit Kerberos Authentication Service` within `Account Logon` needs to be enabled.
known_false_positives: An single endpoint requesting a large number of computer service tickets is not common behavior. Possible false positive scenarios include but are not limited to vulnerability scanners, administration systeams and missconfigured systems.
references:
    - https://attack.mitre.org/techniques/T1078/
analytic_story:
    - Active Directory Lateral Movement
    - Active Directory Kerberos Attacks
    - Active Directory Privilege Escalation
    - Scattered Lapsus$ Hunters
asset_type: Endpoint
mitre_attack_id:
    - T1078
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security` EventCode=4769 Service_Name="*$" Account_Name!="*$*"

Stage 2: bucket

| bucket span=2m _time

Stage 3: stats

| stats dc(Service_Name) AS unique_targets values(Service_Name) as host_targets
    BY _time, Client_Address, Account_Name

Stage 4: eventstats

| eventstats avg(unique_targets) as comp_avg , stdev(unique_targets) as comp_std
    BY Client_Address, Account_Name

Stage 5: eval

| eval upperBound=(comp_avg+comp_std*3)

Stage 6: eval

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

Stage 7: search

| `unusual_number_of_computer_service_tickets_requested_filter`

Indicators

These rows show field, operator, and value matches.

Unusual svchost Child Process (Windows Event Log)

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

Adversaries may inject code into processes in order to evade process-based defenses as well as possibly elevate privileges. Process injection is a method of executing arbitrary code in the address space of a separate live process. Running code in the context of another process may allow access to the process's memory, system/network resources, and possibly elevated privileges. Execution via process injection may also evade detection from security products since the execution is masked under a legitimate process. Expected Service Host (svchost.exe) activity does not normally include certain child processes. Svchost spawning these child processes may be an indication of process injection

MITRE ATT&CK Coverage

TacticTechniques
Privilege Escalation
Stealth

References

Telemetry Coverage

Rule Body

id: '16041.24006'
title: Unusual svchost Child Process
description: 'Adversaries may inject code into processes in order to evade process-based
  defenses as well as possibly elevate privileges. Process injection is a method of
  executing arbitrary code in the address space of a separate live process. Running
  code in the context of another process may allow access to the process''s memory,
  system/network resources, and possibly elevated privileges. Execution via process
  injection may also evade detection from security products since the execution is
  masked under a legitimate process. Expected Service Host (svchost.exe) activity
  does not normally include certain child processes. Svchost spawning these child
  processes may be an indication of process injection. -- Threat Actor Association:
  Lazarus'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) "svchost" ("WdiSystemHost" OR "LicenseManager"
  OR "StorSvc" OR "CDPSvc" OR "cdbhsvc" OR "BthAvctpSvc" OR "SstpSvc" OR "WdiServiceHost"
  OR "imgsvc" OR "TrkWks" OR "WpnService" OR "IKEEXT" OR "PolicyAgent" OR "CryptSvc"
  OR "netprofm" OR "ProfSvc" OR "StateRepository" OR "camsvc" OR "LanmanWorkstation"
  OR "NlaSvc" OR "EventLog" OR "hidserv" OR "DisplayEnhancementService" OR "ShellHWDetection"
  OR "AppHostSvc" OR "fhsvc" OR "CscService" OR "PushToInstall") | regex process="(?i)WdiSystemHost|LicenseManager|StorSvc|CDPSvc|cdbhsvc|BthAvctpSvc|SstpSvc|WdiServiceHost|imgsvc|TrkWks|WpnService|IKEEXT|PolicyAgent|CryptSvc|netprofm|ProfSvc|StateRepository|camsvc|LanmanWorkstation|NlaSvc|EventLog|hidserv|DisplayEnhancementService|ShellHWDetection|AppHostSvc|fhsvc|CscService|PushToInstall"|
  where match(parent_process_name, "(?i)svchost")| where not match(process_name, "(?i)werfault(secure)?|wermgr\.exe")
  | table _time, host, user process, process_*, parent_process_*, signature_id | bin
  span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:process injection
technique_id: 
- T1055
data_category:
- Windows event logs
references:
- https://redcanary.com/threat-detection-report/techniques/process-injection/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) "svchost" ("WdiSystemHost" OR "LicenseManager" OR "StorSvc" OR "CDPSvc" OR "cdbhsvc" OR "BthAvctpSvc" OR "SstpSvc" OR "WdiServiceHost" OR "imgsvc" OR "TrkWks" OR "WpnService" OR "IKEEXT" OR "PolicyAgent" OR "CryptSvc" OR "netprofm" OR "ProfSvc" OR "StateRepository" OR "camsvc" OR "LanmanWorkstation" OR "NlaSvc" OR "EventLog" OR "hidserv" OR "DisplayEnhancementService" OR "ShellHWDetection" OR "AppHostSvc" OR "fhsvc" OR "CscService" OR "PushToInstall")

Stage 2: regex

| regex
    process="(?i)WdiSystemHost|LicenseManager|StorSvc|CDPSvc|cdbhsvc|BthAvctpSvc|SstpSvc|WdiServiceHost|imgsvc|TrkWks|WpnService|IKEEXT|PolicyAgent|CryptSvc|netprofm|ProfSvc|StateRepository|camsvc|LanmanWorkstation|NlaSvc|EventLog|hidserv|DisplayEnhancementService|ShellHWDetection|AppHostSvc|fhsvc|CscService|PushToInstall"

Stage 3: where

| where match(parent_process_name, "(?i)svchost")

Stage 4: where

| where not match(process_name, "(?i)werfault(secure)?|wermgr\.exe")

Stage 5: table

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

Stage 6: bucket

| bin span=1s

Stage 7: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
parent_process_nameregex_match
  • (?i)svchost corpus 2 (splunk 2)
field:"parent_process_name" kind:regex_match value:"(?i)svchost"
processregex_match
    • (?i)WdiSystemHost
    • LicenseManager
    • StorSvc
    • CDPSvc
    • cdbhsvc
    • BthAvctpSvc
    • SstpSvc
    • WdiServiceHost
    • imgsvc
    • TrkWks
    • WpnService
    • IKEEXT
    • PolicyAgent
    • CryptSvc
    • netprofm
    • ProfSvc
    • StateRepository
    • camsvc
    • LanmanWorkstation
    • NlaSvc
    • EventLog
    • hidserv
    • DisplayEnhancementService
    • ShellHWDetection
    • AppHostSvc
    • fhsvc
    • CscService
    • PushToInstall
    corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process_nameregex_match(?i)werfault(secure)?, wermgr.exeexcludes:process_name field:"process_name" value:"(?i)werfault(secure)?" field:"process_name" value:"wermgr.exe"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"svchost"
1"WdiSystemHost"
1"LicenseManager"
1"StorSvc"
1"CDPSvc"
1"cdbhsvc"
1"BthAvctpSvc"
1"SstpSvc"
1"WdiServiceHost"
1"imgsvc"
1"TrkWks"
1"WpnService"
1"IKEEXT"
1"PolicyAgent"
1"CryptSvc"
1"netprofm"
1"ProfSvc"
1"StateRepository"
1"camsvc"
1"LanmanWorkstation"
1"NlaSvc"
1"EventLog"
1"hidserv"
1"DisplayEnhancementService"
1"ShellHWDetection"
1"AppHostSvc"
1"fhsvc"
1"CscService"
1"PushToInstall"

Windows Impair Defense Deny Security Software With Applocker

#
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 in the Windows registry by the Applocker utility that deny the execution of various security products. This detection leverages data from the Endpoint.Registry datamodel, focusing on specific registry paths and values indicating a "Deny" action against known antivirus and security software. This activity is significant as it may indicate an attempt to disable security defenses, a tactic observed in malware like Azorult. If confirmed malicious, this could allow attackers to bypass security measures, facilitating further malicious activities and persistence within the environment.

Known False Positives

  • False positives may be present based on organization use of Applocker. Filter as needed.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows Impair Defense Deny Security Software With Applocker
id: e0b6ca60-9e29-4450-b51a-bba0abae2313
version: 12
creation_date: '2022-06-28'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects modifications in the Windows registry by the Applocker utility that deny the execution of various security products. This detection leverages data from the Endpoint.Registry datamodel, focusing on specific registry paths and values indicating a "Deny" action against known antivirus and security software. This activity is significant as it may indicate an attempt to disable security defenses, a tactic observed in malware like Azorult. If confirmed malicious, this could allow attackers to bypass security measures, facilitating further malicious activities and persistence within the environment.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where (Registry.registry_path= "*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Group Policy Objects\\*" AND Registry.registry_path= "*}Machine\\Software\\Policies\\Microsoft\\Windows\\SrpV2*") OR Registry.registry_path="*\\Software\\Policies\\Microsoft\\Windows\\SrpV2*" AND Registry.registry_value_data = "*Action\=\"Deny\"*" AND Registry.registry_value_data IN("*O=SYMANTEC*","*O=MCAFEE*","*O=KASPERSKY*","*O=BLEEPING COMPUTER*", "*O=PANDA SECURITY*","*O=SYSTWEAK SOFTWARE*", "*O=TREND MICRO*", "*O=AVAST*", "*O=GRIDINSOFT*", "*O=MICROSOFT*", "*O=NANO SECURITY*", "*O=SUPERANTISPYWARE.COM*", "*O=DOCTOR WEB*", "*O=MALWAREBYTES*", "*O=ESET*", "*O=AVIRA*", "*O=WEBROOT*") 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_impair_defense_deny_security_software_with_applocker_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Registry` node. Also make sure that this registry was included in your config files ex. sysmon config to be monitored.
known_false_positives: False positives may be present based on organization use of Applocker. Filter as needed.
references:
    - https://app.any.run/tasks/a6f2ffe2-e6e2-4396-ae2e-04ea0143f2d8/
    - https://www.microsoftpressstore.com/articles/article.aspx?p=2228450&seqNum=11
finding:
    title: Applocker registry modification to deny the action of several AV products on $dest$.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Azorult
    - Scattered Lapsus$ Hunters
asset_type: Endpoint
mitre_attack_id:
    - T1685
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Registry
  where (
      Registry.registry_path= "*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Group Policy Objects\\*"
      AND Registry.registry_path= "*}Machine\\Software\\Policies\\Microsoft\\Windows\\SrpV2*"
  ) OR Registry.registry_path="*\\Software\\Policies\\Microsoft\\Windows\\SrpV2*"
    AND Registry.registry_value_data = "*Action\=\"Deny\"*" AND Registry.registry_value_data IN(
        "*O=SYMANTEC*",
        "*O=MCAFEE*",
        "*O=KASPERSKY*",
        "*O=BLEEPING COMPUTER*",
        "*O=PANDA SECURITY*",
        "*O=SYSTWEAK SOFTWARE*",
        "*O=TREND MICRO*",
        "*O=AVAST*",
        "*O=GRIDINSOFT*",
        "*O=MICROSOFT*",
        "*O=NANO SECURITY*",
        "*O=SUPERANTISPYWARE.COM*",
        "*O=DOCTOR WEB*",
        "*O=MALWAREBYTES*",
        "*O=ESET*",
        "*O=AVIRA*",
        "*O=WEBROOT*"
    )
  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_impair_defense_deny_security_software_with_applocker_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Registry.registry_patheq
  • *\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy Objects\*
  • *\Software\Policies\Microsoft\Windows\SrpV2*
  • *}Machine\Software\Policies\Microsoft\Windows\SrpV2*
field:"registry_path" kind:eq
Registry.registry_value_dataeq
  • *Action\="Deny"*
field:"Details" kind:eq
Registry.registry_value_datain
  • *O=AVAST*
  • *O=AVIRA*
  • *O=BLEEPING COMPUTER*
  • *O=DOCTOR WEB*
  • *O=ESET*
  • *O=GRIDINSOFT*
  • *O=KASPERSKY*
  • *O=MALWAREBYTES*
  • *O=MCAFEE*
  • *O=MICROSOFT*
  • *O=NANO SECURITY*
  • *O=PANDA SECURITY*
  • *O=SUPERANTISPYWARE.COM*
  • *O=SYMANTEC*
  • *O=SYSTWEAK SOFTWARE*
  • *O=TREND MICRO*
  • *O=WEBROOT*
field:"Details" kind:in

Windows InstallUtil Remote Network Connection

#
Status
production
Severity
low
Group by
IntegrityLevel, _time, command_line, computer_name, dest, destination_port, 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 Windows InstallUtil.exe binary making a remote network connection. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process and network telemetry. This activity is significant because InstallUtil.exe can be exploited to download and execute malicious code, bypassing application control mechanisms. If confirmed malicious, an attacker could achieve code execution, potentially leading to further system compromise, data exfiltration, or lateral movement within the network. Analysts should review the parent process, network connections, and any associated file modifications to determine the legitimacy of this activity.

Known False Positives

  • Limited false positives should be present as InstallUtil is not typically used to download remote files. Filter as needed based on Developers requirements.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows InstallUtil Remote Network Connection
id: 4fbf9270-43da-11ec-9486-acde48001122
version: 19
creation_date: '2021-11-12'
modification_date: '2026-07-14'
author: Michael Haag, Splunk
status: production
type: Anomaly
description: The following analytic detects the Windows InstallUtil.exe binary making a remote network connection. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process and network telemetry. This activity is significant because InstallUtil.exe can be exploited to download and execute malicious code, bypassing application control mechanisms. If confirmed malicious, an attacker could achieve code execution, potentially leading to further system compromise, data exfiltration, or lateral movement within the network. Analysts should review the parent process, network connections, and any associated file modifications to determine the legitimacy of this activity.
data_source:
    - Sysmon EventID 1 AND Sysmon EventID 3
    - Cisco Network Visibility Module Flow Data
search: |
    | tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Processes
      where `process_installutil`
      by _time span=1h
      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)`
    | join process_id dest
        [| tstats `security_content_summariesonly`
            count FROM datamodel=Network_Traffic.All_Traffic where
            All_Traffic.dest_port != 0
            by All_Traffic.action All_Traffic.app All_Traffic.bytes All_Traffic.bytes_in All_Traffic.bytes_out
            All_Traffic.dest  All_Traffic.dest_ip All_Traffic.dest_port All_Traffic.dvc All_Traffic.protocol
            All_Traffic.protocol_version All_Traffic.src All_Traffic.src_ip All_Traffic.src_port
            All_Traffic.transport All_Traffic.user All_Traffic.vendor_product All_Traffic.direction All_Traffic.process_id
        | `drop_dm_object_name(All_Traffic)`
        | rename dest as command_and_control
        | rename src as dest]
    | table _time user src dest parent_process_name process_name process_path process process_id dest_port command_and_control
    | stats count min(_time) as firstTime
        max(_time) as lastTime
        values(process) as process
        values(command_and_control) as command_and_control
        by user dest process_name process_id dest_port parent_process_name
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_installutil_remote_network_connection_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 should be present as InstallUtil is not typically used to download remote files. Filter as needed based on Developers requirements.
references:
    - https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218.004/T1218.004.md
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ generating a remote download.
        - field: dest
          type: system
          score: 20
          message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ generating a remote download.
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process_name
      type: process_name
analytic_story:
    - Living Off The Land
    - Compromised Windows Host
    - Signed Binary Proxy Execution InstallUtil
    - Cisco Network Visibility Module Analytics
asset_type: Endpoint
mitre_attack_id:
    - T1218.004
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
  FROM datamodel=Endpoint.Processes
  where `process_installutil`
  by
    _time span=1h
    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: join

| join process_id dest
    [
        | tstats `security_content_summariesonly`
            count
          FROM datamodel=Network_Traffic.All_Traffic
          where
                All_Traffic.dest_port != 0
          by
            All_Traffic.action
            All_Traffic.app
            All_Traffic.bytes
            All_Traffic.bytes_in
            All_Traffic.bytes_out
            All_Traffic.dest
            All_Traffic.dest_ip
            All_Traffic.dest_port
            All_Traffic.dvc
            All_Traffic.protocol
            All_Traffic.protocol_version
            All_Traffic.src
            All_Traffic.src_ip
            All_Traffic.src_port
            All_Traffic.transport
            All_Traffic.user
            All_Traffic.vendor_product
            All_Traffic.direction
            All_Traffic.process_id
        | `drop_dm_object_name(All_Traffic)`
        | rename dest as command_and_control
        | rename src as dest
    ]

Stage 6: table

| table _time user src dest parent_process_name process_name process_path process process_id
    dest_port command_and_control

Stage 7: stats

| stats count min(_time) as firstTime
    max(_time) as lastTime
    values(process) as process
    values(command_and_control) as command_and_control
    by user dest process_name process_id dest_port parent_process_name

Stage 8: search

| `security_content_ctime(firstTime)`

Stage 9: search

| `security_content_ctime(lastTime)`

Stage 10: search

| `windows_installutil_remote_network_connection_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
All_Traffic.dest_portne
  • 0 corpus 7 (splunk 7)
field:"DestinationPort" kind:ne value:"0"
Processes.original_file_nameeq
  • InstallUtil.exe corpus 19 (elastic 9, sigma 6, splunk 4)
field:"OriginalFileName" kind:eq value:"InstallUtil.exe"
Processes.process_nameeq
  • installutil.exe corpus 36 (elastic 32, splunk 4)
field:"process_basename" kind:eq value:"installutil.exe"

Windows Modify Registry DisAllow Windows App

#
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 the Windows registry aimed at preventing the execution of specific computer programs. It leverages data from the Endpoint.Registry datamodel, focusing on changes to the registry path "\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun" with a value of "0x00000001". This activity is significant as it can indicate an attempt to disable security tools, a tactic used by malware like Azorult. If confirmed malicious, this could allow an attacker to evade detection and maintain persistence on the compromised host.

Known False Positives

  • Administrators may enable or disable this feature that may cause some false positive. Filter as needed.

MITRE ATT&CK Coverage

TacticTechniques
Persistence
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows Modify Registry DisAllow Windows App
id: 4bc788d3-c83a-48c5-a4e2-e0c6dba57889
version: 11
creation_date: '2022-07-06'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects modifications to the Windows registry aimed at preventing the execution of specific computer programs. It leverages data from the Endpoint.Registry datamodel, focusing on changes to the registry path "*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\DisallowRun*" with a value of "0x00000001". This activity is significant as it can indicate an attempt to disable security tools, a tactic used by malware like Azorult. If confirmed malicious, this could allow an attacker to evade detection and maintain persistence on the compromised host.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path= "*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\DisallowRun*" Registry.registry_value_data="0x00000001" by Registry.action Registry.dest Registry.process_guid Registry.process_id Registry.registry_hive Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.registry_value_name Registry.registry_value_type Registry.status Registry.user Registry.vendor_product | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_modify_registry_disallow_windows_app_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Registry` node. Also make sure that this registry was included in your config files ex. sysmon config to be monitored.
known_false_positives: Administrators may enable or disable this feature that may cause some false positive. Filter as needed.
references:
    - https://app.any.run/tasks/a6f2ffe2-e6e2-4396-ae2e-04ea0143f2d8/
finding:
    title: The registry for DisallowRun settings was modified to enable on $dest$.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Azorult
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
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Registry
  where
    Registry.registry_path= "*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\DisallowRun*"
    Registry.registry_value_data="0x00000001"
  by
    Registry.action
    Registry.dest
    Registry.process_guid
    Registry.process_id
    Registry.registry_hive
    Registry.registry_path
    Registry.registry_key_name
    Registry.registry_value_data
    Registry.registry_value_name
    Registry.registry_value_type
    Registry.status
    Registry.user
    Registry.vendor_product

Stage 2: search

| `drop_dm_object_name(Registry)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_modify_registry_disallow_windows_app_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Registry.registry_patheq
  • *\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun*
field:"registry_path" kind:eq value:"*\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun*"
Registry.registry_value_dataeq
  • 0x00000001 corpus 61 (splunk 52, elastic 9)
field:"Details" kind:eq value:"0x00000001"

Windows Modify Registry WuServer

#
Status
production
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 suspicious modifications to the Windows Update Server (WUServer) registry settings. It leverages data from the Endpoint.Registry data model to identify changes in the registry path associated with Windows Update configurations. This activity is significant because adversaries, including malware like RedLine Stealer, exploit this technique to bypass detection and deploy additional payloads. If confirmed malicious, this registry modification could allow attackers to evade defenses, potentially leading to further system compromise and persistent unauthorized access.

Known False Positives

  • Administrators may enable or disable this feature that may cause some false positive.

MITRE ATT&CK Coverage

TacticTechniques
Persistence
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows Modify Registry WuServer
id: a02ad386-e26d-44ce-aa97-6a46cee31439
version: 9
creation_date: '2023-04-26'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Hunting
description: The following analytic detects suspicious modifications to the Windows Update Server (WUServer) registry settings. It leverages data from the Endpoint.Registry data model to identify changes in the registry path associated with Windows Update configurations. This activity is significant because adversaries, including malware like RedLine Stealer, exploit this technique to bypass detection and deploy additional payloads. If confirmed malicious, this registry modification could allow attackers to evade defenses, potentially leading to further system compromise and persistent unauthorized access.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path="*\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\WUServer" 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(lastTime)` | `security_content_ctime(firstTime)` | `windows_modify_registry_wuserver_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Processes` node. In addition, confirm the latest CIM App 4.20 or higher is installed and the latest TA for the endpoint product.
known_false_positives: Administrators may enable or disable this feature that may cause some false positive.
references:
    - https://learn.microsoft.com/de-de/security-updates/windowsupdateservices/18127499
analytic_story:
    - RedLine Stealer
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
    min(_time) as firstTime
    max(_time) as lastTime
  from datamodel=Endpoint.Registry
  where Registry.registry_path="*\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\WUServer"
  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(lastTime)`

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `windows_modify_registry_wuserver_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Registry.registry_patheq
  • *\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\WUServer
field:"registry_path" kind:eq value:"*\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\WUServer"

Windows PowerShell IIS Components WebGlobalModule Usage

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

The following analytic detects the usage of PowerShell Cmdlets - New-WebGlobalModule, Enable-WebGlobalModule, and Set-WebGlobalModule, which are used to create, enable, or modify IIS Modules. This detection leverages PowerShell Script Block Logging, specifically monitoring EventCode 4104 for these cmdlets. This activity is significant as adversaries may use these lesser-known cmdlets to manipulate IIS configurations, similar to AppCmd.exe, potentially bypassing traditional defenses. If confirmed malicious, this could allow attackers to persist in the environment, manipulate web server behavior, or escalate privileges.

Known False Positives

  • It is possible administrators or scripts may run these commands, filtering may be required.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows PowerShell IIS Components WebGlobalModule Usage
id: 33fc9f6f-0ce7-4696-924e-a69ec61a3d57
version: 13
creation_date: '2022-12-21'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: Anomaly
description: The following analytic detects the usage of PowerShell Cmdlets - New-WebGlobalModule, Enable-WebGlobalModule, and Set-WebGlobalModule, which are used to create, enable, or modify IIS Modules. This detection leverages PowerShell Script Block Logging, specifically monitoring EventCode 4104 for these cmdlets. This activity is significant as adversaries may use these lesser-known cmdlets to manipulate IIS configurations, similar to AppCmd.exe, potentially bypassing traditional defenses. If confirmed malicious, this could allow attackers to persist in the environment, manipulate web server behavior, or escalate privileges.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell` EventCode=4104 ScriptBlockText IN("*New-WebGlobalModule*","*Enable-WebGlobalModule*","*Set-WebGlobalModule*")
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY dest signature signature_id
           user_id vendor_product EventID
           Guid Opcode Name
           Path ProcessID ScriptBlockId
           ScriptBlockText
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `windows_powershell_iis_components_webglobalmodule_usage_filter`
how_to_implement: To successfully implement this analytic, you will need to enable PowerShell Script Block Logging on some or all endpoints. Additional setup here https://help.splunk.com/en/security-offerings/splunk-user-behavior-analytics/get-data-in/5.4.1/add-other-data-to-splunk-uba/configure-powershell-logging-to-see-powershell-anomalies-in-splunk-uba.
known_false_positives: It is possible administrators or scripts may run these commands, filtering may be required.
references:
    - https://learn.microsoft.com/en-us/powershell/module/webadministration/new-webglobalmodule?view=windowsserver2022-ps
    - https://www.microsoft.com/en-us/security/blog/2022/12/12/iis-modules-the-evolution-of-web-shells-and-how-to-detect-them/
    - https://www.crowdstrike.com/wp-content/uploads/2022/05/crowdstrike-iceapple-a-novel-internet-information-services-post-exploitation-framework-1.pdf
    - https://unit42.paloaltonetworks.com/unit42-oilrig-uses-rgdoor-iis-backdoor-targets-middle-east/
    - https://www.secureworks.com/research/bronze-union
    - https://github.com/redcanaryco/atomic-red-team/tree/master/atomics/T1505.004
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A PowerShell Cmdlet related to enabling, creating or modifying a IIS module has occurred on $dest$.
analytic_story:
    - GhostRedirector IIS Module and Rungan Backdoor
    - IIS Components
asset_type: Endpoint
mitre_attack_id:
    - T1505.004
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`powershell` EventCode=4104 ScriptBlockText IN(
    "*New-WebGlobalModule*",
    "*Enable-WebGlobalModule*",
    "*Set-WebGlobalModule*"
)

Stage 2: fillnull

| fillnull

Stage 3: stats

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

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `windows_powershell_iis_components_webglobalmodule_usage_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTextin
  • *Enable-WebGlobalModule*
  • *New-WebGlobalModule*
  • *Set-WebGlobalModule*
field:"ScriptBlockText" kind:in

Windows Rdp AutomaticDestinations Deletion

#
Status
production
Severity
low
Group by
action, dest, dvc, file_hash, file_modify_time, file_name, process_guid, process_id, process_name, signature, signature_id, target_filename, user, user_id, vendor_product
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

This detection identifies the deletion of files within the AutomaticDestinations folder, located under a user’s AppData\Roaming\Microsoft\Windows\Recent directory. These files are part of the Windows Jump List feature, which records recently accessed files and folders tied to specific applications. Each .automaticDestinations-ms file corresponds to a program (e.g., Explorer, Word, Notepad) and can be valuable for forensic analysis of user activity. Adversaries may target this folder to erase evidence of their actions, such as which documents or directories were accessed during a session. This type of deletion is rarely seen during normal user activity and may indicate deliberate anti-forensic behavior. When correlated with suspicious logon events, RDP usage, or script execution, this activity may represent an attempt to cover tracks after data access, lateral movement, or staging for exfiltration. Detecting removal of these artifacts can highlight post-compromise cleanup efforts and help analysts reconstruct attacker behavior.

Known False Positives

  • False positives will be present, filter as needed or restrict to critical assets on the perimeter.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Rdp AutomaticDestinations Deletion
id: e40a40a1-9fea-4554-abdf-b164422f0627
version: 5
creation_date: '2025-08-06'
modification_date: '2026-07-20'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: This detection identifies the deletion of files within the AutomaticDestinations folder, located under a user’s AppData\Roaming\Microsoft\Windows\Recent directory. These files are part of the Windows Jump List feature, which records recently accessed files and folders tied to specific applications. Each .automaticDestinations-ms file corresponds to a program (e.g., Explorer, Word, Notepad) and can be valuable for forensic analysis of user activity. Adversaries may target this folder to erase evidence of their actions, such as which documents or directories were accessed during a session. This type of deletion is rarely seen during normal user activity and may indicate deliberate anti-forensic behavior. When correlated with suspicious logon events, RDP usage, or script execution, this activity may represent an attempt to cover tracks after data access, lateral movement, or staging for exfiltration. Detecting removal of these artifacts can highlight post-compromise cleanup efforts and help analysts reconstruct attacker behavior.
data_source:
    - Sysmon EventID 23
    - Sysmon EventID 26
search: |-
    `sysmon`
    EventCode IN (23, 26)
    TargetFilename IN ("*\\Recent\\AutomaticDestinations*")
    | stats count min(_time) as firstTime
                  max(_time) as lastTime

      by action dest dvc file_path file_hash file_name
         file_modify_time process_exec process_guid process_id
         process_name process_path signature
         signature_id user user_id vendor_product

    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_rdp_automaticdestinations_deletion_filter`
how_to_implement: To successfully implement this search, you must ingest logs that include the process name, TargetFilename, and ProcessID executions from your endpoints. If you are utilizing Sysmon, ensure you have at least version 2.0 of the Sysmon TA installed.
known_false_positives: False positives will be present, filter as needed or restrict to critical assets on the perimeter.
references:
    - https://medium.com/@bonguides25/how-to-clear-rdp-connections-history-in-windows-cf0ffb67f344
    - https://thelocalh0st.github.io/posts/rdp/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A file related to rdp automatic destination folder has been deleted on $dest$.
analytic_story:
    - Windows RDP Artifacts and Defense Evasion
asset_type: Endpoint
mitre_attack_id:
    - T1070.004
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon`
EventCode IN (23, 26)
TargetFilename IN ("*\\Recent\\AutomaticDestinations*")

Stage 2: stats

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

  by action dest dvc file_path file_hash file_name
     file_modify_time process_exec process_guid process_id
     process_name process_path signature
     signature_id user user_id vendor_product

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_rdp_automaticdestinations_deletion_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodein
  • 23 corpus 10 (splunk 10)
  • 26 corpus 10 (splunk 10)
field:"EventID" kind:in
TargetFilenamein
  • *\Recent\AutomaticDestinations*
field:"TargetFilename" kind:in value:"*\Recent\AutomaticDestinations*"

Windows Service Deletion In Registry

#
Status
production
Severity
low
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 the deletion of a service from the Windows Registry under CurrentControlSet\Services. It leverages data from the Endpoint.Registry datamodel, specifically monitoring registry paths and actions related to service deletion. This activity is significant as adversaries may delete services to evade detection and hinder incident response efforts. If confirmed malicious, this action could disrupt legitimate services, impair system functionality, and potentially allow attackers to maintain a lower profile within the environment, complicating detection and remediation efforts.

Known False Positives

  • This event can be seen when administrator delete a service or uninstall/reinstall a software that creates service entry, but it is still recommended to check this alert with high priority.

MITRE ATT&CK Coverage

TacticTechniques
Impact

Telemetry Coverage

Rule Body

name: Windows Service Deletion In Registry
id: daed6823-b51c-4843-a6ad-169708f1323e
version: 10
creation_date: '2022-06-22'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic detects the deletion of a service from the Windows Registry under CurrentControlSet\Services. It leverages data from the Endpoint.Registry datamodel, specifically monitoring registry paths and actions related to service deletion. This activity is significant as adversaries may delete services to evade detection and hinder incident response efforts. If confirmed malicious, this action could disrupt legitimate services, impair system functionality, and potentially allow attackers to maintain a lower profile within the environment, complicating detection and remediation efforts.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path= "*\\SYSTEM\\CurrentControlSet\\Services*" AND (Registry.action = deleted OR (Registry.registry_value_name = DeleteFlag AND Registry.registry_value_data = 0x00000001 AND Registry.action=modified)) 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_service_deletion_in_registry_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Registry` node. Also make sure that this registry was included in your config files ex. sysmon config to be monitored.
known_false_positives: This event can be seen when administrator delete a service or uninstall/reinstall a software that creates service entry, but it is still recommended to check this alert with high priority.
references:
    - https://unit42.paloaltonetworks.com/brute-ratel-c4-tool/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A service was deleted on $dest$ within the Windows registry.
analytic_story:
    - PlugX
    - Crypto Stealer
    - Brute Ratel C4
asset_type: Endpoint
mitre_attack_id:
    - T1489
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Registry
  where Registry.registry_path= "*\\SYSTEM\\CurrentControlSet\\Services*" AND (
      Registry.action = deleted
      OR (
          Registry.registry_value_name = DeleteFlag
          AND Registry.registry_value_data = 0x00000001
          AND Registry.action=modified
      )
  )
  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_service_deletion_in_registry_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Registry.actioneq
  • deleted corpus 8 (splunk 8)
  • modified corpus 7 (splunk 7)
field:"EventType" kind:eq
Registry.registry_patheq
  • *\SYSTEM\CurrentControlSet\Services* corpus 2 (splunk 2)
field:"registry_path" kind:eq value:"*\SYSTEM\CurrentControlSet\Services*"
Registry.registry_value_dataeq
  • 0x00000001 corpus 61 (splunk 52, elastic 9)
field:"Details" kind:eq value:"0x00000001"
Registry.registry_value_nameeq
  • DeleteFlag
field:"registry_value_name" kind:eq value:"DeleteFlag"

Back to all Splunk rules