Detection rules › Splunk

Splunk rules: 20

Bash -c Execution - Windows (Windows Event Log)

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

Bash is a popular default shell on Linux and macOS. Git Bash is a package that installs Bash, some common bash utilities, and Git on a Windows operating system. Bash is also included with Windows Subsystem for Linux. Bash is on the Microsoft recommended block list for executable files. This use case detects executions of bash.exe with -c.

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '33144.58774'
title: Bash -c Execution - Windows
description: Bash is a popular default shell on Linux and macOS. Git Bash is a package
  that installs Bash, some common bash utilities, and Git on a Windows operating system.
  Bash is also included with Windows Subsystem for Linux. Bash is on the Microsoft
  recommended block list for executable files. This use case detects executions of
  bash.exe with -c.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) "bash.exe" | regex process_name="(?i)bash\.exe"|
  regex process="(?i)\s+-[ilsx]*c[ilsx]*" | table _time, host, user, signature_id,
  process, process_*, parent_process_* | bin span=1s | stats values(*) as * by _time,
  host | where event_count < 5 '
techniques:
- defense-evasion:system binary proxy execution
- defense-evasion:system script proxy execution
technique_id: 
- T1218
- T1216
data_category:
- Process command-line parameters
- Windows event logs
references:
- https://lolbas-project.github.io/lolbas/Binaries/Bash/

Stages and Predicates

Stage 1: search

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

Stage 2: regex

| regex process_name="(?i)bash\.exe"

Stage 3: regex

| regex process="(?i)\s+-[ilsx]*c[ilsx]*"

Stage 4: table

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

Stage 5: bucket

| bin span=1s

Stage 6: stats

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

Stage 7: where

| where event_count < 5

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
event_countlt
  • 5 corpus 3 (splunk 3)
field:"event_count" kind:lt value:"5"
processregex_match
  • (?i)\s+-[ilsx]*c[ilsx]* corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match value:"(?i)\s+-[ilsx]*c[ilsx]*"
process_nameregex_match
  • (?i)bash.exe corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)bash.exe"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"bash.exe"

Cisco NVM - Outbound Connection to Suspicious Port

#
Status
production
Severity
low
Group by
IntegrityLevel, dest, parent_process_integrity_level, parent_process_name, process_id, process_name, src, transport
Author
Nasreddine Bencherchali, Splunk
Source
github.com/splunk/security_content

The following analytic detects any outbound network connection from an endpoint process to a known suspicious or non-standard port. It leverages Cisco Network Visibility Module flow data logs to identify potentially suspicious behavior by looking at processes communicating over ports like 4444, 2222, or 51820 are commonly used by tools like Metasploit, SliverC2 or other pentest, red team or malware. These connections are worth investigating further, especially when initiated by unexpected or non-network-native binaries.

Known False Positives

  • Some legitimate applications may use high or non-standard ports, such as alternate SSH daemons or development tools. However, many of these ports are commonly used by threat actors for reverse shells or C2 communications. Review the associated process and command-line context to determine intent.

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

Rule Body

name: Cisco NVM - Outbound Connection to Suspicious Port
id: fc32a8d5-bc79-4437-b48f-4646ab7bed9d
version: 6
creation_date: '2025-07-01'
modification_date: '2026-07-14'
author: Nasreddine Bencherchali, Splunk
status: production
type: Anomaly
description: |
    The following analytic detects any outbound network connection from an endpoint process to a known suspicious or non-standard port.
    It leverages Cisco Network Visibility Module flow data logs to identify potentially suspicious behavior by looking at processes
    communicating over ports like 4444, 2222, or 51820 are commonly used by tools like Metasploit, SliverC2 or other pentest, red team or malware.
    These connections are worth investigating further, especially when initiated by unexpected or non-network-native binaries.
data_source:
    - Cisco Network Visibility Module Flow Data
search: |
    `cisco_network_visibility_module_flowdata`
    NOT dest IN (
            "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "100.64.0.0/10",
            "127.0.0.0/8", "169.254.0.0/16", "192.0.0.0/24", "192.0.0.0/29", "192.0.0.8/32",
            "192.0.0.9/32", "192.0.0.10/32", "192.0.0.170/32", "192.0.0.171/32", "192.0.2.0/24",
            "192.31.196.0/24", "192.52.193.0/24", "192.88.99.0/24", "224.0.0.0/4", "192.175.48.0/24",
            "198.18.0.0/15", "198.51.100.0/24", "203.0.113.0/24", "240.0.0.0/4", "::1"
            )
    | stats count min(_time) as firstTime max(_time) as lastTime
            values(parent_process_arguments) as parent_process_arguments
            values(process_arguments) as process_arguments
            values(parent_process_hash) as parent_process_hash
            values(process_hash) as process_hash
            values(module_name_list) as module_name_list
            values(module_hash_list) as module_hash_list
            values(dest_port) as dest_port
            values(aliul) as additional_logged_in_users_list
            values(dest_hostname) as dest_hostname
            by src dest parent_process_path parent_process_integrity_level process_path process_name process_integrity_level process_id transport
    | lookup suspicious_ports_list dest_port OUTPUTNEW comment as dest_port_metadata confidence as dest_confidence category as dest_port_category
    | where isnotnull(dest_port_metadata)
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | table
      parent_process_integrity_level parent_process_path parent_process_arguments parent_process_hash
      process_integrity_level process_path process_name process_arguments process_hash process_id
      additional_logged_in_users_list module_name_list module_hash_list
      src dest_hostname dest dest_port transport firstTime lastTime
    | `cisco_nvm___outbound_connection_to_suspicious_port_filter`
how_to_implement: |
    This search requires Network Visibility Module logs, which includes the flow data sourcetype.
    This search uses an input macro named `cisco_network_visibility_module_flowdata`.
    We strongly recommend that you specify your environment-specific configurations
    (index, source, sourcetype, etc.) for Cisco Network Visibility Module logs.
    Replace the macro definition with configurations for your Splunk environment.
    The search also uses a post-filter macro designed to filter out known false positives.
    The logs are to be ingested using the Splunk Add-on for Cisco Endpoint Security Analytics (CESA) (https://splunkbase.splunk.com/app/4221).
known_false_positives: |
    Some legitimate applications may use high or non-standard ports, such as alternate SSH daemons or development tools.
    However, many of these ports are commonly used by threat actors for reverse shells or C2 communications.
    Review the associated process and command-line context to determine intent.
references:
    - https://mthcht.medium.com/hunting-for-suspicious-ports-activities-50ef56d5cef
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: The host $src$ established an outbound network connection via the process $process_path$ with the commandline arguments $process_arguments$ to $dest$ over suspicious port $dest_port$.
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - Cisco Network Visibility Module Analytics
asset_type: Endpoint
mitre_attack_id:
    - T1571
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`cisco_network_visibility_module_flowdata`
NOT dest IN (
        "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "100.64.0.0/10",
        "127.0.0.0/8", "169.254.0.0/16", "192.0.0.0/24", "192.0.0.0/29", "192.0.0.8/32",
        "192.0.0.9/32", "192.0.0.10/32", "192.0.0.170/32", "192.0.0.171/32", "192.0.2.0/24",
        "192.31.196.0/24", "192.52.193.0/24", "192.88.99.0/24", "224.0.0.0/4", "192.175.48.0/24",
        "198.18.0.0/15", "198.51.100.0/24", "203.0.113.0/24", "240.0.0.0/4", "::1"
        )

Stage 2: stats

| stats
    count
    min(_time) as firstTime
    max(_time) as lastTime
    values(parent_process_arguments) as parent_process_arguments
    values(process_arguments) as process_arguments
    values(parent_process_hash) as parent_process_hash
    values(process_hash) as process_hash
    values(module_name_list) as module_name_list
    values(module_hash_list) as module_hash_list
    values(dest_port) as dest_port
    values(aliul) as additional_logged_in_users_list
    values(dest_hostname) as dest_hostname
  by
    src
    dest
    parent_process_path
    parent_process_integrity_level
    process_path
    process_name
    process_integrity_level
    process_id
    transport

Stage 3: lookup

| lookup suspicious_ports_list dest_port OUTPUTNEW comment as dest_port_metadata
    confidence as dest_confidence category as dest_port_category
Lookup table
suspicious_ports_list
Key field
dest_port
Output columns
['comment', 'dest_port_metadata'], ['confidence', 'dest_confidence'], ['category', 'dest_port_category']

Stage 4: where

| where isnotnull(dest_port_metadata)

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: table

| table
  parent_process_integrity_level parent_process_path parent_process_arguments parent_process_hash
  process_integrity_level process_path process_name process_arguments process_hash process_id
  additional_logged_in_users_list module_name_list module_hash_list
  src dest_hostname dest dest_port transport firstTime lastTime

Stage 8: search

| `cisco_nvm___outbound_connection_to_suspicious_port_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
dest_port_metadatais_not_null
  • (no value, null check)
field:"dest_port_metadata" kind:is_not_null
sourcetypein
  • cisco:nvm:flowdata
  • cisco:nvm:flowdata:v2
field:"sourcetype" kind:in

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
destin10.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.0.0/29, 192.0.0.10/32, 192.0.0.170/32, 192.0.0.171/32, 192.0.0.8/32, 192.0.0.9/32, 192.0.2.0/24, 192.168.0.0/16, 192.175.48.0/24, 192.31.196.0/24, 192.52.193.0/24, 192.88.99.0/24, 198.18.0.0/15, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 240.0.0.0/4, ::1excludes:dest

Command-Line Interface Execution (PowerShell)

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

Detects when a Command-Line Interface executes on a host

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '1036.1046'
title: Command-Line Interface Execution
description: 'Detects when a Command-Line Interface executes on a host. -- Threat
  Actor Association: APT29/Nobelium/Cozy Bear, APT31, APT35/Phosphorus/Magic Hound,
  APT36, APT37, APT41, Carbanak, FamousSparrow, FIN6, FIN7, FIN8, Kimsuky, MalKamak,
  MuddyWater, Night Spider, TA,505, TA551, Prophet Spider, Wizard Spider, WIRTE --
  Software Association: Astaroth, BadHatch, Bazar, Conti, Cring, Emotet, GhostShell,
  Hafnium, Hancitor, Harvester, Hive, IcedID, MINEBRIDGE, MirrorBlast, MysterySnail,
  Nefilim, PowerShortShell, Prometheus / Spook, QakBot, Ransom Cartel, RATDispenser,
  Remcos, Ryuk, Sodinokibi/REvil, SquirrelWaffle, Trickbot, XingLocker, Zloader, Zumkong'
logic_format: Splunk
logic: ' `get_endpoint_data` `get_endpoint_data_powershell` EventCode=4103 ("powershell.exe"
  OR "cmd.exe") | table _time, host, user client, event_id, eventtype, host, index,
  parameters, process, process_name, process_path, shell, signature_id, source, sourcetype,
  tag, user, user_id | bin span=60s | stats values(*) as * by _time, host | where
  match(process,"(?i)powershell\.exe") OR match(process,"(i?)cmd\.exe") | fields -
  process '
techniques:
- execution:command and scripting interpreter:powershell
- execution:command and scripting interpreter:windows command shell
technique_id:
- T1059.001
- T1059.003
data_category:
- PowerShell logs
- Process command-line parameters
references:
- https://securityintelligence.com/an-increase-in-powershell-attacks-observations-from-ibm-x-force-iris/
- https://www.trendmicro.com/vinfo/us/security/news/cybercrime-and-digital-threats/tracking-detecting-and-thwarting-powershell-based-malware-and-attacks

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` EventCode=4103 ("powershell.exe" OR "cmd.exe")

Stage 2: table

| table _time, host, user client, event_id, eventtype, host, index, parameters, process,
    process_name, process_path, shell, signature_id, source, sourcetype, tag, user, user_id

Stage 3: bucket

| bin span=60s

Stage 4: stats

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

Stage 5: where

| where match(process,"(?i)powershell\.exe") OR match(process,"(i?)cmd\.exe")

Stage 6: fields

| fields - process

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4103 corpus 105 (splunk 105)
field:"EventID" kind:eq value:"4103"
processregex_match
  • (?i)powershell.exe corpus 2 (splunk 2)
  • (i?)cmd.exe corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"powershell.exe"
1"cmd.exe"

comsvcs.dll Lsass Memory Dump (Windows Event Log)

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

Credential dumping within the lsass memory using Windows built-in comsvcs.dll file. When System32 crashes this DLL contains a function called minidumpw which dumps the lsass memory. This does not require additional tools like Mimikatz and Procdump in order to perform the lsass dump

MITRE ATT&CK Coverage

TacticTechniques
Credential Access

References

Telemetry Coverage

Rule Body

id: '5463.5626'
title: ' comsvcs.dll Lsass Memory Dump'
description: 'Credential dumping within the lsass memory using Windows built-in comsvcs.dll
  file. When System32 crashes this DLL contains a function called minidumpw which
  dumps the lsass memory. This does not require additional tools like Mimikatz and
  Procdump in order to perform the lsass dump. -- Threat Actor Association: APT27,
  APT35/Phosphorus/Magic Hound, BlackCat, Lancefly, Lazarus, Volt Typhoon, Witchetty,
  Wizard Spider - Software Association: Akira, Conti, HermeticWiper/Trojan.Killdisk,
  Prestige, PYSA/Mespinoza, Vice Society - Atomics T1003 Test #3 Atomics T1003.001
  Test #3'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) ("rundll32.exe" OR "rundll32") ("comsvcs.dll"
  OR "comsvcs") ("dmp" OR "MiniDump" OR "DumpProc" OR "lsass.exe" OR "lsass" OR "#24")
  | table _time, host, user signature_id, user, process_id, process_name, process_path,
  process, parent_process_id, parent_process_name, parent_process_path | bin span=1s
  | stats values(*) as * by _time, host, process '
