Detection rules › Splunk

Splunk rules: 3e

Add or Set Windows Defender Exclusion

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

The following analytic detects the use of commands to add or set exclusions in Windows Defender. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on command-line executions involving "Add-MpPreference" or "Set-MpPreference" with exclusion parameters. This activity is significant because adversaries often use it to bypass Windows Defender, allowing malicious code to execute undetected. If confirmed malicious, this behavior could enable attackers to evade antivirus detection, maintain persistence, and execute further malicious activities without interference from Windows Defender.

Known False Positives

  • Admin or user may choose to use this windows features. Filter as needed.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

Rule Body

name: Add or Set Windows Defender Exclusion
id: 773b66fe-4dd9-11ec-8289-acde48001122
version: 18
creation_date: '2021-11-25'
modification_date: '2026-06-08'
author: Teoderick Contreras, Nasreddine Bencherchali, Splunk
status: production
type: TTP
description: |
    The following analytic detects the use of commands to add or set exclusions
    in Windows Defender. It leverages data from Endpoint Detection and Response (EDR)
    agents, focusing on command-line executions involving "Add-MpPreference" or "Set-MpPreference"
    with exclusion parameters. This activity is significant because adversaries often
    use it to bypass Windows Defender, allowing malicious code to execute undetected.
    If confirmed malicious, this behavior could enable attackers to evade antivirus
    detection, maintain persistence, and execute further malicious activities without
    interference from Windows Defender.
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 = "*Add-MpPreference *"
      OR
      Processes.process = "*Set-MpPreference *"
    )
    Processes.process IN (
          "*-Exclusion*",
          "*-ControlledFolderAccessAllowedApplications*",
          "*-AttackSurfaceReductionOnlyExclusions*"
          )
    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)`
    | `add_or_set_windows_defender_exclusion_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 use this windows features. Filter as needed.
references:
    - https://tccontre.blogspot.com/2020/01/remcos-rat-evading-windows-defender-av.html
    - https://app.any.run/tasks/cf1245de-06a7-4366-8209-8e3006f2bfe5/
    - https://www.microsoft.com/security/blog/2022/01/15/destructive-malware-targeting-ukrainian-organizations/
    - https://learn.microsoft.com/en-us/powershell/module/defender/add-mppreference?view=windowsserver2025-ps
finding:
    title: exclusion command $process$ executed on $dest$
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: exclusion command $process$ executed on $dest$
analytic_story:
    - Compromised Windows Host
    - AgentTesla
    - Data Destruction
    - Remcos
    - CISA AA22-320A
    - ValleyRAT
    - XWorm
    - WhisperGate
    - Windows Defense Evasion Tactics
    - Crypto Stealer
    - NetSupport RMM Tool Abuse
    - Salat 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 = "*Add-MpPreference *"
    OR Processes.process = "*Set-MpPreference *"
)
Processes.process IN (
    "*-Exclusion*",
    "*-ControlledFolderAccessAllowedApplications*",
    "*-AttackSurfaceReductionOnlyExclusions*"
)
  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

| `add_or_set_windows_defender_exclusion_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *Add-MpPreference * corpus 3 (sigma 2, splunk 1)
  • *Set-MpPreference * corpus 3 (sigma 2, splunk 1)
field:"CommandLine" kind:eq
Processes.processin
  • *-AttackSurfaceReductionOnlyExclusions*
  • *-ControlledFolderAccessAllowedApplications*
  • *-Exclusion*
field:"CommandLine" kind:in

Azure AD Global Administrator Role Assigned

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

The following analytic detects the assignment of the Azure AD Global Administrator role to a user. It leverages Azure Active Directory AuditLogs to identify when the "Add member to role" operation includes the "Global Administrator" role. This activity is significant because the Global Administrator role grants extensive access to data, resources, and settings, similar to a Domain Administrator in traditional AD environments. If confirmed malicious, this could allow an attacker to establish persistence, escalate privileges, and potentially gain control over Azure resources, posing a severe security risk.

Known False Positives

  • Administrators may legitimately assign the Global Administrator role to a user. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

PlatformRecord / event type
AzureAdd member to role

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: Azure AD Global Administrator Role Assigned
id: 825fed20-309d-4fd1-8aaf-cd49c1bb093c
version: 15
creation_date: '2022-08-17'
modification_date: '2026-05-13'
author: Gowthamaraj Rajendran, Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects the assignment of the Azure AD Global Administrator role to a user. It leverages Azure Active Directory AuditLogs to identify when the "Add member to role" operation includes the "Global Administrator" role. This activity is significant because the Global Administrator role grants extensive access to data, resources, and settings, similar to a Domain Administrator in traditional AD environments. If confirmed malicious, this could allow an attacker to establish persistence, escalate privileges, and potentially gain control over Azure resources, posing a severe security risk.
data_source:
    - Azure Active Directory Add member to role
search: |-
    `azure_monitor_aad` operationName="Add member to role" properties.targetResources{}.modifiedProperties{}.newValue="*Global Administrator*"
      | rename properties.* as *
      | rename initiatedBy.user.userPrincipalName as initiatedBy
      | rename userAgent as user_agent
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY dest user src
           vendor_account vendor_product user_agent
           initiatedBy signature
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `azure_ad_global_administrator_role_assigned_filter`
how_to_implement: You must install the latest version of Splunk Add-on for Microsoft Cloud Services from Splunkbase(https://splunkbase.splunk.com/app/3110/#/details). You must be ingesting Azure Active Directory events into your Splunk environment through an EventHub. This analytic was written to be used with the azure:monitor:aad sourcetype leveraging the AuditLogs log category.
known_false_positives: Administrators may legitimately assign the Global Administrator role to a user. Filter as needed.
references:
    - https://o365blog.com/post/admin/
    - https://adsecurity.org/?p=4277
    - https://www.mandiant.com/resources/detecting-microsoft-365-azure-active-directory-backdoors
    - https://docs.microsoft.com/en-us/azure/active-directory/roles/security-planning
    - https://docs.microsoft.com/en-us/azure/role-based-access-control/elevate-access-global-admin
    - https://attack.mitre.org/techniques/T1098/003/
finding:
    title: Global Administrator Role assigned for User $user$ initiated by $initiatedBy$
    entity:
        field: initiatedBy
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 50
          message: Global Administrator Role assigned for User $user$ initiated by $initiatedBy$
analytic_story:
    - Azure Active Directory Persistence
    - Azure Active Directory Privilege Escalation
    - Scattered Lapsus$ Hunters
asset_type: Azure Active Directory
mitre_attack_id:
    - T1098.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`azure_monitor_aad` operationName="Add member to role"
    properties.targetResources{}.modifiedProperties{}.newValue="*Global Administrator*"

Stage 2: rename

| rename properties.* as *

Stage 3: rename

| rename initiatedBy.user.userPrincipalName as initiatedBy

Stage 4: rename

| rename userAgent as user_agent

Stage 5: fillnull

| fillnull

Stage 6: stats

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

Stage 7: search

| `security_content_ctime(firstTime)`

Stage 8: search

| `security_content_ctime(lastTime)`

Stage 9: search

| `azure_ad_global_administrator_role_assigned_filter`

Indicators

These rows show field, operator, and value matches.

Cisco AI Defense Security Alerts by Application Name

#
Status
production
Severity
low
Group by
"model.model_name", application_id, application_name, connection_name
Author
Bhavin Patel, Splunk
Source
github.com/splunk/security_content

The search surfaces alerts from the Cisco AI Defense product for potential attacks against the AI models running in your environment. This analytic identifies security events within Cisco AI Defense by examining event messages, actions, and policy names. It focuses on connections and applications associated with specific guardrail entities and ruleset types. By aggregating and analyzing these elements, the search helps detect potential policy violations and security threats, enabling proactive defense measures and ensuring network integrity.

Known False Positives

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

Rule Body

name: Cisco AI Defense Security Alerts by Application Name
id: 105e4a69-ec55-49fc-be1f-902467435ea8
version: 7
creation_date: '2025-02-14'
modification_date: '2026-05-13'
author: Bhavin Patel, Splunk
status: production
type: Anomaly
description: The search surfaces alerts from the Cisco AI Defense product for potential attacks against the AI models running in your environment. This analytic identifies security events within Cisco AI Defense by examining event messages, actions, and policy names. It focuses on connections and applications associated with specific guardrail entities and ruleset types. By aggregating and analyzing these elements, the search helps detect potential policy violations and security threats, enabling proactive defense measures and ensuring network integrity.
data_source:
    - Cisco AI Defense Alerts
search: |-
    `cisco_ai_defense`
      | rename genai_application.application_name as application_name
      | rename connection.connection_name as connection_name
      ```Aggregating data by model name, connection name, application name, application ID, and user ID```
      | stats count
          values(user_id) as user_id
          values(event_message_type) as event_message_type
          values(event_action) as event_action
          values(policy.policy_name) as policy_name
          values(event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_entity.guardrail_entity_name) as guardrail_entity_name
          values(event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_ruleset.guardrail_ruleset_type) as guardrail_ruleset_type
          by model.model_name connection_name application_name application_id
      ```Evaluating severity based on policy name and guardrail ruleset type```
      | eval severity=case(
          policy_name IN ("AI Runtime Latency Testing - Prompt Injection"), "critical",
          policy_name IN ("AI Runtime Latency Testing - Code Detection"), "high",
          guardrail_ruleset_type IN ("Toxicity"), "medium",
          true(), "low"
      )
      ```Calculating risk score based on severity level```
      | eval risk_score=case(
          severity="critical", 100,
          severity="high", 75,
          severity="medium", 50,
          severity="low", 25
      )
      | table model.model_name, user_id, event_action, application_id, application_name, severity, risk_score, policy_name, connection_name, guardrail_ruleset_type, guardrail_entity_name
      | `cisco_ai_defense_security_alerts_by_application_name_filter`
how_to_implement: To enable this detection, you need to ingest alerts from the Cisco AI Defense product. This can be done by using this app from splunkbase - Cisco Security Cloud and ingest alerts into the cisco:ai:defense sourcetype.
known_false_positives: False positives may vary based on Cisco AI Defense configuration; monitor and filter out the alerts that are not relevant to your environment.
references:
    - https://www.robustintelligence.com/blog-posts/prompt-injection-attack-on-gpt-4
    - https://docs.aws.amazon.com/prescriptive-guidance/latest/llm-prompt-engineering-best-practices/common-attacks.html
intermediate_findings:
    entities:
        - field: application_name
          type: other
          score: 20
          message: Cisco AI Defense Security Alert has been action - [$event_action$] for the application name - [$application_name$]
analytic_story:
    - Critical Alerts
asset_type: Web Application
mitre_attack_id: []
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`cisco_ai_defense`

Stage 2: rename

| rename genai_application.application_name as application_name

Stage 3: rename

| rename connection.connection_name as connection_name

Stage 4: stats

| stats
    count
    values(user_id) as user_id
    values(event_message_type) as event_message_type
    values(event_action) as event_action
    values(policy.policy_name) as policy_name
    values(event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_entity.guardrail_entity_name) as guardrail_entity_name
    values(event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_ruleset.guardrail_ruleset_type) as guardrail_ruleset_type
  by model.model_name connection_name application_name application_id

Stage 5: eval

| eval severity=case(
      policy_name IN ("AI Runtime Latency Testing - Prompt Injection"), "critical",
      policy_name IN ("AI Runtime Latency Testing - Code Detection"), "high",
      guardrail_ruleset_type IN ("Toxicity"), "medium",
      true(), "low"
  )
severity =
ifin(policy_name, "AI Runtime Latency Testing - Prompt Injection")"critical"
elifin(policy_name, "AI Runtime Latency Testing - Code Detection")"high"
elifin(guardrail_ruleset_type, "Toxicity")"medium"
else"low"

Stage 6: eval

| eval risk_score=case(
      severity="critical", 100,
      severity="high", 75,
      severity="medium", 50,
      severity="low", 25
  )
risk_score =
ifseverity = "critical"100
elifseverity = "high"75
elifseverity = "medium"50
else25

Stage 7: table

| table model.model_name, user_id, event_action, application_id, application_name, severity,
    risk_score, policy_name, connection_name, guardrail_ruleset_type, guardrail_entity_name

Stage 8: search

| `cisco_ai_defense_security_alerts_by_application_name_filter`

Indicators

These rows show field, operator, and value matches.

Cisco IOS XE VTY Access Class Tampering

#
Status
production
Severity
low
Group by
_time, dest
Author
Nasreddine Bencherchali
Source
github.com/splunk/security_content

This analytic detects rapid modification of Cisco IOS-XE VTY access-class settings. The Salt Typhoon notes describe configure HTTP activity followed by line vty changes and removal/re-application of an access-class within 60 seconds.

Known False Positives

  • VTY ACL changes occur during legitimate management access updates. Filter approved maintenance windows and known administrators.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment
Lateral Movement

Rule Body

name: Cisco IOS XE VTY Access Class Tampering
id: a01ca274-16cb-476d-a814-d2ffe29d8905
version: 1
creation_date: '2026-05-19'
modification_date: '2026-05-20'
author: Nasreddine Bencherchali
status: production
type: Anomaly
description: |
    This analytic detects rapid modification of Cisco IOS-XE VTY access-class settings. The Salt Typhoon notes describe configure HTTP activity followed by line vty changes and removal/re-application of an access-class within 60 seconds.
data_source:
    - Cisco IOS Logs
search: |-
    `cisco_ios`
    facility IN ("HA_EM", "PARSER")
    mnemonic IN ("LOG", "CFGLOG_LOGGEDCMD")
    message_text IN (
        "*access-class*",
        "*configure http*",
        "*line vty*"
    )
    | rex field=message_text "^(?:[^:]+:\s+)?(?:catchall:\s+)?(?<eem_command>.+?)\s*$"
    | rex field=message_text "<enteredCommand><cli>(?<parser_command>.*?)</cli>"
    | rex field=message_text "<user>(?<parser_user>[^<]+)</user>"
    | rex field=message_text "<srcIP>(?<parser_src_ip>[^<]+)</srcIP>"
    | eval command=lower(trim(coalesce(parser_command, eem_command, "")))
    | eval event_type=case(
        like(command, "configure http%") OR like(command, "ip http secure-server%"), "http_config",
        like(command, "line vty%"), "line_vty",
        like(command, "no access-class%"), "remove_access_class",
        like(command, "access-class%"), "add_access_class",
        true(), null())
    | where isnotnull(event_type)
    | eval user=coalesce(parser_user, user, "unknown")
    | eval src_ip=coalesce(parser_src_ip, src_ip, "unknown")
    | eval dest=coalesce(host, dvc, dest, "unknown")
    | bin _time span=1m
    | stats count min(_time) as firstTime
                  max(_time) as lastTime
                  values(event_type) as event_types
                  values(user) as user
                  values(src_ip) as src_ip
                  values(command) as commands
      by _time dest
    | where mvfind(event_types, "line_vty") >= 0
            AND
            mvfind(event_types, "remove_access_class") >= 0
            AND
            mvfind(event_types, "add_access_class") >= 0
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `cisco_ios_xe_vty_access_class_tampering_filter`
how_to_implement: |
    Use the Cisco Catalyst Add-on for Splunk (https://splunkbase.splunk.com/app/7538) to Ingest Cisco IOS-XE syslog with sourcetype "cisco:ios" and enable archive/config command logging.
known_false_positives: |
    VTY ACL changes occur during legitimate management access updates. Filter approved maintenance windows and known administrators.
references:
    - https://www.cisa.gov/news-events/cybersecurity-advisories/aa25-239a
    - https://blog.talosintelligence.com/salt-typhoon-analysis/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Cisco IOS-XE VTY access-class settings were removed and reapplied on $dest$ by $user$.
threat_objects:
    - field: commands
      type: command
analytic_story:
    - Salt Typhoon
asset_type: Network
mitre_attack_id:
    - T1562
    - T1021
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: network

Stages and Predicates

Stage 1: search

`cisco_ios`
facility IN ("HA_EM", "PARSER")
mnemonic IN ("LOG", "CFGLOG_LOGGEDCMD")
message_text IN (
    "*access-class*",
    "*configure http*",
    "*line vty*"
)

Stage 2: rex

| rex field=message_text "^(?:[^:]+:\s+)?(?:catchall:\s+)?(?<eem_command>.+?)\s*$"

Stage 3: rex

| rex field=message_text "<enteredCommand><cli>(?<parser_command>.*?)</cli>"

Stage 4: rex

| rex field=message_text "<user>(?<parser_user>[^<]+)</user>"

Stage 5: rex

| rex field=message_text "<srcIP>(?<parser_src_ip>[^<]+)</srcIP>"

Stage 6: eval

| eval command=lower(trim(coalesce(parser_command, eem_command, "")))

Stage 7: eval

| eval event_type=case(
    like(command, "configure http%") OR like(command, "ip http secure-server%"), "http_config",
    like(command, "line vty%"), "line_vty",
    like(command, "no access-class%"), "remove_access_class",
    like(command, "access-class%"), "add_access_class",
    true(), null())
event_type =
iflike(command, "configure http%") OR like(command, "ip http secure-server%")"http_config"
eliflike(command, "line vty%")"line_vty"
eliflike(command, "no access-class%")"remove_access_class"
eliflike(command, "access-class%")"add_access_class"
elsenull()

Stage 8: where

| where isnotnull(event_type)

Stage 9: eval

| eval user=coalesce(parser_user, user, "unknown")

Stage 10: eval

| eval src_ip=coalesce(parser_src_ip, src_ip, "unknown")

Stage 11: eval

| eval dest=coalesce(host, dvc, dest, "unknown")

Stage 12: bucket

| bin _time span=1m

Stage 13: stats

| stats count min(_time) as firstTime
              max(_time) as lastTime
              values(event_type) as event_types
              values(user) as user
              values(src_ip) as src_ip
              values(command) as commands
  by _time dest

Stage 14: where

| where mvfind(event_types, "line_vty") >= 0
        AND
        mvfind(event_types, "remove_access_class") >= 0
        AND
        mvfind(event_types, "add_access_class") >= 0

Stage 15: search

| `security_content_ctime(firstTime)`

Stage 16: search

| `security_content_ctime(lastTime)`

Stage 17: search

| `cisco_ios_xe_vty_access_class_tampering_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
event_typeis_not_null
  • (no value, null check)
