Detection rules › Splunk

Splunk rules: 1x

AWS Bedrock Claude Unusually Large Prompts

#
Status
production
Severity
low
Author
Rod Soto
Source
github.com/splunk/security_content

This detection identifies unusually large prompts sent to AWS Bedrock Claude models by calculating the statistical baseline of input token counts and flagging requests that exceed one standard deviations above the mean. Abnormally large prompts may indicate prompt injection attacks, data exfiltration attempts, or abuse of the AI service.

Known False Positives

  • Possible false positives may arise from legitimate user interactions with the AI model that require large input prompts, such as complex queries or multi-turn conversations. It is important to review the context of the detected prompts to determine if they represent actual prompt injection attempts or benign usage.

MITRE ATT&CK Coverage

TacticTechniques
Privilege Escalation
Stealth

Rule Body

name: AWS Bedrock Claude Unusually Large Prompts
id: 95fbdd4e-1202-4971-b85a-513b2005086e
version: 2
creation_date: '2026-07-06'
modification_date: '2026-07-08'
author: Rod Soto
status: production
type: Anomaly
description: This detection identifies unusually large prompts sent to AWS Bedrock Claude models by calculating the statistical baseline of input token counts and flagging requests that exceed one standard deviations above the mean. Abnormally large prompts may indicate prompt injection attacks, data exfiltration attempts, or abuse of the AI service.
data_source:
    - AWS Bedrock Claude
search: |-
    `aws_bedrock_claude`
    | rename "input.inputTokenCount" AS input_tokens
    | rename "identity.arn" AS user_arn
    | rename "accountId" AS account_id
    | rex field=user_arn "assumed-role/[^/]+/(?<user>[^\"]+)$"
    | eval input_tokens=tonumber(input_tokens)
    | where input_tokens>0
    | eventstats avg(input_tokens) AS avg_tokens stdev(input_tokens) AS stdev
    | where input_tokens > avg_tokens + (1*stdev)
    | where input_tokens > 1000
    | table _time, modelId, user, user_arn, account_id, input_tokens, avg_tokens, host
    | sort - input_tokens
    | `aws_bedrock_claude_unusually_large_prompts_filter`
how_to_implement: You must install and configure the Splunk Add-on for AWS (https://splunkbase.splunk.com/app/1876). Enable Amazon Bedrock model invocation logging in AWS so that Claude request/response payloads are delivered to S3 and/or CloudWatch Logs (see https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html for setup steps), then ingest those logs into Splunk via the AWS TA. Configure the `aws_bedrock_claude` macro to point to the index and sourcetype (`json_no_timestamp`) where these logs land.
known_false_positives: Possible false positives may arise from legitimate user interactions with the AI model that require large input prompts, such as complex queries or multi-turn conversations. It is important to review the context of the detected prompts to determine if they represent actual prompt injection attempts or benign usage.
references:
    - https://aws.amazon.com/blogs/apn/unlocking-the-power-of-splunk-with-amazon-bedrock-an-agentic-ai-approach-to-build-customized-splunk-assistants-using-bedrock-agents/
    - https://help.splunk.com/en/splunk-observability-cloud/observability-for-ai/splunk-ai-infrastructure-monitoring/set-up-ai-infrastructure-monitoring/amazon-bedrock
    - https://research.splunk.com/stories/aws_bedrock_security/
    - https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html
intermediate_findings:
    entities:
        - field: host
          type: system
          score: 20
          message: Unusually large prompt detected on $host$ with $input_tokens$ input tokens, exceeding the statistical baseline of $avg_tokens$ average tokens.
analytic_story:
    - Suspicious AWS Bedrock Claude Activities
asset_type: Web Application
mitre_attack_id:
    - T1055
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`aws_bedrock_claude`

Stage 2: rename

| rename "input.inputTokenCount" AS input_tokens

Stage 3: rename

| rename "identity.arn" AS user_arn

Stage 4: rename

| rename "accountId" AS account_id

Stage 5: rex

| rex field=user_arn "assumed-role/[^/]+/(?<user>[^\"]+)$"

The parser skipped this rex command.

Stage 6: eval

| eval input_tokens=tonumber(input_tokens)

Stage 7: where

| where input_tokens>0

Stage 8: eventstats

| eventstats avg(input_tokens) AS avg_tokens stdev(input_tokens) AS stdev

Stage 9: where

| where input_tokens > avg_tokens + (1*stdev)

Stage 10: where

| where input_tokens > 1000

Stage 11: table

| table _time, modelId, user, user_arn, account_id, input_tokens, avg_tokens, host

Stage 12: sort

| sort - input_tokens

Stage 13: search

| `aws_bedrock_claude_unusually_large_prompts_filter`

Indicators

These rows show field, operator, and value matches.

Detect RClone Command-Line Usage

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

The following analytic detects the usage of rclone.exe with specific command-line arguments indicative of file transfer activities. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on command-line executions and process details. This activity is significant as rclone.exe is often used by adversaries for data exfiltration, especially during ransomware attacks. If confirmed malicious, this behavior could lead to unauthorized data transfer, resulting in data breaches and potential loss of sensitive information. Immediate isolation of the affected endpoint and further investigation are recommended.

Known False Positives

  • False positives should be limited as this is restricted to the Rclone process name. Filter or tune the analytic as needed.

MITRE ATT&CK Coverage

TacticTechniques
Exfiltration

Telemetry Coverage

Rule Body

name: Detect RClone Command-Line Usage
id: 32e0baea-b3f1-11eb-a2ce-acde48001122
version: 19
creation_date: '2021-05-13'
modification_date: '2026-07-14'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects the usage of `rclone.exe` with specific command-line arguments indicative of file transfer activities. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on command-line executions and process details. This activity is significant as `rclone.exe` is often used by adversaries for data exfiltration, especially during ransomware attacks. If confirmed malicious, this behavior could lead to unauthorized data transfer, resulting in data breaches and potential loss of sensitive information. Immediate isolation of the affected endpoint and further investigation are recommended.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
    - Cisco Network Visibility Module Flow Data
search: |
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time)
    as lastTime from datamodel=Endpoint.Processes where
    (Processes.original_file_name="rclone.exe" OR Processes.process_name="rclone.exe")
    Processes.process IN (
            "*copy*", "*mega*", "*pcloud*", "*ftp*",
            "*--config*", "*--progress*", "*--no-check-certificate*",
            "*--ignore-existing*", "*--auto-confirm*", "*--transfers*",
            "*--multi-thread-streams*"
            )
    by Processes.action Processes.dest Processes.original_file_name Processes.parent_process
    Processes.parent_process_exec Processes.parent_process_guid Processes.parent_process_id
    Processes.parent_process_name Processes.parent_process_path Processes.process Processes.process_exec
    Processes.process_guid Processes.process_hash Processes.process_id Processes.process_integrity_level
    Processes.process_name Processes.process_path Processes.user Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    |  `security_content_ctime(lastTime)`
    | `detect_rclone_command_line_usage_filter`
how_to_implement: |
    The detection is based on data that originates from Endpoint Detection
    and Response (EDR) agents. These agents are designed to provide security-related
    telemetry from the endpoints where the agent is installed. To implement this search,
    you must ingest logs that contain the process GUID, process name, and parent process.
    Additionally, you must ingest complete command-line executions. These logs must
    be processed using the appropriate Splunk Technology Add-ons that are specific to
    the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint`
    data model. Use the Splunk Common Information Model (CIM) to normalize the field
    names and speed up the data modeling process.
known_false_positives: |
    False positives should be limited as this is restricted to the Rclone process name. Filter or tune the analytic as needed.
references:
    - https://redcanary.com/blog/rclone-mega-extortion/
    - https://www.mandiant.com/resources/shining-a-light-on-darkside-ransomware-operations
    - https://thedfirreport.com/2021/03/29/sodinokibi-aka-revil-ransomware/
    - https://thedfirreport.com/2021/11/29/continuing-the-bazar-ransomware-story/
finding:
    title: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ by user $user$ attempting to connect to a remote cloud service to move files or folders.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ by user $user$ attempting to connect to a remote cloud service to move files or folders.
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process_name
      type: process_name
analytic_story:
    - Storm-0501 Ransomware
    - Hellcat Ransomware
    - DarkSide Ransomware
    - Ransomware
    - Black Basta Ransomware
    - Cactus Ransomware
    - Cisco Network Visibility Module Analytics
asset_type: Endpoint
mitre_attack_id:
    - T1020
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.original_file_name="rclone.exe" OR Processes.process_name="rclone.exe")
Processes.process IN (
    "*copy*",
    "*mega*",
    "*pcloud*",
    "*ftp*",
    "*--config*",
    "*--progress*",
    "*--no-check-certificate*",
    "*--ignore-existing*",
    "*--auto-confirm*",
    "*--transfers*",
    "*--multi-thread-streams*"
)
  by
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `detect_rclone_command_line_usage_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • rclone.exe corpus 2 (splunk 2)
field:"OriginalFileName" kind:eq value:"rclone.exe"
Processes.processin
  • *--auto-confirm*
  • *--config* corpus 3 (splunk 3)
  • *--ignore-existing*
  • *--multi-thread-streams*
  • *--no-check-certificate*
  • *--progress*
  • *--transfers*
  • *copy*
  • *ftp*
  • *mega*
  • *pcloud*
field:"CommandLine" kind:in
Processes.process_nameeq
  • rclone.exe corpus 2 (elastic 1, splunk 1)
field:"process_basename" kind:eq value:"rclone.exe"

ESXi System Clock Manipulation

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

This detection identifies a significant change to the system clock on an ESXi host, which may indicate an attempt to manipulate timestamps and evade detection or forensic analysis

Known False Positives

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

MITRE ATT&CK Coverage

Rule Body

name: ESXi System Clock Manipulation
id: 910df401-b215-4675-88c5-2ad7b06d82a5
version: 4
creation_date: '2025-07-11'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: TTP
description: This detection identifies a significant change to the system clock on an ESXi host, which may indicate an attempt to manipulate timestamps and evade detection or forensic analysis
data_source:
    - VMWare ESXi Syslog
search: '`esxi_syslog` Message="*NTPClock*" AND Message="*system clock stepped*" | rex field=_raw "stepped to (?<epoch_time>\d+\.\d+),.+delta\s(?<delta>\d+)\s" | rex field=_raw "Z (?<dest>[\w\.]+)\s" | eval epoch_time=tonumber(epoch_time) | eval delta=tonumber(delta) | eval event_time=round(_time, 0) | eval direction=if(epoch_time < event_time, "backward", "forward") | eval original_time=if(direction=="backward", epoch_time + delta, epoch_time - delta) | eval stepped_to_str=strftime(epoch_time, "%Y-%m-%d %H:%M:%S") | eval original_time_str=strftime(original_time, "%Y-%m-%d %H:%M:%S") | stats min(_time) as firstTime max(_time) as lastTime count by dest direction original_time_str stepped_to_str epoch_time delta | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `esxi_system_clock_manipulation_filter`'
how_to_implement: This is based on syslog data generated by VMware ESXi hosts. To implement this search, you must configure your ESXi systems to forward syslog output to your Splunk deployment. These logs must be ingested with the appropriate Splunk Technology Add-on for VMware ESXi Logs, which provides field extractions and CIM compatibility.
known_false_positives: Limited false positives in most environments, however tune as needed
finding:
    title: Large time change on ESXi host $dest$.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - ESXi Post Compromise
    - Black Basta Ransomware
asset_type: Infrastructure
mitre_attack_id:
    - T1070.006
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`esxi_syslog` Message="*NTPClock*" AND Message="*system clock stepped*"

Stage 2: rex

| rex field=_raw "stepped to (?<epoch_time>\d+\.\d+),.+delta\s(?<delta>\d+)\s"

Stage 3: rex

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

Stage 4: eval

| eval epoch_time=tonumber(epoch_time)

Stage 5: eval

| eval delta=tonumber(delta)

Stage 6: eval

| eval event_time=round(_time, 0)

Stage 7: eval

| eval direction=if(epoch_time < event_time, "backward", "forward")
direction =
ifepoch_time < event_time"backward"
else"forward"

Stage 8: eval

| eval original_time=if(direction=="backward", epoch_time + delta, epoch_time - delta)

Stage 9: eval

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

Stage 10: eval

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

Stage 11: stats

| stats
    min(_time) as firstTime
    max(_time) as lastTime
    count
  by dest direction original_time_str stepped_to_str epoch_time delta

Stage 12: search

| `security_content_ctime(firstTime)`

Stage 13: search

| `security_content_ctime(lastTime)`

Stage 14: search