techniques:
- credential-access:os credential dumping:lsass memory
technique_id:
- T1003.001
data_category:
- Windows event logs
references:
- https://en.hackndo.com/remote-lsass-dump-passwords/#manual-method--procdump

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) ("rundll32.exe" OR "rundll32") ("comsvcs.dll" OR "comsvcs") ("dmp" OR "MiniDump" OR "DumpProc" OR "lsass.exe" OR "lsass" OR "#24")

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"rundll32.exe"
1"rundll32"
1"comsvcs.dll"
1"comsvcs"
1"dmp"
1"MiniDump"
1"DumpProc"
1"lsass.exe"
1"lsass"
1"#24"

Consent.exe Suspicious Child Process (Sysmon)

#

Detect Computer Changed with Anonymous Account

#
Status
production
Group by
PasswordLastSet, SubjectDomainName, action, app, dest, process_id, signature, signature_id, status, user, user_group, vendor_product
Author
Rod Soto, Jose Hernandez, Splunk
Source
github.com/splunk/security_content

The following analytic detects changes to computer accounts using an anonymous logon. It leverages Windows Security Event Codes 4742 (Computer Change) with a SubjectUserName of a value "ANONYMOUS LOGON". This activity can be significant because anonymous logons should not typically be modifying computer accounts, indicating potential unauthorized access or misconfiguration. If confirmed malicious, this could allow an attacker to alter computer accounts, potentially leading to privilege escalation or persistent access within the network.

Known False Positives

  • Some legitimate, legacy devices may utilize this functionality and generate false positives. Apply additional tuning as needed.

MITRE ATT&CK Coverage

TacticTechniques
Lateral Movement

Telemetry Coverage

Rule Body

name: Detect Computer Changed with Anonymous Account
id: 1400624a-d42d-484d-8843-e6753e6e3645
version: 11
creation_date: '2020-09-18'
modification_date: '2026-05-13'
author: Rod Soto, Jose Hernandez, Splunk
status: production
type: Hunting
description: |
    The following analytic detects changes to computer accounts using an anonymous logon.
    It leverages Windows Security Event Codes 4742 (Computer Change) with a SubjectUserName of a value "ANONYMOUS LOGON".
    This activity can be significant because anonymous logons should not typically be modifying computer accounts, indicating potential unauthorized access or misconfiguration.
    If confirmed malicious, this could allow an attacker to alter computer accounts, potentially leading to privilege escalation or persistent access within the network.
data_source:
    - Windows Event Log Security 4742
search: |-
    `wineventlog_security`
    EventCode=4742
    SubjectUserName="ANONYMOUS LOGON"
    PasswordLastSet="*"
    | stats count min(_time) as firstTime max(_time) as lastTime
        BY action app dest ProcessID PasswordLastSet
           signature signature_id src_user status
           SubjectDomainName user user_group vendor_product
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `detect_computer_changed_with_anonymous_account_filter`
how_to_implement: |
    This search requires "Audit Computer Account Management" sub-category in the audit policy to be enabled on the system in order to generate Event ID 4742, as well as "Audit Logon" to generate Event ID 4624.
    We strongly recommend that you specify your environment-specific configurations (index, source, sourcetype, etc.) for Windows Event Logs.
    Replace the macro definition with configurations for your Splunk environment. The search also uses a post-filter macro designed to filter out known false positives.
known_false_positives: Some legitimate, legacy devices may utilize this functionality and generate false positives. Apply additional tuning as needed.
references:
    - https://www.lares.com/blog/from-lares-labs-defensive-guidance-for-zerologon-cve-2020-1472/
    - https://netwrix.com/en/cybersecurity-glossary/cyber-security-attacks/zerologon-vulnerability/
    - https://github.com/sbousseaden/EVTX-ATTACK-SAMPLES/blob/master/Credential%20Access/Zerologon_VoidSec_CVE-2020-1472_4626_LT3_Anonym_follwedby_4742_DC_Anony_DC.evtx
analytic_story:
    - Detect Zerologon Attack
asset_type: Windows
cve:
    - CVE-2020-1472
mitre_attack_id:
    - T1210
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security`
EventCode=4742
SubjectUserName="ANONYMOUS LOGON"
PasswordLastSet="*"

Stage 2: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY action app dest ProcessID PasswordLastSet
       signature signature_id src_user status
       SubjectDomainName user user_group vendor_product

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `detect_computer_changed_with_anonymous_account_filter`

Indicators

These rows show field, operator, and value matches.

Enable RDP In Other Port Number

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

The following analytic detects modifications to the registry that enable RDP on a machine using a non-default port number. It leverages data from the Endpoint.Registry data model, specifically monitoring changes to the registry path "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" and the "PortNumber" value. This activity is significant as attackers often modify RDP settings to facilitate lateral movement and maintain remote access to compromised systems. If confirmed malicious, this could allow attackers to bypass network defenses, gain persistent access, and potentially control the compromised machine.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Lateral Movement

Telemetry Coverage

Rule Body

name: Enable RDP In Other Port Number
id: 99495452-b899-11eb-96dc-acde48001122
version: 18
creation_date: '2021-05-19'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk, Steven Dick
status: production
type: TTP
description: The following analytic detects modifications to the registry that enable RDP on a machine using a non-default port number. It leverages data from the Endpoint.Registry data model, specifically monitoring changes to the registry path "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" and the "PortNumber" value. This activity is significant as attackers often modify RDP settings to facilitate lateral movement and maintain remote access to compromised systems. If confirmed malicious, this could allow attackers to bypass network defenses, gain persistent access, and potentially control the compromised machine.
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="*\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp*" Registry.registry_value_name = "PortNumber") by Registry.action Registry.dest Registry.process_guid Registry.process_id Registry.registry_hive Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.registry_value_name Registry.registry_value_type Registry.status Registry.user Registry.vendor_product | `drop_dm_object_name(Registry)` | where isnotnull(registry_value_data) | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `enable_rdp_in_other_port_number_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting logs with the registry value name, registry path, and registry value data from your endpoints. If you are using Sysmon, you must have at least version 2.0 of the official Sysmon TA. https://splunkbase.splunk.com/app/5709
known_false_positives: No false positives have been identified at this time.
references:
    - https://www.mvps.net/docs/how-to-secure-remote-desktop-rdp/
finding:
    title: RDP was moved to a non-standard port on $dest$ by $user$.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: RDP was moved to a non-standard port on $dest$ by $user$.
analytic_story:
    - Prohibited Traffic Allowed or Protocol Mismatch
    - Windows Registry Abuse
    - Windows RDP Artifacts and Defense Evasion
    - Interlock Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1021
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="*\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp*"
      Registry.registry_value_name = "PortNumber"
  )
  by
    Registry.action
    Registry.dest
    Registry.process_guid
    Registry.process_id
    Registry.registry_hive
    Registry.registry_path
    Registry.registry_key_name
    Registry.registry_value_data
    Registry.registry_value_name
    Registry.registry_value_type
    Registry.status
    Registry.user
    Registry.vendor_product

Stage 2: search

| `drop_dm_object_name(Registry)`

Stage 3: where

| where isnotnull(registry_value_data)

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `enable_rdp_in_other_port_number_filter`

Indicators

These rows show field, operator, and value matches.

Enable WDigest UseLogonCredential Registry

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

The following analytic detects a suspicious registry modification that enables the plain text credential feature in Windows by setting the "UseLogonCredential" value to 1 in the WDigest registry path. This detection leverages data from the Endpoint.Registry data model, focusing on specific registry paths and values. This activity is significant because it is commonly used by malware and tools like Mimikatz to dump plain text credentials, indicating a potential credential dumping attempt. If confirmed malicious, this could allow an attacker to obtain sensitive credentials, leading to further compromise and lateral movement within the network.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Persistence
Defense Impairment
Credential Access

Telemetry Coverage

Rule Body

name: Enable WDigest UseLogonCredential Registry
id: 0c7d8ffe-25b1-11ec-9f39-acde48001122
version: 16
creation_date: '2021-10-05'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk, Steven Dick
status: production
type: TTP
description: The following analytic detects a suspicious registry modification that enables the plain text credential feature in Windows by setting the "UseLogonCredential" value to 1 in the WDigest registry path. This detection leverages data from the Endpoint.Registry data model, focusing on specific registry paths and values. This activity is significant because it is commonly used by malware and tools like Mimikatz to dump plain text credentials, indicating a potential credential dumping attempt. If confirmed malicious, this could allow an attacker to obtain sensitive credentials, leading to further compromise and lateral movement within the network.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry WHERE (Registry.registry_path="*\\System\\CurrentControlSet\\Control\\SecurityProviders\\WDigest\\*" Registry.registry_value_name = "UseLogonCredential" Registry.registry_value_data=0x00000001) by Registry.action Registry.dest Registry.process_guid Registry.process_id Registry.registry_hive Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.registry_value_name Registry.registry_value_type Registry.status Registry.user Registry.vendor_product | `drop_dm_object_name(Registry)` | where isnotnull(registry_value_data) | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `enable_wdigest_uselogoncredential_registry_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting logs with the registry value name, registry path, and registry value data from your endpoints. If you are using Sysmon, you must have at least version 2.0 of the official Sysmon TA. https://splunkbase.splunk.com/app/5709
known_false_positives: No false positives have been identified at this time.
references:
    - https://www.csoonline.com/article/3438824/how-to-detect-and-halt-credential-theft-via-windows-wdigest.html
finding:
    title: wdigest registry $registry_path$ was modified on $dest$
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: wdigest registry $registry_path$ was modified on $dest$
analytic_story:
    - Credential Dumping
    - Windows Registry Abuse
    - CISA AA22-320A
asset_type: Endpoint
mitre_attack_id:
    - T1112
    - T1003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Registry
  WHERE (
      Registry.registry_path="*\\System\\CurrentControlSet\\Control\\SecurityProviders\\WDigest\\*"
      Registry.registry_value_name = "UseLogonCredential"
      Registry.registry_value_data=0x00000001
  )
  by
    Registry.action
    Registry.dest
    Registry.process_guid
    Registry.process_id
    Registry.registry_hive
    Registry.registry_path
    Registry.registry_key_name
    Registry.registry_value_data
    Registry.registry_value_name
    Registry.registry_value_type
    Registry.status
    Registry.user
    Registry.vendor_product

Stage 2: search

| `drop_dm_object_name(Registry)`

Stage 3: where

| where isnotnull(registry_value_data)

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `enable_wdigest_uselogoncredential_registry_filter`

Indicators

These rows show field, operator, and value matches.

GetDomainController with PowerShell Script Block

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

The following analytic detects the execution of the Get-DomainController commandlet using PowerShell Script Block Logging (EventCode=4104). This commandlet is part of PowerView, a tool often used for domain enumeration. The detection leverages script block text to identify this specific activity. Monitoring this behavior is crucial as it may indicate an adversary or Red Team performing reconnaissance to map out domain controllers. If confirmed malicious, this activity could lead to further domain enumeration, potentially exposing sensitive information and aiding in lateral movement within the network.

Known False Positives

  • Administrators or power users may use this PowerShell commandlet for troubleshooting.

MITRE ATT&CK Coverage

TacticTechniques
Discovery

Telemetry Coverage

Rule Body

name: GetDomainController with PowerShell Script Block
id: 676b600a-a94d-4951-b346-11329431e6c1
version: 12
creation_date: '2021-09-01'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects the execution of the `Get-DomainController` commandlet using PowerShell Script Block Logging (EventCode=4104). This commandlet is part of PowerView, a tool often used for domain enumeration. The detection leverages script block text to identify this specific activity. Monitoring this behavior is crucial as it may indicate an adversary or Red Team performing reconnaissance to map out domain controllers. If confirmed malicious, this activity could lead to further domain enumeration, potentially exposing sensitive information and aiding in lateral movement within the network.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell` EventCode=4104 (ScriptBlockText = "*Get-DomainController*")
      | 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)`
      | `getdomaincontroller_with_powershell_script_block_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: Administrators or power users may use this PowerShell commandlet for troubleshooting.
references:
    - https://attack.mitre.org/techniques/T1018/
    - https://powersploit.readthedocs.io/en/latest/Recon/Get-DomainController/
finding:
    title: Remote system discovery with PowerView on $dest$ by $user_id$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Active Directory Discovery
asset_type: Endpoint
mitre_attack_id:
    - T1018
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`powershell` EventCode=4104 (ScriptBlockText = "*Get-DomainController*")

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

| `getdomaincontroller_with_powershell_script_block_filter`

Indicators

These rows show field, operator, and value matches.

GitHub Enterprise Disable IP Allow List

#
Status
production
Severity
low
Group by
"actor_location.country_code", action, actor, actor_id, actor_is_bot, aws::userAgent, business, business_id, user_id
Author
Patrick Bareiss, Splunk
Source
github.com/splunk/security_content