field:"event_type" kind:is_not_null
facilityin
  • HA_EM
  • PARSER
field:"facility" kind:in
message_textin
  • *access-class*
  • *configure http*
  • *line vty*
field:"message_text" kind:in
mnemonicin
  • CFGLOG_LOGGEDCMD
  • LOG
field:"mnemonic" kind:in
sourcetypeeq
  • cisco:ios
field:"sourcetype" kind:eq value:"cisco:ios"

Command Line Homoglyphs - Windows (Sysmon)

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

Threat actors may use homoglyph attacks by substituting characters in process names or commands with visually similar Unicode symbols to impersonate legitimate commands, or messages (e.g., using Cyrillic “а” instead of Latin “a”). This tactic is often used to evade string-based detection and confuse analysts during investigation. This use case detects Windows processes containing Unicode characters from commonly abused homoglyph ranges, including Cyrillic extended, Greek extended, and full-width Latin letters and digits.

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '44644.87462'
title: Command Line Homoglyphs - Windows
description: Threat actors may use homoglyph attacks by substituting characters in
  process names or commands with visually similar Unicode symbols to impersonate legitimate
  commands, or messages (e.g., using Cyrillic “а” instead of Latin “a”). This tactic
  is often used to evade string-based detection and confuse analysts during investigation.
  This use case detects Windows processes containing Unicode characters from commonly
  abused homoglyph ranges, including Cyrillic extended, Greek extended, and full-width
  Latin letters and digits.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  | regex process="[Ѐ-ӿͰ-Ͽa-zA-Z0-9]" | table _time, host, user, process, process_name,
  parent_process_name | bin span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:obfuscated files or information:command obfuscation
technique_id:
- T1027.010
data_category:
- Windows Sysmon
references:
- https://app.any.run/tasks/c044f84a-fd44-47ab-b53f-976debf96e63
- https://www.zdnet.com/article/magecart-group-uses-homoglyph-attacks-to-fool-you-into-visiting-malicious-websites/
- https://www.meshsecurity.io/blog/homoglyph-attacks-understanding-and-mitigating-the-threat
- https://www.bitdefender.com/en-us/blog/businessinsights/homograph-phishing-attacks-when-user-awareness-is-not-enough

Stages and Predicates

Stage 1: search

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

Stage 2: regex

| regex process="[Ѐ-ӿͰ-Ͽa-zA-Z0-9]"

Stage 3: table

| table _time, host, user, process, process_name, 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
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
processregex_match
  • [Ѐ-ӿͰ-Ͽa-zA-Z0-9] corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match value:"[Ѐ-ӿͰ-Ͽa-zA-Z0-9]"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"

Common Reconnaissance Commands (PowerShell)

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

These are reconnaissance commands that are most commonly used by attackers in order to collect information after gaining a access to the machine

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '1035.1043'
title: Common Reconnaissance Commands
description: 'These are reconnaissance commands that are most commonly used by attackers
  in order to collect information after gaining a access to the machine. -- Threat
  Actor Association: AbcBot, Alloy Taurus/Gallium, Andariel, APT27/Emissary Panda,
  APT28 (aka.Fancy Bear, Fighting Ursa, Forest Blizzard, Pawn Storm, TA422, STRONTIUM),
  APT29/Nobelium/Cozy Bear, APT33, APT35/Phosphorus/Magic Hound, APT36, APT43, Carbanak,
  FamousSparrow, FIN6, FIN7, FIN8, FIN12, FIN13, Gorgon Group, Kimsuky, MuddyWater,
  OilRig, SaintBear (aka UAC-0056, UNC2589, TA471), TA428, TA2541, TRAVELING SPIDER,
  UAC-0056, Volt Typhoon (Bronze Silhouette, Vanguard Panda), Winter Vivern, Wizard
  Spider -- Software Association: AvosLocker, BadHatch, Bazarloader, BianLian, Black
  Basta, Blackcat/ALPHV, Clop, Conti, Cyclops Blink, Emotet, GhostShell, Hancitor,
  Havex, IcedID, Insekt, Lockbit, NanoCore, Nefilim, PowerShortShell, Prometheus /
  Spook, PYSA/Mespinoza, QakBot, Remcos, Ryuk, Snatch, Sodinokibi/REvil, Trickbot,
  Vice Society, XingLocker -- Atomics T1007 Test#1 Atomics T1007 Test#2 Atomics T1016
  Test#1 Atomics T1016 Test#2 Atomics T1016 Test#3 Atomics T1016 Test#4 Atomics T1016
  Test#7 Atomics T1018 Test#1 Atomics T1018 Test#2 Atomics T1018 Test#3 Atomics T1018
  Test#5 Atomics T1018 Test#6 Atomics T1018 Test#8 Atomics T1518.001 Test#1 Atomics
  T1571 Test#1 Atomics T1033 Test #1 Atomics T1087.001 Test #4 Atomics T1087.001 Test
  #5 Atomics T1087.001 Test #6 Atomics T1087.001 Test #7 Atomics T1087.001 Test #8
  Atomics T1087.001 Test #9 Atomics T1087.001 Test #10 Atomics T1201 Test #5 Atomics
  T1201 Test #6'
logic_format: Splunk
logic: ' `get_endpoint_data` `get_endpoint_data_powershell` EventCode=4104 ("whoami"
  OR "dir" OR "systeminfo" OR "HOSTNAME" OR "ipconfig" OR "route" OR "arp" OR "netstat"
  OR "netsh" OR "schtasks" OR "tasklist" OR "driverquery" OR "qprocess" OR "nslookup"
  OR "tracert" OR "query" OR "cmdkey" OR ("net" AND ("localgroup" OR "group" OR "config"
  OR "share" OR "use" OR "user"))) | rex field=process mode=sed max_match=0 "s/(?mi)^(Path.+)|^(ScriptBlock
  ID.+)|^(Creating Scriptblock.+)//g"| rex field=process mode=sed "s/([\n\r]+)|(\s\s+)//g"|
  table _time, host, user dvc, dvc_nt_host, event_id, eventtype, host, index, parameters,
  process, process_id, process_name, process_path, shell, signature_id, source, sourcetype,
  src_user, tag, user, user_id | bin span=60s | stats values(*) as * by _time, host
  | where match(process,"(?i)((whoami)|(dir)|(hostname)|(hostname)|(systeminfo)|(ipconfig)|(route)|(arp)|(cmdkey))($|\s)")
  OR match(process,"(?i)((netstat)|(netsh)|(schtasks)|(tasklist)|(driverquery)|(qprocess)|(nslookup))($|\s)")
  OR match(process,"(?i)((tracert)|(query)|(net\s+((localgroup)|(group)|(config)|(share)|(use)|(user)|(view))))($|\s)")
  `hec_collect`'
techniques:
- discovery:system owner/user discovery
- execution:command and scripting interpreter
- discovery:account discovery:local account
- discovery:process discovery
- discovery:system information discovery
- discovery:system service discovery
- execution:command and scripting interpreter:unix shell
- execution:command and scripting interpreter:windows command shell
technique_id:
- T1033
- T1059
- T1087.001
- T1057
- T1082
- T1007
- T1059.003
- T1059.004
data_category:
- PowerShell logs
- Process command-line parameters
references:
- https://capec.mitre.org/data/definitions/577.html
- https://www.programmersought.com/article/71384528057/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` EventCode=4104 (
    "whoami"
    OR "dir"
    OR "systeminfo"
    OR "HOSTNAME"
    OR "ipconfig"
    OR "route"
    OR "arp"
    OR "netstat"
    OR "netsh"
    OR "schtasks"
    OR "tasklist"
    OR "driverquery"
    OR "qprocess"
    OR "nslookup"
    OR "tracert"
    OR "query"
    OR "cmdkey"
    OR ("net" AND ("localgroup" OR "group" OR "config" OR "share" OR "use" OR "user"))
)

Stage 2: rex

| rex field=process mode=sed max_match=0
    "s/(?mi)^(Path.+)|^(ScriptBlock ID.+)|^(Creating Scriptblock.+)//g"

The parser skipped this rex command.

Stage 3: rex

| rex field=process mode=sed "s/([\n\r]+)|(\s\s+)//g"

The parser skipped this rex command.

Stage 4: table

| table _time, host, user dvc, dvc_nt_host, event_id, eventtype, host, index, parameters, process,
    process_id, process_name, process_path, shell, signature_id, source, sourcetype, src_user, tag,
    user, user_id

Stage 5: bucket

| bin span=60s

Stage 6: stats

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

Stage 7: where

| where match(process,"(?i)((whoami)|(dir)|(hostname)|(hostname)|(systeminfo)|(ipconfig)|(route)|(arp)|(cmdkey))($|\s)") OR match(process,"(?i)((netstat)|(netsh)|(schtasks)|(tasklist)|(driverquery)|(qprocess)|(nslookup))($|\s)") OR match(process,"(?i)((tracert)|(query)|(net\s+((localgroup)|(group)|(config)|(share)|(use)|(user)|(view))))($|\s)") `hec_collect`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
processregex_match
  • (?i)((netstat)|(netsh)|(schtasks)|(tasklist)|(driverquery)|(qprocess)|(nslookup))($|\s) corpus 2 (splunk 2)
  • (?i)((tracert)|(query)|(net\s+((localgroup)|(group)|(config)|(share)|(use)|(user)|(view))))($|\s) corpus 3 (splunk 3)
  • (?i)((whoami)|(dir)|(hostname)|(hostname)|(systeminfo)|(ipconfig)|(route)|(arp)|(cmdkey))($|\s) corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"whoami"
1"dir"
1"systeminfo"
1"HOSTNAME"
1"ipconfig"
1"route"
1"arp"
1"netstat"
1"netsh"
1"schtasks"
1"tasklist"
1"driverquery"
1"qprocess"
1"nslookup"
1"tracert"
1"query"
1"cmdkey"
1"net"
1"localgroup"
1"group"
1"config"
1"share"
1"use"
1"user"

Domain Trust Discovery Commands - Windows (PowerShell)

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

Adversaries may attempt to gather information on domain trust relationships that may be used to identify lateral movement opportunities in Windows multi-domain/forest environments. This use case detects executions of domain trust discovery commands used with nltest.exe. nltest.exe is not included in the detection to account for instances where nltest.exe has been renamed