| `esxi_system_clock_manipulation_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Messageeq
  • *NTPClock*
  • *system clock stepped*
field:"Message" kind:eq
sourcetypein
  • vmw-syslog corpus 23 (splunk 23)
  • vmware:esxlog* corpus 23 (splunk 23)
field:"sourcetype" kind:in

Expand.exe Execution (Windows Event Log)

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

expand.exe is a legitimate Windows utility used to extract files from compressed .cab archives. Threat actors have been observed abusing expand.exe to unpack malicious payloads hidden within .cab files on compromised systems. This use case detects expand.exe executions with .cab file extensions or references to suspicious path locations. Allowlisting expected processes with full file paths and command lines where possible is recommended for best fidelity

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '35367.62204'
title: Expand.exe Execution
description: expand.exe is a legitimate Windows utility used to extract files from
  compressed .cab archives. Threat actors have been observed abusing expand.exe to
  unpack malicious payloads hidden within .cab files on compromised systems. This
  use case detects expand.exe executions with .cab file extensions or references to
  suspicious path locations. Allowlisting expected processes with full file paths
  and command lines where possible is recommended for best fidelity. Living Off the
  Land Binary and Scripts (LOLBAS) (LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4688) OR
  "<EventID>4688<") OR Type=Process) "expand.exe" (".cab" OR "/F:" OR "-F:" OR "\\ProgramData"
  OR "\\Public" OR "\\AppData\\Local\\Temp\\" OR "\\AppData\\Roaming\\Temp\\") | where
  match(process_name, "(?i)expand\.exe") and match(process, "(?i)\.cab|(-|\/)F:|\x5cAppData\x5c|(Local|Roaming)\x5cTemp\x5c")
  and not (match(parent_process_path, "(?i):\x5cProgram\sFiles\s\(x86\)\x5cDell\x5cUpdateService\x5cServiceShell\.exe")
  and match(process, "(?i):\x5cProgramData\x5cDell\x5cUpdateService\x5cTemp\x5c"))
  | table _time, host, user, process, process_name, parent_process_path, parent_process_name
  | bin span=1s | stats values(*) as * by _time, host '
techniques:
- command-and-control:ingress tool transfer
- defense-evasion:hide artifacts:ntfs file attributes
technique_id:
- T1105
- T1564.004
data_category:
- Process command-line parameters
- Windows event logs
references:
- https://lolbas-project.github.io/lolbas/Binaries/Expand/
- https://github.com/SigmaHQ/sigma/blob/c04bef2fbbe8beff6c7620d5d7ea6872dbe7acba/rules/windows/process_creation/proc_creation_win_expand_cabinet_files.yml
- https://www.threatdown.com/blog/new-variant-of-konni-malware-used-in-campaign-targetting-russia/
- https://www.sygnia.co/blog/ghost-emperor-demodex-rootkit/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4688) OR "<EventID>4688<") OR Type=Process) "expand.exe" (".cab" OR "/F:" OR "-F:" OR "\\ProgramData" OR "\\Public" OR "\\AppData\\Local\\Temp\\" OR "\\AppData\\Roaming\\Temp\\")

Stage 2: where

| where match(process_name, "(?i)expand\.exe")
    and match(process, "(?i)\.cab|(-|\/)F:|\x5cAppData\x5c|(Local|Roaming)\x5cTemp\x5c") and not (
        match(
            parent_process_path,
            "(?i):\x5cProgram\sFiles\s\(x86\)\x5cDell\x5cUpdateService\x5cServiceShell\.exe"
        )
        and match(process, "(?i):\x5cProgramData\x5cDell\x5cUpdateService\x5cTemp\x5c")
    )

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
processregex_match
    • (?i).cab
    • (-|\/)F:
    • \x5cAppData\x5c
    • (Local|Roaming)\x5cTemp\x5c
    corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match
process_nameregex_match
  • (?i)expand.exe corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)expand.exe"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
parent_process_pathregex_match(?i):\x5cProgram\sFiles\s(x86)\x5cDell\x5cUpdateService\x5cServiceShell.exeexcludes:parent_process_path field:"parent_process_path" value:"(?i):\x5cProgram\sFiles\s(x86)\x5cDell\x5cUpdateService\x5cServiceShell.exe"
processregex_match(?i):\x5cProgramData\x5cDell\x5cUpdateService\x5cTemp\x5cexcludes:process field:"process" value:"(?i):\x5cProgramData\x5cDell\x5cUpdateService\x5cTemp\x5c"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"expand.exe"
1".cab"
1"/F:"
1"-F:"
1"\\ProgramData"
1"\\Public"
1"\\AppData\\Local\\Temp\\"
1"\\AppData\\Roaming\\Temp\\"

Hiding Files And Directories With Attrib exe

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

The following analytic detects the use of the Windows binary attrib.exe to hide files or directories by marking them with specific flags. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on command-line arguments that include the "+h" flag. This activity is significant because hiding files can be a tactic used by attackers to conceal malicious files or tools from users and security software. If confirmed malicious, this behavior could allow an attacker to persist in the environment undetected, potentially leading to further compromise or data exfiltration.

Known False Positives

  • Some applications and users may legitimately use attrib.exe to interact with the files.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Hiding Files And Directories With Attrib exe
id: 6e5a3ae4-90a3-462d-9aa6-0119f638c0f1
version: 18
creation_date: '2020-04-29'
modification_date: '2026-05-13'
author: Bhavin Patel, Splunk
status: production
type: TTP
description: The following analytic detects the use of the Windows binary attrib.exe to hide files or directories by marking them with specific flags. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on command-line arguments that include the "+h" flag. This activity is significant because hiding files can be a tactic used by attackers to conceal malicious files or tools from users and security software. If confirmed malicious, this behavior could allow an attacker to persist in the environment undetected, potentially leading to further compromise or data exfiltration.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` count min(_time) values(Processes.process) as process max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.process_name=attrib.exe (Processes.process=*+h*)
      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)`
    | `hiding_files_and_directories_with_attrib_exe_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Some applications and users may legitimately use attrib.exe to interact with the files.
references: []
finding:
    title: Attrib.exe with +h flag to hide files on $dest$ executed by $user$ is detected.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: Attrib.exe with +h flag to hide files on $dest$ executed by $user$ is detected.
analytic_story:
    - Windows Persistence Techniques
    - Malicious Inno Setup Loader
    - Azorult
    - Compromised Windows Host
    - Windows Defense Evasion Tactics
    - Crypto Stealer
    - VIP Keylogger
asset_type: Endpoint
mitre_attack_id:
    - T1222.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time)
    values(Processes.process) as process
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.process_name=attrib.exe (Processes.process=*+h*)
  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

| `hiding_files_and_directories_with_attrib_exe_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *+h* corpus 2 (sigma 1, splunk 1)
field:"CommandLine" kind:eq value:"*+h*"
Processes.process_nameeq
  • attrib.exe corpus 5 (elastic 3, splunk 2)
field:"process_basename" kind:eq value:"attrib.exe"

Impacket PSexec (Windows Event Log)

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

Impackets psexec.py enables users to execute commands or gain an interactive shell on a remote host

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '5398.5498'
title: Impacket PSexec
description: 'Impackets psexec.py enables users to execute commands or gain an interactive
  shell on a remote host. -- Threat Actor Association: APT28 (aka.Fancy Bear, Fighting
  Ursa, Forest Blizzard, Pawn Storm, TA422, STRONTIUM), Cadet Blizzard, UNC5221, UTA0178
  - Software Association: LockBit, Vice Society -- Atomics T1021.002 Test#3'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR TERM(EventCode=5145) OR "<EventID>5145<")| regex _raw="(?i)(\w{8}\.exe)|(psexec)"
  | eval file_name=Relative_Target_Name| where match(parent_process_name, "(?i)(\w{8}\.exe)|(psexec)")
  or match(file_name, "(?i)(\w{8}\.exe)|(psexec)") | table _time, host, user signature_id,
  user, dest_host, process_id, process_name, process_path, process, parent_process_id,
  parent_process_name, parent_process_path, file_name | bin span=10s | stats values(*)
  as * by _time, host | where match(signature_id, "4688") and match(signature_id,
  "5145") '
techniques:
- execution:system services:service execution
- lateral-movement:remote services
technique_id:
- T1569.002
- T1021
data_category:
- Windows event logs
references:
- https://github.com/SecureAuthCorp/impacket/blob/master/examples/psexec.py

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR TERM(EventCode=5145) OR "<EventID>5145<")

Stage 2: regex

| regex _raw="(?i)(\w{8}\.exe)|(psexec)"

Stage 3: eval

| eval file_name=Relative_Target_Name

Stage 4: where

| where match(parent_process_name, "(?i)(\w{8}\.exe)|(psexec)")
    or match(file_name, "(?i)(\w{8}\.exe)|(psexec)")

Stage 5: table

| table _time, host, user signature_id, user, dest_host, process_id, process_name, process_path,
    process, parent_process_id, parent_process_name, parent_process_path, file_name

Stage 6: bucket

| bin span=10s

Stage 7: stats

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

Stage 8: where

| where match(signature_id, "4688") and match(signature_id, "5145")

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
  • 5145 corpus 19 (splunk 17, elastic 2)
field:"EventID" kind:eq
_rawregex_match
    • (?i)(\w{8}.exe)
    • (psexec)
field:"_raw" kind:regex_match
file_nameregex_match
    • (?i)(\w{8}.exe)
    • (psexec)
field:"file_name" kind:regex_match
parent_process_nameregex_match
    • (?i)(\w{8}.exe)
    • (psexec)
field:"parent_process_name" kind:regex_match
signature_idregex_match
  • 4688 corpus 8 (splunk 8)
  • 5145 corpus 2 (splunk 2)
field:"signature_id" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"<EventID>5145<"

Linux Auditd Possible Access To Sudoers File

#
Status
production
Severity
low
Group by
audit_id, current_working_directory, dest, host, match_count, reconstructed_path
Author
Teoderick Contreras, Nasreddine Bencherchali, Splunk
Source
github.com/splunk/security_content

The following analytic detects potential access or modification of the /etc/sudoers file on a Linux system. It leverages data from Linux Auditd, focusing on events of type PATH or CWD. This activity could be significant because the sudoers file controls user permissions for executing commands with elevated privileges. Correlate this with related EXECVE or PROCTITLE events to identify the process or user responsible for the access or modification. If confirmed malicious, an attacker could gain persistence or escalate privileges, compromising the security of the targeted host.

Known False Positives

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

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Linux Auditd Possible Access To Sudoers File
id: 8be88f46-f7e8-4ae6-b15e-cf1b13392834
version: 14
creation_date: '2024-08-09'
modification_date: '2026-05-13'
author: Teoderick Contreras, Nasreddine Bencherchali, Splunk
status: production
type: Anomaly
description: |
    The following analytic detects potential access or modification of the /etc/sudoers file on a Linux system.
    It leverages data from Linux Auditd, focusing on events of type PATH or CWD.
    This activity could be significant because the sudoers file controls user permissions for executing commands with elevated privileges.
    Correlate this with related EXECVE or PROCTITLE events to identify the process or user responsible for the access or modification.
    If confirmed malicious, an attacker could gain persistence or escalate privileges, compromising the security of the targeted host.
data_source:
    - Linux Auditd Path
    - Linux Auditd Cwd
search: |
    `linux_auditd`
    (type=PATH OR type=CWD)
    | rex "msg=audit\([^)]*:(?<audit_id>\d+)\)"

    | stats
      values(type) as types
      values(name) as names
      values(nametype) as nametype
      values(cwd) as cwd_list
      values(_time) as event_times
      by audit_id, host

    | eval current_working_directory = coalesce(mvindex(cwd_list, 0), "N/A")
    | eval candidate_paths = mvmap(names, if(match(names, "^/"), names, current_working_directory + "/" + names))
    | eval matched_paths = mvfilter(match(candidate_paths, "/etc/sudoers.*"))
    | eval match_count = mvcount(matched_paths)
    | eval reconstructed_path = mvindex(matched_paths, 0)
    | eval e_time = mvindex(event_times, 0)
    | where match_count > 0
    | rename host as dest

    | stats count min(e_time) as firstTime max(e_time) as lastTime
      values(nametype) as nametype
      by current_working_directory
         reconstructed_path
         match_count
         dest
         audit_id

    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `linux_auditd_possible_access_to_sudoers_file_filter`
how_to_implement: |
    To implement this detection, the process begins by ingesting auditd
    data, that consist SYSCALL, TYPE, EXECVE and PROCTITLE events, which captures command-line
    executions and process details on Unix/Linux systems. These logs should be ingested
    and processed using Splunk Add-on for Unix and Linux (https://splunkbase.splunk.com/app/833),
    which is essential for correctly parsing and categorizing the data. The next step
    involves normalizing the field names  to match the field names set by the Splunk
    Common Information Model (CIM) to ensure consistency across different data sources
    and enhance the efficiency of data modeling and make sure the type=CWD record type is activate in your auditd configuration.
    This approach enables effective monitoring and detection of linux endpoints where auditd is deployed.
known_false_positives: |
    Administrator or network operator can execute this command.
    Please update the filter macros to remove false positives.
references:
    - https://attack.mitre.org/techniques/T1548/003/
    - https://web.archive.org/web/20210708035426/https://www.cobaltstrike.com/downloads/csmanual43.pdf
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: $reconstructed_path$ has been accessed for potential modification or deletion on host - [$dest$]
analytic_story:
    - Linux Persistence Techniques
    - Compromised Linux Host
    - China-Nexus Threat Activity
    - Salt Typhoon
    - Linux Privilege Escalation
asset_type: Endpoint
mitre_attack_id:
    - T1548.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`linux_auditd`
(type=PATH OR type=CWD)

Stage 2: rex

| rex "msg=audit\([^)]*:(?<audit_id>\d+)\)"

Stage 3: stats

| stats
  values(type) as types
  values(name) as names
  values(nametype) as nametype
  values(cwd) as cwd_list
  values(_time) as event_times
  by audit_id, host

Stage 4: eval

| eval current_working_directory = coalesce(mvindex(cwd_list, 0), "N/A")

Stage 5: eval

| eval
    candidate_paths = mvmap(
        names,
        if(match(names, "^/"), names, current_working_directory + "/" + names)
    )

Stage 6: eval

| eval matched_paths = mvfilter(match(candidate_paths, "/etc/sudoers.*"))

Stage 7: eval

| eval match_count = mvcount(matched_paths)

Stage 8: eval

| eval reconstructed_path = mvindex(matched_paths, 0)

Stage 9: eval

| eval e_time = mvindex(event_times, 0)

Stage 10: where

| where match_count > 0

Stage 11: rename

| rename host as dest

Stage 12: stats

| stats count min(e_time) as firstTime max(e_time) as lastTime
  values(nametype) as nametype
  by current_working_directory
     reconstructed_path
     match_count
     dest
     audit_id

Stage 13: search

| `security_content_ctime(firstTime)`

Stage 14: search

| `security_content_ctime(lastTime)`

Stage 15: search

| `linux_auditd_possible_access_to_sudoers_file_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
match_countgt
  • 0 corpus 7 (splunk 7)