The following analytic identifies when an IP allow list is disabled in GitHub Enterprise. The detection monitors GitHub Enterprise audit logs for actions related to disabling IP allow lists at the organization or enterprise level. This behavior is concerning because IP allow lists are a critical security control that restricts access to GitHub Enterprise resources to only trusted IP addresses. When disabled, it could indicate an attacker attempting to bypass access controls to gain unauthorized access from untrusted networks. The impact includes potential exposure of sensitive code repositories and GitHub Enterprise resources to access from any IP address. SOC teams should investigate such events, especially if they were not pre-approved changes, as they may indicate compromise of admin credentials or malicious insider activity.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access
Defense Impairment

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: GitHub Enterprise Disable IP Allow List
id: afed020e-edcd-4913-a675-cebedf81d4fb
version: 8
creation_date: '2025-01-15'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: Anomaly
description: The following analytic identifies when an IP allow list is disabled in GitHub Enterprise. The detection monitors GitHub Enterprise audit logs for actions related to disabling IP allow lists at the organization or enterprise level. This behavior is concerning because IP allow lists are a critical security control that restricts access to GitHub Enterprise resources to only trusted IP addresses. When disabled, it could indicate an attacker attempting to bypass access controls to gain unauthorized access from untrusted networks. The impact includes potential exposure of sensitive code repositories and GitHub Enterprise resources to access from any IP address. SOC teams should investigate such events, especially if they were not pre-approved changes, as they may indicate compromise of admin credentials or malicious insider activity.
data_source:
    - GitHub Enterprise Audit Logs
search: |-
    `github_enterprise` action=ip_allow_list.disable
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY actor, actor_id, actor_is_bot,
           actor_location.country_code, business, business_id,
           user_agent, user_id, action
      | eval user=actor
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `github_enterprise_disable_ip_allow_list_filter`
how_to_implement: You must ingest GitHub Enterprise logs using Audit log streaming as described in this documentation https://docs.github.com/en/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise#setting-up-streaming-to-splunk using a Splunk HTTP Event Collector.
known_false_positives: No false positives have been identified at this time.
references:
    - https://www.googlecloudcommunity.com/gc/Community-Blog/Monitoring-for-Suspicious-GitHub-Activity-with-Google-Security/ba-p/763610
    - https://docs.github.com/en/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise#setting-up-streaming-to-splunk
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: $user$ disabled an IP allow list in GitHub Enterprise
threat_objects:
    - field: user_agent
      type: http_user_agent
analytic_story:
    - GitHub Malicious Activity
asset_type: GitHub
mitre_attack_id:
    - T1685
    - T1195
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: network

Stages and Predicates

Stage 1: search

`github_enterprise` action=ip_allow_list.disable

Stage 2: fillnull

| fillnull

Stage 3: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY actor, actor_id, actor_is_bot,
       actor_location.country_code, business, business_id,
       user_agent, user_id, action

Stage 4: eval

| eval user=actor

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `github_enterprise_disable_ip_allow_list_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
actioneq
  • ip_allow_list.disable
field:"action" kind:eq value:"ip_allow_list.disable"
sourcetypeeq
  • httpevent corpus 12 (splunk 12)
field:"sourcetype" kind:eq value:"httpevent"

GitHub Organizations Repository Deleted

#
Status
production
Severity
low
Group by
"actor_location.country_code", actor, actor_id, actor_is_bot, aws::userAgent, business, business_id, org, org_id, repo, repo_id, vendor_action, visibility
Author
Patrick Bareiss, Splunk
Source
github.com/splunk/security_content

The following analytic identifies when a repository is deleted within a GitHub organization. The detection monitors GitHub Organizations audit logs for repository deletion events by tracking actor details, repository information, and associated metadata. This behavior is concerning for SOC teams as malicious actors may attempt to delete repositories to destroy source code, intellectual property, or evidence of compromise. Repository deletion can result in permanent loss of code, documentation, and project history if proper backups are not maintained. Additionally, unauthorized repository deletion could indicate account compromise, insider threats, or attempts to disrupt business operations. The impact of a repository deletion attack includes loss of intellectual property, disruption to development workflows, and potential financial losses from lost work. Early detection of unauthorized repository deletions allows security teams to investigate potential compromises and restore from backups if needed.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access
Impact

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: GitHub Organizations Repository Deleted
id: 9ff4ca95-fdae-4eea-9ffa-6d8e1c202a71
version: 9
creation_date: '2025-01-15'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: Anomaly
description: The following analytic identifies when a repository is deleted within a GitHub organization. The detection monitors GitHub Organizations audit logs for repository deletion events by tracking actor details, repository information, and associated metadata. This behavior is concerning for SOC teams as malicious actors may attempt to delete repositories to destroy source code, intellectual property, or evidence of compromise. Repository deletion can result in permanent loss of code, documentation, and project history if proper backups are not maintained. Additionally, unauthorized repository deletion could indicate account compromise, insider threats, or attempts to disrupt business operations. The impact of a repository deletion attack includes loss of intellectual property, disruption to development workflows, and potential financial losses from lost work. Early detection of unauthorized repository deletions allows security teams to investigate potential compromises and restore from backups if needed.
data_source:
    - GitHub Organizations Audit Logs
search: |-
    `github_organizations` vendor_action=repo.destroy
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY actor, actor_id, actor_is_bot,
           actor_location.country_code, business, business_id,
           org, org_id, repo,
           repo_id, user_agent, visibility,
           vendor_action
      | eval user=actor
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `github_organizations_repository_deleted_filter`
how_to_implement: You must ingest GitHub Organizations logs using Splunk Add-on for Github using a Personal Access Token https://splunk.github.io/splunk-add-on-for-github-audit-log-monitoring/Install/ .
known_false_positives: No false positives have been identified at this time.
references:
    - https://splunk.github.io/splunk-add-on-for-github-audit-log-monitoring/Install/
    - https://www.googlecloudcommunity.com/gc/Community-Blog/Monitoring-for-Suspicious-GitHub-Activity-with-Google-Security/ba-p/763610
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: $user$ deleted a repository in GitHub Organizations
threat_objects:
    - field: user_agent
      type: http_user_agent
analytic_story:
    - GitHub Malicious Activity
    - NPM Supply Chain Compromise
asset_type: GitHub
mitre_attack_id:
    - T1485
    - T1195
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: network

Stages and Predicates

Stage 1: search

`github_organizations` vendor_action=repo.destroy

Stage 2: fillnull

| fillnull

Stage 3: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY actor, actor_id, actor_is_bot,
       actor_location.country_code, business, business_id,
       org, org_id, repo,
       repo_id, user_agent, visibility,
       vendor_action

Stage 4: eval

| eval user=actor

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `github_organizations_repository_deleted_filter`

Indicators

These rows show field, operator, and value matches.

hh.exe Remote File Execution (Sysmon)

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

Adversaries may abuse Compiled HTML files (.chm) to conceal malicious code. CHM files are commonly distributed as part of the Microsoft HTML Help system. A custom CHM file containing embedded payloads could be delivered to a victim then triggered by User Execution. This use case detects hh.exe executions accessing a remote compiled HTML file. LOLBAS

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '17787.30036'
title: hh.exe Remote File Execution
description: 'Adversaries may abuse Compiled HTML files (.chm) to conceal malicious
  code. CHM files are commonly distributed as part of the Microsoft HTML Help system.
  A custom CHM file containing embedded payloads could be delivered to a victim then
  triggered by User Execution. This use case detects hh.exe executions accessing a
  remote compiled HTML file. LOLBAS Atomics T1218.001 Test #2'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  (TERM(hh) OR TERM(hh.exe)) | where match(process_name, "(?i)hh\.exe") AND match(process,
  "(?i)\w+tps?://") | table _time, host, user process, process_*, parent_* | bin span=1s
  | stats values(*) as * by _time, host '
techniques:
- defense-evasion:system binary proxy execution:compiled html file
technique_id:
- T1218.001
data_category:
- Windows Sysmon
references:
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218.001/T1218.001.md#atomic-test-2---compiled-html-help-remote-payload
- https://www.ptsecurity.com/ww-en/analytics/pt-esc-threat-intelligence/higaisa-or-winnti-apt-41-backdoors-old-and-new/

Stages and Predicates

Stage 1: search

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

Stage 2: where

| where match(process_name, "(?i)hh\.exe") AND match(process, "(?i)\w+tps?://")

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
processregex_match
  • (?i)\w+tps?:// corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)\w+tps?://"
process_nameregex_match
  • (?i)hh.exe corpus 6 (splunk 6)
field:"process_name" kind:regex_match value:"(?i)hh.exe"

Search Terms

These SPL tokens match against raw event text.

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

Kerberos Pre-Authentication Flag Disabled with PowerShell

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

The following analytic detects the use of the Set-ADAccountControl PowerShell cmdlet with parameters that disable Kerberos Pre-Authentication. It leverages PowerShell Script Block Logging (EventCode=4104) to identify this specific command execution. Disabling Kerberos Pre-Authentication is significant because it allows adversaries to perform offline brute force attacks against user passwords using the AS-REP Roasting technique. If confirmed malicious, this activity could enable attackers to escalate privileges or maintain persistence within an Active Directory environment, posing a severe security risk.

Known False Positives

  • Although unlikely, Administrators may need to set this flag for legitimate purposes.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Kerberos Pre-Authentication Flag Disabled with PowerShell
id: 59b51620-94c9-11ec-b3d5-acde48001122
version: 13
creation_date: '2022-02-23'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects the use of the `Set-ADAccountControl` PowerShell cmdlet with parameters that disable Kerberos Pre-Authentication. It leverages PowerShell Script Block Logging (EventCode=4104) to identify this specific command execution. Disabling Kerberos Pre-Authentication is significant because it allows adversaries to perform offline brute force attacks against user passwords using the AS-REP Roasting technique. If confirmed malicious, this activity could enable attackers to escalate privileges or maintain persistence within an Active Directory environment, posing a severe security risk.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell` EventCode=4104 (ScriptBlockText = "*Set-ADAccountControl*" AND ScriptBlockText="*DoesNotRequirePreAuth:$true*")
      | 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)`
      | `kerberos_pre_authentication_flag_disabled_with_powershell_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: Although unlikely, Administrators may need to set this flag for legitimate purposes.
references:
    - https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/useraccountcontrol-manipulate-account-properties
    - https://m0chan.github.io/2019/07/31/How-To-Attack-Kerberos-101.html
    - https://stealthbits.com/blog/cracking-active-directory-passwords-with-as-rep-roasting/
finding:
    title: Kerberos Pre Authentication was Disabled using PowerShell on $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Active Directory Kerberos Attacks
asset_type: Endpoint
mitre_attack_id:
    - T1558.004
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`powershell` EventCode=4104 (
    ScriptBlockText = "*Set-ADAccountControl*"
    AND ScriptBlockText="*DoesNotRequirePreAuth:$true*"
)

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