MITRE ATT&CK Coverage

TacticTechniques
Discovery

References

Telemetry Coverage

Rule Body

id: '22209.39130'
title: Domain Trust Discovery Commands - Windows
description: 'Adversaries may attempt to gather information on domain trust relationships
  that may be used to identify lateral movement opportunities in Windows multi-domain/forest
  environments. This use case detects executions of domain trust discovery commands
  used with nltest.exe. nltest.exe is not included in the detection to account for
  instances where nltest.exe has been renamed. -- Software Association: Play -- Atomics
  T1482 Test #2'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104) OR
  "<EventID>4104<") ("/domain_trusts" OR "/trusted_domains") | table _time, host,
  user, process, process_*, parent_* | bin span=1s | stats values(*) as * by _time,
  host '
techniques:
- discovery:domain trust discovery
technique_id: 
- T1482
data_category:
- PowerShell logs
- Process command-line parameters
references:
- https://thedfirreport.com/2023/06/12/a-truly-graceful-wipe-out/
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1482/T1482.md#atomic-test-2---windows---discover-domain-trusts-with-nltest

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104) OR "<EventID>4104<") ("/domain_trusts" OR "/trusted_domains")

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4104<"
1"/domain_trusts"
1"/trusted_domains"

Exfiltration via curl.exe - Windows (Sysmon)

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

Threat actors may abuse curl.exe on Windows systems to exfiltrate data or upload files to remote servers using command-line options like -d, -T, --form, or --upload-file. These flags are commonly used for HTTP POST requests, enabling attackers to transmit files or sensitive information during post-compromise activity. This use case detects process creation events where curl.exe is used with data or file upload arguments, potentially indicating data exfiltration, C2 communication, or malicious use of legitimate tools.

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '45179.90468'
title: Exfiltration via curl.exe - Windows
description: Threat actors may abuse curl.exe on Windows systems to exfiltrate data
  or upload files to remote servers using command-line options like -d, -T, --form,
  or --upload-file. These flags are commonly used for HTTP POST requests, enabling
  attackers to transmit files or sensitive information during post-compromise activity.
  This use case detects process creation events where curl.exe is used with data or
  file upload arguments, potentially indicating data exfiltration, C2 communication,
  or malicious use of legitimate tools.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  TERM(curl) ("-d" OR "-T" OR "-F" OR " --form" OR "--upload-file " OR "--data " OR
  "--data-") | where match(process_path, "(?i)\x5ccurl\.exe") and (match(process,
  "\s-[dTF]\s") or match(process, "(?i)\s--(form|upload-file|data)\s|\s--data-"))
  | table _time, host, user, process, process_path, process_name, parent_process_name,
  user | bin span=1s | stats values(*) as * by _time, host '
techniques:
- exfiltration:exfiltration over alternative protocol
technique_id: 
- T1048
data_category:
- Windows Sysmon
references:
- https://github.com/SigmaHQ/sigma/blob/master/rules-threat-hunting/windows/process_creation/proc_creation_win_curl_fileupload.yml
- https://x.com/d1r4c/status/1279042657508081664
- https://medium.com/@petehouston/upload-files-with-curl-93064dcccc76
- https://curl.se/docs/manpage.html

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") TERM(curl) ("-d" OR "-T" OR "-F" OR " --form" OR "--upload-file " OR "--data " OR "--data-")

Stage 2: where

| where match(process_path, "(?i)\x5ccurl\.exe") and (
    match(process, "\s-[dTF]\s")
    or match(process, "(?i)\s--(form|upload-file|data)\s|\s--data-")
)

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
processregex_match
    • (?i)\s--(form|upload-file|data)\s
    • \s--data-
    corpus 3 (splunk 3)
  • \s-[dTF]\s corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match
process_pathregex_match
  • (?i)\x5ccurl.exe corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)\x5ccurl.exe"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1curl
1"-d"
1"-T"
1"-F"
1" --form"
1"--upload-file "
1"--data "
1"--data-"

Impacket atexec.py Temp File Creation (Windows Event Log)

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

Impacket's atexec.py is a tool designed for executing commands on a target system via the Windows Task Scheduler to run arbitrary commands with the privileges of the account under which the scheduler is running, often providing a method for remote command execution which can be used by attackers during post-exploitation activities. This use case detects the file creation events matching characteristics of those created by Impacket atexec.py.

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '29738.53781'
title: Impacket atexec.py Temp File Creation
description: Impacket's atexec.py is a tool designed for executing commands on a target
  system via the Windows Task Scheduler to run arbitrary commands with the privileges
  of the account under which the scheduler is running, often providing a method for
  remote command execution which can be used by attackers during post-exploitation
  activities. This use case detects the file creation events matching characteristics
  of those created by Impacket atexec.py.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4656) OR
  "<EventID>4656<") ("\\Windows\\System32\\Tasks\\" "svchost.exe") OR ("\\Windows\\Temp\\"
  ".tmp" "cmd.exe") | regex file_name="^([a-zA-Z]){8}(\.tmp)?$" | table _time, host,
  user, file_name, file_path, process_name | bin span=1s | stats values(*) as * by
  _time, host '
techniques:
- execution:scheduled task/job
- execution:command and scripting interpreter
- execution:scheduled task/job:scheduled task
- persistence:scheduled task/job:scheduled task
- privilege-escalation:scheduled task/job:scheduled task
- execution:command and scripting interpreter:windows command shell
- defense-evasion:obfuscated files or information
technique_id:
- T1053
- T1059
- T1053.005
- T1059.003
- T1027
data_category:
- File monitoring
- Windows event logs
references:
- https://u0041.co/blog/post/1
- https://github.com/fortra/impacket/blob/master/examples/atexec.py
- https://labs.withsecure.com/content/dam/labs/docs/WithSecure-Lazarus-No-Pineapple-Threat-Intelligence-Report-2023.pdf
- https://thedfirreport.com/2023/10/30/netsupport-intrusion-results-in-domain-compromise/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4656) OR "<EventID>4656<") ("\\Windows\\System32\\Tasks\\" "svchost.exe") OR ("\\Windows\\Temp\\" ".tmp" "cmd.exe")

Stage 2: regex

| regex file_name="^([a-zA-Z]){8}(\.tmp)?$"

Stage 3: table

| table _time, host, user, file_name, file_path, 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
  • 4656 corpus 15 (splunk 15)
field:"EventID" kind:eq value:"4656"
file_nameregex_match
  • ^([a-zA-Z]){8}(.tmp)?$ corpus 2 (splunk 2)
field:"file_name" kind:regex_match value:"^([a-zA-Z]){8}(.tmp)?$"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4656<"
1"\\Windows\\System32\\Tasks\\"
1"svchost.exe"
1"\\Windows\\Temp\\"
1".tmp"
1"cmd.exe"

Invoke-Expression Command (Sysmon)

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

Detects when PowerShell Invoke-Expression is executed. -- Threat Group Association: Actinium/Gamaredon/Primitive Bear, Andariel, APT29/Nobelium/Cozy Bear, APT31, FIN7, FIN8, Lazarus, TA505, TA551, Turla (akaSecret Blizzard, KRYPTON, and UAC-0003), WinterVivern/UAC-0114, Winter Vivern, WIRTE, Wizard Spider

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '1037.1051'
title: Invoke-Expression Command
description: 'Detects when PowerShell Invoke-Expression is executed. -- Threat Group
  Association: Actinium/Gamaredon/Primitive Bear, Andariel, APT29/Nobelium/Cozy Bear,
  APT31, FIN7, FIN8, Lazarus, TA505, TA551, Turla (akaSecret Blizzard, KRYPTON, and
  UAC-0003), WinterVivern/UAC-0114, Winter Vivern, WIRTE, Wizard Spider - Software
  Association: ALPHV/BlackCat, BadHatch, Bazar, Black Basta, Clop, Conti, Cring, IcedID,
  LV, Play, PowerShortShell, PurpleFox, PYSA/Mespinoza, Remcos, SamSam, SquirrelWaffle,
  Trickbot, XingLocker -- #TrendingThreat #Russia #Ukraine -- Atomics T1059.001 Test
  #1 Atomics T1059.001 Test #4 Atomics T1059.001 Test #5 Atomics T1059.001 Test #8
  Atomics T1059.001 Test #11 Atomics T1059.001 Test #13 Atomics T1135 Test #6 Atomics
  T1059.005 Test #2 Atomics T1059.005 Test #3 Atomics T1134.002 Test #2'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` EventCode=1 (TERM("invoke-expression")
  OR TERM("iex")) | table _time, host, user dest, direction, dvc, dvc_nt_host, event_id,
  eventtype, hashes, host, index, parent_process, parent_process_id, parent_process_name,
  parent_process_path, process, process_current_directory, process_id, process_name,
  process_path, signature_id, source, sourcetype, tag, user, user_id `group_events("host,
  process", 1)` '
techniques:
- execution:command and scripting interpreter:powershell
technique_id:
- T1059.001
data_category:
- Windows Sysmon
references:
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-expression?view=powershell-7.1
- https://www.fortinet.com/blog/threat-research/offense-and-defense-a-tale-of-two-sides-powershell
- https://www.cyber.gov.au/acsc/view-all-content/publications/securing-powershell-enterprise
- https://www.microsoft.com/security/blog/2022/02/04/actinium-targets-ukrainian-organizations/?utm_campaign=Threat%20Report%20Newsletter&utm_medium=email&_hsmi=203254280&_hsenc=p2ANqtz-_lmhDqWF4dK1aEuVSrgJUOHdLMvJ7ORkr-vdksakqAPIxGFhGLMHMGAUiX4y9HTdUyzYWBQlJ

Stages and Predicates

Stage 1: search

search EventCode=1 source="*" source IN (
    "WinEventLog:Microsoft-Windows-Sysmon/Operational",
    "XmlWinEventLog:Microsoft-Windows-Sysmon/Operational"
)

Stage 2: table

table _time, dest, direction, dvc, dvc_nt_host, event_id, eventtype, hashes, host, index,
    parent_process, parent_process_id, parent_process_name, parent_process_path, process,
    process_current_directory, process_id, process_name, process_path, signature_id, source,
    sourcetype, tag, user, user_id

Stage 3: bucket

bucket _time

Stage 4: stats

stats BY host, process, _time

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"\"invoke-expression\""
1"\"iex\""

O365 Mailbox Read Access Granted to Application

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

The following analytic identifies instances where the Mail.Read Graph API permissions are granted to an application registration within an Office 365 tenant. It leverages O365 audit logs, specifically events related to changes in application permissions within the AzureActiveDirectory workload. This activity is significant because the Mail.Read permission allows applications to access and read all emails within a user's mailbox, which often contain sensitive or confidential information. If confirmed malicious, this could lead to data exfiltration, spear-phishing attacks, or further compromise based on the information gathered from the emails.

Known False Positives

  • There are legitimate scenarios in wich an Application registrations requires Mailbox read access. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

PlatformRecord / event type
Microsoft 365Update application.

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: O365 Mailbox Read Access Granted to Application
id: 27ab61c5-f08a-438a-b4d3-325e666490b3
version: 10
creation_date: '2023-12-06'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic identifies instances where the Mail.Read Graph API permissions are granted to an application registration within an Office 365 tenant. It leverages O365 audit logs, specifically events related to changes in application permissions within the AzureActiveDirectory workload. This activity is significant because the Mail.Read permission allows applications to access and read all emails within a user's mailbox, which often contain sensitive or confidential information. If confirmed malicious, this could lead to data exfiltration, spear-phishing attacks, or further compromise based on the information gathered from the emails.
data_source:
    - O365 Update application.
search: "`o365_management_activity` Operation=\"Update application.\" | eval json_data=mvindex('ModifiedProperties{}.NewValue',0) | eval json_data=replace(json_data,\"^\\[\\s*\",\"\") | eval json_data=replace(json_data,\"\\s*\\]$\",\"\") | spath input=json_data path=RequiredAppPermissions{}.EntitlementId output=EntitlementIds | eval match_found=mvfind(EntitlementIds, \"810c84a8-4a9e-49e6-bf7d-12d183f40d01\") | where isnotnull(match_found) | fillnull | stats count earliest(_time) as firstTime max(_time) as lastTime values(EntitlementIds) as EntitlementIds by signature, user, dest, vendor_account, vendor_product, object, src | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `o365_mailbox_read_access_granted_to_application_filter`"
how_to_implement: You must install the Splunk Microsoft Office 365 Add-on and ingest Office 365 management activity events.
known_false_positives: There are legitimate scenarios in wich an Application registrations requires Mailbox read access. Filter as needed.
references:
    - https://attack.mitre.org/techniques/T1098/003/
    - https://attack.mitre.org/techniques/T1114/002/
    - https://www.mandiant.com/sites/default/files/2022-08/remediation-hardening-strategies-for-m365-defend-against-apt29-white-paper.pdf
    - https://www.cisa.gov/sites/default/files/publications/Supply_Chain_Compromise_Detecting_APT_Activity_from_known_TTPs.pdf
    - https://learn.microsoft.com/en-us/graph/permissions-reference
    - https://graphpermissions.merill.net/permission/Mail.Read
finding:
    title: Application registration $object$ was grandes mailbox read access by $user$
    entity:
        field: user
        type: user
        score: 50
analytic_story:
    - Office 365 Persistence Mechanisms
asset_type: O365 Tenant
mitre_attack_id:
    - T1098.003
    - T1114.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: access

Stages and Predicates

Stage 1: search

`o365_management_activity` Operation="Update application."

Stage 2: eval

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

Stage 3: eval

| eval json_data=replace(json_data,"^\[\s*","")

Stage 4: eval

| eval json_data=replace(json_data,"\s*\]$","")

Stage 5: spath

| spath input=json_data path=RequiredAppPermissions{}.EntitlementId output=EntitlementIds

Stage 6: eval

| eval match_found=mvfind(EntitlementIds, "810c84a8-4a9e-49e6-bf7d-12d183f40d01")

Stage 7: where

| where isnotnull(match_found)

Stage 8: fillnull

| fillnull

Stage 9: stats

| stats
    count
    earliest(_time) as firstTime
    max(_time) as lastTime
    values(EntitlementIds) as EntitlementIds
  by signature, user, dest, vendor_account, vendor_product, object, src