field:"match_count" kind:gt value:"0"
sourcetypeeq
  • auditd corpus 58 (splunk 58)
field:"sourcetype" kind:eq value:"auditd"
typeeq
  • CWD corpus 7 (splunk 7)
  • PATH corpus 19 (sigma 12, splunk 7)
field:"type" kind:eq

Linux MOTD Script Added

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

The following analytic detects the creation of a file within the /etc/update-motd.d directory. This is used to add scripts that run with Message of the Day (MOTD) when a user logs in. This can be used by attackers for persistence if it contains malicious code.

Known False Positives

  • Legitimate system administrators may add or modify MOTD scripts for valid operational purposes such as displaying system information or login banners. Filter based on known administrative activity and authorized users.

MITRE ATT&CK Coverage

Telemetry Coverage

PlatformRecord / event type
LinuxEvent ID 11: File created

Rule Body

name: Linux MOTD Script Added
id: 6dd14256-559b-4364-99d8-0968407b8074
version: 1
creation_date: '2026-07-08'
modification_date: '2026-07-08'
author: Raven Tait, Splunk
status: production
type: Anomaly
description: |-
    The following analytic detects the creation of a file within the /etc/update-motd.d directory.
    This is used to add scripts that run with Message of the Day (MOTD) when a user logs in.
    This can be used by attackers for persistence if it contains malicious code.
data_source:
    - Sysmon for Linux EventID 11
search: |-
    | tstats `security_content_summariesonly`
      count min(_time) as firstTime
            max(_time) as lastTime

    from datamodel=Endpoint.Filesystem where

    Filesystem.file_path="/etc/update-motd.d/*"
    Filesystem.action IN ("created", "modified")

    by Filesystem.file_path Filesystem.file_name
       Filesystem.user Filesystem.dest
       Filesystem.action Filesystem.process_guid
       Filesystem.process_id

    | `drop_dm_object_name(Filesystem)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `linux_motd_script_added_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 file creation events including the file path and user context. 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 `Filesystem` 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: |-
    Legitimate system administrators may add or modify MOTD scripts for valid operational purposes such as displaying system information or login banners. Filter based on known administrative activity and authorized users.
references:
    - https://github.com/Aegrah/PANIX
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Potential MOTD Script [$file_name$] added by [$user$] on [$dest$].
threat_objects:
    - field: file_name
      type: file_name
analytic_story:
    - Linux Persistence Techniques
    - Linux Post-Exploitation
asset_type: Endpoint
mitre_attack_id:
    - T1547
    - T1037
    - T1059.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 min(_time) as firstTime
        max(_time) as lastTime

from datamodel=Endpoint.Filesystem where

Filesystem.file_path="/etc/update-motd.d/*"
Filesystem.action IN ("created", "modified")

by Filesystem.file_path Filesystem.file_name
   Filesystem.user Filesystem.dest
   Filesystem.action Filesystem.process_guid
   Filesystem.process_id

Stage 2: search

| `drop_dm_object_name(Filesystem)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `linux_motd_script_added_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Filesystem.actionin
  • created corpus 10 (splunk 10)
  • modified corpus 10 (splunk 10)