| `kerberos_pre_authentication_flag_disabled_with_powershell_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTexteq
  • *DoesNotRequirePreAuth:$true*
  • *Set-ADAccountControl*
field:"ScriptBlockText" kind:eq

Kubernetes Shell Running on Worker Node

#
Status
experimental
Severity
low
Group by
"host.name", "k8s.cluster.name", "k8s.node.name", "process.executable.name", "process.pid"
Author
Matthew Moore, Splunk
Source
github.com/splunk/security_content

The following analytic identifies shell activity within the Kubernetes privilege scope on a worker node. It leverages process metrics from an OTEL collector hostmetrics receiver, specifically process.cpu.utilization and process.memory.utilization, pulled from Splunk Observability Cloud. This activity is significant as unauthorized shell processes can indicate potential security threats, providing attackers an entry point to compromise the node and the entire Kubernetes cluster. If confirmed malicious, this activity could lead to data theft, service disruption, privilege escalation, lateral movement, and further attacks, severely compromising the cluster's security and integrity.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Execution

Rule Body

name: Kubernetes Shell Running on Worker Node
id: efebf0c4-dcf4-496f-85a2-5ab7ad8fa876
version: 10
creation_date: '2024-01-10'
modification_date: '2026-05-13'
author: Matthew Moore, Splunk
status: experimental
type: Anomaly
description: The following analytic identifies shell activity within the Kubernetes privilege scope on a worker node. It leverages process metrics from an OTEL collector hostmetrics receiver, specifically process.cpu.utilization and process.memory.utilization, pulled from Splunk Observability Cloud. This activity is significant as unauthorized shell processes can indicate potential security threats, providing attackers an entry point to compromise the node and the entire Kubernetes cluster. If confirmed malicious, this activity could lead to data theft, service disruption, privilege escalation, lateral movement, and further attacks, severely compromising the cluster's security and integrity.
data_source: []
search: |-
    | mstats avg(process.cpu.utilization) as process.cpu.utilization avg(process.memory.utilization) as process.memory.utilization where `kubernetes_metrics` AND process.executable.name IN ("sh","bash","csh", "tcsh") by host.name k8s.cluster.name k8s.node.name process.pid process.executable.name span=10s
    | search process.cpu.utilization>0 OR process.memory.utilization>0
    | stats avg(process.cpu.utilization) as process.cpu.utilization avg(process.memory.utilization) as process.memory.utilization
      BY host.name k8s.cluster.name k8s.node.name
         process.pid process.executable.name
    | rename host.name as host
    | `kubernetes_shell_running_on_worker_node_filter`
how_to_implement: "To implement this detection, follow these steps:\n* Deploy the OpenTelemetry Collector (OTEL) to your Kubernetes cluster.\n* Enable the hostmetrics/process receiver in the OTEL configuration.\n* Ensure that the process metrics, specifically Process.cpu.utilization and process.memory.utilization, are enabled.\n* Install the Splunk Infrastructure Monitoring (SIM) add-on. (ref: https://splunkbase.splunk.com/app/5247)\n * Configure the SIM add-on with your Observability Cloud Organization ID and Access Token.\n* Set up the SIM modular input to ingest Process Metrics. Name this input \"sim_process_metrics_to_metrics_index\".\n* In the SIM configuration, set the Organization ID to your Observability Cloud Organization ID.\n* Set the Signal Flow Program to the following: data('process.threads').publish(label='A'); data('process.cpu.utilization').publish(label='B'); data('process.cpu.time').publish(label='C'); data('process.disk.io').publish(label='D'); data('process.memory.usage').publish(label='E'); data('process.memory.virtual').publish(label='F'); data('process.memory.utilization').publish(label='G'); data('process.cpu.utilization').publish(label='H'); data('process.disk.operations').publish(label='I'); data('process.handles').publish(label='J'); data('process.threads').publish(label='K')\n* Set the Metric Resolution to 10000.\n * Leave all other settings at their default values.\n* Run the Search Baseline Of Kubernetes Container Network IO Ratio"
known_false_positives: No false positives have been identified at this time.
references:
    - https://github.com/signalfx/splunk-otel-collector-chart/tree/main
intermediate_findings:
    entities:
        - field: host
          type: system
          score: 20
          message: Kubernetes shell running on worker node on host $host$
analytic_story:
    - Abnormal Kubernetes Behavior using Splunk Infrastructure Monitoring
asset_type: Kubernetes
mitre_attack_id:
    - T1204
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: network

Stages and Predicates

Stage 1: search

| mstats avg(process.cpu.utilization) as process.cpu.utilization avg(process.memory.utilization) as process.memory.utilization where `kubernetes_metrics` AND process.executable.name IN ("sh","bash","csh", "tcsh") by host.name k8s.cluster.name k8s.node.name process.pid process.executable.name span=10s

Stage 2: search

| search process.cpu.utilization>0 OR process.memory.utilization>0

Stage 3: stats

| stats
    avg(process.cpu.utilization) as process.cpu.utilization
    avg(process.memory.utilization) as process.memory.utilization
  BY host.name k8s.cluster.name k8s.node.name
     process.pid process.executable.name

Stage 4: rename

| rename host.name as host

Stage 5: search

| `kubernetes_shell_running_on_worker_node_filter`

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
1mstats
1avg
1process.cpu.utilization
1as
1process.cpu.utilization
1avg
1process.memory.utilization
1as
1process.memory.utilization
1where
1by
1process.executable.name
1host.name
1k8s.cluster.name
1k8s.node.name
1process.pid

Linux Auditd File Permission Modification Via Chmod

#
Status
production
Severity
low
Group by
dest, proctitle
Author
Teoderick Contreras, Splunk, Ivar Nygård
Source
github.com/splunk/security_content

The following analytic detects suspicious file permission modifications using the chmod command, which may indicate an attacker attempting to alter access controls on critical files or directories. Such modifications can be used to grant unauthorized users elevated privileges or to conceal malicious activities by restricting legitimate access. By monitoring for unusual or unauthorized chmod usage, this analytic helps identify potential security breaches, allowing security teams to respond promptly to prevent privilege escalation, data tampering, or other unauthorized actions on the system.

Known False Positives

  • Administrator or network operator can use this application for automation purposes. Please update the filter macros to remove false positives.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Linux Auditd File Permission Modification Via Chmod
id: 5f1d2ea7-eec0-4790-8b24-6875312ad492
version: 15
creation_date: '2024-08-12'
modification_date: '2026-05-13'
author: "Teoderick Contreras, Splunk, Ivar Nygård"
status: production
type: Anomaly
description: The following analytic detects suspicious file permission modifications using the `chmod` command, which may indicate an attacker attempting to alter access controls on critical files or directories. Such modifications can be used to grant unauthorized users elevated privileges or to conceal malicious activities by restricting legitimate access. By monitoring for unusual or unauthorized `chmod` usage, this analytic helps identify potential security breaches, allowing security teams to respond promptly to prevent privilege escalation, data tampering, or other unauthorized actions on the system.
data_source:
    - Linux Auditd Proctitle
search: "`linux_auditd` proctitle=\"*chmod*\" AND proctitle IN (\"* 777 *\", \"* 755 *\", \"*+*x*\", \"* 754 *\")\n  | rename host as dest\n  | stats count min(_time) as firstTime max(_time) as lastTime\n    BY proctitle dest\n  | `security_content_ctime(firstTime)`\n  | `security_content_ctime(lastTime)`\n  | `linux_auditd_file_permission_modification_via_chmod_filter`"
how_to_implement: To implement this detection, the process begins by ingesting auditd data, that consists of SYSCALL, TYPE, EXECVE and PROCTITLE events, which captures command-line executions and process details on Unix/Linux systems. These logs should be ingested and processed using Splunk Add-on for Unix and Linux (https://splunkbase.splunk.com/app/833), which is essential for correctly parsing and categorizing the data. The next step involves normalizing the field names  to match the field names set by the Splunk Common Information Model (CIM) to ensure consistency across different data sources and enhance the efficiency of data modeling. This approach enables effective monitoring and detection of linux endpoints where auditd is deployed
known_false_positives: Administrator or network operator can use this application for automation purposes. Please update the filter macros to remove false positives.
references:
    - https://www.splunk.com/en_us/blog/security/deep-dive-on-persistence-privilege-escalation-technique-and-detection-in-linux-platform.html
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: A $proctitle$ event occurred on host $dest$ to modify file permissions using the "chmod" command.
analytic_story:
    - Linux Persistence Techniques
    - Compromised Linux Host
    - China-Nexus Threat Activity
    - Linux Living Off The Land
    - XorDDos
    - Salt Typhoon
    - Linux Privilege Escalation
    - Axios Supply Chain Post Compromise
asset_type: Endpoint
mitre_attack_id:
    - T1222.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`linux_auditd` proctitle="*chmod*" AND proctitle IN ("* 777 *", "* 755 *", "*+*x*", "* 754 *")

Stage 2: rename

| rename host as dest

Stage 3: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY proctitle dest

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `linux_auditd_file_permission_modification_via_chmod_filter`

Indicators

These rows show field, operator, and value matches.

Linux Busybox Privilege Escalation

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

The following analytic detects the execution of BusyBox with sudo privileges, which can lead to privilege escalation on Linux systems. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process creation events where BusyBox is executed with both 'sh' and 'sudo' commands. This activity is significant because it indicates a user may be attempting to gain root access, bypassing standard security controls. If confirmed malicious, this could allow an attacker to execute arbitrary commands as root, leading to full system compromise and potential persistence within the environment.

Known False Positives

  • False positives may be present, filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

PlatformRecord / event type
LinuxEvent ID 1: Process Create

Rule Body

name: Linux Busybox Privilege Escalation
id: 387c4e78-f4a4-413d-ad44-e9f7bc4642c9
version: 13
creation_date: '2022-08-10'
modification_date: '2026-05-13'
author: Gowthamaraj Rajendran, Splunk
status: production
type: Anomaly
description: The following analytic detects the execution of BusyBox with sudo privileges, which can lead to privilege escalation on Linux systems. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process creation events where BusyBox is executed with both 'sh' and 'sudo' commands. This activity is significant because it indicates a user may be attempting to gain root access, bypassing standard security controls. If confirmed malicious, this could allow an attacker to execute arbitrary commands as root, leading to full system compromise and potential persistence within the environment.
data_source:
    - Sysmon for Linux EventID 1
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.process="*busybox*"
        AND
        Processes.process="*sh*"
        AND
        Processes.process="*sudo*"
      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)`
    | `linux_busybox_privilege_escalation_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: False positives may be present, filter as needed.
references:
    - https://gtfobins.github.io/gtfobins/busybox/
    - https://man.archlinux.org/man/busybox.1.en
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process_name
      type: process_name
analytic_story:
    - Linux Privilege Escalation
    - Linux Living Off The Land
asset_type: Endpoint
mitre_attack_id:
    - T1548.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.process="*busybox*"
    AND
    Processes.process="*sh*"
    AND
    Processes.process="*sudo*"
  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

| `linux_busybox_privilege_escalation_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *busybox*
  • *sh* corpus 2 (sigma 1, splunk 1)
  • *sudo* corpus 24 (splunk 22, sigma 1, elastic 1)
field:"CommandLine" kind:eq

Linux Puppet Privilege Escalation

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

The following analytic detects the execution of Puppet commands with elevated privileges, specifically when Puppet is used to apply configurations with sudo rights. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process execution logs that include command-line details. This activity is significant because it indicates a potential privilege escalation attempt, where a user could gain root access and execute system commands as the root user. If confirmed malicious, this could allow an attacker to fully compromise the system, execute arbitrary commands, and maintain persistent control.

Known False Positives

  • False positives may be present, filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

PlatformRecord / event type
LinuxEvent ID 1: Process Create

Rule Body

name: Linux Puppet Privilege Escalation
id: 1d19037f-466e-4d56-8d87-36fafd9aa3ce
version: 13
creation_date: '2022-08-10'
modification_date: '2026-05-13'
author: Gowthamaraj Rajendran, Splunk
status: production
type: Anomaly
description: The following analytic detects the execution of Puppet commands with elevated privileges, specifically when Puppet is used to apply configurations with sudo rights. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process execution logs that include command-line details. This activity is significant because it indicates a potential privilege escalation attempt, where a user could gain root access and execute system commands as the root user. If confirmed malicious, this could allow an attacker to fully compromise the system, execute arbitrary commands, and maintain persistent control.
data_source:
    - Sysmon for Linux EventID 1
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.process="*puppet*"
        AND
        Processes.process="*apply*"
        AND
        Processes.process="*-e*"
        AND
        Processes.process="*exec*"
        AND
        Processes.process="*sudo*"
      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)`
    | `linux_puppet_privilege_escalation_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: False positives may be present, filter as needed.
references:
    - https://gtfobins.github.io/gtfobins/puppet/
    - https://en.wikipedia.org/wiki/Puppet_(software)
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process_name
      type: process_name
analytic_story:
    - Linux Privilege Escalation
    - Linux Living Off The Land
asset_type: Endpoint
mitre_attack_id:
    - T1548.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.process="*puppet*"
    AND
    Processes.process="*apply*"
    AND
    Processes.process="*-e*"
    AND
    Processes.process="*exec*"
    AND
    Processes.process="*sudo*"
  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