Stage 10: search

| `security_content_ctime(firstTime)`

Stage 11: search

| `security_content_ctime(lastTime)`

Stage 12: search

| `o365_mailbox_read_access_granted_to_application_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Operationeq
  • Update application. corpus 3 (splunk 3)
field:"Operation" kind:eq value:"Update application."
match_foundis_not_null
  • (no value, null check)
field:"match_found" kind:is_not_null
sourcetypeeq
  • o365:management:activity corpus 80 (splunk 80)
field:"sourcetype" kind:eq value:"o365:management:activity"

O365 Multiple Mailboxes Accessed via API

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

The following analytic detects when a high number of Office 365 Exchange mailboxes are accessed via API (Microsoft Graph API or Exchange Web Services) within a short timeframe. It leverages 'MailItemsAccessed' operations in Exchange, using AppId and regex to identify API interactions. This activity is significant as it may indicate unauthorized mass email access, potentially signaling data exfiltration or account compromise. If confirmed malicious, attackers could gain access to sensitive information, leading to data breaches and further exploitation of compromised accounts. The threshold is set to flag over five unique mailboxes accessed within 10 minutes, but should be tailored to your environment.

Known False Positives

  • Legitimate applications may access multiple mailboxes via an API. You can filter by the ClientAppId or the CLientIpAddress fields.

MITRE ATT&CK Coverage

Telemetry Coverage

PlatformRecord / event type
Microsoft 365MailItemsAccessed

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: O365 Multiple Mailboxes Accessed via API
id: 7cd853e9-d370-412f-965d-a2bcff2a2908
version: 11
creation_date: '2024-02-14'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects when a high number of Office 365 Exchange mailboxes are accessed via API (Microsoft Graph API or Exchange Web Services) within a short timeframe. It leverages 'MailItemsAccessed' operations in Exchange, using AppId and regex to identify API interactions. This activity is significant as it may indicate unauthorized mass email access, potentially signaling data exfiltration or account compromise. If confirmed malicious, attackers could gain access to sensitive information, leading to data breaches and further exploitation of compromised accounts. The threshold is set to flag over five unique mailboxes accessed within 10 minutes, but should be tailored to your environment.
data_source:
    - O365 MailItemsAccessed
search: |-
    `o365_management_activity` Workload=Exchange Operation=MailItemsAccessed AppId=* ClientAppId=*
      | bucket span=10m _time
      | eval matchRegex=if(match(ClientInfoString,"^Client=WebServices;ExchangeWebServices"), 1, 0)
      | search (AppId="00000003-0000-0000-c000-000000000000" OR matchRegex=1)
      | fillnull
      | stats values(ClientIPAddress) as src dc(user) as unique_mailboxes values(user) as user
        BY _time ClientAppId ClientInfoString
           vendor_account vendor_product dest
           signature
      | where unique_mailboxes > 5
      | `o365_multiple_mailboxes_accessed_via_api_filter`
how_to_implement: You must install the Splunk Microsoft Office 365 Add-on and ingest Office 365 management activity events.
known_false_positives: Legitimate applications may access multiple mailboxes via an API. You can filter by the ClientAppId or the CLientIpAddress fields.
references:
    - https://attack.mitre.org/techniques/T1114/002/
    - https://learn.microsoft.com/en-us/troubleshoot/azure/active-directory/verify-first-party-apps-sign-in
    - https://learn.microsoft.com/en-us/graph/permissions-reference
    - https://attack.mitre.org/techniques/T1114/002/
    - https://www.microsoft.com/en-us/security/blog/2024/01/25/midnight-blizzard-guidance-for-responders-on-nation-state-attack/
    - https://learn.microsoft.com/en-us/exchange/client-developer/exchange-web-services/ews-applications-and-the-exchange-architecture
finding:
    title: An Oauth application identified with id $ClientAppId$ accessed multiple mailboxes in a short period of time via an API.
    entity:
        field: user
        type: user
        score: 50
analytic_story:
    - Office 365 Collection Techniques
    - NOBELIUM Group
asset_type: O365 Tenant
mitre_attack_id:
    - T1114.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`o365_management_activity` Workload=Exchange Operation=MailItemsAccessed AppId=* ClientAppId=*

Stage 2: bucket

| bucket span=10m _time

Stage 3: eval

| eval matchRegex=if(match(ClientInfoString,"^Client=WebServices;ExchangeWebServices"), 1, 0)
matchRegex =
ifmatch(ClientInfoString, "^Client=WebServices;ExchangeWebServices")1
else0

Stage 4: search

| search (AppId="00000003-0000-0000-c000-000000000000" OR matchRegex=1)

Stage 5: fillnull

| fillnull

Stage 6: stats

| stats values(ClientIPAddress) as src dc(user) as unique_mailboxes values(user) as user
    BY _time ClientAppId ClientInfoString
       vendor_account vendor_product dest
       signature

Stage 7: where

| where unique_mailboxes > 5

Stage 8: search

| `o365_multiple_mailboxes_accessed_via_api_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
AppIdeq
  • * corpus 3 (splunk 3)
  • 00000003-0000-0000-c000-000000000000 corpus 2 (splunk 2)
field:"AppId" kind:eq
ClientAppIdeq
  • * corpus 2 (splunk 2)
field:"ClientAppId" kind:eq value:"*"
Operationeq
  • MailItemsAccessed corpus 4 (splunk 3, kusto 1)
field:"Operation" kind:eq value:"MailItemsAccessed"
Workloadeq
  • Exchange corpus 20 (splunk 20)
field:"Workload" kind:eq value:"Exchange"
matchRegexeq
  • 1
field:"matchRegex" kind:eq value:"1"
sourcetypeeq
  • o365:management:activity corpus 80 (splunk 80)
field:"sourcetype" kind:eq value:"o365:management:activity"
unique_mailboxesgt
  • 5
field:"unique_mailboxes" kind:gt value:"5"

Permissions Replaced by icacls - Windows (PowerShell)

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

icacls is a command-line utility in Windows that allows for viewing and modifying Discretionary Access Control Lists (DACLs) and file permissions. Threat actors may abuse this tool to alter file permissions, potentially gaining unauthorized access or control over sensitive files and directories, as observed by DFIR report (see references). This use case detects icacls executions with switches to replace permissions

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '24625.45524'
title: Permissions Replaced by icacls - Windows
description: 'icacls is a command-line utility in Windows that allows for viewing
  and modifying Discretionary Access Control Lists (DACLs) and file permissions. Threat
  actors may abuse this tool to alter file permissions, potentially gaining unauthorized
  access or control over sensitive files and directories, as observed by DFIR report
  (see references). This use case detects icacls executions with switches to replace
  permissions. -- Threat Actor Association: FIN7 (aka. Carbon Spider, Sangria Tempest)'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104) OR
  "<EventID>4104<") "icacls" ("/grant:" OR "/deny:" OR "/remove:" OR "/setintegritylevel:"
  OR "/inheritance:") | rex field=_raw "(?<=icacls\.exe\"\s)(?<file_path>[^\s]+)"|
  rex field=_raw "/(grant|deny|remove|setintegritylevel|inheritance):\S\s(?<permission_user>[^\:]+):F"|
  table _time, host, user, process, process_*, parent_process, parent_process_*, user,
  file_path, permission_user | bin span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:file and directory permissions modification
- defense-evasion:file and directory permissions modification:windows file and directory
  permissions modification
technique_id:
- T1222
- T1222.001
data_category:
- PowerShell logs
references:
- https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/icacls
- https://thedfirreport.com/2023/10/30/netsupport-intrusion-results-in-domain-compromise/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104) OR "<EventID>4104<") "icacls" ("/grant:" OR "/deny:" OR "/remove:" OR "/setintegritylevel:" OR "/inheritance:")

Stage 2: rex

| rex field=_raw "(?<=icacls\.exe\"\s)(?<file_path>[^\s]+)"

Stage 3: rex

| rex field=_raw
    "/(grant|deny|remove|setintegritylevel|inheritance):\S\s(?<permission_user>[^\:]+):F"

Stage 4: table

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

Stage 5: bucket

| bin span=1s

Stage 6: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4104<"
1"icacls"
1"/grant:"
1"/deny:"
1"/remove:"
1"/setintegritylevel:"
1"/inheritance:"

Potential Credential Dumping of LSASS (Windows Event Log)

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

This use case looks for access requests to lsass by a user, which may indicate an attempt to dump credentials

MITRE ATT&CK Coverage

TacticTechniques
Credential Access

Telemetry Coverage

Rule Body

id: '19351.33713'
title: Potential Credential Dumping of LSASS
description: 'This use case looks for access requests to lsass by a user, which may
  indicate an attempt to dump credentials. -- Threat Actor Association: Alloy Taurus/Gallium'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4656) OR
  "<EventID>4656<") ("0x1010" OR "0x40" OR "0x1400" OR "0x100000" OR "0x1410" OR "0x1438"
  OR "0x143a" OR "0x1418" OR "0x1f0fff" OR "0x1f1fff" OR "0x1f2fff" OR "0x1f3fff")
  ) OR ((TERM(EventCode=4663) OR "<EventID>4663<") ("%%4484" OR "%%4416") ) "lsass.exe"
  | regex user!=".*\$" | table _time, host, user process, process_*, signature_id,
  parent_* | bin span=5s | stats values(*) as * by _time, host | where match(signature_id,
  "4656") and match(signature_id, "4663") '
techniques:
- credential-access:os credential dumping
technique_id: 
- T1003
data_category:
- Windows event logs
references: null

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4656) OR "<EventID>4656<") ("0x1010" OR "0x40" OR "0x1400" OR "0x100000" OR "0x1410" OR "0x1438" OR "0x143a" OR "0x1418" OR "0x1f0fff" OR "0x1f1fff" OR "0x1f2fff" OR "0x1f3fff") ) OR ((TERM(EventCode=4663) OR "<EventID>4663<") ("%%4484" OR "%%4416") ) "lsass.exe"

Stage 2: regex

| regex user!=".*\$"

Stage 3: table

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

Stage 4: bucket

| bin span=5s

Stage 5: stats

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

Stage 6: where

| where match(signature_id, "4656") and match(signature_id, "4663")

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4656 corpus 15 (splunk 15)
  • 4663 corpus 31 (splunk 31)
field:"EventID" kind:eq
signature_idregex_match
  • 4656 corpus 3 (splunk 3)
  • 4663 corpus 2 (splunk 2)
field:"signature_id" kind:regex_match

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
userregex_match.*$excludes:user field:"user" value:".*$"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4656<"
1"0x1010"
1"0x40"
1"0x1400"
1"0x100000"
1"0x1410"
1"0x1438"
1"0x143a"
1"0x1418"
1"0x1f0fff"
1"0x1f1fff"
1"0x1f2fff"
1"0x1f3fff"
1"<EventID>4663<"
1"%%4484"
1"%%4416"
1"lsass.exe"

PowerShell CreateDecryptor (Windows Event Log)

#
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.90187'
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_winevent` (TERM(EventCode=4688) OR
  "EventID>4688<" OR Type=Process) (TERM(powershell) OR TERM(pwsh)) "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:
- Process command-line parameters
- Windows event logs
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_winevent` (TERM(EventCode=4688) OR "EventID>4688<" OR Type=Process) (TERM(powershell) OR TERM(pwsh)) "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
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
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>4688<"
1powershell
1pwsh
1"CreateDecryptor"

PowerShell Loading DotNET into Memory via Reflection

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

The following analytic detects the use of PowerShell scripts to load .NET assemblies into memory via reflection, a technique often used in malicious activities such as those by Empire and Cobalt Strike. It leverages PowerShell Script Block Logging (EventCode=4104) to capture and analyze the full command executed. This behavior is significant as it can indicate advanced attack techniques aiming to execute code in memory, bypassing traditional defenses. If confirmed malicious, this activity could lead to unauthorized code execution, privilege escalation, and persistent access within the environment.

Known False Positives

  • False positives should be limited as day to day scripts do not use this method.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: PowerShell Loading DotNET into Memory via Reflection
id: 85bc3f30-ca28-11eb-bd21-acde48001122
version: 19
creation_date: '2021-06-15'
modification_date: '2026-06-29'
author: Michael Haag, Teoderick Contreras Splunk
status: production
type: Anomaly
description: |-
    The following analytic detects the use of PowerShell scripts to load .NET assemblies into memory via reflection, a technique often used in malicious activities such as those by Empire and Cobalt Strike.
    It leverages PowerShell Script Block Logging (EventCode=4104) to capture and analyze the full command executed.
    This behavior is significant as it can indicate advanced attack techniques aiming to execute code in memory, bypassing traditional defenses.
    If confirmed malicious, this activity could lead to unauthorized code execution, privilege escalation, and persistent access within the environment.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell` EventCode=4104
    ScriptBlockText IN (
        "*.LoadFrom(*",
        "*.LoadModule(*",
        "*.LoadWithPartialName*",
        "*Reflection.Assembly.Load*",
        "*Reflection.Assembly]::('daoL'[-1..-4] -join '')*",
        "*Reflection.Assembly]::Load*",
        "*ReflectionOnlyLoad*",
        "*UnsafeLoadFrom*"
    )

    | 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_loading_dotnet_into_memory_via_reflection_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: False positives should be limited as day to day scripts do not use this method.
references:
    - https://docs.microsoft.com/en-us/dotnet/api/system.reflection.assembly?view=net-5.0
    - 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/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A suspicious powershell script with the ScriptBlockId [$ScriptBlockId$] containing reflective class assembly commands to load .net code in memory was executed on host $dest$
        - field: user_id
          type: user
          score: 20
          message: A suspicious powershell script with the ScriptBlockId [$ScriptBlockId$] containing reflective class assembly commands to load .net code in memory was executed on host $dest$ by user $user_id$
analytic_story:
    - Winter Vivern
    - AgentTesla
    - AsyncRAT
    - Hermetic Wiper
    - Malicious PowerShell
    - Data Destruction
    - 0bj3ctivity Stealer
    - Hellcat Ransomware
    - Axios Supply Chain Post Compromise
    - VIP Keylogger
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 (
    "*.LoadFrom(*",
    "*.LoadModule(*",
    "*.LoadWithPartialName*",
    "*Reflection.Assembly.Load*",
    "*Reflection.Assembly]::('daoL'[-1..-4] -join '')*",
    "*Reflection.Assembly]::Load*",
    "*ReflectionOnlyLoad*",
    "*UnsafeLoadFrom*"
)

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTextin
  • *.LoadFrom(*
  • *.LoadModule(*
  • *.LoadWithPartialName*
  • *Reflection.Assembly.Load*
  • *Reflection.Assembly]::('daoL'[-1..-4] -join '')*
  • *Reflection.Assembly]::Load*
  • *ReflectionOnlyLoad*
  • *UnsafeLoadFrom*
field:"ScriptBlockText" kind:in

Rubeus Commands (Sysmon)

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

Rubeus is a C# toolset for raw Kerberos interaction and abuses

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '5473.17082'
title: Rubeus Commands
description: 'Rubeus is a C# toolset for raw Kerberos interaction and abuses. -- Threat
  Actor Association: Wizard Spider - Software Association: Conti, Diavol, Quakbot/Qbot
  -- Atomics T1558.003 Test#2'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` TERM(exe) ("EventCode=1" OR
  "<EventID>1<") (TERM(harvest) OR TERM(ptt) OR TERM(s4u) OR TERM(asktgt) OR TERM(brute)
  OR TERM(createnetonly) OR TERM(changepw) OR TERM(hash) OR TERM(tgssub) OR TERM(asktgs)
  OR TERM(renew) OR TERM(describe) OR TERM(monitor) OR TERM(purge) OR TERM(klist)
  OR TERM(triage) OR TERM(dump) OR TERM(tgtdeleg) OR TERM(kerberoast) OR TERM(asreproast)
  OR TERM(currentluid)) |regex process="(?i)\.exe\"?\s+(((harvest|ptt|s4u|asktgt|brute|createnetonly|changepw|hash|tgssub|asktgs|renew|describe|monitor)(\s+)?\/\w+\:)|((purge|klist|triage|dump|tgtdeleg|kerberoast|asreproast|currentluid)((\s+)?\/\w+)?))"
  | table _time, host, user, signature_id, process, process_id, process_name, parent_process_name
  | bin span=1s | stats values(*) as * by _time, host '