field:"event_action" kind:in
Filesystem.file_patheq
  • /etc/update-motd.d/* corpus 2 (elastic 1, splunk 1)
field:"TargetFilename" kind:eq value:"/etc/update-motd.d/*"

MacOS Hidden Files and Directories

#
Status
production
Severity
low
Group by
CurrentDirectory, command_line, computer_name, original_file_name, parent_process_id, process_basename, process_guid, process_hash, process_id, process_name, user, user_id, vendor_product
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

The following analytic detects suspicious creation of hidden files and directories, which may indicate an attacker's attempt to conceal malicious activities or unauthorized data. Hidden files and directories are often used to evade detection by security tools and administrators, providing a stealthy means for storing malware, logs, or sensitive information. By monitoring for unusual or unauthorized creation of hidden files and directories, this analytic helps identify potential attempts to hide or unauthorized creation of hidden files and directories, and helps identify potential attempts to hide malicious operations, enabling security teams to uncover and address hidden threats effectively.

Known False Positives

  • Power users or developers utilizing build tools or CI/CD tools could trigger this activity.

MITRE ATT&CK Coverage

Rule Body

name: MacOS Hidden Files and Directories
id: 51c43b7b-e406-45d2-9bad-5c67f07e6528
version: 3
creation_date: '2026-04-14'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: Anomaly
description: |-
    The following analytic detects suspicious creation of hidden files and directories, which may indicate an attacker's attempt to conceal malicious activities or unauthorized data.
    Hidden files and directories are often used to evade detection by security tools and administrators, providing a stealthy means for storing malware, logs, or sensitive information.
    By monitoring for unusual or unauthorized creation of hidden files and directories, this analytic helps identify potential attempts to hide or unauthorized creation of hidden files and directories, and helps identify potential attempts to hide malicious operations, enabling security teams to uncover and address hidden threats effectively.
data_source:
    - Osquery Results
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where

    (
        Processes.process="*chflags *"
        Processes.process="* hidden*"
    )
    OR
    (
        Processes.process="*xattr *"
        Processes.process="* -wx *"
        Processes.process="*com.apple.FinderInfo*"
    )

    by Processes.dest Processes.original_file_name Processes.parent_process_id
       Processes.process Processes.process_exec Processes.process_guid
       Processes.process_hash Processes.process_id
       Processes.process_current_directory 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)`
    | `macos_hidden_files_and_directories_filter`
how_to_implement: |-
    This detection uses osquery and endpoint security on MacOS. Follow the link in references, which describes how to setup process auditing in MacOS with endpoint security and osquery.
    Also the [TA-OSquery](https://splunkbase.splunk.com/app/8574) must be deployed across your indexers and universal forwarders in order to have the osquery data populate the data models.
known_false_positives: |-
    Power users or developers utilizing build tools or CI/CD tools could trigger this activity.
references:
    - https://osquery.readthedocs.io/en/stable/deployment/process-auditing/
    - https://ss64.com/mac/chflags.html
    - https://ss64.com/mac/xattr.html
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: Attempt to hide files on $dest$ by $user$ via $process$
        - field: dest
          type: system
          score: 20
          message: Attempt to hide files on $dest$ by $user$ via $process$
threat_objects:
    - field: process
      type: process
analytic_story:
    - MacOS Persistence Techniques
asset_type: Endpoint
mitre_attack_id:
    - T1564.001
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="*chflags *"
    Processes.process="* hidden*"
)
OR
(
    Processes.process="*xattr *"
    Processes.process="* -wx *"
    Processes.process="*com.apple.FinderInfo*"
)
  by
    Processes.dest
    Processes.original_file_name
    Processes.parent_process_id
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_current_directory
    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

| `macos_hidden_files_and_directories_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • * -wx *
  • * hidden*
  • *chflags *
  • *com.apple.FinderInfo*
  • *xattr *
field:"CommandLine" kind:eq

Network Connection with Suspicious Folder (Windows Event Log)

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

Detects potential downloads to suspicious file locations like temp, appdata, and downloads

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

Telemetry Coverage

Rule Body

id: '9019.12103'
title: Network Connection with Suspicious Folder
description: 'Detects potential downloads to suspicious file locations like temp,
  appdata, and downloads. - Threat Actor Association: Alloy Taurus/Gallium, Lazarus,
  NewsPenguin, OilRig, TA413 - Software Association: LOWZERO, Vidar Stealer'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (EventCode=5156 OR "Event>ID<5156")
  ("Temporary Internet Files" OR TERM("TEMP") OR TERM("Downloads") OR TERM("Appdata"))
  | regex process_path="(?i)Temp|Downloads|Appdata" | table _time, host, user dest,
  direction, event_id, eventtype, parent_*, process, process_*, user, user_id, src_*,
  dest_* | bin span=1s | stats values(*) as * by _time, host, process_path '
techniques:
- command-and-control:ingress tool transfer
technique_id: 
- T1105
data_category:
- Windows event logs
references: null

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (EventCode=5156 OR "Event>ID<5156") ("Temporary Internet Files" OR TERM("TEMP") OR TERM("Downloads") OR TERM("Appdata"))

Stage 2: regex

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

Stage 3: table

| table _time, host, user dest, direction, event_id, eventtype, parent_*, process, process_*, user,
    user_id, src_*, dest_*

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 5156 corpus 13 (splunk 13)
field:"EventID" kind:eq value:"5156"
process_pathregex_match
    • (?i)Temp
    • Downloads
    • Appdata
    corpus 3 (splunk 3)
field:"process_name" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"Event>ID<5156"
1"Temporary Internet Files"
1"\"TEMP\""
1"\"Downloads\""
1"\"Appdata\""

Network Share Discovery Via Dir Command

#
Status
production
Group by
ObjectType, SourcePort, SubjectDomainName, access_mask, computer_name, share_name, src_ip, subject_user_name
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects access to Windows administrative SMB shares (Admin$, IPC$, C$) using the 'dir' command. It leverages Windows Security Event Logs with EventCode 5140 to identify this activity. This behavior is significant as it is commonly used by tools like PsExec/PaExec for staging binaries before creating and starting services on remote endpoints, a technique often employed by adversaries for lateral movement and remote code execution. If confirmed malicious, this activity could allow attackers to propagate malware, such as IcedID, across the network, leading to widespread infection and potential data breaches.

Known False Positives

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

MITRE ATT&CK Coverage

TacticTechniques
Discovery

Telemetry Coverage

Rule Body

name: Network Share Discovery Via Dir Command
id: dc1457d0-1d9b-422e-b5a7-db46c184d9aa
version: 7
creation_date: '2023-05-23'
modification_date: '2026-08-05'
author: Teoderick Contreras, Splunk
status: production
type: Hunting
description: |-
    The following analytic detects access to Windows administrative SMB shares (Admin$, IPC$, C$) using the 'dir' command. It leverages Windows Security Event Logs with EventCode 5140 to identify this activity.
    This behavior is significant as it is commonly used by tools like PsExec/PaExec for staging binaries before creating and starting services on remote endpoints, a technique often employed by adversaries for lateral movement and remote code execution.
    If confirmed malicious, this activity could allow attackers to propagate malware, such as IcedID, across the network, leading to widespread infection and potential data breaches.
data_source:
    - Windows Event Log Security 5140
search: |-
    `wineventlog_security`
    EventCode=5140
    ShareName IN (
        "\\\\*\\Admin$",
        "\\\\*\\C$",
        "\\\\*\\IPC$"
    )


    ```
    We select only read-related operations:
        0x1 = ReadData (or ListDirectory)
    ```

    | eval AccessMask_ = tonumber(AccessMask, 16)
    | where (bit_and(AccessMask_, 1) != 0)

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

    by ShareName IpAddress ObjectType SubjectUserName
       SubjectDomainName IpPort AccessMask Computer

    | rename Computer as dest

    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `network_share_discovery_via_dir_command_filter`
how_to_implement: |-
    To successfully implement this search, you need to be ingesting Windows Security Event Logs with 5140 EventCode enabled. The Windows TA is also required. Also enable the object Audit access success/failure in your group policy.
known_false_positives: |-
    System Administrators may use tools like "net.exe", "net1.exe", or "dir" for troubleshooting or administrations tasks.
    However, this will typically come only from certain users and certain systems that can be added to an allow list.
references:
    - https://thedfirreport.com/2023/05/22/icedid-macro-ends-in-nokoyawa-ransomware/
    - https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/auditing/event-5140#table-of-file-access-codes
    - https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/auditing/event-5140
analytic_story:
    - IcedID
asset_type: Endpoint
atomic_guid:
    - 13daa2cf-195a-43df-a8bd-7dd5ffb607b5
mitre_attack_id:
    - T1135
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security`
EventCode=5140
ShareName IN (
    "\\\\*\\Admin$",
    "\\\\*\\C$",
    "\\\\*\\IPC$"
)

Stage 2: eval

| eval AccessMask_ = tonumber(AccessMask, 16)

Stage 3: where

| where (bit_and(AccessMask_, 1) != 0)

Stage 4: stats

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

by ShareName IpAddress ObjectType SubjectUserName
   SubjectDomainName IpPort AccessMask Computer

Stage 5: rename

| rename Computer as dest

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `network_share_discovery_via_dir_command_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
AccessMask_eq
  • 1 transforms: binary_and_any corpus 2 (splunk 2)
field:"AccessMask_" kind:eq value:"1"
EventCodeeq
  • 5140 corpus 8 (splunk 8)
field:"EventID" kind:eq value:"5140"
ShareNamein
  • \\*\Admin$ corpus 3 (splunk 3)
  • \\*\C$ corpus 3 (splunk 3)
  • \\*\IPC$ corpus 3 (splunk 3)
field:"ShareName" kind:in

NMAP Execution

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

Adversaries may attempt to get a listing of other systems by IP address, hostname, or other logical identifier on a network that may be used for Lateral Movement from the current system. This use case looks for executions of nmap that have been passed an IPv4 Address

MITRE ATT&CK Coverage

TacticTechniques
Discovery

References

Telemetry Coverage

Rule Body

id: '6127.6609'
title: NMAP Execution
description: 'Adversaries may attempt to get a listing of other systems by IP address,
  hostname, or other logical identifier on a network that may be used for Lateral
  Movement from the current system. This use case looks for executions of nmap that
  have been passed an IPv4 Address. -- Threat Actor Association: Alloy Taurus/Gallium'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_unix` (TERM(nmap) type IN("proctitle",
  "execve", "USER_CMD")) | regex process="(?i)nmap\s.+?(\d{1,3}\.){3}\d{1,3}" | table
  _time, host, user, process, process_*, type | bin span=1s | stats values(*) as *
  by _time, host '
techniques:
- discovery:remote system discovery
technique_id: 
- T1018
data_category:
- Process command-line parameters
references:
- https://www.group-ib.com/resources/threat-research/silence_moving-into-the-darkside.pdf

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_unix` (TERM(nmap) type IN("proctitle", "execve", "USER_CMD"))

Stage 2: regex

| regex process="(?i)nmap\s.+?(\d{1,3}\.){3}\d{1,3}"

Stage 3: table

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

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
processregex_match
  • (?i)nmap\s.+?(\d{1,3}.){3}\d{1,3}
field:"CommandLine" kind:regex_match value:"(?i)nmap\s.+?(\d{1,3}.){3}\d{1,3}"
typein
  • USER_CMD corpus 2 (splunk 2)
  • execve corpus 2 (splunk 2)
  • proctitle corpus 2 (splunk 2)
field:"type" kind:in

Search Terms

These SPL tokens match against raw event text.

StageTerm
1nmap

O365 Email Suspicious Search Behavior

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

The following analytic identifies when Office 365 users search for suspicious keywords or have an excessive number of queries to a mailbox within a limited timeframe. This behavior may indicate that a malicious actor has gained control of a mailbox and is conducting discovery or enumeration activities.

Known False Positives

  • Users searching excessively or possible false positives related to matching conditions.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: O365 Email Suspicious Search Behavior
id: 3b6e1d36-6916-4eec-a7d5-bc98953ba595
version: 6
creation_date: '2025-01-08'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: Anomaly
description: The following analytic identifies when Office 365 users search for suspicious keywords or have an excessive number of queries to a mailbox within a limited timeframe. This behavior may indicate that a malicious actor has gained control of a mailbox and is conducting discovery or enumeration activities.
data_source:
    - Office 365 Universal Audit Log
search: |-
    `o365_management_activity` Operation=SearchQueryInitiatedExchange
    | eval command = case(Operation=="SearchQueryPerformed",SearchQueryText,true(),QueryText), UserId = lower(UserId), signature_id = CorrelationId, signature=Operation, src = ClientIP, user = lower(UserId), object_name=case(Operation=="SearchQueryPerformed",'EventData',true(),QuerySource), -time = _time, suspect_terms = case(match(command, `o365_suspect_search_terms_regex`),command,true(),null())
    | where command != "*" AND command != "(*)"
    | bin _time span=1hr
    | stats values(ScenarioName) as app, values(object_name) as object_name values(command) as command, values(suspect_terms) as suspect_terms, values(src) as src, dc(suspect_terms) as suspect_terms_count, dc(command) as count, min(-time) as firstTime, max(-time) as lastTime by user,signature,_time
    | where count > 20 OR suspect_terms_count >= 2
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `o365_email_suspicious_search_behavior_filter`
how_to_implement: You must install the Splunk Microsoft Office 365 Add-on and ingest Office 365 management activity events. You must also enable SearchQueryInitiated category as part of your organizations mailbox audit logging policy. The thresholds and match terms set within the analytic are initial guidelines and should be customized based on the organization's user behavior and risk profile. Security teams are encouraged to adjust these thresholds to optimize the balance between detecting genuine threats and minimizing false positives, ensuring the detection is tailored to their specific environment.
known_false_positives: Users searching excessively or possible false positives related to matching conditions.
references:
    - https://learn.microsoft.com/en-us/purview/audit-get-started#step-3-enable-searchqueryinitiated-events
    - https://www.cisa.gov/sites/default/files/2025-01/microsoft-expanded-cloud-logs-implementation-playbook-508c.pdf
    - https://www.cisa.gov/news-events/cybersecurity-advisories/aa23-320a
    - https://attack.mitre.org/techniques/T1114/002/
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: The user $user$ searched email suspiciously, $count$ unique terms and $suspect_terms_count$ suspect terms were searched within a limited timeframe.
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - Office 365 Account Takeover
    - Office 365 Collection Techniques
    - Compromised User Account
    - CISA AA22-320A
asset_type: O365 Tenant
mitre_attack_id:
    - T1114.002
    - T1552
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`o365_management_activity` Operation=SearchQueryInitiatedExchange

Stage 2: eval

| eval command = case(Operation=="SearchQueryPerformed",SearchQueryText,true(),QueryText),
    UserId = lower(UserId), signature_id = CorrelationId, signature=Operation, src = ClientIP,
    user = lower(UserId),
    object_name=case(Operation=="SearchQueryPerformed",'EventData',true(),QuerySource),
    -time = _time,
    suspect_terms = case(match(command, `o365_suspect_search_terms_regex`),command,true(),null())
command =
ifOperation="SearchQueryPerformed"SearchQueryText
elseQueryText
object_name =
ifOperation="SearchQueryPerformed"'EventData'
elseQuerySource
suspect_terms =
ifmatch(command, "(?i)password|credential|login|passwd|shadow|active directory|account|username|network|computer|access|MFA|bank|deposit|payroll|EFT|Electonic Funds|routing")command
elsenull()

Stage 3: where

| where command != "*" AND command != "(*)"

Stage 4: bucket

| bin _time span=1hr

Stage 5: stats

| stats
    values(ScenarioName) as app,
    values(object_name) as object_name
    values(command) as command,
    values(suspect_terms) as suspect_terms,
    values(src) as src,
    dc(suspect_terms) as suspect_terms_count,
    dc(command) as count,
    min(-time) as firstTime,
    max(-time) as lastTime
  by user,signature,_time

Stage 6: where

| where count > 20 OR suspect_terms_count >= 2

Stage 7: search

| `security_content_ctime(firstTime)`

Stage 8: search

| `security_content_ctime(lastTime)`

Stage 9: search

| `o365_email_suspicious_search_behavior_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Operationeq
  • SearchQueryInitiatedExchange
field:"Operation" kind:eq value:"SearchQueryInitiatedExchange"
commandne
  • (*) corpus 2 (splunk 2)
  • * corpus 2 (splunk 2)
field:"command" kind:ne
countgt
  • 20 corpus 6 (splunk 6)
field:"count" kind:gt value:"20"
sourcetypeeq
  • o365:management:activity corpus 80 (splunk 80)
field:"sourcetype" kind:eq value:"o365:management:activity"
suspect_terms_countge
  • 2 corpus 2 (splunk 2)
field:"suspect_terms_count" kind:ge value:"2"

O365 External Identity Policy Changed

#
Status
production
Severity
medium
Group by
aws::recipientAccountId, dest, object_name, signature, user, vendor_product
Author
Steven Dick
Source
github.com/splunk/security_content

The following analytic identifies when changes are made to the external guest policies within Azure AD. With Azure AD B2B collaboration, users and administrators can invite external users to collaborate with internal users. This detection also attempts to highlight what may have changed. External guest account invitations should be monitored by security teams as they could potentially lead to unauthorized access. An example of this attack vector was described at BlackHat 2022 by security researcher Dirk-Jan during his tall Backdooring and Hijacking Azure AD Accounts by Abusing External Identities.

Known False Positives

  • Business approved changes by known administrators.

MITRE ATT&CK Coverage

TacticTechniques
Persistence

Telemetry Coverage

PlatformRecord / event type
Microsoft 365Update policy.

Rule Body

name: O365 External Identity Policy Changed
id: 29af1725-7a72-4d2d-8a18-e697e79a62d3
version: 9
creation_date: '2024-04-13'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: TTP
description: The following analytic identifies when changes are made to the external guest policies within Azure AD. With Azure AD B2B collaboration, users and administrators can invite external users to collaborate with internal users. This detection also attempts to highlight what may have changed. External guest account invitations should be monitored by security teams as they could potentially lead to unauthorized access. An example of this attack vector was described at BlackHat 2022 by security researcher Dirk-Jan during his tall `Backdooring and Hijacking Azure AD Accounts by Abusing External Identities`.
data_source:
    - Office 365 Universal Audit Log
search: "`o365_management_activity` Workload=AzureActiveDirectory Operation=\"Update policy.\" Target{}.ID=\"B2BManagementPolicy\" | eval object_attrs = mvindex('ModifiedProperties{}.NewValue',0), object_attrs_old = mvindex('ModifiedProperties{}.OldValue',0), object_name = mvindex('Target{}.ID',3), signature=Operation, user = case(match(mvindex('Actor{}.ID',-1),\"User\"),mvindex('Actor{}.ID',0),match(mvindex('Actor{}.ID',-1),\"ServicePrincipal\"), mvindex('Actor{}.ID',3),true(),mvindex('Actor{}.ID',0)) | spath input=object_attrs_old output=B2BOld path={} | spath input=B2BOld | rename B2BManagementPolicy.* as B2BManagementPolicyOld.* | spath input=object_attrs output=B2BNew path={} | spath input=B2BNew | eval object_attrs = 'B2BManagementPolicy.InvitationsAllowedAndBlockedDomainsPolicy.AllowedDomains{}' , object_attrs_old = 'B2BManagementPolicyOld.InvitationsAllowedAndBlockedDomainsPolicy.AllowedDomains{}' | eval diff_add=mvmap(object_attrs,if(isnull(mvfind(object_attrs_old,object_attrs)),object_attrs,null)) | eval diff_remove=mvmap(object_attrs_old,if(isnull(mvfind(object_attrs,object_attrs_old)),object_attrs_old,null)) | eval result = case(isnotnull(diff_add),\"Added \".mvjoin(diff_add,\",\"),isnotnull(diff_remove),\"Removed \".mvjoin(diff_remove,\",\")), action = case(isnotnull(diff_add),\"created\",isnotnull(diff_remove),\"deleted\") | stats values(object_attrs) as object_attrs, values(action) as action, values(result) as result, values(B2BManagementPolicy*) as B2BManagementPolicy*, count, min(_time) as firstTime, max(_time) as lastTime by user signature object_name dest vendor_account vendor_product | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `o365_external_identity_policy_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: Business approved changes by known administrators.
references:
    - https://medium.com/tenable-techblog/roles-allowing-to-abuse-entra-id-federation-for-persistence-and-privilege-escalation-df9ca6e58360
    - https://learn.microsoft.com/en-us/entra/external-id/external-identities-overview
finding:
    title: User $user$ changed the external identity [$object_name$] policy
    entity:
        field: user
        type: user
        score: 50
analytic_story:
    - Azure Active Directory Persistence
asset_type: O365 Tenant
mitre_attack_id:
    - T1136.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`o365_management_activity` Workload=AzureActiveDirectory Operation="Update policy."
    Target{}.ID="B2BManagementPolicy"

Stage 2: eval

| eval object_attrs = mvindex('ModifiedProperties{}.NewValue',0),
    object_attrs_old = mvindex('ModifiedProperties{}.OldValue',0),
    object_name = mvindex('Target{}.ID',3), signature=Operation,
    user = case(
        match(mvindex('Actor{}.ID',-1),"User"), mvindex('Actor{}.ID',0),
        match(mvindex('Actor{}.ID',-1),"ServicePrincipal"), mvindex('Actor{}.ID',3),
        true(), mvindex('Actor{}.ID',0)
    )
user =
ifmatch(mvindex('Actor{}.ID', -1), "User")mvindex('Actor{}.ID', 0)
elifmatch(mvindex('Actor{}.ID', -1), "ServicePrincipal")mvindex('Actor{}.ID', 3)
elsemvindex('Actor{}.ID', 0)

Stage 3: spath

| spath input=object_attrs_old output=B2BOld path={}

Stage 4: spath

| spath input=B2BOld

Stage 5: rename

| rename B2BManagementPolicy.* as B2BManagementPolicyOld.*

Stage 6: spath

| spath input=object_attrs output=B2BNew path={}

Stage 7: spath

| spath input=B2BNew

Stage 8: eval

| eval
    object_attrs = 'B2BManagementPolicy.InvitationsAllowedAndBlockedDomainsPolicy.AllowedDomains{}' ,
    object_attrs_old = 'B2BManagementPolicyOld.InvitationsAllowedAndBlockedDomainsPolicy.AllowedDomains{}'

Stage 9: eval

| eval
    diff_add=mvmap(object_attrs,if(isnull(mvfind(object_attrs_old,object_attrs)),object_attrs,null))

Stage 10: eval

| eval
    diff_remove=mvmap(
        object_attrs_old,
        if(isnull(mvfind(object_attrs,object_attrs_old)),object_attrs_old,null)
    )

Stage 11: eval

| eval
    result = case(
        isnotnull(diff_add), "Added ".mvjoin(diff_add,","),
        isnotnull(diff_remove), "Removed ".mvjoin(diff_remove,",")
    ),
    action = case(isnotnull(diff_add),"created",isnotnull(diff_remove),"deleted")
action =
ifisnotnull(diff_add)"created"
else"deleted"
result =
ifisnotnull(diff_add)concat("Added ", mvjoin(diff_add, ","))
elseconcat("Removed ", mvjoin(diff_remove, ","))

Stage 12: stats

| stats
    values(object_attrs) as object_attrs,
    values(action) as action,
    values(result) as result,
    values(B2BManagementPolicy*) as B2BManagementPolicy*,
    count,
    min(_time) as firstTime,
    max(_time) as lastTime
  by user signature object_name dest vendor_account vendor_product

Stage 13: search

| `security_content_ctime(firstTime)`

Stage 14: search

| `security_content_ctime(lastTime)`

Stage 15: search

| `o365_external_identity_policy_changed_filter`

Indicators

These rows show field, operator, and value matches.

PowerShell CreateDecryptor (PowerShell)

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

Threat actors may abuse the CreateDecryptor() method within PowerShell scripts to dynamically decrypt embedded payloads, configuration files, or sensitive data at runtime. CreateDecryptor() is part of legitimate .NET cryptographic operations, but its presence in PowerShell ScriptBlock or CommandLine activity — especially outside normal application behavior — often signals malware unpacking, fileless attacks, or ransomware staging. This use case detects references to CreateDecryptor in PowerShell activity, potentially indicating obfuscated payload execution or preparation for in-memory attacks.

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '45003.90177'
title: PowerShell CreateDecryptor
description: Threat actors may abuse the CreateDecryptor() method within PowerShell
  scripts to dynamically decrypt embedded payloads, configuration files, or sensitive
  data at runtime. CreateDecryptor() is part of legitimate .NET cryptographic operations,
  but its presence in PowerShell ScriptBlock or CommandLine activity — especially
  outside normal application behavior — often signals malware unpacking, fileless
  attacks, or ransomware staging. This use case detects references to CreateDecryptor
  in PowerShell activity, potentially indicating obfuscated payload execution or preparation
  for in-memory attacks.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4103) OR
  "EventID>4103<" OR TERM(EventCode=4104) OR "EventID>4104<") "CreateDecryptor" |
  regex process="(?i)CreateDecryptor" | table _time, host, user process, process_*,
  signature_id | bin span=1s | stats values(*) as * by _time, host '
techniques:
- execution:command and scripting interpreter:powershell
- defense-evasion:obfuscated files or information
technique_id:
- T1059.001
- T1027
data_category:
- PowerShell logs
- Process command-line parameters
references:
- https://www.cybereason.com/blog/threat-analysis-lummastealer-2.0
- https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.symmetricalgorithm.createdecryptor?view=net-9.0
- https://www.virustotal.com/gui/file/034694376c291c82789e7dc2c8771a4dff47c1c447f2ea7427edb968f480fa71

Stages and Predicates

Stage 1: search

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

Stage 2: regex

| regex process="(?i)CreateDecryptor"

Stage 3: table

| table _time, host, user 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
EventCodeeq
  • 4103 corpus 105 (splunk 105)
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq
processregex_match
  • (?i)CreateDecryptor corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)CreateDecryptor"

Search Terms

These SPL tokens match against raw event text.

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

PowerShell Domain Enumeration

#
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 execution of PowerShell commands used for domain enumeration, such as get-netdomaintrust and get-adgroupmember. It leverages PowerShell Script Block Logging (EventCode=4104) to capture and analyze the full command sent to PowerShell. This activity is significant as it often indicates reconnaissance efforts by an attacker to map out the domain structure and identify key users and groups. If confirmed malicious, this behavior could lead to further targeted attacks, privilege escalation, and unauthorized access to sensitive information within the domain.

Known False Positives

  • Legitimate use can be common or expected in certain environments. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: PowerShell Domain Enumeration
id: e1866ce2-ca22-11eb-8e44-acde48001122
version: 16
creation_date: '2021-06-15'
modification_date: '2026-06-28'
author: Michael Haag, Splunk
status: production
type: Anomaly
description: |-
    The following analytic detects the execution of PowerShell commands used for domain enumeration, such as `get-netdomaintrust` and `get-adgroupmember`.
    It leverages PowerShell Script Block Logging (EventCode=4104) to capture and analyze the full command sent to PowerShell.
    This activity is significant as it often indicates reconnaissance efforts by an attacker to map out the domain structure and identify key users and groups.
    If confirmed malicious, this behavior could lead to further targeted attacks, privilege escalation, and unauthorized access to sensitive information within the domain.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell`
    EventCode=4104
    ScriptBlockText IN (
        *get-netdomaintrust*,
        *get-netforesttrust*,
        *get-addomain*,
        *get-adgroupmember*,
        *get-domainuser*
    )
    | 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)`
      | `powershell_domain_enumeration_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: Legitimate use can be common or expected in certain environments. Filter as needed.
references:
    - 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.
    - https://blog.palantir.com/tampering-with-windows-event-tracing-background-offense-and-defense-4be7ac62ac63
    - https://static1.squarespace.com/static/552092d5e4b0661088167e5c/t/59c1814829f18782e24f1fe2/1505853768977/Windows+PowerShell+Logging+Cheat+Sheet+ver+Sept+2017+v2.1.pdf
    - https://www.crowdstrike.com/blog/investigating-powershell-command-and-script-logging/
    - https://www.splunk.com/en_us/blog/security/hunting-for-malicious-powershell-using-script-block-logging.html
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A suspicious powershell script with the ScriptBlockId [$ScriptBlockId$] contains domain enumeration commands executed on host $dest$
analytic_story:
    - Hermetic Wiper
    - Malicious PowerShell
    - CISA AA23-347A
    - Data Destruction
    - Interlock Ransomware
    - Microsoft WSUS CVE-2025-59287
asset_type: Endpoint
mitre_attack_id:
    - T1059.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`powershell`
EventCode=4104
ScriptBlockText IN (
    *get-netdomaintrust*,
    *get-netforesttrust*,
    *get-addomain*,
    *get-adgroupmember*,
    *get-domainuser*
)

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

| `powershell_domain_enumeration_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTextin
  • *get-addomain*
  • *get-adgroupmember*
  • *get-domainuser*
  • *get-netdomaintrust*
  • *get-netforesttrust*
field:"ScriptBlockText" kind:in

Process Connection to Mega - Windows (Windows Event Log)

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

Mega is a cloud storage service used by many threat actors due to its use of end-to-end encryption and semi-anonymous payment options. The client application MEGAsync.exe and command-line interface utility MegaCMD allow threat actors to exfiltrate large amounts of data. This use case detects network connections involving MEGASync.exe or MegaCMD or network connections to mega.co.nz or mega.nz (Sysmon only).

MITRE ATT&CK Coverage

TacticTechniques
Exfiltration

References

Telemetry Coverage

Rule Body

id: '35864.62857'
title: Process Connection to Mega - Windows
description: Mega is a cloud storage service used by many threat actors due to its
  use of end-to-end encryption and semi-anonymous payment options. The client application
  MEGAsync.exe and command-line interface utility MegaCMD allow threat actors to exfiltrate
  large amounts of data. This use case detects network connections involving MEGASync.exe
  or MegaCMD or network connections to mega.co.nz or mega.nz (Sysmon only).
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=5156) OR
  "<EventID>5156<") "Megasync.exe" OR "megacmd" | where match(process_name, "(?i)mega(sync|cmd)")
  | table _time, host, user, process, process_*, parent_process_*, dest_host | bin
  span=300s | stats values(*) as * by _time, host '
techniques:
- exfiltration:exfiltration over web service
technique_id: 
- T1567
data_category:
- Windows event logs
- Process use of network
references:
- https://redcanary.com/blog/threat-detection/rclone-mega-extortion/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=5156) OR "<EventID>5156<") "Megasync.exe" OR "megacmd"

Stage 2: where

| where match(process_name, "(?i)mega(sync|cmd)")

Stage 3: table

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

Stage 4: bucket

| bin span=300s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 5156 corpus 13 (splunk 13)
field:"EventID" kind:eq value:"5156"
process_nameregex_match
  • (?i)mega(sync|cmd) corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)mega(sync|cmd)"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>5156<"
1"Megasync.exe"
1"megacmd"

RDP Enabled (Sysmon)

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

Detects if RDP service has been enabled on Windows host

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '1106.1173'
title: RDP Enabled
description: 'Detects if RDP service has been enabled on Windows host -- Threat Actor
  Association: APT35/Phosphorus/Magic Hound, DarkSide, BlackMatter, FIN7, TA551, Wizard
  Spider, Yanluowang -- Software Association: BianLian, Black Basta, Conti, Hive,
  IcedID, Insekt, Lockbit, Nefilim, Ryuk Ransomware, Sodinokibi/REvil'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` EventCode=1 ( ("reg.exe" AND
  TERM(add) AND TERM(fDenyTSConnections) AND TERM(REG_DWORD) AND TERM(/d) AND TERM(0)
  AND TERM(Terminal) AND TERM(Server) ) OR ("netsh.exe" AND TERM(remote) AND TERM(desktop)
  AND TERM(enable=yes)) ) | table _time, host, user process, process_*, parent_process,
  parent_process_* | bin span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:modify registry
- lateral-movement:remote services:remote desktop protocol
technique_id:
- T1112
- T1021.001
data_category:
- Windows Sysmon
references:
- https://pureinfotech.com/enable-remote-desktop-command-prompt-windows-10/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` EventCode=1 (
    (
        "reg.exe"
        AND TERM(add)
        AND TERM(fDenyTSConnections)
        AND TERM(REG_DWORD)
        AND TERM(/d)
        AND TERM(0)
        AND TERM(Terminal)
        AND TERM(Server)
    )
    OR ("netsh.exe" AND TERM(remote) AND TERM(desktop) AND TERM(enable=yes))
)

Stage 2: table

| table _time, host, user process, process_*, parent_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"reg.exe"
1add
1fDenyTSConnections
1REG_DWORD
1"/d"
10
1Terminal
1Server
1"netsh.exe"
1remote
1desktop
1"enable=yes"

Recon AVProduct Through Pwh or WMI

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

The following analytic detects suspicious PowerShell script execution via EventCode 4104, specifically targeting checks for installed anti-virus products using WMI or PowerShell commands. This detection leverages PowerShell Script Block Logging to identify scripts containing keywords like "SELECT," "WMIC," "AntiVirusProduct," or "AntiSpywareProduct." This activity is significant as it is commonly used by malware and APT actors to map running security applications or services, potentially aiding in evasion techniques. If confirmed malicious, this could allow attackers to disable or bypass security measures, leading to further compromise of the endpoint.

Known False Positives

  • network administrator may used this command for checking purposes

MITRE ATT&CK Coverage

TacticTechniques
Reconnaissance

Telemetry Coverage

Rule Body

name: Recon AVProduct Through Pwh or WMI
id: 28077620-c9f6-11eb-8785-acde48001122
version: 16
creation_date: '2021-06-14'
modification_date: '2026-07-20'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects suspicious PowerShell script execution via EventCode 4104, specifically targeting checks for installed anti-virus products using WMI or PowerShell commands. This detection leverages PowerShell Script Block Logging to identify scripts containing keywords like "SELECT," "WMIC," "AntiVirusProduct," or "AntiSpywareProduct." This activity is significant as it is commonly used by malware and APT actors to map running security applications or services, potentially aiding in evasion techniques. If confirmed malicious, this could allow attackers to disable or bypass security measures, leading to further compromise of the endpoint.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell` EventCode=4104 (ScriptBlockText = "*SELECT*" OR ScriptBlockText = "*WMIC*") AND (ScriptBlockText = "*AntiVirusProduct*" OR ScriptBlockText = "*AntiSpywareProduct*")
      | 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)`
      | `recon_avproduct_through_pwh_or_wmi_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: network administrator may used this command for checking purposes
references:
    - https://news.sophos.com/en-us/2020/05/12/maze-ransomware-1-year-counting/
    - 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.
    - https://blog.palantir.com/tampering-with-windows-event-tracing-background-offense-and-defense-4be7ac62ac63
    - https://static1.squarespace.com/static/552092d5e4b0661088167e5c/t/59c1814829f18782e24f1fe2/1505853768977/Windows+PowerShell+Logging+Cheat+Sheet+ver+Sept+2017+v2.1.pdf
    - https://www.crowdstrike.com/blog/investigating-powershell-command-and-script-logging/
    - https://www.splunk.com/en_us/blog/security/hunting-for-malicious-powershell-using-script-block-logging.html
finding:
    title: A suspicious powershell script contains AV recon command on host $dest$
    entity:
        field: user_id
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: A suspicious powershell script contains AV recon command on host $dest$
analytic_story:
    - XWorm
    - Ransomware
    - Hermetic Wiper
    - Prestige Ransomware
    - Quasar RAT
    - Malicious PowerShell
    - Data Destruction
    - MoonPeak
    - Qakbot
    - Windows Post-Exploitation
    - Starland RAT Campaign
asset_type: Endpoint
mitre_attack_id:
    - T1592
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`powershell` EventCode=4104 (ScriptBlockText = "*SELECT*" OR ScriptBlockText = "*WMIC*") AND (
    ScriptBlockText = "*AntiVirusProduct*"
    OR ScriptBlockText = "*AntiSpywareProduct*"
)

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

| `recon_avproduct_through_pwh_or_wmi_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTexteq
  • *AntiSpywareProduct*
  • *AntiVirusProduct*
  • *SELECT* corpus 3 (splunk 3)
  • *WMIC*
field:"ScriptBlockText" kind:eq

Rundll32 Suspicious Command Line (Windows Event Log)

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

Threat actors using Gamarue, also referred to as Andromeda or Wauchos, have been observed abusing rundll32.exe using unusual strings for DLL names. This use case detects rundll32 executions with strings matching unusual patterns

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '27224.49649'
title: Rundll32 Suspicious Command Line
description: Threat actors using Gamarue, also referred to as Andromeda or Wauchos,
  have been observed abusing rundll32.exe using unusual strings for DLL names. This
  use case detects rundll32 executions with strings matching unusual patterns. Living
  Off the Land Binary and Scripts (LOLBAS) (LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) TERM(rundll32) OR "rundll32" | regex process="\x5c\x5c?[-_]{2,}[-_]{2,}[-_]{2,}.+,"|
  table _time, host, user, process, process_*, parent_process_* | bin span=1s | stats
  values(*) as * by _time, host '
techniques:
- defense-evasion:system binary proxy execution:rundll32
technique_id:
- T1218.011
data_category:
- Process command-line parameters
- Windows event logs
references:
- https://redcanary.com/threat-detection-report/threats/gamarue/
- https://redcanary.com/blog/lolbins-abuse/

Stages and Predicates

Stage 1: search

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

Stage 2: regex

| regex process="\x5c\x5c?[-_]{2,}[-_]{2,}[-_]{2,}.+,"

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
processregex_match
  • \x5c\x5c?[-_]{2,}[-_]{2,}[-_]{2,}.+, corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"\x5c\x5c?[-_]{2,}[-_]{2,}[-_]{2,}.+,"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1rundll32
1"rundll32"

SimpleHelp Remote Access Tool Execution (Windows Event Log)

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

Threat actors may install remote access tools (RATs) to maintain persistent access to compromised systems. Tools like SimpleHelp or JWrapper Remote Access are often abused for stealthy remote control, masquerading as legitimate IT support tools. This use case detects process creation events with file paths or executable names related to SimpleHelp Remote Access. - LOLRMM

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

References

Telemetry Coverage

Rule Body

id: '44775.89768'
title: SimpleHelp Remote Access Tool Execution
description: Threat actors may install remote access tools (RATs) to maintain persistent
  access to compromised systems. Tools like SimpleHelp or JWrapper Remote Access are
  often abused for stealthy remote control, masquerading as legitimate IT support
  tools. This use case detects process creation events with file paths or executable
  names related to SimpleHelp Remote Access. - LOLRMM
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) "JWrapper-Remote" OR "SimpleHelp" OR "SimpleService"
  OR "SimpleGatewayService" | where (match(process_name, "(?i)(Simple(help(customer)?|service|gatewayservice)|remote\saccess|windows\slauncher)\.exe")
  and match(process_path, "(?i)JWrapper-Remote\s+(Access|Support)")) or match(process_name,
  "(?i)Simple(help(customer)?|service|gatewayservice)\.exe") | table _time, host,
  user, signature_id, process, process_name, process_path `group_events("host", 5)` '
techniques:
- command-and-control:remote access software
technique_id: 
- T1219
data_category:
- Windows event logs
references:
- https://lolrmm.io/tools/simplehelp
- https://detection.fyi/sigmahq/sigma/windows/process_creation/proc_creation_win_remote_access_tools_simple_help/
- https://simple-help.com/downloads
- https://www.huntress.com/blog/slashandgrab-screen-connect-post-exploitation-in-the-wild-cve-2024-1709-cve-2024-1708

Stages and Predicates

Stage 1: search

search (EventCode=4688 OR Type="Process") source="*" source IN (
    "WinEventLog:Security",
    "XmlWinEventLog:Security"
)

Stage 2: where

where ((match(process_name, "(?i)(Simple(help(customer)?|service|gatewayservice)|remote\\saccess|windows\\slauncher)\\.exe") match(process_path, "(?i)JWrapper-Remote\\s+(Access|Support)")) OR match(process_name, "(?i)Simple(help(customer)?|service|gatewayservice)\\.exe"))

Stage 3: table

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

Stage 4: bucket

bucket _time

Stage 5: stats

stats BY host, _time

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
process_nameregex_match
  • (?i)(Simple(help(customer)?|service|gatewayservice)|remote\saccess|windows\slauncher).exe corpus 2 (splunk 2)
  • (?i)Simple(help(customer)?|service|gatewayservice).exe corpus 2 (splunk 2)
field:"process_name" kind:regex_match
process_pathregex_match
  • (?i)JWrapper-Remote\s+(Access|Support) corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)JWrapper-Remote\s+(Access|Support)"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"JWrapper-Remote"
1"SimpleHelp"
1"SimpleService"
1"SimpleGatewayService"

Sliver C2 Implant Activity Pattern (Sysmon)

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

Adversaries may abuse command and script interpreters to execute commands, scripts, or binaries. These interfaces and languages provide ways of interacting with computer systems and are a common feature across many different platforms. Most systems come with some built-in command-line interface and scripting capabilities, for example, macOS and Linux distributions include some flavor of Unix Shell while Windows installations include the Windows Command Shell and PowerShell. This use case detects process activity patterns related to Sliver C2 framework implants when spawning PowerShell.

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '38206.68755'
title: Sliver C2 Implant Activity Pattern
description: Adversaries may abuse command and script interpreters to execute commands,
  scripts, or binaries. These interfaces and languages provide ways of interacting
  with computer systems and are a common feature across many different platforms.
  Most systems come with some built-in command-line interface and scripting capabilities,
  for example, macOS and Linux distributions include some flavor of Unix Shell while
  Windows installations include the Windows Command Shell and PowerShell. This use
  case detects process activity patterns related to Sliver C2 framework implants when
  spawning PowerShell.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  "-NoExit" "-Command" "[Console]::OutputEncoding=[Text.UTF8Encoding]::UTF8" | table
  _time, host, user, parent_*, process, process_* | bin span=1s | stats values(*)
  as * by _time, host '
techniques:
- execution:command and scripting interpreter
technique_id: 
- T1059
data_category:
- Windows Sysmon
references:
- https://attack.mitre.org/techniques/T1059/
- https://github.com/BishopFox/sliver/blob/master/implant/sliver/shell/shell_windows.go#L39
- https://sliver.sh/docs?name=Compile+from+Source
- https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_hktl_sliver_c2_execution_pattern.yml

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") "-NoExit" "-Command" "[Console]::OutputEncoding=[Text.UTF8Encoding]::UTF8"

Stage 2: table

| table _time, host, user, parent_*, process, 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"-NoExit"
1"-Command"
1"[Console]::OutputEncoding=[Text.UTF8Encoding]::UTF8"

Suspicious Registry Key Created (PowerShell)

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

Adversaries may achieve persistence by adding a program or referencing it with a Registry run key or by utilizing content triggered by Image File Execution Options (IFEO) debugger keys. Run keys may exist under multiple hives and IFEOs can also enable an arbitrary monitor program to be launched when a specified program silently exits. Multiple APTs leverage these Hives in order to establish persistence or execute additional payloads that appear to blend in with normal traffic. -- Threat Group Association: APT29/Nobelium/Cozy Bear, APT31, Kimsuky, TA505, Wizard Spider

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '5857.6625'
title: Suspicious Registry Key Created
description: 'Adversaries may achieve persistence by adding a program or referencing
  it with a Registry run key or by utilizing content triggered by Image File Execution
  Options (IFEO) debugger keys. Run keys may exist under multiple hives and IFEOs
  can also enable an arbitrary monitor program to be launched when a specified program
  silently exits. Multiple APTs leverage these Hives in order to establish persistence
  or execute additional payloads that appear to blend in with normal traffic. -- Threat
  Group Association: APT29/Nobelium/Cozy Bear, APT31, Kimsuky, TA505, Wizard Spider
  -- Software Association: BABYSHARK, Bazar, DirtyMoe, GhostShell, TrickBot -- Atomics
  T1003 Test #2 Atomic T1574.012 Test#1 Atomic T1574.012 Test#2'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` TERM(new-itemproperty)
  ("HKLM" OR "HKCU") ("dll" OR "vbs") | table _time, host, user process, process_*,
  signature_id | bin span=1s | stats values(*) as * by _time, host '
techniques:
- persistence:boot or logon autostart execution:registry run keys / startup folder
- persistence:event triggered execution:image file execution options injection
- privilege-escalation:boot or logon autostart execution:registry run keys / startup
  folder
- privilege-escalation:event triggered execution:image file execution options injection
technique_id:
- T1547.001
- T1546.012
data_category:
- PowerShell logs
- Process command-line parameters
references:
- https://blog.talosintelligence.com/2021/09/tinyturla.html

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` TERM(new-itemproperty) ("HKLM" OR "HKCU") (
    "dll"
    OR "vbs"
)

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"new-itemproperty"
1"HKLM"
1"HKCU"
1"dll"
1"vbs"

Suspicious Scheduled Task from Public Directory

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

The following analytic identifies the creation of scheduled tasks that execute binaries or scripts from public directories, such as users\public, \programdata, or \windows\temp, using schtasks.exe with the /create command. It leverages Sysmon Event ID 1 data to detect this behavior. This activity is significant because it often indicates an attempt to maintain persistence or execute malicious scripts, which are common tactics in malware deployment. If confirmed as malicious, this could lead to data compromise, unauthorized access, and potential lateral movement within the network.

Known False Positives

  • The main source of false positives could be the legitimate use of scheduled tasks from these directories. Careful tuning of this search may be necessary to suit the specifics of your environment, reducing the rate of false positives.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Suspicious Scheduled Task from Public Directory
id: 7feb7972-7ac3-11eb-bac8-acde48001122
version: 21
creation_date: '2021-03-01'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: Anomaly
description: The following analytic identifies the creation of scheduled tasks that execute binaries or scripts from public directories, such as users\public, \programdata\, or \windows\temp, using schtasks.exe with the /create command. It leverages Sysmon Event ID 1 data to detect this behavior. This activity is significant because it often indicates an attempt to maintain persistence or execute malicious scripts, which are common tactics in malware deployment. If confirmed as malicious, this could lead to data compromise, unauthorized access, and potential lateral movement within the network.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=schtasks.exe (Processes.process=*\\users\\public\\* OR Processes.process=*\\programdata\\* OR Processes.process=*windows\\temp*)  Processes.process=*/create* 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)`| `suspicious_scheduled_task_from_public_directory_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: The main source of false positives could be the legitimate use of scheduled tasks from these directories. Careful tuning of this search may be necessary to suit the specifics of your environment, reducing the rate of false positives.
references:
    - https://attack.mitre.org/techniques/T1053/005/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Suspicious scheduled task registered on $dest$ from Public Directory
        - field: user
          type: user
          score: 20
          message: Suspicious scheduled task registered on $dest$ from Public Directory