| `linux_puppet_privilege_escalation_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *-e* corpus 3 (splunk 2, sigma 1)
  • *apply*
  • *exec* corpus 9 (elastic 5, sigma 2, splunk 2)
  • *puppet*
  • *sudo* corpus 24 (splunk 22, sigma 1, elastic 1)
field:"CommandLine" kind:eq

Ollama Possible RCE via Model Loading

#
Status
experimental
Severity
low
Group by
attack_type, code_sources, error_count, error_details, error_messages, error_types, first_error, host, last_error, severity, unique_error_types
Author
Rod Soto
Source
github.com/splunk/security_content

Detects Ollama server errors and failures during model loading operations that may indicate malicious model injection, path traversal attempts, or exploitation of model loading mechanisms to achieve remote code execution. Adversaries may attempt to load specially crafted malicious models or exploit vulnerabilities in the model loading process to execute arbitrary code on the server. This detection monitors error messages and failure patterns that could signal attempts to abuse model loading functionality for malicious purposes.

Known False Positives

  • Corrupted model files from interrupted downloads, insufficient disk space or memory during legitimate model loading, incompatible model formats or versions, network timeouts when pulling models from registries, file permission issues in multi-user environments, or genuine configuration errors during initial Ollama setup may generate similar error patterns during normal operations.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access

Rule Body

name: Ollama Possible RCE via Model Loading
id: 3f28c930-5208-425d-a7b9-53d349756d91
version: 4
creation_date: '2025-10-13'
modification_date: '2026-05-13'
author: Rod Soto
status: experimental
type: Anomaly
description: Detects Ollama server errors and failures during model loading operations that may indicate malicious model injection, path traversal attempts, or exploitation of model loading mechanisms to achieve remote code execution. Adversaries may attempt to load specially crafted malicious models or exploit vulnerabilities in the model loading process to execute arbitrary code on the server. This detection monitors error messages and failure patterns that could signal attempts to abuse model loading functionality for malicious purposes.
data_source:
    - Ollama Server
search: '`ollama_server` level=ERROR ("*llama runner*" OR "*model*" OR "*server.go*" OR "*exited*") | rex field=_raw "source=(?<code_source>[^\s]+)" | rex field=_raw "msg=\"(?<msg>[^\"]+)\"" | rex field=_raw "err=\"(?<err>[^\"]+)\"" | rex field=_raw "level=(?<log_level>\w+)" | eval error_type=case( match(_raw, "exited"), "service_crash", match(_raw, "model"), "model_error", match(_raw, "llama runner"), "runner_error", 1=1, "unknown_error" ) | bin _time span=1h | stats count as error_count, earliest(_time) as first_error, latest(_time) as last_error, values(msg) as error_messages, values(err) as error_details, values(code_source) as code_sources, values(error_type) as error_types, dc(error_type) as unique_error_types by host | where error_count > 0 | eval first_error=strftime(first_error, "%Y-%m-%d %H:%M:%S") | eval last_error=strftime(last_error, "%Y-%m-%d %H:%M:%S") | eval severity=case( match(error_details, "exit status") OR error_count > 5, "critical", error_count > 2, "high", 1=1, "medium" ) | eval attack_type="Suspicious Model Loading / Potential RCE" | stats count by first_error, last_error, host, code_sources, error_count, unique_error_types, error_types, error_messages, error_details, severity, attack_type | `ollama_possible_rce_via_model_loading_filter`'
how_to_implement: 'Ingest Ollama logs via Splunk TA-ollama add-on by configuring file monitoring inputs pointed to your Ollama server log directories (sourcetype: ollama:server), or enable HTTP Event Collector (HEC) for real-time API telemetry and prompt analytics (sourcetypes: ollama:api, ollama:prompts). CIM compatibility using the Web datamodel for standardized security detections.'
known_false_positives: Corrupted model files from interrupted downloads, insufficient disk space or memory during legitimate model loading, incompatible model formats or versions, network timeouts when pulling models from registries, file permission issues in multi-user environments, or genuine configuration errors during initial Ollama setup may generate similar error patterns during normal operations.
references:
    - https://github.com/rosplk/ta-ollama
intermediate_findings:
    entities:
        - field: host
          type: system
          score: 20
          message: Suspicious model loading errors detected on $host$ with $error_count$ failures showing error messages $error_messages$, potentially indicating malicious model injection, path traversal exploitation, or attempts to achieve remote code execution through crafted model files.
analytic_story:
    - Suspicious Ollama Activities
asset_type: Web Application
mitre_attack_id:
    - T1190
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`ollama_server` level=ERROR ("*llama runner*" OR "*model*" OR "*server.go*" OR "*exited*")

Stage 2: rex

| rex field=_raw "source=(?<code_source>[^\s]+)"

Stage 3: rex

| rex field=_raw "msg=\"(?<msg>[^\"]+)\""

The parser skipped this rex command.

Stage 4: rex

| rex field=_raw "err=\"(?<err>[^\"]+)\""

The parser skipped this rex command.

Stage 5: rex

| rex field=_raw "level=(?<log_level>\w+)"

Stage 6: eval

| eval
    error_type=case(
        match(_raw, "exited"), "service_crash",
        match(_raw, "model"), "model_error",
        match(_raw, "llama runner"), "runner_error",
        1=1, "unknown_error"
    )
error_type =
ifmatch(_raw, "exited")"service_crash"
elifmatch(_raw, "model")"model_error"
elifmatch(_raw, "llama runner")"runner_error"
else"unknown_error"

Stage 7: bucket

| bin _time span=1h

Stage 8: stats

| stats
    count as error_count,
    earliest(_time) as first_error,
    latest(_time) as last_error,
    values(msg) as error_messages,
    values(err) as error_details,
    values(code_source) as code_sources,
    values(error_type) as error_types,
    dc(error_type) as unique_error_types
  by host

Stage 9: where

| where error_count > 0

Stage 10: eval

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

Stage 11: eval

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

Stage 12: eval

| eval
    severity=case(
        match(error_details, "exit status") OR error_count > 5, "critical",
        error_count > 2, "high",
        1=1, "medium"
    )
severity =
ifmatch(error_details, "exit status") OR error_count > 5"critical"
eliferror_count > 2"high"
else"medium"

Stage 13: eval

| eval attack_type="Suspicious Model Loading / Potential RCE"

Stage 14: stats

| stats
    count
  by
    first_error,
    last_error,
    host,
    code_sources,
    error_count,
    unique_error_types,
    error_types,
    error_messages,
    error_details,
    severity,
    attack_type

Stage 15: search

| `ollama_possible_rce_via_model_loading_filter`

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"*llama runner*"
1"*model*"
1"*server.go*"
1"*exited*"

Powershell Execute COM Object

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

The following analytic detects the execution of a COM CLSID through PowerShell. It leverages EventCode 4104 and searches for specific script block text indicating the creation of a COM object. This activity is significant as it is commonly used by adversaries and malware, such as the Conti ransomware, to execute commands, potentially for privilege escalation or bypassing User Account Control (UAC). If confirmed malicious, this technique could allow attackers to gain elevated privileges or persist within the environment, posing a significant security risk.

Known False Positives

  • network operrator may use this command.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Powershell Execute COM Object
id: 65711630-f9bf-11eb-8d72-acde48001122
version: 12
creation_date: '2021-08-10'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects the execution of a COM CLSID through PowerShell. It leverages EventCode 4104 and searches for specific script block text indicating the creation of a COM object. This activity is significant as it is commonly used by adversaries and malware, such as the Conti ransomware, to execute commands, potentially for privilege escalation or bypassing User Account Control (UAC). If confirmed malicious, this technique could allow attackers to gain elevated privileges or persist within the environment, posing a significant security risk.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell` EventCode=4104 ScriptBlockText = "*CreateInstance([type]::GetTypeFromCLSID*"
      | 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_execute_com_object_filter`
how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA.
known_false_positives: network operrator may use this command.
references:
    - https://threadreaderapp.com/thread/1423361119926816776.html
    - https://www.splunk.com/en_us/blog/security/hunting-for-malicious-powershell-using-script-block-logging.html
finding:
    title: A suspicious powershell script contains COM CLSID command on host $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Ransomware
    - Malicious PowerShell
    - Hermetic Wiper
    - Data Destruction
asset_type: Endpoint
mitre_attack_id:
    - T1059.001
    - T1546.015
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`powershell` EventCode=4104 ScriptBlockText = "*CreateInstance([type]::GetTypeFromCLSID*"

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTexteq
  • *CreateInstance([type]::GetTypeFromCLSID*
field:"ScriptBlockText" kind:eq value:"*CreateInstance([type]::GetTypeFromCLSID*"

Rundll32 Shimcache Flush

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

The following analytic detects the execution of a suspicious rundll32 command line used to clear the shim cache. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process execution logs and command-line arguments. This activity is significant because clearing the shim cache is an anti-forensic technique aimed at evading detection and removing forensic artifacts. If confirmed malicious, this action could hinder incident response efforts, allowing an attacker to cover their tracks and maintain persistence on the compromised machine.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Persistence
Defense Impairment

Telemetry Coverage

Rule Body

name: Rundll32 Shimcache Flush
id: a913718a-25b6-11ec-96d3-acde48001122
version: 13
creation_date: '2021-10-05'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects the execution of a suspicious rundll32 command line used to clear the shim cache. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process execution logs and command-line arguments. This activity is significant because clearing the shim cache is an anti-forensic technique aimed at evading detection and removing forensic artifacts. If confirmed malicious, this action could hinder incident response efforts, allowing an attacker to cover their tracks and maintain persistence on the compromised machine.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE `process_rundll32`
        AND
        Processes.process = "*apphelp.dll,ShimFlushCache*"
      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)`
    | `rundll32_shimcache_flush_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://blueteamops.medium.com/shimcache-flush-89daff28d15e
finding:
    title: rundll32 process execute $process$ to clear shim cache on $dest$
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: rundll32 process execute $process$ to clear shim cache on $dest$
analytic_story:
    - Unusual Processes
    - Living Off The Land
    - Compromised Windows Host
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.Processes
  WHERE `process_rundll32`
    AND
    Processes.process = "*apphelp.dll,ShimFlushCache*"
  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

| `rundll32_shimcache_flush_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.processeq
  • *apphelp.dll,ShimFlushCache*
field:"CommandLine" kind:eq value:"*apphelp.dll,ShimFlushCache*"
Processes.process_nameeq
  • rundll32.exe corpus 123 (elastic 100, splunk 23)
field:"process_basename" kind:eq value:"rundll32.exe"

Sqlite Module In Temp Folder

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

The following analytic detects the creation of sqlite3.dll files in the %temp% folder. It leverages Sysmon EventCode 11 to identify when these files are written to the temporary directory. This activity is significant because it is associated with IcedID malware, which uses the sqlite3 module to parse browser databases and steal sensitive information such as banking details, credit card information, and credentials. If confirmed malicious, this behavior could lead to significant data theft and compromise of user accounts.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Collection

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 11: FileCreate

Rule Body

name: Sqlite Module In Temp Folder
id: 0f216a38-f45f-11eb-b09c-acde48001122
version: 11
creation_date: '2021-08-05'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects the creation of sqlite3.dll files in the %temp% folder. It leverages Sysmon EventCode 11 to identify when these files are written to the temporary directory. This activity is significant because it is associated with IcedID malware, which uses the sqlite3 module to parse browser databases and steal sensitive information such as banking details, credit card information, and credentials. If confirmed malicious, this behavior could lead to significant data theft and compromise of user accounts.
data_source:
    - Sysmon EventID 11
search: '`sysmon` EventCode=11 (TargetFilename = "*\\sqlite32.dll" OR TargetFilename = "*\\sqlite64.dll") (TargetFilename = "*\\temp\\*") | stats count min(_time) as firstTime max(_time) as lastTime by action dest file_name file_path  process_guid process_id user_id vendor_product | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `sqlite_module_in_temp_folder_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA.
known_false_positives: No false positives have been identified at this time.
references:
    - https://www.cisecurity.org/insights/white-papers/security-primer-icedid
finding:
    title: Process creates a file $file_name$ in host $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - IcedID
    - Lokibot
asset_type: Endpoint
mitre_attack_id:
    - T1005
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon` EventCode=11 (TargetFilename = "*\\sqlite32.dll" OR TargetFilename = "*\\sqlite64.dll") (
    TargetFilename = "*\\temp\\*"
)

Stage 2: stats

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

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `sqlite_module_in_temp_folder_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 11 corpus 25 (splunk 25)
field:"EventID" kind:eq value:"11"
TargetFilenameeq
  • *\sqlite32.dll
  • *\sqlite64.dll
  • *\temp\* corpus 5 (splunk 5)
field:"TargetFilename" kind:eq

Suspicious Conhost.exe Commands (Sysmon)

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

Adversaries may abuse utilities that allow for command execution to bypass security restrictions that limit the use of command-line interpreters. This use case detects commands using conhost.exe to launch other executables, which may be used by adversaries to evade detection and bypass restrictions

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '17711.29614'
title: Suspicious Conhost.exe Commands
description: 'Adversaries may abuse utilities that allow for command execution to
  bypass security restrictions that limit the use of command-line interpreters. This
  use case detects commands using conhost.exe to launch other executables, which may
  be used by adversaries to evade detection and bypass restrictions. -- Software Association:
  Qakbot -- Atomics T1202 Test #3'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  TERM(conhost) | regex process="(?i)conhost\.exe.*?\.exe"| rex field=process "(?i)conhost\.exe\s+\"(?<spawned_process>[^\"]+)\.exe"
  | table _time, host, user parent_*, process, process_*, signature_id, spawned_process|
  bin span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:indirect command execution
- defense-evasion:exploitation for defense evasion
technique_id: 
- T1202
- T1211
data_category:
- Windows Sysmon
- Process command-line parameters
references:
- http://www.hexacorn.com/blog/2020/05/25/how-to-con-your-host/
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1202/T1202.md#atomic-test-3---indirect-command-execution---conhostexe

Stages and Predicates

Stage 1: search

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

Stage 2: regex

| regex process="(?i)conhost\.exe.*?\.exe"

Stage 3: rex

| rex field=process "(?i)conhost\.exe\s+\"(?<spawned_process>[^\"]+)\.exe"

The parser skipped this rex command.

Stage 4: table

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

Stage 5: bucket

| bin span=1s

Stage 6: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
processregex_match
  • (?i)conhost.exe.*?.exe corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match value:"(?i)conhost.exe.*?.exe"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1conhost

Unusual AppCert Child Process (Windows Event Log)

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

Threat actors may exploit legitimate developer utilities to execute malicious payloads by proxy. One such utility is appcert.exe, a command-line tool included in the Windows Application Certification Kit, which is typically used to verify the compliance of Windows applications with Microsoft's certification standards. This use case detects appcert launching child processes outside of known good paths C:\Program Files\Windows Kits\10\App Certification Kit\ and C:\Program Files (x86)\Windows Kits\10\App Certification Kit\

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '35215.61886'
title: Unusual AppCert Child Process
description: Threat actors may exploit legitimate developer utilities to execute malicious
  payloads by proxy. One such utility is appcert.exe, a command-line tool included
  in the Windows Application Certification Kit, which is typically used to verify
  the compliance of Windows applications with Microsoft's certification standards.
  This use case detects appcert launching child processes outside of known good paths
  C:\Program Files\Windows Kits\10\App Certification Kit\ and C:\Program Files (x86)\Windows
  Kits\10\App Certification Kit\. Living Off the Land Binary and Scripts (LOLBAS)
  (LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) (TERM(appcert) OR "appcert.exe") | regex parent_process_name="(?i)^appcert.exe"|
  regex process_path!="(?i)\x5cProgram\sFiles(\s\(x86\))?\x5cWindows\sKits\x5c10\x5c"
  | table _time, host, user, process, signature_id, parent_process_*, process_* |
  bin span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:trusted developer utilities proxy execution