techniques:
- credential-access:steal or forge kerberos tickets
- credential-access:steal or forge kerberos tickets:golden ticket
- credential-access:steal or forge kerberos tickets:silver ticket
- credential-access:steal or forge kerberos tickets:kerberoasting
technique_id:
- T1558
- T1558.003
- T1558.002
- T1558.001
data_category:
- Windows Sysmon
references:
- https://github.com/GhostPack/Rubeus

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` TERM(exe) ("EventCode=1" OR "<EventID>1<") (
    TERM(harvest)
    OR TERM(ptt)
    OR TERM(s4u)
    OR TERM(asktgt)
    OR TERM(brute)
    OR TERM(createnetonly)
    OR TERM(changepw)
    OR TERM(hash)
    OR TERM(tgssub)
    OR TERM(asktgs)
    OR TERM(renew)
    OR TERM(describe)
    OR TERM(monitor)
    OR TERM(purge)
    OR TERM(klist)
    OR TERM(triage)
    OR TERM(dump)
    OR TERM(tgtdeleg)
    OR TERM(kerberoast)
    OR TERM(asreproast)
    OR TERM(currentluid)
)

Stage 2: regex

| regex
    process="(?i)\.exe\"?\s+(((harvest|ptt|s4u|asktgt|brute|createnetonly|changepw|hash|tgssub|asktgs|renew|describe|monitor)(\s+)?\/\w+\:)|((purge|klist|triage|dump|tgtdeleg|kerberoast|asreproast|currentluid)((\s+)?\/\w+)?))"

Stage 3: table

| table _time, host, user, signature_id, process, process_id, process_name, 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
processregex_match
  • (?i).exe"?\s+(((harvest|ptt|s4u|asktgt|brute|createnetonly|changepw|hash|tgssub|asktgs|renew|describe|monitor)(\s+)?\/\w+\:)|((purge|klist|triage|dump|tgtdeleg|kerberoast|asreproast|currentluid)((\s+)?\/\w+)?)) corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1exe
1"EventCode=1"
1"<EventID>1<"
1harvest
1ptt
1s4u
1asktgt
1brute
1createnetonly
1changepw
1hash
1tgssub
1asktgs
1renew
1describe
1monitor
1purge
1klist
1triage
1dump
1tgtdeleg
1kerberoast
1asreproast
1currentluid

Spoolsv Spawning Rundll32

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

The following analytic detects the spawning of rundll32.exe without command-line arguments by spoolsv.exe, which is unusual and potentially indicative of exploitation attempts like CVE-2021-34527 (PrintNightmare). This detection leverages Endpoint Detection and Response (EDR) telemetry, focusing on process creation events where spoolsv.exe is the parent process. This activity is significant as spoolsv.exe typically does not spawn other processes, and such behavior could indicate an active exploitation attempt. If confirmed malicious, this could allow an attacker to execute arbitrary code, escalate privileges, or maintain persistence on the compromised endpoint.

Known False Positives

  • Limited false positives have been identified. There are limited instances where `rundll32.exe` may be spawned by a legitimate print driver.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Spoolsv Spawning Rundll32
id: 15d905f6-da6b-11eb-ab82-acde48001122
version: 14
creation_date: '2021-07-01'
modification_date: '2026-05-13'
author: Mauricio Velazco, Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects the spawning of `rundll32.exe` without command-line arguments by `spoolsv.exe`, which is unusual and potentially indicative of exploitation attempts like CVE-2021-34527 (PrintNightmare). This detection leverages Endpoint Detection and Response (EDR) telemetry, focusing on process creation events where `spoolsv.exe` is the parent process. This activity is significant as `spoolsv.exe` typically does not spawn other processes, and such behavior could indicate an active exploitation attempt. If confirmed malicious, this could allow an attacker to execute arbitrary code, escalate privileges, or maintain persistence on the compromised endpoint.
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=spoolsv.exe `process_rundll32`
      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)`
    | `spoolsv_spawning_rundll32_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Limited false positives have been identified. There are limited instances where `rundll32.exe` may be spawned by a legitimate print driver.
references:
    - https://www.truesec.com/hub/blog/fix-for-printnightmare-cve-2021-1675-exploit-to-keep-your-print-servers-running-while-a-patch-is-not-available
    - https://www.truesec.com/hub/blog/exploitable-critical-rce-vulnerability-allows-regular-users-to-fully-compromise-active-directory-printnightmare-cve-2021-1675
    - https://www.reddit.com/r/msp/comments/ob6y02/critical_vulnerability_printnightmare_exposes
finding:
    title: $parent_process_name$ has spawned $process_name$ on endpoint $dest$. This behavior is suspicious and related to PrintNightmare.
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - PrintNightmare CVE-2021-34527
    - Compromised Windows Host
    - Black Basta Ransomware
asset_type: Endpoint
cve:
    - CVE-2021-34527
mitre_attack_id:
    - T1547.012
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=spoolsv.exe `process_rundll32`
  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

| `spoolsv_spawning_rundll32_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • RUNDLL32.EXE corpus 72 (sigma 35, splunk 21, elastic 16)
field:"OriginalFileName" kind:eq value:"RUNDLL32.EXE"
Processes.parent_process_nameeq
  • spoolsv.exe corpus 5 (elastic 3, splunk 2)
field:"parent_process_basename" kind:eq value:"spoolsv.exe"
Processes.process_nameeq
  • rundll32.exe corpus 123 (elastic 100, splunk 23)
field:"process_basename" kind:eq value:"rundll32.exe"

Suspicious Registry Key Created (Windows Event Log)

#
Group by
_time, host, process_name
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.6155'
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_winevent` (TERM(EventCode=4657) OR
  "<EventID>4657<") Operation_Type="New registry value created" (TERM(vbs) OR TERM(dll))|
  regex New_Value="\.(vbs|dll)" | table _time, host, user parent_*, process, process_*,
  signature_id, Object_*, Operation_*, New_* | bin span=60s | stats values(*) as *
  by _time, host, process_name | where event_count < 3 | fields - Object_*, Operation_*,
  New_* `hec_collect`'
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:
- File monitoring
- Windows event logs
references:
- https://blog.talosintelligence.com/2021/09/tinyturla.html

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4657) OR "<EventID>4657<") Operation_Type="New registry value created" (TERM(vbs) OR TERM(dll))

Stage 2: regex

| regex New_Value="\.(vbs|dll)"

Stage 3: table

| table _time, host, user parent_*, process, process_*, signature_id, Object_*, Operation_*, New_*

Stage 4: bucket

| bin span=60s

Stage 5: stats

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

Stage 6: where

| where event_count < 3

Stage 7: fields

| fields - Object_*, Operation_*, New_* `hec_collect`

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4657<"
1vbs
1dll

System Processes Run From Unexpected Locations

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

The following analytic identifies system processes running from unexpected locations outside of paths such as C:\Windows\System32\ or C:\Windows\SysWOW64. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process paths, names, and hashes. This activity is significant as it may indicate a malicious process attempting to masquerade as a legitimate system process. If confirmed malicious, this behavior could allow an attacker to execute code, escalate privileges, or maintain persistence within the environment, posing a significant security risk.

Known False Positives

  • This detection may require tuning based on third party applications utilizing native Windows binaries in non-standard paths.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: System Processes Run From Unexpected Locations
id: a34aae96-ccf8-4aef-952c-3ea21444444d
version: 17
creation_date: '2019-10-16'
modification_date: '2026-05-13'
author: David Dorsey, Michael Haag, Nasreddine Bencherchali, Splunk
status: production
type: Anomaly
description: The following analytic identifies system processes running from unexpected locations outside of paths such as `C:\Windows\System32\` or `C:\Windows\SysWOW64`. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process paths, names, and hashes. This activity is significant as it may indicate a malicious process attempting to masquerade as a legitimate system process. If confirmed malicious, this behavior could allow an attacker to execute code, escalate privileges, or maintain persistence within the environment, posing a significant security risk.
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
      NOT Processes.process_path IN (
        "*:\\$WINDOWS.~BT\\*",
        "*:\\$WinREAgent\\*",
        "*:\\Program Files \(x86\)\\Windows Kits\\10\\App Certification Kit\\*",
        "*:\\Windows\\SoftwareDistribution\\*",
        "*:\\Windows\\System32\\*",
        "*:\\Windows\\SystemTemp\\*",
        "*:\\Windows\\SysWOW64\\*",
        "*:\\Windows\\uus\\*",
        "*:\\Windows\\WinSxS\\*"
      )
    by Processes.action Processes.dest Processes.original_file_name Processes.parent_process
       Processes.parent_process_exec Processes.parent_process_guid Processes.parent_process_id
       Processes.parent_process_name Processes.parent_process_path Processes.process
       Processes.process_exec Processes.process_guid Processes.process_hash
       Processes.process_id Processes.process_integrity_level Processes.process_name
       Processes.process_path Processes.user Processes.user_id Processes.vendor_product
    | `drop_dm_object_name("Processes")`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | lookup update=true is_windows_system_file filename as process_name OUTPUT systemFile
    | search systemFile=true
    | `system_processes_run_from_unexpected_locations_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: This detection may require tuning based on third party applications utilizing native Windows binaries in non-standard paths.
references:
    - https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1036.003/T1036.003.yaml
    - https://attack.mitre.org/techniques/T1036/003/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A System process $process_name$ is running from $process_path$ on $dest$, potentially non-standard.
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - Suspicious Command-Line Executions
    - Unusual Processes
    - Ransomware
    - Masquerading - Rename System Utilities
    - Qakbot
    - Windows Error Reporting Service Elevation of Privilege Vulnerability
    - DarkGate Malware
asset_type: Endpoint
mitre_attack_id:
    - T1036.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
  count min(_time) as firstTime max(_time) as lastTime
  FROM datamodel=Endpoint.Processes where
  NOT Processes.process_path IN (
    "*:\\$WINDOWS.~BT\\*",
    "*:\\$WinREAgent\\*",
    "*:\\Program Files \(x86\)\\Windows Kits\\10\\App Certification Kit\\*",
    "*:\\Windows\\SoftwareDistribution\\*",
    "*:\\Windows\\System32\\*",
    "*:\\Windows\\SystemTemp\\*",
    "*:\\Windows\\SysWOW64\\*",
    "*:\\Windows\\uus\\*",
    "*:\\Windows\\WinSxS\\*"
  )
by Processes.action Processes.dest Processes.original_file_name Processes.parent_process
   Processes.parent_process_exec Processes.parent_process_guid Processes.parent_process_id
   Processes.parent_process_name Processes.parent_process_path Processes.process
   Processes.process_exec Processes.process_guid Processes.process_hash
   Processes.process_id Processes.process_integrity_level Processes.process_name
   Processes.process_path Processes.user Processes.user_id Processes.vendor_product

Stage 2: search

| `drop_dm_object_name("Processes")`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: lookup

| lookup update=true is_windows_system_file filename as process_name OUTPUT systemFile
Lookup table
is_windows_system_file
Key field
filename as process_name
Output columns
['systemFile', 'systemFile']

Stage 6: search

| search systemFile=true

Stage 7: search

| `system_processes_run_from_unexpected_locations_filter`

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
Processes.process_pathin*:\$WINDOWS.~BT\*, *:\$WinREAgent\*, *:\Program Files \(x86\)\Windows Kits\10\App Certification Kit\*, *:\Windows\SoftwareDistribution\*, *:\Windows\SysWOW64\*, *:\Windows\System32\*, *:\Windows\SystemTemp\*, *:\Windows\WinSxS\*, *:\Windows\uus\*excludes:Processes.process_path

Windows Admin$ Share Access (Sysmon)

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