analytic_story:
    - SolarWinds WHD RCE Post Exploitation
    - XWorm
    - Medusa Ransomware
    - CISA AA23-347A
    - Azorult
    - Scheduled Tasks
    - Living Off The Land
    - Ransomware
    - Crypto Stealer
    - Salt Typhoon
    - Quasar RAT
    - DarkCrystal RAT
    - Ryuk Ransomware
    - CISA AA24-241A
    - Malicious Inno Setup Loader
    - Windows Persistence Techniques
    - MoonPeak
    - China-Nexus Threat Activity
    - Scattered Spider
    - APT37 Rustonotto and FadeStealer
    - Lokibot
    - NetSupport RMM Tool Abuse
asset_type: Endpoint
mitre_attack_id:
    - T1053.005
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  from datamodel=Endpoint.Processes
  where Processes.process_name=schtasks.exe (
      Processes.process=*\\users\\public\\*
      OR Processes.process=*\\programdata\\*
      OR Processes.process=*windows\\temp*
  )  Processes.process=*/create*
  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

| `suspicious_scheduled_task_from_public_directory_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • */create* corpus 8 (sigma 6, splunk 2)
  • *\\programdata\\*
  • *\\users\\public\\*
  • *windows\\temp*
field:"CommandLine" kind:eq
Processes.process_nameeq
  • schtasks.exe corpus 30 (elastic 19, splunk 11)
field:"process_basename" kind:eq value:"schtasks.exe"

Windows Disable or Stop Browser Process

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

The following analytic detects the use of the taskkill command in a process command line to terminate several known browser processes, a technique commonly employed by the Braodo stealer malware to steal credentials. By forcefully closing browsers like Chrome, Edge, and Firefox, the malware can unlock files that store sensitive information, such as passwords and login data. This detection focuses on identifying taskkill commands targeting these browsers, signaling malicious intent. Early detection allows security teams to investigate and prevent further credential theft and system compromise.

Known False Positives

  • Admin or user may choose to terminate browser via taskkill.exe. Filter as needed.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

name: Windows Disable or Stop Browser Process
id: 220d34b7-b6c7-45fe-8dbb-c35cdd9fe6d5
version: 15
creation_date: '2024-10-18'
modification_date: '2026-08-14'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects the use of the taskkill command in a process command line to terminate several known browser processes, a technique commonly employed by the Braodo stealer malware to steal credentials. By forcefully closing browsers like Chrome, Edge, and Firefox, the malware can unlock files that store sensitive information, such as passwords and login data. This detection focuses on identifying taskkill commands targeting these browsers, signaling malicious intent. Early detection allows security teams to investigate and prevent further credential theft and system compromise.
data_source:
    - Sysmon EventID 1
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.process = "*taskkill*" Processes.process IN("*chrome.exe","*firefox.exe","*brave.exe","*opera.exe","*msedge.exe","*chromium.exe")
      BY Processes.action Processes.dest Processes.original_file_name
         Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
         Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
         Processes.process Processes.process_exec Processes.process_guid
         Processes.process_hash Processes.process_id Processes.process_integrity_level
         Processes.process_name Processes.process_path Processes.user
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_disable_or_stop_browser_process_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: Admin or user may choose to terminate browser via taskkill.exe. Filter as needed.
references:
    - https://x.com/suyog41/status/1825869470323056748
    - https://g0njxa.medium.com/from-vietnam-to-united-states-malware-fraud-and-dropshipping-98b7a7b2c36d
finding:
    title: A process commandline- [$process$] that tries to kill browser on [$dest$].
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: A process commandline- [$process$] that tries to kill browser on [$dest$].
analytic_story:
    - Braodo Stealer
    - Scattered Lapsus$ Hunters
    - Hellcat Ransomware
    - Castle RAT
    - BlankGrabber Stealer
    - Salat Stealer
    - Phantom Stealer
    - Vidar Stealer
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.Processes
  WHERE Processes.process = "*taskkill*" Processes.process IN(
      "*chrome.exe",
      "*firefox.exe",
      "*brave.exe",
      "*opera.exe",
      "*msedge.exe",
      "*chromium.exe"
  )
  BY
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_disable_or_stop_browser_process_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *taskkill* corpus 3 (sigma 2, splunk 1)
field:"CommandLine" kind:eq value:"*taskkill*"
Processes.processin
  • *brave.exe
  • *chrome.exe
  • *chromium.exe
  • *firefox.exe
  • *msedge.exe
  • *opera.exe
field:"CommandLine" kind:in

Windows Downdate Registry Activity

#
Status
production
Severity
medium
Group by
ProcessPath, TargetObject, action, computer_name, details, process_guid, process_id, registry_hive, registry_path, registry_value_name, signature_id, status, user, vendor_product
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

Detects the setting of a pending.xml file associated with the Windows Downdate attack which forces a Windows downgrade to enable exploitation. Looks for uses of a pending.xml outside of typical locations.

Known False Positives

  • Legitimate system updates or rollback processes may create or modify pending.xml files in non-standard locations. Verify with IT change management to reduce false alerts.

MITRE ATT&CK Coverage

TacticTechniques
Persistence
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows Downdate Registry Activity
id: d984fca1-ba3a-4f89-aa58-800e235fdf53
version: 2
creation_date: '2022-09-08'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: Anomaly
description: |-
    Detects the setting of a pending.xml file associated with the Windows Downdate attack which forces a Windows downgrade to enable exploitation.
    Looks for uses of a pending.xml outside of typical locations.
data_source:
    - Sysmon EventID 12
    - Sysmon EventID 13
    - Sysmon EventID 14
search: |-
    `sysmon`
    EventID IN (
        12,
        13,
        14
    )
    TargetObject IN (
        "*PoqexecCmdline",
        "*COMPONENTS\\PendingXmlIdentifier"
    )
    NOT ProcessPath="*:\\Windows\\WinSxS\\*"

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

      by EventID TargetObject ProcessPath Computer action process_guid process_id
         registry_hive registry_path registry_key_name registry_value_data registry_value_name
         status user vendor_product

    | rename Computer as dest
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_downdate_registry_activity_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: Legitimate system updates or rollback processes may create or modify pending.xml files in non-standard locations. Verify with IT change management to reduce false alerts.
references:
    - https://www.safebreach.com/blog/downgrade-attacks-using-windows-updates/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: Potential Downdate registry activity observed on $dest$ via $TargetObject$.
analytic_story:
    - Windows Persistence Techniques
asset_type: Endpoint
mitre_attack_id:
    - T1112
    - T1689
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon`
EventID IN (
    12,
    13,
    14
)
TargetObject IN (
    "*PoqexecCmdline",
    "*COMPONENTS\\PendingXmlIdentifier"
)
NOT ProcessPath="*:\\Windows\\WinSxS\\*"