technique_id: 
- T1127
data_category:
- Windows event logs
references:
- https://attack.mitre.org/techniques/T1127/
- https://attack.mitre.org/techniques/T1218/007/
- https://lolbas-project.github.io/lolbas/OtherMSBinaries/Appcert/

Stages and Predicates

Stage 1: search

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

Stage 2: regex

| regex parent_process_name="(?i)^appcert.exe"

Stage 3: regex

| regex process_path!="(?i)\x5cProgram\sFiles(\s\(x86\))?\x5cWindows\sKits\x5c10\x5c"

Stage 4: table

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

Stage 5: bucket

| bin span=1s

Stage 6: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
parent_process_nameregex_match
  • (?i)^appcert.exe corpus 2 (splunk 2)
field:"parent_process_name" kind:regex_match value:"(?i)^appcert.exe"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process_pathregex_match(?i)\x5cProgram\sFiles(\s(x86))?\x5cWindows\sKits\x5c10\x5cexcludes:process_path field:"process_path" value:"(?i)\x5cProgram\sFiles(\s(x86))?\x5cWindows\sKits\x5c10\x5c"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1appcert
1"appcert.exe"

Windows Disable Memory Crash Dump

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

The following analytic detects attempts to disable the memory crash dump feature on Windows systems by setting the registry value to 0. It leverages data from the Endpoint.Registry datamodel, specifically monitoring changes to the CrashDumpEnabled registry key. This activity is significant because disabling crash dumps can hinder forensic analysis and incident response efforts. If confirmed malicious, this action could be part of a broader attack strategy, such as data destruction or system destabilization, as seen with HermeticWiper, potentially leading to significant operational disruptions and data loss.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Impact

Telemetry Coverage

Rule Body

name: Windows Disable Memory Crash Dump
id: 59e54602-9680-11ec-a8a6-acde48001122
version: 12
creation_date: '2022-02-25'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects attempts to disable the memory crash dump feature on Windows systems by setting the registry value to 0. It leverages data from the Endpoint.Registry datamodel, specifically monitoring changes to the CrashDumpEnabled registry key. This activity is significant because disabling crash dumps can hinder forensic analysis and incident response efforts. If confirmed malicious, this action could be part of a broader attack strategy, such as data destruction or system destabilization, as seen with HermeticWiper, potentially leading to significant operational disruptions and data loss.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Registry where (Registry.registry_path="*\\CurrentControlSet\\Control\\CrashControl\\CrashDumpEnabled") 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(firstTime)` | `security_content_ctime(lastTime)` | `windows_disable_memory_crash_dump_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the Filesystem responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Filesystem` and `Registry` node.
known_false_positives: No false positives have been identified at this time.
references:
    - https://blog.talosintelligence.com/2022/02/threat-advisory-hermeticwiper.html
    - https://docs.microsoft.com/en-us/troubleshoot/windows-server/performance/memory-dump-file-options
finding:
    title: A process was identified attempting to disable memory crash dumps on $dest$.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: A process was identified attempting to disable memory crash dumps on $dest$.
analytic_story:
    - Ransomware
    - Data Destruction
    - Windows Registry Abuse
    - Hermetic Wiper
asset_type: Endpoint
mitre_attack_id:
    - T1485
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
  FROM datamodel=Endpoint.Registry
  where (Registry.registry_path="*\\CurrentControlSet\\Control\\CrashControl\\CrashDumpEnabled")
    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(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_disable_memory_crash_dump_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Registry.registry_patheq
  • *\CurrentControlSet\Control\CrashControl\CrashDumpEnabled
field:"registry_path" kind:eq value:"*\CurrentControlSet\Control\CrashControl\CrashDumpEnabled"
Registry.registry_value_dataeq
  • 0x00000000 corpus 41 (splunk 33, elastic 8)
field:"Details" kind:eq value:"0x00000000"

Windows Impair Defense Disable Win Defender Compute File Hashes

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

The following analytic detects modifications to the Windows registry that disable Windows Defender's file hash computation by setting the EnableFileHashComputation value to 0. This detection leverages data from the Endpoint.Registry data model, focusing on changes to the specific registry path associated with Windows Defender. Disabling file hash computation can significantly impair Windows Defender's ability to detect and scan for malware, making it a critical behavior to monitor. If confirmed malicious, this activity could allow attackers to bypass Windows Defender, facilitating undetected malware execution and persistence in the environment.

Known False Positives

  • It is unusual to turn this feature off a Windows system since it is a default security control, although it is not rare for some policies to disable it. Although no false positives have been identified, use the provided filter macro to tune the search.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows Impair Defense Disable Win Defender Compute File Hashes
id: fe52c280-98bd-4596-b6f6-a13bbf8ac7c6
version: 11
creation_date: '2024-01-29'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects modifications to the Windows registry that disable Windows Defender's file hash computation by setting the EnableFileHashComputation value to 0. This detection leverages data from the Endpoint.Registry data model, focusing on changes to the specific registry path associated with Windows Defender. Disabling file hash computation can significantly impair Windows Defender's ability to detect and scan for malware, making it a critical behavior to monitor. If confirmed malicious, this activity could allow attackers to bypass Windows Defender, facilitating undetected malware execution and persistence in the environment.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path= "*\\Windows Defender\\MpEngine\\EnableFileHashComputation" 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(firstTime)` | `security_content_ctime(lastTime)` | `windows_impair_defense_disable_win_defender_compute_file_hashes_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Registry` node.
known_false_positives: It is unusual to turn this feature off a Windows system since it is a default security control, although it is not rare for some policies to disable it. Although no false positives have been identified, use the provided filter macro to tune the search.
references:
    - https://x.com/malmoeb/status/1742604217989415386?s=20
    - https://github.com/undergroundwires/privacy.sexy
finding:
    title: Windows Defender File hashes computation set to disable on $dest$.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Windows Defense Evasion Tactics
    - Windows Registry Abuse