Windows systems have hidden network shares that are accessible only to administrators and provide the ability for remote file copy and other administrative functions. This Use case identifies when network shares C$, ADMIN$, and IPC$ have had an object call. Adversaries may use this technique in conjunction with administrator-level Valid Accounts to remotely access a networked system

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '5707.11625'
title: Windows Admin$ Share Access
description: 'Windows systems have hidden network shares that are accessible only
  to administrators and provide the ability for remote file copy and other administrative
  functions. This Use case identifies when network shares C$, ADMIN$, and IPC$ have
  had an object call. Adversaries may use this technique in conjunction with administrator-level
  Valid Accounts to remotely access a networked system. -- Threat Actor Association:
  APT35/PHOSPHORUS, BlackCat, Blackmatter, Carbanak, Darkside, FIN7, FIN8 (Syssphinx),
  Lazarus, Mustang Panda (aka. Stately Taurus//Earth Preta/BRONZE PRESIDENT/TA416/RedDelta),
  TA551, Vice Society, Volt Typhoon (Bronze Silhouette, Vanguard Panda), Wizard Spider
  - Software Association: Bazar, Conti, DatopLoader, HermeticWiper/Trojan.Killdisk,
  Prestige, Prometheus / Spook, Sodinokibi/REvil, XingLocker -- Atomics T1021.002
  Test#1 Atomics T1021.002 Test#2 Atomics T1021.002 Test#4'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "EventID>1<"
  OR TERM(EventCode=11) OR "EventID>11<") "admin$" | table _time, host, user, signature_id,
  process, process_*, parent_process_*t `group_events("host", 1)` '
techniques:
- lateral-movement:remote services:smb/windows admin shares
technique_id:
- T1021.002
data_category:
- Windows Sysmon
references:
- https://support.malwarebytes.com/hc/en-us/articles/360038524714

Stages and Predicates

Stage 1: search

search EventCode=1 EventCode=11 source="*" source IN (
    "WinEventLog:Microsoft-Windows-Sysmon/Operational",
    "XmlWinEventLog:Microsoft-Windows-Sysmon/Operational"
)

Stage 2: table

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

Stage 3: bucket

bucket _time

Stage 4: stats

stats BY host, _time

Indicators

These rows show field, operator, and value matches.

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

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"EventID>1<"
1"EventID>11<"
1"admin$"

Windows Alternate DataStream - Base64 Content

#
Status
production
Severity
medium
Group by
Contents, base64, command_line, dest, dvc, file_hash, file_name, process_guid, process_id, process_name, signature, signature_id, target_filename, user_id, vendor_product
Author
Steven Dick, Teoderick Contreras, Michael Haag, Splunk
Source
github.com/splunk/security_content

The following analytic detects the creation of Alternate Data Streams (ADS) with Base64 content on Windows systems. It leverages Sysmon EventID 15, which captures file creation events, including the content of named streams. ADS can conceal malicious payloads, making them significant for SOC monitoring. This detection identifies hidden streams that may contain executables, scripts, or configuration data, often used by malware to evade detection. If confirmed malicious, this activity could allow attackers to hide and execute payloads, persist in the environment, or access sensitive information without being easily detected.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 15: FileCreateStreamHash

Rule Body

name: Windows Alternate DataStream - Base64 Content
id: 683f48de-982f-4a7e-9aac-9cec550da498
version: 13
creation_date: '2024-01-10'
modification_date: '2026-05-13'
author: Steven Dick, Teoderick Contreras, Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects the creation of Alternate Data Streams (ADS) with Base64 content on Windows systems. It leverages Sysmon EventID 15, which captures file creation events, including the content of named streams. ADS can conceal malicious payloads, making them significant for SOC monitoring. This detection identifies hidden streams that may contain executables, scripts, or configuration data, often used by malware to evade detection. If confirmed malicious, this activity could allow attackers to hide and execute payloads, persist in the environment, or access sensitive information without being easily detected.
data_source:
    - Sysmon EventID 15
search: '`sysmon` EventCode=15 NOT Contents IN ("-","[ZoneTransfer]*") | regex TargetFilename="(?<!\/)\b\w+(\.\w+)?:\w+(\.\w+)?$" | regex Contents="(?:[A-Za-z0-9+/]{128,})(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" | eval file_name = replace(TargetFilename,"(.*\\\)",""), process = Image , file_path = TargetFilename , base64 = Contents, file_hash = coalesce(SHA256,SHA1,MD5,Hash) | stats count min(_time) as firstTime max(_time) as lastTime by dest dvc file_hash file_name file_path process process_exec process_guid process_id process_name process_path signature signature_id user_id vendor_product Contents Image base64 | `base64decode(base64)` | fields - base64 | rename base64_decode as command | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_alternate_datastream___base64_content_filter`'
how_to_implement: Target environment must ingest sysmon data, specifically Event ID 15.
known_false_positives: No false positives have been identified at this time.
references:
    - https://gist.github.com/api0cradle/cdd2d0d0ec9abb686f0e89306e277b8f
    - https://car.mitre.org/analytics/CAR-2020-08-001/
    - https://blogs.juniper.net/en-us/threat-research/bitpaymer-ransomware-hides-behind-windows-alternate-data-streams
    - https://blog.netwrix.com/2022/12/16/alternate_data_stream/
    - https://github.com/trustedsec/SysmonCommunityGuide/blob/master/chapters/file-stream-creation-hash.md
finding:
    title: Base64 content written to an NTFS alternate data stream in $dest$, see command field for details.
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: file_name
      type: file_name
analytic_story:
    - Windows Defense Evasion Tactics
    - APT37 Rustonotto and FadeStealer