Stage 2: fillnull

| fillnull

Stage 3: stats

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

  by EventID TargetObject ProcessPath Computer action process_guid process_id
     registry_hive registry_path registry_key_name registry_value_data registry_value_name
     status user vendor_product

Stage 4: rename

| rename Computer as dest

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `windows_downdate_registry_activity_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventIDin
  • 12
  • 13 corpus 3 (splunk 3)
  • 14
field:"EventID" kind:in
TargetObjectin
  • *COMPONENTS\PendingXmlIdentifier
  • *PoqexecCmdline
field:"TargetObject" kind:in

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
ProcessPatheq*:\Windows\WinSxS\*excludes:ProcessPath field:"ProcessPath" value:"*:\Windows\WinSxS\*"

Windows FTP Exfiltration (Sysmon)

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

FTP is a utility commonly available with operating systems to transfer information over the File Transfer Protocol (FTP). Adversaries can use it to transfer other tools onto a system or to exfiltrate data

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '5704.18099'
title: Windows FTP Exfiltration
description: 'FTP is a utility commonly available with operating systems to transfer
  information over the File Transfer Protocol (FTP). Adversaries can use it to transfer
  other tools onto a system or to exfiltrate data. - Threat Actor Association: APT35,
  Karakurt - Software Association: Agent Tesla, BianLian, Diavol, PureCrypter'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "EventID>1<")
  TERM(ftp) | regex process="(?i)ftp\s+(.{1,})?\-s\:.{1,}\.\w{2,5}" | table _time,
  host, user process, process_*, signature_id, parent_* | bin span=1s | stats values(*)
  as * by _time, host '
techniques:
- command-and-control:application layer protocol:file transfer protocols
- exfiltration:exfiltration over alternative protocol
technique_id:
- T1071.002
- T1048
data_category:
- Windows Sysmon
references:
- https://book.hacktricks.xyz/exfiltration

Stages and Predicates

Stage 1: search

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

Stage 2: regex

| regex process="(?i)ftp\s+(.{1,})?\-s\:.{1,}\.\w{2,5}"

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
processregex_match
  • (?i)ftp\s+(.{1,})?\-s\:.{1,}.\w{2,5} corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)ftp\s+(.{1,})?\-s\:.{1,}.\w{2,5}"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"EventID>1<"
1ftp

Windows ISO LNK File Creation

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

The following analytic detects the creation of .iso.lnk files in the %USER%\AppData\Local\Temp<random folder name>\ path, indicating that an ISO file has been mounted and accessed. This detection leverages the Endpoint.Filesystem data model, specifically monitoring file creation events in the Windows Recent folder. This activity is significant as it may indicate the delivery and execution of potentially malicious payloads via ISO files. If confirmed malicious, this could lead to unauthorized code execution, data exfiltration, or further system compromise.

Known False Positives

  • False positives may be high depending on the environment and consistent use of ISOs mounting. Restrict to servers, or filter out based on commonly used ISO names. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 11: FileCreate

Rule Body

name: Windows ISO LNK File Creation
id: d7c2c09b-9569-4a9e-a8b6-6a39a99c1d32
version: 10
creation_date: '2022-03-30'
modification_date: '2026-05-13'
author: Michael Haag, Teoderick Contreras, Splunk
status: production
type: Hunting
description: The following analytic detects the creation of .iso.lnk files in the %USER%\AppData\Local\Temp\<random folder name>\ path, indicating that an ISO file has been mounted and accessed. This detection leverages the Endpoint.Filesystem data model, specifically monitoring file creation events in the Windows Recent folder. This activity is significant as it may indicate the delivery and execution of potentially malicious payloads via ISO files. If confirmed malicious, this could lead to unauthorized code execution, data exfiltration, or further system compromise.
data_source:
    - Sysmon EventID 11
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem where Filesystem.file_path IN ("*\\Microsoft\\Windows\\Recent\\*") Filesystem.file_name IN ("*.iso.lnk", "*.img.lnk", "*.vhd.lnk", "*vhdx.lnk") by Filesystem.action Filesystem.dest Filesystem.file_access_time Filesystem.file_create_time Filesystem.file_hash Filesystem.file_modify_time Filesystem.file_name Filesystem.file_path Filesystem.file_acl Filesystem.file_size Filesystem.process_guid Filesystem.process_id Filesystem.user Filesystem.vendor_product | `drop_dm_object_name(Filesystem)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_iso_lnk_file_creation_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Filesystem` node. In addition, confirm the latest CIM App 4.20 or higher is installed and the latest TA for the endpoint product.
known_false_positives: False positives may be high depending on the environment and consistent use of ISOs mounting. Restrict to servers, or filter out based on commonly used ISO names. Filter as needed.
references:
    - https://www.microsoft.com/security/blog/2021/05/27/new-sophisticated-email-based-attack-from-nobelium/
    - https://github.com/MHaggis/notes/blob/master/utilities/ISOBuilder.ps1
    - https://isc.sans.edu/diary/Recent+AZORult+activity/25120
    - https://tccontre.blogspot.com/2020/01/remcos-rat-evading-windows-defender-av.html
analytic_story:
    - Spearphishing Attachments
    - Brute Ratel C4
    - AgentTesla
    - Qakbot
    - IcedID
    - Azorult
    - Remcos
    - Warzone RAT
    - Amadey
    - Gozi Malware
    - APT37 Rustonotto and FadeStealer
asset_type: Endpoint
mitre_attack_id:
    - T1204.001
    - T1566.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Filesystem
  where Filesystem.file_path IN ("*\\Microsoft\\Windows\\Recent\\*") Filesystem.file_name IN (
      "*.iso.lnk",
      "*.img.lnk",
      "*.vhd.lnk",
      "*vhdx.lnk"
  )
  by
    Filesystem.action
    Filesystem.dest
    Filesystem.file_access_time
    Filesystem.file_create_time
    Filesystem.file_hash
    Filesystem.file_modify_time
    Filesystem.file_name
    Filesystem.file_path
    Filesystem.file_acl
    Filesystem.file_size
    Filesystem.process_guid
    Filesystem.process_id
    Filesystem.user
    Filesystem.vendor_product

Stage 2: search

| `drop_dm_object_name(Filesystem)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_iso_lnk_file_creation_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Filesystem.file_namein
  • *.img.lnk
  • *.iso.lnk
  • *.vhd.lnk
  • *vhdx.lnk