asset_type: Endpoint
mitre_attack_id:
    - T1685
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Registry
  where Registry.registry_path= "*\\Windows Defender\\MpEngine\\EnableFileHashComputation"
    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(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_impair_defense_disable_win_defender_compute_file_hashes_filter`

Indicators

These rows show field, operator, and value matches.

Windows NirSoft Tool Bundle File Created

#
Status
production
Severity
low
Group by
CreationUtcTime, computer_name, event_action, file_access_time, file_acl, file_hash, file_modify_time, file_name, file_size, process_guid, process_id, target_filename, user, vendor_product
Author
Nasreddine Bencherchali, Splunk
Source
github.com/splunk/security_content

The following analytic detects the creation of files associated with the NirSoft tool bundles on Windows endpoints. NirSoft is a well-known provider of free, portable utilities that can be used for various system and network tasks. However, threat actors often leverage these tools for malicious purposes, such as credential harvesting, network reconnaissance, and data exfiltration. The detection focuses on the creation of specific NirSoft tool bundle files, which may indicate that an attacker is preparing to use these utilities on a compromised system. Security teams should investigate any instances of these files being created, especially if they are found in unexpected locations or on systems that should not be using such tools.

Known False Positives

  • Administrators or users may download NirSoft tools for legitimate purposes, such as system maintenance or troubleshooting. These instances should be reviewed to determine if the activity is authorized.

MITRE ATT&CK Coverage

TacticTechniques
Resource Development

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 11: FileCreate

Rule Body

name: Windows NirSoft Tool Bundle File Created
id: a2c8e8f8-18d6-4ad4-acf4-f58903bebe41
version: 5
creation_date: '2025-10-24'
modification_date: '2026-05-13'
author: Nasreddine Bencherchali, Splunk
status: production
type: Anomaly
description: |
    The following analytic detects the creation of files associated with the NirSoft
    tool bundles on Windows endpoints.
    NirSoft is a well-known provider of free, portable utilities that can be used for various system and network tasks. However, threat actors often leverage these tools for malicious purposes, such as credential harvesting, network reconnaissance, and data exfiltration.
    The detection focuses on the creation of specific NirSoft tool bundle files, which may indicate that an attacker is preparing to use these utilities on a compromised system.
    Security teams should investigate any instances of these files being created, especially if they are found in unexpected locations or on systems that should not be using such tools.
data_source:
    - Sysmon EventID 11
search: |
    | tstats `security_content_summariesonly`
      count values(Filesystem.file_path) as file_path
            min(_time) as firstTime
            max(_time) as lastTime

    from datamodel=Endpoint.Filesystem where

    ``` Increase coverage by adding additional Nirsoft tool bundle or tool filenames ```

    Filesystem.file_name IN (
      "brtools.zip",
      "mailpv.zip",
      "networktools.zip",
      "passreccommandline.zip",
      "passrecenc.zip",
      "progtools.zip",
      "rdpv.zip",
      "systools.zip",
      "webbrowserpassview.zip"
    )

    by Filesystem.action Filesystem.dest Filesystem.file_access_time Filesystem.file_create_time
       Filesystem.file_hash Filesystem.file_modify_time Filesystem.file_name Filesystem.file_path
       Filesystem.file_acl Filesystem.file_size Filesystem.process_guid Filesystem.process_id
       Filesystem.user Filesystem.vendor_product

    | `drop_dm_object_name("Filesystem")`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_nirsoft_tool_bundle_file_created_filter`
how_to_implement: |
    To successfully implement this search, you must be ingesting data that records the file-system activity from your hosts to populate the Endpoint.Filesystem data model node.
    This is typically populated via endpoint detection-and-response product, such as Carbon Black, or by other endpoint data sources, such as Sysmon.
    The data used for this search is typically generated via logs that report file-system reads and writes.
known_false_positives: |
    Administrators or users may download NirSoft tools for legitimate purposes, such as system maintenance or troubleshooting.
    These instances should be reviewed to determine if the activity is authorized.
references:
    - https://thedfirreport.com/2020/04/04/gogoogle-ransomware/
    - https://asec.ahnlab.com/en/48940/
    - https://www.trendmicro.com/en_gb/research/23/c/emotet-returns-now-adopts-binary-padding-for-evasion.html
    - https://www.welivesecurity.com/2022/06/16/how-emotet-is-changing-tactics-microsoft-tightening-office-macro-security/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: NirSoft tool bundle file $file_name$ created on host $dest$
analytic_story:
    - Unusual Processes
    - Data Destruction
    - WhisperGate
asset_type: Endpoint
mitre_attack_id:
    - T1588.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 values(Filesystem.file_path) as file_path
        min(_time) as firstTime
        max(_time) as lastTime
from datamodel=Endpoint.Filesystem where
Filesystem.file_name IN (
  "brtools.zip",
  "mailpv.zip",
  "networktools.zip",
  "passreccommandline.zip",
  "passrecenc.zip",
  "progtools.zip",
  "rdpv.zip",
  "systools.zip",
  "webbrowserpassview.zip"
)
by Filesystem.action Filesystem.dest Filesystem.file_access_time Filesystem.file_create_time
   Filesystem.file_hash Filesystem.file_modify_time Filesystem.file_name Filesystem.file_path
   Filesystem.file_acl Filesystem.file_size Filesystem.process_guid Filesystem.process_id
   Filesystem.user Filesystem.vendor_product

Stage 2: search

| `drop_dm_object_name("Filesystem")`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_nirsoft_tool_bundle_file_created_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Filesystem.file_namein
  • brtools.zip
  • mailpv.zip
  • networktools.zip
  • passreccommandline.zip
  • passrecenc.zip
  • progtools.zip
  • rdpv.zip
  • systools.zip
  • webbrowserpassview.zip
field:"file_name" kind:in

Windows Phantom DLL Created on Disk

#
Status
production
Severity
medium
Group by
computer_name, event_action, file_hash, file_name, process_id, target_filename, user, vendor_product
Author
Onur Mustafa Erdogan, Nasreddine Bencherchali, Splunk
Source
github.com/splunk/security_content

The following analytic detects creation of DLL files with names associated with phantom DLL hijacking opportunities. These DLLs are usually absent from standard Windows installations, but legitimate Windows components or services may attempt to load them when they are present in expected search paths such as System32. Phantom DLL hijacking involves placing a malicious DLL where a legitimate process will search for a non-existent dependency, allowing the attacker-controlled library to execute in that process context. ShieldBreak is one example where the exploit redirects a privileged Defender-driven write into C:\Windows\System32\phoneinfo.dll and then triggers Windows Error Reporting so wermgr.exe loads the planted DLL at SYSTEM integrity. If confirmed malicious, this activity can indicate preparation for code execution, persistence, or local privilege escalation through DLL search order hijacking.

Known False Positives

  • Some legacy or third-party components may create DLLs with these names for legitimate compatibility reasons, but creation in Windows system paths should be uncommon. Review the creating process, signer, file hash, path, and whether the DLL is expected on the host before tuning.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 11: FileCreate

Rule Body

name: Windows Phantom DLL Created on Disk
id: 34cb2dfb-1dec-4b6b-bc72-c3904e5e4521
version: 2
creation_date: '2026-08-17'
modification_date: '2026-08-20'
author: Onur Mustafa Erdogan, Nasreddine Bencherchali, Splunk
status: production
type: TTP
description: |-
    The following analytic detects creation of DLL files with names associated with phantom DLL hijacking opportunities.
    These DLLs are usually absent from standard Windows installations, but legitimate Windows components or services may attempt to load them when they are present in expected search paths such as System32.
    Phantom DLL hijacking involves placing a malicious DLL where a legitimate process will search for a non-existent dependency, allowing the attacker-controlled library to execute in that process context.
    ShieldBreak is one example where the exploit redirects a privileged Defender-driven write into C:\Windows\System32\phoneinfo.dll and then triggers Windows Error Reporting so wermgr.exe loads the planted DLL at SYSTEM integrity.
    If confirmed malicious, this activity can indicate preparation for code execution, persistence, or local privilege escalation through DLL search order hijacking.
data_source:
    - Sysmon EventID 11
search: |-
    | tstats `security_content_summariesonly`
      count min(_time) as firstTime
            max(_time) as lastTime
    from datamodel=Endpoint.Filesystem where

    Filesystem.action IN ("created","modified")

    Filesystem.file_path IN (
        "*:\\Windows\\System32\\axeonoffhelper.dll",
        "*:\\Windows\\System32\\cdpsgshims.dll",
        "*:\\Windows\\System32\\oci.dll",
        "*:\\Windows\\System32\\offdmpsvc.dll",
        "*:\\Windows\\System32\\shellchromeapi.dll",
        "*:\\Windows\\System32\\TSMSISrv.dll",
        "*:\\Windows\\System32\\TSVIPSrv.dll",
        "*:\\Windows\\System32\\wbem\\wbemcomn.dll",
        "*:\\Windows\\System32\\WLBSCTRL.dll",
        "*:\\Windows\\System32\\wow64log.dll",
        "*:\\Windows\\System32\\WptsExtensions.dll",
        "*\\phoneinfo.dll",
        "*\\SprintCSP.dll"
    )
    by Filesystem.action Filesystem.dest Filesystem.file_hash
       Filesystem.file_name Filesystem.file_path Filesystem.process_id
       Filesystem.user Filesystem.vendor_product

    | `drop_dm_object_name(Filesystem)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_phantom_dll_created_on_disk_filter`
how_to_implement: |-
    To successfully implement this search, you need file creation telemetry from Windows endpoints mapped into the Endpoint.Filesystem datamodel.
    If you are using Sysmon, enable EventID 11 and ensure the FileCreate configuration captures the full target filename for DLL creations in Windows system paths.
known_false_positives: |-
    Some legacy or third-party components may create DLLs with these names for legitimate compatibility reasons, but creation in Windows system paths should be uncommon.
    Review the creating process, signer, file hash, path, and whether the DLL is expected on the host before tuning.
references:
    - http://remoteawesomethoughts.blogspot.com/2019/05/windows-10-task-schedulerservice.html
    - https://clement.notin.org/blog/2020/09/12/CVE-2020-7315-McAfee-Agent-DLL-injection/
    - https://decoded.avast.io/martinchlumecky/png-steganography/
    - https://github.com/blackarrowsec/redteam-research/tree/26e6fc0c0d30d364758fa11c2922064a9a7fd309/LPE%20via%20StorSvc
    - https://github.com/Wh04m1001/SysmonEoP
    - https://itm4n.github.io/cdpsvc-dll-hijacking/
    - https://posts.specterops.io/lateral-movement-scm-and-dll-hijacking-primer-d2f61e8ab992
    - https://securelist.com/passiveneuron-campaign-with-apt-implants-and-cobalt-strike/117745/
    - https://www.crowdstrike.com/en-us/blog/4-ways-adversaries-hijack-dlls/
    - https://www.cyderes.com/howler-cell/rogueplanet-windows-zero-day
    - https://www.hexacorn.com/blog/2013/12/08/beyond-good-ol-run-key-part-5/
    - https://www.hexacorn.com/blog/2016/06/02/beyond-good-ol-run-key-part-40/
    - https://www.hexacorn.com/blog/2025/06/14/wermgr-exe-boot-offdmpsvc-dll-lolbin/
    - https://www.hexacorn.com/blog/2025/06/14/wpr-exe-boottrace-phantom-dll-axeonoffhelper-dll-lolbin/
    - https://www.threatlocker.com/blog/nightmareeclipse-releases-new-poc-shieldbreak-exploits-same-weakness-as-rogueplanet
    - https://x.com/0gtweet/status/1564131230941122561
finding:
    title: A phantom DLL candidate named [$file_name$] was created at [$file_path$] on [$dest$]
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: file_name
      type: file_name
    - field: file_path
      type: file_path
analytic_story:
    - RoguePlanet
    - Windows Privilege Escalation
    - Windows Defense Evasion Tactics
asset_type: Endpoint
mitre_attack_id:
    - T1574.001
    - T1068
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
  count min(_time) as firstTime
        max(_time) as lastTime
from datamodel=Endpoint.Filesystem where

Filesystem.action IN ("created","modified")

Filesystem.file_path IN (
    "*:\\Windows\\System32\\axeonoffhelper.dll",
    "*:\\Windows\\System32\\cdpsgshims.dll",
    "*:\\Windows\\System32\\oci.dll",
    "*:\\Windows\\System32\\offdmpsvc.dll",
    "*:\\Windows\\System32\\shellchromeapi.dll",
    "*:\\Windows\\System32\\TSMSISrv.dll",
    "*:\\Windows\\System32\\TSVIPSrv.dll",
    "*:\\Windows\\System32\\wbem\\wbemcomn.dll",
    "*:\\Windows\\System32\\WLBSCTRL.dll",
    "*:\\Windows\\System32\\wow64log.dll",
    "*:\\Windows\\System32\\WptsExtensions.dll",
    "*\\phoneinfo.dll",
    "*\\SprintCSP.dll"
)
by Filesystem.action Filesystem.dest Filesystem.file_hash
   Filesystem.file_name Filesystem.file_path Filesystem.process_id
   Filesystem.user Filesystem.vendor_product

Stage 2: search

| `drop_dm_object_name(Filesystem)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_phantom_dll_created_on_disk_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Filesystem.actionin
  • created corpus 10 (splunk 10)
  • modified corpus 10 (splunk 10)
field:"event_action" kind:in
Filesystem.file_pathin
  • *:\Windows\System32\TSMSISrv.dll
  • *:\Windows\System32\TSVIPSrv.dll
  • *:\Windows\System32\WLBSCTRL.dll
  • *:\Windows\System32\WptsExtensions.dll
  • *:\Windows\System32\axeonoffhelper.dll
  • *:\Windows\System32\cdpsgshims.dll
  • *:\Windows\System32\oci.dll
  • *:\Windows\System32\offdmpsvc.dll
  • *:\Windows\System32\shellchromeapi.dll
  • *:\Windows\System32\wbem\wbemcomn.dll
  • *:\Windows\System32\wow64log.dll
  • *\SprintCSP.dll
  • *\phoneinfo.dll
field:"TargetFilename" kind:in

Windows UAC Bypass Suspicious Escalation Behavior

#
Status
production
Severity
medium
Group by
IntegrityLevel, command_line, computer_name, dest, event_action, join_guid_1, join_guid_2, 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
Steven Dick
Source
github.com/splunk/security_content

The following analytic detects when a process spawns an executable known for User Account Control (UAC) bypass exploitation and subsequently monitors for any child processes with a higher integrity level than the original process. This detection leverages Sysmon EventID 1 data, focusing on process integrity levels and known UAC bypass executables. This activity is significant as it may indicate an attacker has successfully used a UAC bypass exploit to escalate privileges. If confirmed malicious, the attacker could gain elevated privileges, potentially leading to further system compromise and persistent access.

Known False Positives

  • Including Werfault.exe may cause some unintended false positives related to normal application faulting, but is used in a number of UAC bypass techniques.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

name: Windows UAC Bypass Suspicious Escalation Behavior
id: 00d050d3-a5b4-4565-a6a5-a31f69681dc3
version: 14
creation_date: '2024-01-10'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: TTP
description: |-
    The following analytic detects when a process spawns an executable known for User Account Control (UAC) bypass exploitation and subsequently monitors for any child processes with a higher integrity level than the original process.
    This detection leverages Sysmon EventID 1 data, focusing on process integrity levels and known UAC bypass executables.
    This activity is significant as it may indicate an attacker has successfully used a UAC bypass exploit to escalate privileges.
    If confirmed malicious, the attacker could gain elevated privileges, potentially leading to further system compromise and persistent access.
data_source:
    - Sysmon EventID 1 AND Sysmon EventID 1
search: |-
    | tstats `security_content_summariesonly`
      count max(_time) as lastTime

    FROM datamodel=Endpoint.Processes WHERE

    Processes.process_integrity_level IN (
        "low",
        "medium"
    )

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

    | eval original_integrity_level = CASE(
                match(process_integrity_level,"low"),1,
                match(process_integrity_level,"medium"),2,
                match(process_integrity_level,"high"),3,
                match(process_integrity_level,"system"),4,
                true(),0
            )
    | rename process_guid as join_guid_1,
             process* as parent_process*

    | join max=0 dest join_guid_1 [
        | tstats `security_content_summariesonly`
          count min(_time) as firstTime
        FROM datamodel=Endpoint.Processes WHERE

        Processes.process_integrity_level IN (
            "high",
            "system"
        )
        Processes.process_name IN (`uacbypass_process_name`)

        BY Processes.dest Processes.parent_process_guid
           Processes.process_name Processes.process_guid

        | `drop_dm_object_name(Processes)`
        | rename parent_process_guid as join_guid_1,
                 process_guid as join_guid_2,
                 process_name as uac_process_name
    ]

    | join max=0 dest join_guid_2 [
        | tstats `security_content_summariesonly`
          count min(_time) as firstTime
        FROM datamodel=Endpoint.Processes WHERE

        Processes.parent_process_name IN (`uacbypass_process_name`)
        Processes.process_integrity_level IN (
            "high",
            "system"
        )
        BY Processes.dest Processes.parent_process_guid
           Processes.process_name Processes.process
           Processes.process_guid Processes.process_path
           Processes.process_integrity_level Processes.process_current_directory

        | `drop_dm_object_name(Processes)`

        | rename parent_process_guid as join_guid_2

        | eval elevated_integrity_level = CASE(
            match(process_integrity_level,"low"),1,
            match(process_integrity_level,"medium"),2,
            match(process_integrity_level,"high"),3,
            match(process_integrity_level,"system"),4,
            true(),0
        )
    ]
    | where elevated_integrity_level > original_integrity_level
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_uac_bypass_suspicious_escalation_behavior_filter`
how_to_implement: |-
    Target environment must ingest sysmon data, specifically Event ID 1 with process integrity level data.
known_false_positives: |-
    Including Werfault.exe may cause some unintended false positives related to normal application faulting, but is used in a number of UAC bypass techniques.
references:
    - https://attack.mitre.org/techniques/T1548/002/
    - https://atomicredteam.io/defense-evasion/T1548.002/
    - https://hadess.io/user-account-control-uncontrol-mastering-the-art-of-bypassing-windows-uac/
    - https://enigma0x3.net/2016/08/15/fileless-uac-bypass-using-eventvwr-exe-and-registry-hijacking/
finding:
    title: A UAC bypass behavior was detected by process $parent_process_name$ on host $dest$ by $user$.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: A UAC bypass behavior was detected by process $parent_process_name$ on host $dest$ by $user$.
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process_name
      type: process_name
    - field: process_name
      type: process_name
analytic_story:
    - Living Off The Land
    - Compromised Windows Host
    - Windows Defense Evasion Tactics
asset_type: Endpoint
mitre_attack_id:
    - T1548.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 max(_time) as lastTime

FROM datamodel=Endpoint.Processes WHERE

Processes.process_integrity_level IN (
    "low",
    "medium"
)

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: eval

| eval original_integrity_level = CASE(
            match(process_integrity_level,"low"),1,
            match(process_integrity_level,"medium"),2,
            match(process_integrity_level,"high"),3,
            match(process_integrity_level,"system"),4,
            true(),0
        )
original_integrity_level =
ifmatch(process_integrity_level, "low")1
elifmatch(process_integrity_level, "medium")2
elifmatch(process_integrity_level, "high")3
elifmatch(process_integrity_level, "system")4
else0

Stage 4: rename

| rename process_guid as join_guid_1,
         process* as parent_process*

Stage 5: join

| join max=0 dest join_guid_1 [
    | tstats `security_content_summariesonly`
      count min(_time) as firstTime
    FROM datamodel=Endpoint.Processes WHERE

    Processes.process_integrity_level IN (
        "high",
        "system"
    )
    Processes.process_name IN (`uacbypass_process_name`)

    BY Processes.dest Processes.parent_process_guid
       Processes.process_name Processes.process_guid

    | `drop_dm_object_name(Processes)`
    | rename parent_process_guid as join_guid_1,
             process_guid as join_guid_2,
             process_name as uac_process_name
]

Stage 6: join

| join max=0 dest join_guid_2 [
    | tstats `security_content_summariesonly`
      count min(_time) as firstTime
    FROM datamodel=Endpoint.Processes WHERE

    Processes.parent_process_name IN (`uacbypass_process_name`)
    Processes.process_integrity_level IN (
        "high",
        "system"
    )
    BY Processes.dest Processes.parent_process_guid
       Processes.process_name Processes.process
       Processes.process_guid Processes.process_path
       Processes.process_integrity_level Processes.process_current_directory

    | `drop_dm_object_name(Processes)`

    | rename parent_process_guid as join_guid_2

    | eval elevated_integrity_level = CASE(
        match(process_integrity_level,"low"),1,
        match(process_integrity_level,"medium"),2,
        match(process_integrity_level,"high"),3,
        match(process_integrity_level,"system"),4,
        true(),0
    )
]

Stage 7: where

| where elevated_integrity_level > original_integrity_level

Stage 8: search

| `security_content_ctime(firstTime)`

Stage 9: search

| `security_content_ctime(lastTime)`

Stage 10: search

| `windows_uac_bypass_suspicious_escalation_behavior_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.parent_process_namein
  • BitlockerWizardElev.exe corpus 2 (splunk 2)
  • CompMgmtLauncher.exe corpus 2 (splunk 2)
  • EventVwr.exe corpus 2 (splunk 2)
  • GWXUXWorker.exe corpus 2 (splunk 2)
  • SystemPropertiesAdvanced.exe corpus 2 (splunk 2)
  • TpmInit.exe corpus 2 (splunk 2)
  • WSReset.exe corpus 2 (splunk 2)
  • WerFault.exe corpus 2 (splunk 2)
  • cliconfg.exe corpus 2 (splunk 2)
  • clipup.exe corpus 2 (splunk 2)
  • cmstp.exe corpus 2 (splunk 2)
  • consent.exe corpus 2 (splunk 2)
  • control.exe corpus 2 (splunk 2)
  • credwiz.exe corpus 2 (splunk 2)
  • dccw.exe corpus 2 (splunk 2)
  • dismhost.exe corpus 2 (splunk 2)
  • fodhelper.exe corpus 2 (splunk 2)
  • inetmgr.exe corpus 2 (splunk 2)
  • iscsicli.exe corpus 2 (splunk 2)
  • mcx2prov.exe corpus 2 (splunk 2)
  • migwiz.exe corpus 2 (splunk 2)
  • mmc.exe corpus 5 (splunk 3, elastic 2)
  • msconfig.exe corpus 2 (splunk 2)
  • oobe.exe corpus 2 (splunk 2)
  • osk.exe corpus 2 (splunk 2)
  • pkgmgr.exe corpus 2 (splunk 2)
  • recdisc.exe corpus 2 (splunk 2)
  • rstrui.exe corpus 2 (splunk 2)
  • sdclt.exe corpus 2 (splunk 2)
  • setupsqm.exe corpus 2 (splunk 2)
  • slui.exe corpus 2 (splunk 2)
  • sysprep.exe corpus 2 (splunk 2)
  • taskhost.exe corpus 2 (splunk 2)
  • tzsync.exe corpus 2 (splunk 2)
  • w32tm.exe corpus 2 (splunk 2)
  • wusa.exe corpus 2 (splunk 2)
field:"parent_process_basename" kind:in
Processes.process_integrity_levelin
  • high corpus 4 (splunk 4)
  • low corpus 3 (splunk 3)
  • medium corpus 3 (splunk 3)
  • system corpus 3 (splunk 3)
field:"IntegrityLevel" kind:in
Processes.process_namein
  • BitlockerWizardElev.exe
  • CompMgmtLauncher.exe
  • EventVwr.exe
  • GWXUXWorker.exe
  • SystemPropertiesAdvanced.exe
  • TpmInit.exe
  • WSReset.exe
  • WerFault.exe corpus 2 (splunk 2)
  • cliconfg.exe
  • clipup.exe
  • cmstp.exe corpus 6 (splunk 6)
  • consent.exe
  • control.exe corpus 2 (splunk 2)
  • credwiz.exe
  • dccw.exe
  • dismhost.exe
  • fodhelper.exe
  • inetmgr.exe
  • iscsicli.exe
  • mcx2prov.exe
  • migwiz.exe
  • mmc.exe corpus 8 (splunk 5, elastic 3)
  • msconfig.exe corpus 6 (splunk 6)
  • oobe.exe
  • osk.exe
  • pkgmgr.exe
  • recdisc.exe
  • rstrui.exe
  • sdclt.exe
  • setupsqm.exe
  • slui.exe
  • sysprep.exe
  • taskhost.exe
  • tzsync.exe
  • w32tm.exe
  • wusa.exe corpus 2 (splunk 2)
field:"process_basename" kind:in

Windows VSSVC Process Accessing Defender Engine

#
Status
production
Severity
medium
Group by
CallTrace, GrantedAccess, Guid, Opcode, SourceProcessGUID, TargetProcessGUID, dest, parent_process_guid, parent_process_name, process_guid, process_id, process_name, signature, signature_id, source_process_name, target_process_name, user, user_id
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

Detects vssvc.exe opening a handle to MsMpEng.exe. In the RedSun exploit, VSS participates in the cloud-file restore race that directs WD to write through the NTFS junction. This handle acquisition is observed at the exact moment of exploitation. vssvc querying MsMpEng is not expected in normal operation.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Privilege Escalation

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 10: ProcessAccess

Rule Body

name: Windows VSSVC Process Accessing Defender Engine
id: 0c398be7-e33a-4882-9546-12166ceaf73c
version: 1
creation_date: '2026-05-01'
modification_date: '2026-05-01'
author: Raven Tait, Splunk
status: production
type: TTP
description: |-
    Detects vssvc.exe opening a handle to MsMpEng.exe.
    In the RedSun exploit, VSS participates in the cloud-file restore race that directs WD to write through the NTFS junction.
    This handle acquisition is observed at the exact moment of exploitation.
    vssvc querying MsMpEng is not expected in normal operation.
data_source:
    - Sysmon EventID 10
search: |-
    `sysmon`
    EventCode=10
    TargetImage="*\\MsMpEng.exe"
    SourceImage="*\\vssvc.exe"
    | stats count min(_time) as firstTime
                  max(_time) as lastTime
      by EventID GrantedAccess Guid Opcode ProcessID
         SourceImage SourceProcessGUID  SourceProcessId
         TargetImage TargetProcessGUID TargetProcessId
         UserID dest CallTrace user_id parent_process_name
         parent_process_guid process_name
         process_guid process_id signature
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_vssvc_process_accessing_defender_engine_filter`
how_to_implement: |-
    This search requires Sysmon Logs and a Sysmon configuration, which includes EventCode 10 for lsass.exe.
    This search uses an input macro named `sysmon`. We strongly recommend that you specify your environment-specific configurations (index, source, sourcetype, etc.) for Windows Sysmon logs.
    Replace the macro definition with configurations for your Splunk environment. The search also uses a post-filter macro designed to filter out known false positives.
known_false_positives: |-
    No false positives have been identified at this time.
references:
    - https://github.com/Nightmare-Eclipse/RedSun
    - https://www.huntress.com/blog/nightmare-eclipse-intrusion
finding:
    title: Windows Process $SourceImage$ accessing $TargetImage$ on $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - RedSun
    - Windows Privilege Escalation
asset_type: Endpoint
cve:
    - CVE-2026-33825
mitre_attack_id:
    - T1068
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon`
EventCode=10
TargetImage="*\\MsMpEng.exe"
SourceImage="*\\vssvc.exe"

Stage 2: stats

| stats count min(_time) as firstTime
              max(_time) as lastTime
  by EventID GrantedAccess Guid Opcode ProcessID
     SourceImage SourceProcessGUID  SourceProcessId
     TargetImage TargetProcessGUID TargetProcessId
     UserID dest CallTrace user_id parent_process_name
     parent_process_guid process_name
     process_guid process_id signature

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_vssvc_process_accessing_defender_engine_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 10 corpus 16 (splunk 16)
field:"EventID" kind:eq value:"10"
SourceImageeq
  • *\vssvc.exe corpus 2 (sigma 1, splunk 1)
field:"SourceImage" kind:eq value:"*\vssvc.exe"
TargetImageeq
  • *\MsMpEng.exe corpus 2 (sigma 1, splunk 1)
field:"TargetImage" kind:eq value:"*\MsMpEng.exe"

WmiPrvSE Suspicious Child Process (Windows Event Log)

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

Windows Management Instrumentation Provider Service (WmiPrvSE.exe) is a Windows component used for system management, monitoring, and reporting. While it is legitimately used by system administrators, its system privileges make it an attractive target for abuse by threat actors. This use case detects unusual child processes of WmiPrvSe.exe. It specifically looks for instances where known scripting or executable processes are spawned by WmiPrvSe.exe. The rule excludes certain system processes like 'werfault' and 'wmiprvse' and specific user accounts to reduce false positives, focusing on patterns that are often associated with security threats or attacks

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '25922.47940'
title: WmiPrvSE Suspicious Child Process
description: Windows Management Instrumentation Provider Service (WmiPrvSE.exe) is
  a Windows component used for system management, monitoring, and reporting. While
  it is legitimately used by system administrators, its system privileges make it
  an attractive target for abuse by threat actors. This use case detects unusual child
  processes of WmiPrvSe.exe. It specifically looks for instances where known scripting
  or executable processes are spawned by WmiPrvSe.exe. The rule excludes certain system
  processes like 'werfault' and 'wmiprvse' and specific user accounts to reduce false
  positives, focusing on patterns that are often associated with security threats
  or attacks. Living Off the Land Binary and Scripts (LOLBAS) (LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) (TERM(wmiprvse) OR "wmiprvse.exe") (TERM(certutil)
  OR TERM(cscript) OR TERM(mshta) OR TERM(msiexec) OR TERM(regsvr32) OR TERM(rundll32)
  OR TERM(verclsid) OR TERM(wscript) OR "certutil" OR "cscript" OR "mshta" OR "msiexec"
  OR "regsvr32" OR "rundll32" OR "verclsid" OR "wscript") | where match(parent_process_path,
  "(?i)(\x5cwbem\x5cwmiprvse\.exe)") and (match(process_name, "(?i)(certutil|cscript|mshta|msiexec|regsvr32|rundll32|verclsid|wscript)\.exe")
  or match(process_name, "(?i)cmd\.exe") and match(process, "(?i)(cscript|mshta|powershell|pwsh|regsvr32|rundll32|wscript)"))
  and not match(process_name, "(?i)(werfault|wmiprvse)\.exe") and not match(user,
  "AUTHORI|AUTORI") | table _time, host, user, process, process_*, parent_process_*
  | bin span=1s | stats values(*) as * by _time, host '
techniques:
- execution:windows management instrumentation
technique_id: 
- T1047
data_category:
- Windows event logs
references:
- https://thedfirreport.com/2021/03/29/sodinokibi-aka-revil-ransomware/
- https://blog.osarmor.com/319/onenote-attachment-delivers-asyncrat-malware/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) (TERM(wmiprvse) OR "wmiprvse.exe") (TERM(certutil) OR TERM(cscript) OR TERM(mshta) OR TERM(msiexec) OR TERM(regsvr32) OR TERM(rundll32) OR TERM(verclsid) OR TERM(wscript) OR "certutil" OR "cscript" OR "mshta" OR "msiexec" OR "regsvr32" OR "rundll32" OR "verclsid" OR "wscript")

Stage 2: where

| where match(parent_process_path, "(?i)(\x5cwbem\x5cwmiprvse\.exe)") and (
    match(
        process_name,
        "(?i)(certutil|cscript|mshta|msiexec|regsvr32|rundll32|verclsid|wscript)\.exe"
    )
    or match(process_name, "(?i)cmd\.exe")
    and match(process, "(?i)(cscript|mshta|powershell|pwsh|regsvr32|rundll32|wscript)")
) and not match(process_name, "(?i)(werfault|wmiprvse)\.exe") and not match(user, "AUTHORI|AUTORI")

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
parent_process_pathregex_match
  • (?i)(\x5cwbem\x5cwmiprvse.exe) corpus 2 (splunk 2)
field:"parent_process_name" kind:regex_match value:"(?i)(\x5cwbem\x5cwmiprvse.exe)"
processregex_match
  • (?i)(cscript|mshta|powershell|pwsh|regsvr32|rundll32|wscript) corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match value:"(?i)(cscript|mshta|powershell|pwsh|regsvr32|rundll32|wscript)"
process_nameregex_match
  • (?i)(certutil|cscript|mshta|msiexec|regsvr32|rundll32|verclsid|wscript).exe corpus 2 (splunk 2)
  • (?i)cmd.exe corpus 3 (splunk 3)
field:"process_name" kind:regex_match

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process_nameregex_match(?i)(werfault|wmiprvse).exeexcludes:process_name field:"process_name" value:"(?i)(werfault|wmiprvse).exe"
userregex_matchAUTHORI, AUTORIexcludes:user field:"user" value:"AUTHORI" field:"user" value:"AUTORI"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1wmiprvse
1"wmiprvse.exe"
1certutil
1cscript
1mshta
1msiexec
1regsvr32
1rundll32
1verclsid
1wscript
1"certutil"
1"cscript"
1"mshta"
1"msiexec"
1"regsvr32"
1"rundll32"
1"verclsid"
1"wscript"

Back to all Splunk rules