asset_type: Endpoint
mitre_attack_id:
    - T1564.004
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon` EventCode=15 NOT Contents IN ("-","[ZoneTransfer]*")

Stage 2: regex

| regex TargetFilename="(?<!\/)\b\w+(\.\w+)?:\w+(\.\w+)?$"

Stage 3: regex

| regex Contents="(?:[A-Za-z0-9+/]{128,})(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"

Stage 4: eval

| eval file_name = replace(TargetFilename,"(.*\\\)",""), process = Image ,
    file_path = TargetFilename , base64 = Contents, file_hash = coalesce(SHA256,SHA1,MD5,Hash)

Stage 5: stats

| stats
    count
    min(_time) as firstTime
    max(_time) as lastTime
  by
    dest
    dvc
    file_hash
    file_name
    file_path
    process
    process_exec
    process_guid
    process_id
    process_name
    process_path
    signature
    signature_id
    user_id
    vendor_product
    Contents
    Image
    base64

Stage 6: search

| `base64decode(base64)`

Stage 7: fields

| fields - base64

Stage 8: rename

| rename base64_decode as command

Stage 9: search

| `security_content_ctime(firstTime)`

Stage 10: search

| `security_content_ctime(lastTime)`

Stage 11: search

| `windows_alternate_datastream___base64_content_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Contentsregex_match
  • (?:[A-Za-z0-9+/]{128,})(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
field:"Contents" kind:regex_match value:"(?:[A-Za-z0-9+/]{128,})(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"
EventCodeeq
  • 15 corpus 6 (splunk 6)
field:"EventID" kind:eq value:"15"
TargetFilenameregex_match
  • (?<!\/)\b\w+(.\w+)?:\w+(.\w+)?$ corpus 2 (splunk 2)
field:"TargetFilename" kind:regex_match value:"(?<!\/)\b\w+(.\w+)?:\w+(.\w+)?$"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
Contentsin-, [ZoneTransfer]*excludes:Contents field:"Contents" value:"-" field:"Contents" value:"[ZoneTransfer]*"

Windows Command Shell DCRat ForkBomb Payload

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

The following analytic detects the execution of a DCRat "forkbomb" payload, which spawns multiple cmd.exe processes that launch notepad.exe instances in quick succession. This detection leverages Endpoint Detection and Response (EDR) data, focusing on the rapid creation of cmd.exe and notepad.exe processes within a 30-second window. This activity is significant as it indicates a potential DCRat infection, a known Remote Access Trojan (RAT) with destructive capabilities. If confirmed malicious, this behavior could lead to system instability, resource exhaustion, and potential disruption of services.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

name: Windows Command Shell DCRat ForkBomb Payload
id: 2bb1a362-7aa8-444a-92ed-1987e8da83e1
version: 14
creation_date: '2022-07-28'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects the execution of a DCRat "forkbomb" payload, which spawns multiple cmd.exe processes that launch notepad.exe instances in quick succession. This detection leverages Endpoint Detection and Response (EDR) data, focusing on the rapid creation of cmd.exe and notepad.exe processes within a 30-second window. This activity is significant as it indicates a potential DCRat infection, a known Remote Access Trojan (RAT) with destructive capabilities. If confirmed malicious, this behavior could lead to system instability, resource exhaustion, and potential disruption of services.
data_source:
    - Sysmon EventID 1
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` values(Processes.user) as user values(Processes.action) as action values(Processes.parent_process_exec) as parent_process_exec values(Processes.parent_process_guid) as parent_process_guid values(Processes.parent_process_id) as parent_process_id values(Processes.parent_process_path) as parent_process_path values(Processes.process) as process values(Processes.process_exec) as process_exec values(Processes.process_guid) as process_guid values(Processes.process_hash) as process_hash values(Processes.process_id) as process_id values(Processes.process_integrity_level) as process_integrity_level values(Processes.process_path) as process_path values(Processes.user_id) as user_id values(Processes.vendor_product) as vendor_product dc(Processes.parent_process_id) as parent_process_id_count dc(Processes.process_id) as process_id_count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.parent_process_name= "cmd.exe" (Processes.process_name = "notepad.exe"
        OR
        Processes.original_file_name= "notepad.exe") Processes.parent_process = "*.bat*"
      BY Processes.parent_process_name Processes.process_name Processes.original_file_name
         Processes.parent_process Processes.dest Processes.user
         _time span=30s
    | where parent_process_id_count>= 10 AND process_id_count >=10
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_command_shell_dcrat_forkbomb_payload_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: No false positives have been identified at this time.
references:
    - https://cert.gov.ua/article/405538
    - https://malpedia.caad.fkie.fraunhofer.de/details/win.dcrat
    - https://www.mandiant.com/resources/analyzing-dark-crystal-rat-backdoor
finding:
    title: Multiple cmd.exe processes with child process of notepad.exe executed on $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Compromised Windows Host
    - DarkCrystal RAT
asset_type: Endpoint
mitre_attack_id:
    - T1059.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    values(Processes.user) as user
    values(Processes.action) as action
    values(Processes.parent_process_exec) as parent_process_exec
    values(Processes.parent_process_guid) as parent_process_guid
    values(Processes.parent_process_id) as parent_process_id
    values(Processes.parent_process_path) as parent_process_path
    values(Processes.process) as process
    values(Processes.process_exec) as process_exec
    values(Processes.process_guid) as process_guid
    values(Processes.process_hash) as process_hash
    values(Processes.process_id) as process_id
    values(Processes.process_integrity_level) as process_integrity_level
    values(Processes.process_path) as process_path
    values(Processes.user_id) as user_id
    values(Processes.vendor_product) as vendor_product
    dc(Processes.parent_process_id) as parent_process_id_count
    dc(Processes.process_id) as process_id_count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.parent_process_name= "cmd.exe" (
      Processes.process_name = "notepad.exe"
      OR Processes.original_file_name= "notepad.exe"
  ) Processes.parent_process = "*.bat*"
  BY
    Processes.parent_process_name
    Processes.process_name
    Processes.original_file_name
    Processes.parent_process
    Processes.dest
    Processes.user
    _time span=30s

Stage 2: where

| where parent_process_id_count>= 10 AND process_id_count >=10

Stage 3: search

| `drop_dm_object_name(Processes)`

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `windows_command_shell_dcrat_forkbomb_payload_filter`

Indicators

These rows show field, operator, and value matches.

Windows EDRSilencer Custom Outbound Filter Added

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

The following analytic detects the EDRSilencer-specific Windows Filtering Platform filter name "Custom Outbound Filter" when it is configured with a block action. EDRSilencer creates WFP filters to block outbound traffic from EDR and security agent processes, impairing endpoint telemetry without requiring the tool binary to keep its original process name. EventCode 5447 identifies creation of the runtime filter with ChangeType %%16384, while EventCode 5441 can show the same persistent filter when the Base Filtering Engine starts.

Known False Positives

  • This filter name is associated with EDRSilencer behavior. Validate whether any approved administrative tooling creates WFP block filters with the same name before tuning.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows EDRSilencer Custom Outbound Filter Added
id: 67fea630-445d-4c70-a7d0-584fddb93b86
version: 1
creation_date: '2026-08-23'
modification_date: '2026-08-23'
author: Nasreddine Bencherchali, Splunk
status: production
type: TTP
description: |-
    The following analytic detects the EDRSilencer-specific Windows Filtering Platform filter name "Custom Outbound Filter" when it is configured with a block action.
    EDRSilencer creates WFP filters to block outbound traffic from EDR and security agent processes, impairing endpoint telemetry without requiring the tool binary to keep its original process name.
    EventCode 5447 identifies creation of the runtime filter with ChangeType %%16384, while EventCode 5441 can show the same persistent filter when the Base Filtering Engine starts.
data_source:
    - Windows Event Log Security 5441
    - Windows Event Log Security 5447
search: |-
    `wineventlog_security`
    (
        (
            (
                EventCode=5447
                ChangeType IN ("%%16384", "Add")
            )
            OR
            EventCode=5441
        )
        Action IN ("%%16389", "Block")
        FilterName="Custom Outbound Filter"
    )

    | eval user=coalesce(UserName,user,"unknown")
    | eval filter_action=case(Action="%%16389","Block", true(), Action),
           change_type=case(ChangeType="%%16384","Add", true(), ChangeType)

    | stats count min(_time) as firstTime
                  max(_time) as lastTime
                  values(filter_action) as filter_action
                  values(change_type) as change_type
                  values(ProviderName) as provider_name
                  values(FilterType) as filter_type
                  values(FilterId) as filter_id
                  values(FilterKey) as filter_key
                  values(LayerName) as layer_name
                  values(LayerId) as layer_id
                  values(Conditions) as conditions
                  values(CalloutName) as callout_name
      BY dest user process_id FilterName
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_edrsilencer_custom_outbound_filter_added_filter`
how_to_implement: |-
    To implement this analytic, enable auditing for Windows Filtering Platform policy changes and ingest Windows Security Event Log data with EventCode 5447 and EventCode 5441.
    The Splunk Add-on for Microsoft Windows should extract fields such as EventCode, ChangeType, FilterName, Conditions, and Action from XmlWinEventLog:Security events.
known_false_positives: |-
    This filter name is associated with EDRSilencer behavior.
    Validate whether any approved administrative tooling creates WFP block filters with the same name before tuning.
references:
    - https://github.com/netero1010/EDRSilencer
    - https://github.com/mthcht/awesome-lists/blob/main/Lists/Others/windows%20message%20tables/windows_messagetable_strings_list.csv
    - https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/auditing/event-5447
    - https://learn.microsoft.com/en-us/windows/win32/fwp/auditing-and-logging
finding:
    title: EDRSilencer WFP block filter [$FilterName$] was detected on [$dest$].
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: FilterName
      type: signature
analytic_story:
    - Disabling Security Tools
    - Security Solution Tampering
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: search

`wineventlog_security`
(
    (
        (
            EventCode=5447
            ChangeType IN ("%%16384", "Add")
        )
        OR
        EventCode=5441
    )
    Action IN ("%%16389", "Block")
    FilterName="Custom Outbound Filter"
)

Stage 2: eval

| eval user=coalesce(UserName,user,"unknown")

Stage 3: eval

| eval filter_action=case(Action="%%16389","Block", true(), Action),
       change_type=case(ChangeType="%%16384","Add", true(), ChangeType)
change_type =
ifChangeType = "%%16384""Add"
elseChangeType
filter_action =
ifAction = "%%16389""Block"
elseAction

Stage 4: stats

| stats count min(_time) as firstTime
              max(_time) as lastTime
              values(filter_action) as filter_action
              values(change_type) as change_type
              values(ProviderName) as provider_name
              values(FilterType) as filter_type
              values(FilterId) as filter_id
              values(FilterKey) as filter_key
              values(LayerName) as layer_name
              values(LayerId) as layer_id
              values(Conditions) as conditions
              values(CalloutName) as callout_name
  BY dest user process_id FilterName

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `windows_edrsilencer_custom_outbound_filter_added_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Actionin
  • %%16389 corpus 2 (splunk 2)
  • Block corpus 2 (splunk 2)
field:"Action" kind:in
ChangeTypein
  • %%16384 corpus 2 (splunk 2)
  • Add corpus 2 (splunk 2)
field:"ChangeType" kind:in
EventCodeeq
  • 5441
  • 5447 corpus 3 (splunk 3)
field:"EventID" kind:eq
FilterNameeq
  • Custom Outbound Filter
field:"FilterName" kind:eq value:"Custom Outbound Filter"

Windows Modify Registry Auto Minor Updates

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

The following analytic identifies a suspicious modification to the Windows auto update configuration registry. It detects changes to the registry path "*\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\AutoInstallMinorUpdates" with a value of "0x00000000". This activity is significant as it is commonly used by adversaries, including malware like RedLine Stealer, to bypass detection and deploy additional payloads. If confirmed malicious, this modification could allow attackers to evade defenses, potentially leading to further system compromise and exploitation of zero-day vulnerabilities.

Known False Positives

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

MITRE ATT&CK Coverage

TacticTechniques
Persistence
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows Modify Registry Auto Minor Updates
id: be498b9f-d804-4bbf-9fc0-d5448466b313
version: 9
creation_date: '2023-04-26'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Hunting
description: The following analytic identifies a suspicious modification to the Windows auto update configuration registry. It detects changes to the registry path "*\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\\AutoInstallMinorUpdates" with a value of "0x00000000". This activity is significant as it is commonly used by adversaries, including malware like RedLine Stealer, to bypass detection and deploy additional payloads. If confirmed malicious, this modification could allow attackers to evade defenses, potentially leading to further system compromise and exploitation of zero-day vulnerabilities.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path="*\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\\AutoInstallMinorUpdates" AND Registry.registry_value_data="0x00000000" by Registry.action Registry.dest Registry.process_guid Registry.process_id Registry.registry_hive Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.registry_value_name Registry.registry_value_type Registry.status Registry.user Registry.vendor_product | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `windows_modify_registry_auto_minor_updates_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Processes` node. In addition, confirm the latest CIM App 4.20 or higher is installed and the latest TA for the endpoint product.
known_false_positives: administrators may enable or disable this feature that may cause some false positive.
references:
    - https://learn.microsoft.com/de-de/security-updates/windowsupdateservices/18127499
analytic_story:
    - RedLine Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1112
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  from datamodel=Endpoint.Registry
  where
    Registry.registry_path="*\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\\AutoInstallMinorUpdates"
    AND Registry.registry_value_data="0x00000000"
  by
    Registry.action
    Registry.dest
    Registry.process_guid
    Registry.process_id
    Registry.registry_hive
    Registry.registry_path
    Registry.registry_key_name
    Registry.registry_value_data
    Registry.registry_value_name
    Registry.registry_value_type
    Registry.status
    Registry.user
    Registry.vendor_product

Stage 2: search

| `drop_dm_object_name(Registry)`

Stage 3: search

| `security_content_ctime(lastTime)`

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `windows_modify_registry_auto_minor_updates_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Registry.registry_patheq
  • *\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\AutoInstallMinorUpdates
field:"registry_path" kind:eq value:"*\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\AutoInstallMinorUpdates"
Registry.registry_value_dataeq
  • 0x00000000 corpus 41 (splunk 33, elastic 8)
field:"Details" kind:eq value:"0x00000000"

Windows Office Product Loading VBE7 DLL

#
Status
production
Severity
low
Group by
dest, image_loaded, original_file_name, process_guid, process_hash, process_id, process_name, service_dll_signature_exists, service_dll_signature_verified, signature, signature_id, user_id, vendor_product
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic identifies office documents executing macro code. It leverages Sysmon EventCode 7 to detect when processes like WINWORD.EXE or EXCEL.EXE load specific DLLs associated with macros (e.g., VBE7.DLL). This activity is significant because macros are a common attack vector for delivering malicious payloads, such as malware. If confirmed malicious, this could lead to unauthorized code execution, data exfiltration, or further compromise of the system. Disabling macros by default is recommended to mitigate this risk.

Known False Positives

  • False positives may occur if legitimate office documents are executing macro code. Ensure to investigate the macro code and the command to be executed. If the macro code is benign, add the document name to the exclusion list. Some applications may legitimately load VBE7INTL.DLL, VBE7.DLL, or VBEUI.DLL.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 7: Image loaded

Rule Body

name: Windows Office Product Loading VBE7 DLL
id: 7cfec906-2697-43f7-898b-83634a051d9a
version: 7
creation_date: '2021-04-14'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic identifies office documents executing macro code. It leverages Sysmon EventCode 7 to detect when processes like WINWORD.EXE or EXCEL.EXE load specific DLLs associated with macros (e.g., VBE7.DLL). This activity is significant because macros are a common attack vector for delivering malicious payloads, such as malware. If confirmed malicious, this could lead to unauthorized code execution, data exfiltration, or further compromise of the system. Disabling macros by default is recommended to mitigate this risk.
data_source:
    - Sysmon EventID 7
search: '`sysmon` EventCode=7 process_name IN ("EQNEDT32.exe", "excel.exe", "Graph.exe", "msaccess.exe", "mspub.exe", "onenote.exe", "onenoteim.exe", "onenotem.exe", "outlook.exe", "powerpnt.exe", "visio.exe", "winproj.exe", "winword.exe") loaded_file_path IN ("*\\VBE7INTL.DLL", "*\\VBE7.DLL", "*\\VBEUI.DLL") | fillnull | stats count min(_time) as firstTime max(_time) as lastTime by Image ImageLoaded dest loaded_file loaded_file_path original_file_name process_exec process_guid process_hash process_id process_name process_path service_dll_signature_exists service_dll_signature_verified signature signature_id user_id vendor_product | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_office_product_loading_vbe7_dll_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name and ImageLoaded (Like sysmon EventCode 7) from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA. Also be sure to include those monitored dll to your own sysmon config.
known_false_positives: False positives may occur if legitimate office documents are executing macro code. Ensure to investigate the macro code and the command to be executed. If the macro code is benign, add the document name to the exclusion list. Some applications may legitimately load VBE7INTL.DLL, VBE7.DLL, or VBEUI.DLL.
references:
    - https://www.joesandbox.com/analysis/386500/0/html
    - https://www.joesandbox.com/analysis/702680/0/html
    - https://bazaar.abuse.ch/sample/02cbc1ab80695fc12ff8822b926957c3a600247b9ca412a137f69cb5716c8781/
    - https://www.fortinet.com/blog/threat-research/latest-remcos-rat-phishing
    - https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/trojanized-onenote-document-leads-to-formbook-malware/
    - https://www.fortinet.com/blog/threat-research/leveraging-microsoft-office-documents-to-deliver-agent-tesla-and-njrat
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Office document executing a macro on $dest$
analytic_story:
    - Spearphishing Attachments
    - Trickbot
    - IcedID
    - DarkCrystal RAT
    - AgentTesla
    - Qakbot
    - Azorult
    - Remcos
    - PlugX
    - NjRAT
    - MuddyWater
asset_type: Endpoint
mitre_attack_id:
    - T1566.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon` EventCode=7 process_name IN (
    "EQNEDT32.exe",
    "excel.exe",
    "Graph.exe",
    "msaccess.exe",
    "mspub.exe",
    "onenote.exe",
    "onenoteim.exe",
    "onenotem.exe",
    "outlook.exe",
    "powerpnt.exe",
    "visio.exe",
    "winproj.exe",
    "winword.exe"
) loaded_file_path IN ("*\\VBE7INTL.DLL", "*\\VBE7.DLL", "*\\VBEUI.DLL")

Stage 2: fillnull

| fillnull

Stage 3: stats

| stats
    count
    min(_time) as firstTime
    max(_time) as lastTime
  by
    Image
    ImageLoaded
    dest
    loaded_file
    loaded_file_path
    original_file_name
    process_exec
    process_guid
    process_hash
    process_id
    process_name
    process_path
    service_dll_signature_exists
    service_dll_signature_verified
    signature
    signature_id
    user_id
    vendor_product

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `windows_office_product_loading_vbe7_dll_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 7 corpus 39 (splunk 39)
field:"EventID" kind:eq value:"7"
loaded_file_pathin
  • *\VBE7.DLL
  • *\VBE7INTL.DLL
  • *\VBEUI.DLL
field:"ImageLoaded" kind:in
process_namein
  • EQNEDT32.exe corpus 4 (splunk 4)
  • Graph.exe corpus 3 (splunk 3)
  • excel.exe corpus 3 (splunk 3)
  • msaccess.exe corpus 3 (splunk 3)
  • mspub.exe corpus 3 (splunk 3)
  • onenote.exe corpus 3 (splunk 3)
  • onenoteim.exe corpus 3 (splunk 3)
  • onenotem.exe corpus 3 (splunk 3)
  • outlook.exe corpus 3 (splunk 3)
  • powerpnt.exe corpus 3 (splunk 3)
  • visio.exe corpus 3 (splunk 3)
  • winproj.exe corpus 3 (splunk 3)
  • winword.exe corpus 3 (splunk 3)
field:"process_name" kind:in

Windows Time Based Evasion

#
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 potentially malicious processes that initiate a ping delay using an invalid IP address. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on command-line executions involving "ping 0 -n". Malware like NJRAT was observed using this technique to introduce time delays for evasion tactics, such as delaying self-deletion. If confirmed malicious, this activity could indicate an active infection attempting to evade detection, potentially leading to further compromise and persistence within the environment.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

name: Windows Time Based Evasion
id: 34502357-deb1-499a-8261-ffe144abf561
version: 14
creation_date: '2023-09-19'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: |-
    The following analytic detects potentially malicious processes that initiate a ping delay using an invalid IP address.
    It leverages data from Endpoint Detection and Response (EDR) agents, focusing on command-line executions involving "ping 0 -n".
    Malware like NJRAT was observed using this technique to introduce time delays for evasion tactics, such as delaying self-deletion.
    If confirmed malicious, this activity could indicate an active infection attempting to evade detection, potentially leading to further compromise and persistence within the environment.
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.process_name = "ping.exe"
    (
        Processes.parent_process IN (
            "*ping  0 -n *",
            "*ping 0 -n *",
            "*ping.exe  0 -n *",
            "*ping.exe 0 -n *"
        )
        OR
        Processes.process IN (
            "*ping  0 -n *",
            "*ping 0 -n *",
            "*ping.exe  0 -n *",
            "*ping.exe 0 -n *"
        )
    )

    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_time_based_evasion_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: No false positives have been identified at this time.
references:
    - https://malpedia.caad.fkie.fraunhofer.de/details/win.njrat
finding:
    title: A $process_name$ did a suspicious ping to invalid IP address on $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - NjRAT
    - BlankGrabber Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1497.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

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

FROM datamodel=Endpoint.Processes WHERE

Processes.process_name = "ping.exe"
(
    Processes.parent_process IN (
        "*ping  0 -n *",
        "*ping 0 -n *",
        "*ping.exe  0 -n *",
        "*ping.exe 0 -n *"
    )
    OR
    Processes.process IN (
        "*ping  0 -n *",
        "*ping 0 -n *",
        "*ping.exe  0 -n *",
        "*ping.exe 0 -n *"
    )
)

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.parent_processin
  • *ping 0 -n *
  • *ping 0 -n *
  • *ping.exe 0 -n *
  • *ping.exe 0 -n *
field:"ParentCommandLine" kind:in
Processes.processin
  • *ping 0 -n *
  • *ping 0 -n *
  • *ping.exe 0 -n *
  • *ping.exe 0 -n *
field:"CommandLine" kind:in
Processes.process_nameeq
  • ping.exe corpus 12 (elastic 8, splunk 2, kusto 2)
field:"process_basename" kind:eq value:"ping.exe"

Windows Unusual File Creation in Confluence Directory

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

Detects executable file formats being created within the Confluence main directory. This can be indicative of exploitation of the Confluence web services to stage malware. This won't catch adversaries who modify the output location outside the Confluence directory when exploiting.

Known False Positives

  • Some legitimate administrative or development activities may create executable files in the Confluence directory. Review and filter based on approved maintenance processes.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 11: FileCreate

Rule Body

name: Windows Unusual File Creation in Confluence Directory
id: aa9d80d9-ed47-44da-aceb-2909ca4dc19e
version: 2
creation_date: '2021-09-02'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: Anomaly
description: |-
    Detects executable file formats being created within the Confluence main directory.
    This can be indicative of exploitation of the Confluence web services to stage malware.
    This won't catch adversaries who modify the output location outside the Confluence directory when exploiting.
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="*\\Atlassian\\Confluence\\*"
    Filesystem.file_path IN (
        "*.bat",
        "*.cmd",
        "*.dat",
        "*.dll",
        "*.exe",
        "*.msc",
        "*.ps1",
        "*.vbe",
        "*.vbs"
    )

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

    | `drop_dm_object_name(Filesystem)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_unusual_file_creation_in_confluence_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: Some legitimate administrative or development activities may create executable files in the Confluence directory. Review and filter based on approved maintenance processes.
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Executable file created under a Confluence path at $file_path$ on $dest$.
threat_objects:
    - field: file_path
      type: file_path
analytic_story:
    - Confluence Data Center and Confluence Server Vulnerabilities
    - CVE-2023-22515 Privilege Escalation Vulnerability Confluence Data Center and Server
asset_type: Endpoint
mitre_attack_id:
    - T1190
    - T1608.001
    - T1608.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

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

from datamodel=Endpoint.Filesystem where

Filesystem.file_path="*\\Atlassian\\Confluence\\*"
Filesystem.file_path IN (
    "*.bat",
    "*.cmd",
    "*.dat",
    "*.dll",
    "*.exe",
    "*.msc",
    "*.ps1",
    "*.vbe",
    "*.vbs"
)

by Filesystem.dest Filesystem.file_create_time Filesystem.process_path
   Filesystem.process_guid Filesystem.process_id Filesystem.file_path Filesystem.action
   Filesystem.file_name 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_unusual_file_creation_in_confluence_directory_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Filesystem.file_patheq
  • *\Atlassian\Confluence\*
field:"TargetFilename" kind:eq value:"*\Atlassian\Confluence\*"
Filesystem.file_pathin
  • *.bat
  • *.cmd corpus 2 (splunk 2)
  • *.dat
  • *.dll corpus 3 (splunk 3)
  • *.exe corpus 3 (splunk 3)
  • *.msc
  • *.ps1 corpus 2 (splunk 2)
  • *.vbe
  • *.vbs corpus 2 (splunk 2)
field:"TargetFilename" kind:in

Windows Visual Basic Commandline Compiler DNSQuery

#
Status
production
Severity
medium
Group by
QueryName, QueryResults, QueryStatus, answer, answer_count, dest, process_guid, process_name, query, query_count, reply_code_id, signature, signature_id, src, user_id, vendor_product
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects instances where vbc.exe, the Visual Basic Command Line Compiler, initiates DNS queries. Normally, vbc.exe operates locally to compile Visual Basic code and does not require internet access or to perform DNS lookups. Therefore, any observed DNS activity originating from vbc.exe is highly suspicious and indicative of potential malicious activity. This behavior often suggests that a malicious payload is masquerading as the legitimate vbc.exe process to establish command-and-control (C2) communication, resolve domains for data exfiltration, or download additional stages of malware. Security teams should investigate the process's parent, command-line arguments, and the resolved domains for further indicators of compromise.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

Telemetry Coverage

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

Rule Body

name: Windows Visual Basic Commandline Compiler DNSQuery
id: 8976744a-ae7a-46a4-8128-690df85c2af4
version: 6
creation_date: '2025-08-28'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects instances where vbc.exe, the Visual Basic Command Line Compiler, initiates DNS queries. Normally, vbc.exe operates locally to compile Visual Basic code and does not require internet access or to perform DNS lookups. Therefore, any observed DNS activity originating from vbc.exe is highly suspicious and indicative of potential malicious activity. This behavior often suggests that a malicious payload is masquerading as the legitimate vbc.exe process to establish command-and-control (C2) communication, resolve domains for data exfiltration, or download additional stages of malware. Security teams should investigate the process's parent, command-line arguments, and the resolved domains for further indicators of compromise.
data_source:
    - Sysmon EventID 22
search: |-
    `sysmon` EventCode=22 process_name="vbc.exe"
      | rename dvc as dest
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY answer answer_count dest
           process_exec process_guid process_name
           query query_count reply_code_id
           signature signature_id src
           user_id vendor_product QueryName
           QueryResults QueryStatus
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `windows_visual_basic_commandline_compiler_dnsquery_filter`
how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name and eventcode = 22 dnsquery executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA. Tune and filter known instances where renamed rundll32.exe may be used.
known_false_positives: No false positives have been identified at this time.
references:
    - https://www.cisa.gov/news-events/cybersecurity-advisories/aa20-266a
finding:
    title: vbc.exe process [$process_name$] made a DNS query for $query$ from host $dest$.
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - Lokibot
asset_type: Endpoint
mitre_attack_id:
    - T1071.004
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon` EventCode=22 process_name="vbc.exe"

Stage 2: rename

| rename dvc as dest

Stage 3: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY answer answer_count dest
       process_exec process_guid process_name
       query query_count reply_code_id
       signature signature_id src
       user_id vendor_product QueryName
       QueryResults QueryStatus

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `windows_visual_basic_commandline_compiler_dnsquery_filter`

Indicators

These rows show field, operator, and value matches.

WinRM Tools (PowerShell)

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

Winrm is a command–line tool for system management is implemented in a Visual Basic Scripting Edition file (Winrm.vbs) written using the WinRM scripting API. This tool enables an administrator to configure WinRM and to get data or manage resources. Winrs.exe is a command line tool enables administrators to remotely execute most Cmd.exe commands using the WS-Management protocol. -- The WMI command-line (WMIC) utility provides a command-line interface for Windows Management Instrumentation (WMI). WMIC is compatible with existing shells and utility commands. - ThreatActor Association: Antlion, APT27/Emissary Panda, APT29/Nobelium/Cozy Bear, Carbanak, APT34/OilRig, FIN6, FIN7, FIN8 (Syssphinx), FIN12, FIN13, Flax Typhoon, GhostShell, Lazarus, Magic Hound (aka APT35, Charming Kitten, Phosphorus, and Mint Sandstorm), MalKamak, MuddyWater, TA2541, TA551, Vice Society, Volt Typhoon, WinterVivern/UAC-0114, Witchetty, Wizard Spider

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '5490.5671'
title: WinRM Tools
description: 'Winrm is a command–line tool for system management is implemented in
  a Visual Basic Scripting Edition file (Winrm.vbs) written using the WinRM scripting
  API. This tool enables an administrator to configure WinRM and to get data or manage
  resources. Winrs.exe is a command line tool enables administrators to remotely execute
  most Cmd.exe commands using the WS-Management protocol. -- The WMI command-line
  (WMIC) utility provides a command-line interface for Windows Management Instrumentation
  (WMI). WMIC is compatible with existing shells and utility commands. - ThreatActor
  Association: Antlion, APT27/Emissary Panda, APT29/Nobelium/Cozy Bear, Carbanak,
  APT34/OilRig, FIN6, FIN7, FIN8 (Syssphinx), FIN12, FIN13, Flax Typhoon, GhostShell,
  Lazarus, Magic Hound (aka APT35, Charming Kitten, Phosphorus, and Mint Sandstorm),
  MalKamak, MuddyWater, TA2541, TA551, Vice Society, Volt Typhoon, WinterVivern/UAC-0114,
  Witchetty, Wizard Spider -- Software Association: ALPHV/BlackCat, Astaroth, Avaddon,
  AvosLocker, BadHatch, Bazar, Blackcat/ALPHV, Black Basta, Clop, Conti, Cring, IcedID,
  Play, Quantum, Ryuk, SamSam, Sodinokibi/REvil, Vice Society, XingLocker -- Atomics
  T1047 Test#1 Atomics T1047 Test#2 Atomics T1047 Test#3 Atomics T1047 Test#4 Atomics
  T1047 Test#5 Atomics T1047 Test#6 Atomics T1047 Test#9 Atomics T1518.001 Test#6'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104))
  (TERM(winrm) OR TERM(winrs) OR TERM(wmic)) | table _time, host, user, signature_id,
  process | bin span=1s | stats values(*) as * by _time, host | eventstats c(process)
  as c_process by process | where c_process < 25 '
techniques:
- lateral-movement:remote services:windows remote management
- execution:windows management instrumentation
technique_id:
- T1021.006
- T1047
data_category:
- PowerShell logs
references:
- http://msdn.microsoft.com/en-us/library/aa384426

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4104)) (TERM(winrm) OR TERM(winrs) OR TERM(wmic))