field:"file_name" kind:in
Filesystem.file_pathin
  • *\Microsoft\Windows\Recent\* corpus 2 (sigma 1, splunk 1)
field:"TargetFilename" kind:in value:"*\Microsoft\Windows\Recent\*"

Windows PowGoop Beacon Decoding

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

Detects a DLL decoding and executing the PowGoop config.txt payload, the stage in the MuddyWater infection chain where an obfuscated PowerShell beacon is unwrapped and live C2 communication begins. PowGoop is the primary loader used by MuddyWater (also tracked as SeedWorm, Static Kitten, and MERCURY) and has been their main initial access loader since at least 2020. It abuses DLL side-loading against a fake GoogleUpdate.exe to execute a multi-stage decoding chain, a fully functional PowerShell backdoor disguised with a benign extension. The config.txt contains a hardcoded C2 address and victim GUID, beacons via modified base64-encoded HTTP, and runs C2 traffic under the legitimate Google Update process to evade network detection.

Known False Positives

  • Some security tools or legitimate debugging processes may decode config files similar to PowGoop. Review and whitelist trusted applications to reduce false alerts.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

name: Windows PowGoop Beacon Decoding
id: 4d0480d8-80c4-4f74-84fe-2ab7fb514c85
version: 2
creation_date: '2026-05-05'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: TTP
description: |-
    Detects a DLL decoding and executing the PowGoop config.txt payload, the stage in the MuddyWater infection chain where an obfuscated PowerShell beacon is unwrapped and live C2 communication begins.
    PowGoop is the primary loader used by MuddyWater (also tracked as SeedWorm, Static Kitten, and MERCURY) and has been their main initial access loader since at least 2020.
    It abuses DLL side-loading against a fake GoogleUpdate.exe to execute a multi-stage decoding chain, a fully functional PowerShell backdoor disguised with a benign extension.
    The config.txt contains a hardcoded C2 address and victim GUID, beacons via modified base64-encoded HTTP, and runs C2 traffic under the legitimate Google Update process to evade network detection.