Stage 2: table

| table _time, host, user, signature_id, process

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Stage 5: eventstats

| eventstats c(process) as c_process by process

Stage 6: where

| where c_process < 25

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
c_processlt
  • 25 corpus 4 (splunk 4)
field:"c_process" kind:lt value:"25"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1winrm
1winrs
1wmic

WordPress Bricks Builder plugin RCE

#
Status
production
Severity
medium
Group by
Web.src, Web.status, c-uri, c-uri-stem, c-useragent, channel, cs-host, cs-method, sourcetype
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

The following analytic identifies potential exploitation of the WordPress Bricks Builder plugin RCE vulnerability. It detects HTTP POST requests to the URL path "/wp-json/bricks/v1/render_element" with a status code of 200, leveraging the Web datamodel. This activity is significant as it indicates an attempt to exploit CVE-2024-25600, a known vulnerability that allows remote code execution. If confirmed malicious, an attacker could execute arbitrary commands on the target server, leading to potential full system compromise and unauthorized access to sensitive data.

Known False Positives

  • False positives may be possible, however we restricted it to HTTP Status 200 and POST requests, based on the POC. Upon investigation review the POST body for the actual payload - or command - being executed.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access

Rule Body

name: WordPress Bricks Builder plugin RCE
id: 56a8771a-3fda-4959-b81d-2f266e2f679f
version: 10
creation_date: '2024-02-22'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic identifies potential exploitation of the WordPress Bricks Builder plugin RCE vulnerability. It detects HTTP POST requests to the URL path "/wp-json/bricks/v1/render_element" with a status code of 200, leveraging the Web datamodel. This activity is significant as it indicates an attempt to exploit CVE-2024-25600, a known vulnerability that allows remote code execution. If confirmed malicious, an attacker could execute arbitrary commands on the target server, leading to potential full system compromise and unauthorized access to sensitive data.
data_source:
    - Nginx Access
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Web
      WHERE Web.url IN ("*/wp-json/bricks/v1/render_element") Web.status=200 Web.http_method=POST
      BY Web.src, Web.dest, Web.http_user_agent,
         Web.url, Web.uri_path, Web.status,
         Web.http_method, sourcetype, source
    | `drop_dm_object_name("Web")`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `wordpress_bricks_builder_plugin_rce_filter`
how_to_implement: The search is based on data in the Web datamodel and was modeled from NGINX logs. Ensure that the Web datamodel is accelerated and that the data source for the Web datamodel is properly configured. If using other web sources, modify they query, or review the data, as needed.
known_false_positives: False positives may be possible, however we restricted it to HTTP Status 200 and POST requests, based on the POC. Upon investigation review the POST body for the actual payload - or command - being executed.
references:
    - https://attack.mitre.org/techniques/T1190
    - https://github.com/Tornad0007/CVE-2024-25600-Bricks-Builder-plugin-for-WordPress/blob/main/exploit.py
    - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-25600
    - https://op-c.net/blog/cve-2024-25600-wordpresss-bricks-builder-rce-flaw-under-active-exploitation/
    - https://thehackernews.com/2024/02/wordpress-bricks-theme-under-active.html
finding:
    title: Potential exploitation of the WordPress Bricks Builder plugin RCE vulnerability on $dest$ by $src$.
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - WordPress Vulnerabilities
    - Hellcat Ransomware
asset_type: Web Server
cve:
    - CVE-2024-25600
mitre_attack_id:
    - T1190
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: web
security_domain: network

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Web
  WHERE Web.url IN ("*/wp-json/bricks/v1/render_element") Web.status=200 Web.http_method=POST
  BY
    Web.src,
    Web.dest,
    Web.http_user_agent,
    Web.url,
    Web.uri_path,
    Web.status,
    Web.http_method,
    sourcetype,
    source

Stage 2: search

| `drop_dm_object_name("Web")`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `wordpress_bricks_builder_plugin_rce_filter`

Indicators

These rows show field, operator, and value matches.

ZeroLogon CVE-2020-1472 (Windows Event Log)

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

The vulnerability allows an attacker to set a password for the computer account of an Active Directory Domain Controller, which can then be abused to pull credentials from the Domain Controller

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '5366.5480'
title: ZeroLogon CVE-2020-1472
description: 'The vulnerability allows an attacker to set a password for the computer
  account of an Active Directory Domain Controller, which can then be abused to pull
  credentials from the Domain Controller. -- Threat Actor Association: APT15, APT29/Nobelium/Cozy
  Bear - Software Association: BianLian, BlackSuit, Bumblebee Loader, Cuba, LockBit,
  Qbot/Qakbot - #TrendingThreat #Russia #Ukraine'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4742) OR
  "<EventID>4742<") "NT AUTHORITY" "ANONYMOUS LOGON")| regex host="(?i)dc" | rex field=_raw
  "(?i)Changed:\s+Security ID:\s+(?<dest_host>[\S]+)" | table _time, host, user signature_id,
  member_nt_domain, user, dest_host | bin span=1s | stats values(*) as * by _time,
  host '
techniques:
- privilege-escalation:exploitation for privilege escalation
- lateral-movement:exploitation of remote services
technique_id: 
- T1068
- T1210
data_category:
- Windows event logs
references:
- https://www.secura.com/pathtoimg.php?id=2055
- https://msrc.microsoft.com/update-guide/vulnerability/CVE-2020-1472

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4742) OR "<EventID>4742<") "NT AUTHORITY" "ANONYMOUS LOGON")

Stage 2: regex

| regex host="(?i)dc"

Stage 3: rex

| rex field=_raw "(?i)Changed:\s+Security ID:\s+(?<dest_host>[\S]+)"

Stage 4: table

| table _time, host, user signature_id, member_nt_domain, user, dest_host

Stage 5: bucket

| bin span=1s

Stage 6: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4742 corpus 6 (splunk 6)
field:"EventID" kind:eq value:"4742"
hostregex_match
  • (?i)dc
field:"host" kind:regex_match value:"(?i)dc"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4742<"
1"NT AUTHORITY"
1"ANONYMOUS LOGON"

Back to all Splunk rules