data_source:
    - Sysmon EventID 1
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly`
      count min(_time) as firstTime
            max(_time) as lastTime

    from datamodel=Endpoint.Processes where

    Processes.parent_process_path="*rundll32.exe"
    Processes.process_name="powershell.exe"
    Processes.process="*FromBase64String*"
    Processes.process="*config.txt*"

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

    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_powgoop_beacon_decoding_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Some security tools or legitimate debugging processes may decode config files similar to PowGoop. Review and whitelist trusted applications to reduce false alerts.
references:
    - https://www.cisa.gov/uscert/sites/default/files/publications/AA22-055A_Iranian_Government-Sponsored_Actors_Conduct_Cyber_Operations.pdf
finding:
    title: Potential PowGoop Beacon Decoding activity observed on $dest$ via $process$.
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: parent_process_name
      type: parent_process_name
analytic_story:
    - Compromised Windows Host
asset_type: Endpoint
mitre_attack_id:
    - T1059.001
    - T1001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

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

from datamodel=Endpoint.Processes where

Processes.parent_process_path="*rundll32.exe"
Processes.process_name="powershell.exe"
Processes.process="*FromBase64String*"
Processes.process="*config.txt*"

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

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_powgoop_beacon_decoding_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.parent_process_patheq
  • *rundll32.exe
field:"ParentImage" kind:eq value:"*rundll32.exe"
Processes.processeq
  • *FromBase64String* corpus 15 (sigma 9, elastic 4, splunk 2)
  • *config.txt*
field:"CommandLine" kind:eq
Processes.process_nameeq
  • powershell.exe corpus 187 (elastic 140, splunk 44, kusto 3)
field:"process_basename" kind:eq value:"powershell.exe"

Windows Rapid Authentication On Multiple Hosts

#
Status
production
Severity
medium
Group by
_time, action, app, authentication_method, signature, signature_id, src_ip, target_user_name
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic detects a source computer authenticating to 30 or more remote endpoints within a 5-minute timespan using Event ID 4624. This behavior is identified by analyzing Windows Event Logs for LogonType 3 events and counting unique target computers. Such activity is significant as it may indicate lateral movement or network share enumeration by an adversary. If confirmed malicious, this could lead to unauthorized access to multiple systems, potentially compromising sensitive data and escalating privileges within the network.

Known False Positives

  • Vulnerability scanners or system administration tools may also trigger this detection. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Rapid Authentication On Multiple Hosts
id: 62606c77-d53d-4182-9371-b02cdbbbcef7
version: 11
creation_date: '2023-03-23'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects a source computer authenticating to 30 or more remote endpoints within a 5-minute timespan using Event ID 4624. This behavior is identified by analyzing Windows Event Logs for LogonType 3 events and counting unique target computers. Such activity is significant as it may indicate lateral movement or network share enumeration by an adversary. If confirmed malicious, this could lead to unauthorized access to multiple systems, potentially compromising sensitive data and escalating privileges within the network.
data_source:
    - Windows Event Log Security 4624
search: |-
    `wineventlog_security` EventCode=4624 LogonType=3 TargetUserName!="ANONYMOUS LOGON" TargetUserName!="*$"
      | bucket span=5m _time
      | stats dc(Computer) AS unique_targets values(Computer) as host_targets values(dest) as dest values(src) as src values(user) as user
        BY _time, IpAddress, TargetUserName,
           action, app, authentication_method,
           signature, signature_id
      | where unique_targets > 30
      | `windows_rapid_authentication_on_multiple_hosts_filter`
how_to_implement: To successfully implement this search, you need to be ingesting Windows Event Logs from domain controllers as well as member servers and workstations. The Advanced Security Audit policy setting `Audit Logon` within `Logon/Logoff` needs to be enabled.
known_false_positives: Vulnerability scanners or system administration tools may also trigger this detection. Filter as needed.
references:
    - https://attack.mitre.org/techniques/T1135/
    - https://thedfirreport.com/2023/01/23/sharefinder-how-threat-actors-discover-file-shares/
    - https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4624
finding:
    title: The source computer with ip address $IpAddress$ authenticated to a large number of remote endpoints within 5 minutes.
    entity:
        field: host_targets
        type: system
        score: 50
threat_objects:
    - field: IpAddress
      type: ip_address
analytic_story:
    - Active Directory Privilege Escalation
    - Active Directory Lateral Movement
asset_type: Endpoint
mitre_attack_id:
    - T1003.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security` EventCode=4624 LogonType=3 TargetUserName!="ANONYMOUS LOGON"
    TargetUserName!="*$"

Stage 2: bucket

| bucket span=5m _time

Stage 3: stats

| stats
    dc(Computer) AS unique_targets
    values(Computer) as host_targets
    values(dest) as dest
    values(src) as src
    values(user) as user
  BY _time, IpAddress, TargetUserName,
       action, app, authentication_method,
       signature, signature_id

Stage 4: where

| where unique_targets > 30

Stage 5: search

| `windows_rapid_authentication_on_multiple_hosts_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4624 corpus 13 (splunk 13)
field:"EventID" kind:eq value:"4624"
LogonTypeeq
  • 3 corpus 30 (splunk 13, sigma 12, elastic 5)
field:"LogonType" kind:eq value:"3"
TargetUserNamene
  • *$ corpus 14 (splunk 14)
  • ANONYMOUS LOGON
field:"TargetUserName" kind:ne
unique_targetsgt
  • 30 corpus 5 (splunk 5)
field:"unique_targets" kind:gt value:"30"

Windows Wermgr Spawning System Integrity Process

#
Status
production
Severity
medium
Group by
IntegrityLevel, command_line, computer_name, event_action, parent_command_line, parent_process_basename, parent_process_id, parent_process_name, process_basename, process_hash, process_id, process_name, user, vendor_product
Author
Onur Mustafa Erdogan, Splunk
Source
github.com/splunk/security_content

The following analytic detects WerMgr.exe (Windows Error Reporting) spawning a child process running at SYSTEM integrity level. WerMgr.exe normally runs at the integrity level of the reporting user or as a background SYSTEM-owned service that does not launch interactive children. In the ShieldBreak exploit, WerMgr.exe is manually triggered via the QueueReporting scheduled task and loads an attacker-planted phantom DLL (phoneinfo.dll), which then spawns an elevated shell. If confirmed malicious, this activity indicates successful local privilege escalation to SYSTEM.

Known False Positives

  • No false positives have been identified at this time. WerMgr.exe spawning a SYSTEM-integrity child process is not expected under normal Windows Error Reporting operation.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Wermgr Spawning System Integrity Process
id: d39634c8-7ce7-4503-a5da-73ca3c758fb9
version: 1
creation_date: '2026-08-17'
modification_date: '2026-08-18'
author: Onur Mustafa Erdogan, Splunk
status: production
type: TTP
description: |-
    The following analytic detects WerMgr.exe (Windows Error Reporting) spawning a child process running at SYSTEM integrity level.
    WerMgr.exe normally runs at the integrity level of the reporting user or as a background SYSTEM-owned service that does not launch interactive children.
    In the ShieldBreak exploit, WerMgr.exe is manually triggered via the QueueReporting scheduled task and loads an attacker-planted phantom DLL (phoneinfo.dll), which then spawns an elevated shell.
    If confirmed malicious, this activity indicates successful local privilege escalation to SYSTEM.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly`
      count min(_time) as firstTime
            max(_time) as lastTime

    from datamodel=Endpoint.Processes where

    Processes.parent_process_name="WerMgr.exe"
    (
        Processes.process_integrity_level="System"
        OR
        Processes.user IN ("*$", "System")
    )

    by Processes.action Processes.dest Processes.parent_process_name Processes.parent_process_path
       Processes.parent_process Processes.parent_process_id Processes.process_name
       Processes.process_path Processes.process Processes.process_id Processes.process_hash
       Processes.process_integrity_level Processes.user Processes.vendor_product

    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_wermgr_spawning_system_integrity_process_filter`
how_to_implement: |-
    This detection is based on Process creation events. Make sure you are ingesting logs that contain parent process details and fields that indicate privilege level, such as user name or integrity level. If you are using Sysmon, make sure to enable logging of child processes of WerMgr.exe.
known_false_positives: |-
    No false positives have been identified at this time.
    WerMgr.exe spawning a SYSTEM-integrity child process is not expected under normal Windows Error Reporting operation.
references:
    - https://www.cyderes.com/howler-cell/rogueplanet-windows-zero-day
    - https://www.threatlocker.com/blog/nightmareeclipse-releases-new-poc-shieldbreak-exploits-same-weakness-as-rogueplanet
    - https://isc.sans.edu/diary/22536
finding:
    title: The [$parent_process_name$] process spawned [$process_name$] running at SYSTEM integrity level on $dest$
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: process
      type: process
    - field: process_name
      type: process_name
analytic_story:
    - RoguePlanet
    - Windows Privilege Escalation
    - Windows Error Reporting Service Elevation of Privilege Vulnerability
asset_type: Endpoint
mitre_attack_id:
    - T1068
    - T1134.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

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

from datamodel=Endpoint.Processes where

Processes.parent_process_name="WerMgr.exe"
(
    Processes.process_integrity_level="System"
    OR
    Processes.user IN ("*$", "System")
)

by Processes.action Processes.dest Processes.parent_process_name Processes.parent_process_path
   Processes.parent_process Processes.parent_process_id Processes.process_name
   Processes.process_path Processes.process Processes.process_id Processes.process_hash
   Processes.process_integrity_level Processes.user Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_wermgr_spawning_system_integrity_process_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.parent_process_nameeq
  • WerMgr.exe corpus 6 (splunk 3, elastic 2, kusto 1)
field:"parent_process_basename" kind:eq value:"WerMgr.exe"
Processes.process_integrity_leveleq
  • System corpus 31 (sigma 22, splunk 5, elastic 3, kusto 1)
field:"IntegrityLevel" kind:eq value:"System"
Processes.userin
  • *$
  • System
field:"user" kind:in

Back to all Splunk rules