Detection rules › Splunk

Splunk rules: 0u

Add DLL_EXE Registry Value (Sysmon)

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

Adding an entry to the "run keys" in the Registry or startup folder will cause the program referenced to be executed when a user logs in

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '1093.1147'
title: Add DLL_EXE Registry Value
description: 'Adding an entry to the "run keys" in the Registry or startup folder
  will cause the program referenced to be executed when a user logs in. -- Threat
  Actor Association: CL-STA-0043, FamousSparrow, FIN6, Flax Typhoon, WIRTE -- Software
  Association: Blackbyte'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` ( signature_id=13 AND (TERM(HKU)
  OR TERM(HKCU) OR TERM(HKLM)) AND (registry_value_name="*\\Temp\\*.exe" OR registry_value_name="*\\Temp\\*.dll"
  OR registry_value_name="*\\Common Files\\*.dll" OR registry_value_name="*\\Common
  Files\\*.exe") ) | table _time, host, user, process process_name, parent_process_name,
  signature_id, dest_ip, registry_value_name | bin span=1s | stats values(*) as *
  by _time, host | table _time, host, user, process process_name, parent_process_name,
  signature_id dest_ip registry_value_name `hec_collect`'
techniques:
- persistence:boot or logon autostart execution:registry run keys / startup folder
technique_id:
- T1547.001
data_category:
- Windows Registry
- Windows Sysmon
references:
- https://www.hackingarticles.in/multiple-ways-to-persistence-on-windows-10-with-metasploit/
- https://blog.talosintelligence.com/2021/09/tinyturla.html

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` ( signature_id=13 AND (TERM(HKU) OR TERM(HKCU) OR TERM(HKLM)) AND (registry_value_name="*\\Temp\\*.exe" OR registry_value_name="*\\Temp\\*.dll" OR registry_value_name="*\\Common Files\\*.dll" OR registry_value_name="*\\Common Files\\*.exe") )

Stage 2: table

| table _time, host, user, process process_name, parent_process_name, signature_id, dest_ip,
    registry_value_name

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Stage 5: table

| table _time, host, user, process process_name, parent_process_name, signature_id dest_ip
    registry_value_name `hec_collect`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
registry_value_nameeq
  • *\Common Files\*.dll
  • *\Common Files\*.exe
  • *\Temp\*.dll
  • *\Temp\*.exe
field:"registry_value_name" kind:eq
signature_ideq
  • 13
field:"signature_id" kind:eq value:"13"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1HKU
1HKCU
1HKLM

ASL AWS Disable Bucket Versioning

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

The following analytic detects when AWS S3 bucket versioning is suspended by a user. It leverages AWS CloudTrail logs to identify PutBucketVersioning events with the VersioningConfiguration.Status set to Suspended. This activity is significant because disabling versioning can prevent recovery of deleted or modified data, which is a common tactic in ransomware attacks. If confirmed malicious, this action could lead to data loss and hinder recovery efforts, severely impacting data integrity and availability.

Known False Positives

  • It is possible that an AWS Administrator has legitimately disabled versioning on certain buckets to avoid costs.

MITRE ATT&CK Coverage

TacticTechniques
Impact

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: ASL AWS Disable Bucket Versioning
id: f32598bb-fa5f-4afd-8ab3-0263cc28efbc
version: 7
creation_date: '2022-10-04'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: Anomaly
description: The following analytic detects when AWS S3 bucket versioning is suspended by a user. It leverages AWS CloudTrail logs to identify `PutBucketVersioning` events with the `VersioningConfiguration.Status` set to `Suspended`. This activity is significant because disabling versioning can prevent recovery of deleted or modified data, which is a common tactic in ransomware attacks. If confirmed malicious, this action could lead to data loss and hinder recovery efforts, severely impacting data integrity and availability.
data_source:
    - ASL AWS CloudTrail
search: |-
    `amazon_security_lake` api.operation=PutBucketVersioning
      | spath input=api.request.data path=VersioningConfiguration.Status output=Status
      | spath input=api.request.data path=bucketName output=bucketName
      | search Status=Suspended
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY actor.user.uid api.operation api.service.name
           http_request.user_agent src_endpoint.ip actor.user.account.uid
           cloud.provider cloud.region api.request.data
           bucketName
      | rename actor.user.uid as user api.operation as action api.service.name as dest http_request.user_agent as user_agent src_endpoint.ip as src actor.user.account.uid as vendor_account cloud.provider as vendor_product cloud.region as vendor_region
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `asl_aws_disable_bucket_versioning_filter`
how_to_implement: The detection is based on Amazon Security Lake events from Amazon Web Services (AWS), which is a centralized data lake that provides security-related data from AWS services. To use this detection, you must ingest CloudTrail logs from Amazon Security Lake into Splunk. To run this search, ensure that you ingest events using the latest version of Splunk Add-on for Amazon Web Services (https://splunkbase.splunk.com/app/1876) or the Federated Analytics App.
known_false_positives: It is possible that an AWS Administrator has legitimately disabled versioning on certain buckets to avoid costs.
references:
    - https://invictus-ir.medium.com/ransomware-in-the-cloud-7f14805bbe82
    - https://bleemb.medium.com/data-exfiltration-with-native-aws-s3-features-c94ae4d13436
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: Bucket Versioning is suspended for S3 buckets- $bucketName$ by user $user$ from IP address $src$
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - Suspicious AWS S3 Activities
    - Data Exfiltration
asset_type: AWS Account
mitre_attack_id:
    - T1490
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`amazon_security_lake` api.operation=PutBucketVersioning

Stage 2: spath

| spath input=api.request.data path=VersioningConfiguration.Status output=Status

Stage 3: spath

| spath input=api.request.data path=bucketName output=bucketName

Stage 4: search

| search Status=Suspended

Stage 5: fillnull

| fillnull

Stage 6: stats

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

Stage 7: rename

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

Stage 8: search

| `security_content_ctime(firstTime)`

Stage 9: search

| `security_content_ctime(lastTime)`

Stage 10: search

| `asl_aws_disable_bucket_versioning_filter`

Indicators

These rows show field, operator, and value matches.

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

Cisco SD-WAN - Peering Activity

#
Status
production
Group by
dest, new_state, peer_system_ip, peer_type
Author
Nasreddine Bencherchali, Splunk
Source
github.com/splunk/security_content

This analytic detects Cisco SD-WAN control-connection-state-change events where a control connection transitions. It extracts and highlights key triage fields including peer-type, peer-system-ip, public-ip, and public-port. Analysts should manually validate whether the peer-system-ip matches the expected SD-WAN addressing schema and device inventory, whether the event timing aligns with known operational activity (maintenance, failover, or planned changes), and whether the public-ip is an expected source for control peering in the environment. Treat peer-type:vmanage events with higher scrutiny, especially when peer or source IP values are previously unseen.

Known False Positives

  • New controller onboarding, topology expansion, controller failover, maintenance windows, and temporary transport. Path changes can create rare peer/public-IP combinations. Validate outliers against change records and known SD-WAN inventory before escalating.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access

Rule Body

name: Cisco SD-WAN - Peering Activity
id: 1d192a47-4bd3-4c06-902d-5dbe2375ec6d
version: 3
creation_date: '2026-03-03'
modification_date: '2026-05-13'
author: Nasreddine Bencherchali, Splunk
status: production
type: Hunting
description: |
    This analytic detects Cisco SD-WAN `control-connection-state-change` events where a control connection transitions.
    It extracts and highlights key triage fields including `peer-type`, `peer-system-ip`, `public-ip`, and `public-port`.
    Analysts should manually validate whether the `peer-system-ip` matches the expected SD-WAN addressing schema and
    device inventory, whether the event timing aligns with known operational activity (maintenance, failover, or
    planned changes), and whether the `public-ip` is an expected source for control peering in the environment.
    Treat `peer-type:vmanage` events with higher scrutiny, especially when peer or source IP values are previously
    unseen.
data_source:
    - Cisco SD-WAN NTCE 1000001
search: |-
    `cisco_sd_wan_syslog`
    TERM("*control-connection-state-change*")
    TERM("*peer-system-ip:*")
    TERM("*public-ip:*")
    TERM("*new-state:up*")
    | rex field=_raw "^(?<event_timestamp>(?:[A-Z][a-z]{2}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2}(?:\.\d{3})?|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\.\d{1,6})?(?:Z|[+-][0-9]{2}:[0-9]{2})))\s*:?"
    | rex field=_raw "^(?:[A-Z][a-z]{2}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2}(?:\.\d{3})?\s*:?\s+)(?<prefix_host>[^\s:]+)\s+\S+(?:\[\d+\])?:\s+%"
    | eval dest=coalesce(prefix_host, legacy_host, device_name, host)
    | rex field=_raw "new-state:(?<new_state>\S+)"
    | rex field=_raw "peer-type:(?<peer_type>\S+)"
    | rex field=_raw "peer-system-ip:(?<peer_system_ip>\S+)"
    | rex field=_raw "public-ip:(?<public_ip>\S+)"
    | rex field=_raw "public-port:(?<public_port>\d+)"

    | where isnotnull(peer_type) AND isnotnull(peer_system_ip)

    | stats count max(event_timestamp) as event_time
                  values(public_ip) as public_ips
                  values(public_port) as public_ports
      by peer_type peer_system_ip dest new_state

    | table event_time dest peer_type peer_system_ip
            public_ips public_ports count
    | `cisco_sd_wan___peering_activity_filter`
how_to_implement: |
    This analytic requires Cisco SD-WAN/vSmart logs in Splunk and assumes control peering status
    messages are searchable via the `cisco_sd_wan_syslog` macro. Update that macro with your environment-specific index and sourcetype settings.
    Follow the documentation https://www.cisco.com/c/en/us/td/docs/routers/sdwan/17-x/systems-interfaces/systems-interfaces-guide-17-x/system-logging.html#config-sys-logging to start ingesting these logs.
known_false_positives: |
    New controller onboarding, topology expansion, controller failover, maintenance windows, and temporary transport.
    Path changes can create rare peer/public-IP combinations.
    Validate outliers against change records and known SD-WAN inventory before escalating.
references:
    - https://www.cisa.gov/news-events/directives/supplemental-direction-ed-26-03-hunt-and-hardening-guidance-cisco-sd-wan-systems
    - https://blog.talosintelligence.com/uat-8616-sd-wan/
    - https://www.cisco.com/c/en/us/td/docs/routers/sdwan/configuration/Monitor-And-Maintain/monitor-maintain-book/m-alarms-events-logs.html
    - https://www.cisco.com/c/en/us/td/docs/routers/sdwan/17-x/systems-interfaces/systems-interfaces-guide-17-x/system-logging.html#config-sys-logging
    - https://sec.cloudapps.cisco.com/security/center/resources/Cisco-Catalyst-SD-WAN-HardeningGuide
    - https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-sdwan-rpa-EHchtZk
analytic_story:
    - Cisco Catalyst SD-WAN Analytics
asset_type: Network
cve:
    - CVE-2026-20127
mitre_attack_id:
    - T1190
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: network
security_domain: network

Stages and Predicates

Stage 1: search

`cisco_sd_wan_syslog`
TERM("*control-connection-state-change*")
TERM("*peer-system-ip:*")
TERM("*public-ip:*")
TERM("*new-state:up*")

Stage 2: rex

| rex field=_raw
    "^(?<event_timestamp>(?:[A-Z][a-z]{2}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2}(?:\.\d{3})?|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\.\d{1,6})?(?:Z|[+-][0-9]{2}:[0-9]{2})))\s*:?"

Stage 3: rex

| rex field=_raw
    "^(?:[A-Z][a-z]{2}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2}(?:\.\d{3})?\s*:?\s+)(?<prefix_host>[^\s:]+)\s+\S+(?:\[\d+\])?:\s+%"

Stage 4: eval

| eval dest=coalesce(prefix_host, legacy_host, device_name, host)

Stage 5: rex

| rex field=_raw "new-state:(?<new_state>\S+)"

Stage 6: rex

| rex field=_raw "peer-type:(?<peer_type>\S+)"

Stage 7: rex

| rex field=_raw "peer-system-ip:(?<peer_system_ip>\S+)"

Stage 8: rex

| rex field=_raw "public-ip:(?<public_ip>\S+)"

Stage 9: rex

| rex field=_raw "public-port:(?<public_port>\d+)"

Stage 10: where

| where isnotnull(peer_type) AND isnotnull(peer_system_ip)

Stage 11: stats

| stats count max(event_timestamp) as event_time
              values(public_ip) as public_ips
              values(public_port) as public_ports
  by peer_type peer_system_ip dest new_state

Stage 12: table

| table event_time dest peer_type peer_system_ip
        public_ips public_ports count

Stage 13: search

| `cisco_sd_wan___peering_activity_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
peer_system_ipis_not_null
  • (no value, null check)
field:"peer_system_ip" kind:is_not_null
peer_typeis_not_null
  • (no value, null check)
field:"peer_type" kind:is_not_null
sourcetypeeq
  • cisco:sdwan:syslog
field:"sourcetype" kind:eq value:"cisco:sdwan:syslog"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"\"*control-connection-state-change*\""
1"\"*peer-system-ip:*\""
1"\"*public-ip:*\""
1"\"*new-state:up*\""

Conhost.exe Kernel call (Sysmon)

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

conhost. exe ForceV1 asks for information directly from the kernel space, conhost connects to the console application. Usecase Identifies potentially suspicious Conhost execution paired with additional processes

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '5541.17145'
title: Conhost.exe Kernel call
description: 'conhost. exe ForceV1 asks for information directly from the kernel space,
  conhost connects to the console application. Usecase Identifies potentially suspicious
  Conhost execution paired with additional processes. - Software Association: Trojan.Killdisk/HermeticWiper,
  Snatch'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` ("EventCode=1" OR "<EventID>1<")
  NOT (TERM(usoclient.exe) OR TERM(devicecensus.exe) OR TERM(ProgramData) OR "Program
  Files" OR "wmiprvse.exe") | regex process="^\S+\s" | table _time, host, user, process,
  process_*, parent_*, signature_id | bin span=1s | stats values(*) as * by _time,
  host | regex process="conhost.exe 0xffffffff -ForceV1"| where mvcount(process)>1 '
techniques:
- defense-evasion:indirect command execution
- execution:command and scripting interpreter
- defense-evasion:exploitation for defense evasion
technique_id: 
- T1202
- T1059
- T1211
data_category:
- Windows Sysmon
references:
- https://medium.com/@clermont1050/covid-19-cyber-infection-c615ead7c29

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` ("EventCode=1" OR "<EventID>1<") NOT (TERM(usoclient.exe) OR TERM(devicecensus.exe) OR TERM(ProgramData) OR "Program Files" OR "wmiprvse.exe")

Stage 2: regex

| regex process="^\S+\s"

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Stage 6: regex

| regex process="conhost.exe 0xffffffff -ForceV1"

Stage 7: where

| where mvcount(process)>1

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
processregex_match
  • ^\S+\s corpus 2 (splunk 2)
  • conhost.exe 0xffffffff -ForceV1 corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

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

Disable ETW Through 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 modifications to the registry that disable the Event Tracing for Windows (ETW) feature. It leverages data from the Endpoint.Registry data model, specifically monitoring changes to the registry path "*\SOFTWARE\Microsoft\.NETFramework\ETWEnabled" with a value set to "0x00000000". This activity is significant because disabling ETW can allow attackers to evade detection mechanisms, making it harder for security tools to monitor malicious activities. If confirmed malicious, this could enable attackers to execute payloads with minimal alerts, impairing defenses and potentially leading to further compromise of the system.

Known False Positives

  • network operator may disable this feature of windows but not so common.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

Rule Body

name: Disable ETW Through Registry
id: f0eacfa4-d33f-11eb-8f9d-acde48001122
version: 15
creation_date: '2021-06-23'
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 disable the Event Tracing for Windows (ETW) feature. It leverages data from the Endpoint.Registry data model, specifically monitoring changes to the registry path "*\\SOFTWARE\\Microsoft\\.NETFramework\\ETWEnabled" with a value set to "0x00000000". This activity is significant because disabling ETW can allow attackers to evade detection mechanisms, making it harder for security tools to monitor malicious activities. If confirmed malicious, this could enable attackers to execute payloads with minimal alerts, impairing defenses and potentially leading to further compromise of the system.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry WHERE (Registry.registry_path= "*\\SOFTWARE\\Microsoft\\.NETFramework\\ETWEnabled" 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)` | where isnotnull(registry_value_data) | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `disable_etw_through_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: network operator may disable this feature of windows but not so common.
references:
    - https://app.any.run/tasks/c0f98850-af65-4352-9746-fbebadee4f05/
finding:
    title: Disable ETW Through Registry on $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Ransomware
    - CISA AA23-347A
    - 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= "*\\SOFTWARE\\Microsoft\\.NETFramework\\ETWEnabled"
      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: where

| where isnotnull(registry_value_data)

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `disable_etw_through_registry_filter`

Indicators

These rows show field, operator, and value matches.

Disabling CMD Application

#
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 disable the CMD prompt application. It leverages data from the Endpoint.Registry data model, specifically looking for changes to the "DisableCMD" registry value. This activity is significant because disabling CMD can hinder an analyst's ability to investigate and remediate threats, a tactic often used by malware such as RATs, Trojans, or Worms. If confirmed malicious, this could prevent security teams from using CMD for directory and file traversal, complicating incident response and allowing the attacker to maintain persistence.

Known False Positives

  • admin may disable this application for non technical user.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Disabling CMD Application
id: ff86077c-9212-11eb-a1e6-acde48001122
version: 17
creation_date: '2021-03-31'
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 disable the CMD prompt application. It leverages data from the Endpoint.Registry data model, specifically looking for changes to the "DisableCMD" registry value. This activity is significant because disabling CMD can hinder an analyst's ability to investigate and remediate threats, a tactic often used by malware such as RATs, Trojans, or Worms. If confirmed malicious, this could prevent security teams from using CMD for directory and file traversal, complicating incident response and allowing the attacker to maintain persistence.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry WHERE (Registry.registry_path= "*\\SOFTWARE\\Policies\\Microsoft\\Windows\\System\\DisableCMD" 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)` | `disabling_cmd_application_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: admin may disable this application for non technical user.
references:
    - https://any.run/report/ea4ea08407d4ee72e009103a3b77e5a09412b722fdef67315ea63f22011152af/a866d7b1-c236-4f26-a391-5ae32213dfc4#registry
finding:
    title: The Windows command prompt was disabled on $dest$ by $user$.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: The Windows command prompt was disabled on $dest$ by $user$.
analytic_story:
    - Windows Defense Evasion Tactics
    - Windows Registry Abuse
    - NjRAT
asset_type: Endpoint
mitre_attack_id:
    - T1112
    - T1685
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Registry
  WHERE (
      Registry.registry_path= "*\\SOFTWARE\\Policies\\Microsoft\\Windows\\System\\DisableCMD"
      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

| `disabling_cmd_application_filter`

Indicators

These rows show field, operator, and value matches.

DNS Query Length With High Standard Deviation

#
Status
production
Severity
low
Group by
DNS.answer_count, DNS.query_count, DNS.vendor_product, QueryName, dest_ip, dns.answers.name, dns.answers.type, dns.response.code, src, src_ip
Author
Bhavin Patel, Splunk
Source
github.com/splunk/security_content

The following analytic identifies DNS queries with unusually large lengths by computing the standard deviation of query lengths and filtering those exceeding two times the standard deviation. It leverages DNS query data from the Network_Resolution data model, focusing on the length of the domain names being resolved. This activity is significant as unusually long DNS queries can indicate data exfiltration or command-and-control communication attempts. If confirmed malicious, this activity could allow attackers to stealthily transfer data or maintain persistent communication channels within the network.

Known False Positives

  • It's possible there can be long domain names that are legitimate.

MITRE ATT&CK Coverage

Telemetry Coverage

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

Rule Body

name: DNS Query Length With High Standard Deviation
id: 1a67f15a-f4ff-4170-84e9-08cf6f75d6f5
version: 16
creation_date: '2019-10-16'
modification_date: '2026-05-13'
author: Bhavin Patel, Splunk
status: production
type: Anomaly
description: The following analytic identifies DNS queries with unusually large lengths by computing the standard deviation of query lengths and filtering those exceeding two times the standard deviation. It leverages DNS query data from the Network_Resolution data model, focusing on the length of the domain names being resolved. This activity is significant as unusually long DNS queries can indicate data exfiltration or command-and-control communication attempts. If confirmed malicious, this activity could allow attackers to stealthily transfer data or maintain persistent communication channels within the network.
data_source:
    - Sysmon EventID 22
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Network_Resolution
      WHERE NOT DNS.record_type IN ("Pointer","PTR","SOA", "SRV") DNS.query != *.
      BY DNS.answer DNS.answer_count DNS.query
         DNS.query_count DNS.reply_code_id DNS.src
         DNS.vendor_product DNS.dest DNS.record_type
    | `drop_dm_object_name("DNS")`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | eval tlds=split(query,".")
    | eval tld=mvindex(tlds,-1)
    | eval tld_len=len(tld)
    | search tld_len<=20
    | eval query_length = len(query)
    | table firstTime lastTime src dest query query_length record_type count record_type
    | eventstats stdev(query_length) AS stdev avg(query_length) AS avg p50(query_length) AS p50
    | where query_length>(avg+stdev*2)
    | eval z_score=(query_length-avg)/stdev
    | stats count values(query) as query values(dest) as dest avg(query_length) as avg_query_length values(record_type) as record_type min(firstTime) as firstTime latest(lastTime) as lastTime
      BY src
    | `dns_query_length_with_high_standard_deviation_filter`
how_to_implement: To successfully implement this search, you will need to ensure that DNS data is populating the Network_Resolution data model.
known_false_positives: It's possible there can be long domain names that are legitimate.
references: []
intermediate_findings:
    entities:
        - field: src
          type: system
          score: 20
          message: Potentially suspicious DNS query [$query$] with high standard deviation from src - [$src$]
threat_objects:
    - field: query
      type: url
analytic_story:
    - Hidden Cobra Malware
    - Suspicious DNS Traffic
    - Command And Control
asset_type: Endpoint
mitre_attack_id:
    - T1048.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: network
security_domain: network

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Network_Resolution
  WHERE NOT DNS.record_type IN ("Pointer","PTR","SOA", "SRV") DNS.query != *.
  BY
    DNS.answer
    DNS.answer_count
    DNS.query
    DNS.query_count
    DNS.reply_code_id
    DNS.src
    DNS.vendor_product
    DNS.dest
    DNS.record_type

Stage 2: search

| `drop_dm_object_name("DNS")`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: eval

| eval tlds=split(query,".")

Stage 6: eval

| eval tld=mvindex(tlds,-1)

Stage 7: eval

| eval tld_len=len(tld)

Stage 8: search

| search tld_len<=20

Stage 9: eval

| eval query_length = len(query)

Stage 10: table

| table firstTime lastTime src dest query query_length record_type count record_type

Stage 11: eventstats

| eventstats stdev(query_length) AS stdev avg(query_length) AS avg p50(query_length) AS p50

Stage 12: where

| where query_length>(avg+stdev*2)

Stage 13: eval

| eval z_score=(query_length-avg)/stdev

Stage 14: stats

| stats
    count
    values(query) as query
    values(dest) as dest
    avg(query_length) as avg_query_length
    values(record_type) as record_type
    min(firstTime) as firstTime
    latest(lastTime) as lastTime
  BY src

Stage 15: search

| `dns_query_length_with_high_standard_deviation_filter`

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
DNS.record_typeinPTR, Pointer, SOA, SRVexcludes:DNS.record_type

Domain Controller Enumeration via nltest (Sysmon)

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

Adversaries may attempt to get a listing of other systems by IP address, hostname, or other logical identifier on a network that may be used for Lateral Movement from the current system. Functionality could exist within remote access tools to enable this, but utilities available on the operating system could also be used such as Nltest. Adversaries may look for details about the network configuration and settings, such as IP and/or MAC addresses, of systems they access or through information discovery of remote systems. Several operating system administration utilities exist that can be used to gather this information. Examples include Arp, ipconfig/ifconfig, nbtstat, and route. This use case detects nltest executions with options dclist or dsgetdc.

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '33360.59026'
title: Domain Controller Enumeration via nltest
description: Adversaries may attempt to get a listing of other systems by IP address,
  hostname, or other logical identifier on a network that may be used for Lateral
  Movement from the current system. Functionality could exist within remote access
  tools to enable this, but utilities available on the operating system could also
  be used such as Nltest. Adversaries may look for details about the network configuration
  and settings, such as IP and/or MAC addresses, of systems they access or through
  information discovery of remote systems. Several operating system administration
  utilities exist that can be used to gather this information. Examples include Arp,
  ipconfig/ifconfig, nbtstat, and route. This use case detects nltest executions with
  options dclist or dsgetdc.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  TERM(nltest) (TERM(dclist) OR TERM(dsgetdc)) | table _time, host, user, process,
  process_*, parent_* | bin span=1s | stats values(*) as * by _time, host '
techniques:
- discovery:system network configuration discovery
- discovery:remote system discovery
technique_id: 
- T1016
- T1018
data_category:
- Windows Sysmon
references:
- https://attack.mitre.org/techniques/T1016/
- https://attack.mitre.org/techniques/T1018/
- https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_nltest_recon.yml
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1018/T1018.md#atomic-test-3---remote-system-discovery---nltest

Stages and Predicates

Stage 1: search

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

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Indicators

These rows show field, operator, and value matches.

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

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1nltest
1dclist
1dsgetdc

Excessive DRSGetNCChanges Requests (Windows Event Log)

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

Adversaries may attempt to access credentials and other sensitive information by abusing a Windows Domain Controller's application programming interface (API) to simulate the replication process from a remote domain controller using a technique called DCSync. During a FIN8 attack, a desktop device performed more than 100 DRSGetNCChanges requests to a domain controller. Such activity, when not performed by new domain controllers to sync Active Directory contents, can indicate malicious domain or user enumeration, credential compromise or Active Directory enumeration. This use case detects excessive DRSGetNChanges requests (represented by GUID 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2). Note: Windows Event ID 4662 must be logged and configured correctly for detection. Blocklisting event 4662 event collection and forwarding from expected hosts (likely other Domain Controllers) is recommended for best performance, as activity from DCs is expected behavior. See references for details

MITRE ATT&CK Coverage

TacticTechniques
Credential Access

References

Telemetry Coverage

Rule Body

id: '29487.53152'
title: Excessive DRSGetNCChanges Requests
description: 'Adversaries may attempt to access credentials and other sensitive information
  by abusing a Windows Domain Controller''s application programming interface (API)
  to simulate the replication process from a remote domain controller using a technique
  called DCSync. During a FIN8 attack, a desktop device performed more than 100 DRSGetNCChanges
  requests to a domain controller. Such activity, when not performed by new domain
  controllers to sync Active Directory contents, can indicate malicious domain or
  user enumeration, credential compromise or Active Directory enumeration. This use
  case detects excessive DRSGetNChanges requests (represented by GUID 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2).
  Note: Windows Event ID 4662 must be logged and configured correctly for detection.
  Blocklisting event 4662 event collection and forwarding from expected hosts (likely
  other Domain Controllers) is recommended for best performance, as activity from
  DCs is expected behavior. See references for details. -- Threat Actor Association:
  FIN8 (Syssphinx), Muddled Libra, Scattered Spider'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4662) OR
  "<EventID>4662<") "0x100" "1131f6aa-9c07-11d1-f79f-00c04fc2dcd2" | table _time,
  host, user process, process_*, signature_id, parent_*, parameters | bin span=600s
  | stats values(*) as * by _time, user | where event_count > 5 '
techniques:
- credential-access:os credential dumping:dcsync
technique_id:
- T1003.006
data_category:
- Windows event logs
references:
- https://blog.blacklanternsecurity.com/p/detecting-dcsync
- https://darktrace.com/blog/shining-a-light-on-syssphinx-darktraces-detection-of-a-novel-ransomware-attack
- https://community.netwitness.com/t5/netwitness-community-blog/dcsync-detection-with-netwitness/ba-p/695474
- https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/f977faaa-673e-4f66-b9bf-48c640241d47
- https://www.extrahop.com/company/blog/2021/dcsync-definition-and-protection/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4662) OR "<EventID>4662<") "0x100" "1131f6aa-9c07-11d1-f79f-00c04fc2dcd2"

Stage 2: table

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

Stage 3: bucket

| bin span=600s

Stage 4: stats

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

Stage 5: where

| where event_count > 5

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4662<"
1"0x100"
1"1131f6aa-9c07-11d1-f79f-00c04fc2dcd2"

GetLocalUser with PowerShell Script Block

#
Status
production
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-LocalUser PowerShell commandlet using PowerShell Script Block Logging (EventCode=4104). This commandlet lists all local users on a system. The detection leverages script block text from PowerShell logs to identify this activity. Monitoring this behavior is significant as adversaries and Red Teams may use it to enumerate local users for situational awareness and Active Directory discovery. If confirmed malicious, this activity could lead to further reconnaissance, enabling attackers to identify potential targets for privilege escalation or lateral movement.

Known False Positives

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

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: GetLocalUser with PowerShell Script Block
id: 2e891cbe-0426-11ec-9c9c-acde48001122
version: 11
creation_date: '2021-08-24'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: Hunting
description: The following analytic detects the execution of the `Get-LocalUser` PowerShell commandlet using PowerShell Script Block Logging (EventCode=4104). This commandlet lists all local users on a system. The detection leverages script block text from PowerShell logs to identify this activity. Monitoring this behavior is significant as adversaries and Red Teams may use it to enumerate local users for situational awareness and Active Directory discovery. If confirmed malicious, this activity could lead to further reconnaissance, enabling attackers to identify potential targets for privilege escalation or lateral movement.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell` EventCode=4104 (ScriptBlockText = "*Get-LocalUser*")
      | 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)`
      | `getlocaluser_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/T1087/001/
    - https://www.splunk.com/en_us/blog/security/hunting-for-malicious-powershell-using-script-block-logging.html
analytic_story:
    - Active Directory Discovery
    - Malicious PowerShell
asset_type: Endpoint
mitre_attack_id:
    - T1059.001
    - T1087.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

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

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

| `getlocaluser_with_powershell_script_block_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTexteq
  • *Get-LocalUser* corpus 2 (sigma 1, splunk 1)
field:"ScriptBlockText" kind:eq value:"*Get-LocalUser*"

GetWmiObject User Account with PowerShell Script Block

#
Status
production
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-WmiObject commandlet with the Win32_UserAccount parameter via PowerShell Script Block Logging (EventCode=4104). This method leverages script block text to identify when a list of all local users is being enumerated. This activity is significant as it may indicate an adversary or Red Team operation attempting to gather user information for situational awareness and Active Directory discovery. If confirmed malicious, this could lead to further reconnaissance, privilege escalation, or lateral movement within the network.

Known False Positives

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

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: GetWmiObject User Account with PowerShell Script Block
id: 640b0eda-0429-11ec-accd-acde48001122
version: 11
creation_date: '2021-08-24'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: Hunting
description: The following analytic detects the execution of the `Get-WmiObject` commandlet with the `Win32_UserAccount` parameter via PowerShell Script Block Logging (EventCode=4104). This method leverages script block text to identify when a list of all local users is being enumerated. This activity is significant as it may indicate an adversary or Red Team operation attempting to gather user information for situational awareness and Active Directory discovery. If confirmed malicious, this could lead to further reconnaissance, privilege escalation, or lateral movement within the network.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell` EventCode=4104 (ScriptBlockText="*Get-WmiObject*" AND ScriptBlockText="*Win32_UserAccount*")
      | 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)`
      | `getwmiobject_user_account_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/T1087/001/
    - https://www.splunk.com/en_us/blog/security/hunting-for-malicious-powershell-using-script-block-logging.html
analytic_story:
    - Winter Vivern
    - Active Directory Discovery
    - Malicious PowerShell
asset_type: Endpoint
mitre_attack_id:
    - T1059.001
    - T1087.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`powershell` EventCode=4104 (
    ScriptBlockText="*Get-WmiObject*"
    AND ScriptBlockText="*Win32_UserAccount*"
)

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

| `getwmiobject_user_account_with_powershell_script_block_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTexteq
  • *Get-WmiObject* corpus 7 (splunk 5, sigma 2)
  • *Win32_UserAccount*
field:"ScriptBlockText" kind:eq

hh.exe Execution (PowerShell)

#
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

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '17974.30258'
title: hh.exe 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. -- Threat Actor Association: APT-K-47/Mysterious Elephant,
  Gamaredon (aka. Armageddon, UAC-0010), Kimsuky -- LOLBAS Atomics T1218.001 Test
  #1 Atomics T1218.001 Test #2 Atomics T1218.001 Test #3 Atomics T1218.001 Test #4
  Atomics T1218.001 Test #5 Atomics T1218.001 Test #6 Atomics T1218.001 Test #7 Atomics
  T1218.001 Test #8'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4103) OR
  "<EventID>4103<" OR TERM(EventCode=4104) OR "<EventID>4104<") (TERM(hh) OR TERM(hh.exe))
  | where match(process_name, "(?i)hh\.exe") OR match(process, "(?i)hh\.exe") | 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:
- PowerShell logs
references:
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218.001/T1218.001.md#atomic-test-8---decompile-local-chm-file
- https://www.ptsecurity.com/ww-en/analytics/pt-esc-threat-intelligence/higaisa-or-winnti-apt-41-backdoors-old-and-new/
- https://asec.ahnlab.com/en/51746/

Stages and Predicates

Stage 1: search

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

Stage 2: where

| where match(process_name, "(?i)hh\.exe") OR match(process, "(?i)hh\.exe")

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
  • 4103 corpus 105 (splunk 105)
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq
processregex_match
  • (?i)hh.exe corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)hh.exe"
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>4103<"
1"<EventID>4104<"
1hh
1hh.exe

Linux Binary Launched Process with Null Argv

#
Status
production
Severity
medium
Group by
host, launched_process, launching_process
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

The following analytic detects kernel-level events where a setuid binary launches a shell or interpreter with a NULL argument vector, which occurs when a privilege escalation exploit gains root and executes a process via execve() without constructing a legitimate argument array.

Known False Positives

  • Legitimate false positives are rare but can occur when custom or poorly written setuid binaries, PAM modules, or login frameworks invoke shells programmatically without constructing a proper argv array. However, mainstream setuid binaries like su, sudo, and pkexec on modern Linux distributions always pass arguments, so any hit involving those specific processes should be treated as high confidence.

MITRE ATT&CK Coverage

TacticTechniques
Privilege Escalation

Rule Body

name: Linux Binary Launched Process with Null Argv
id: 0085652a-e682-45a2-a40c-5bb68b8f260e
version: 2
creation_date: '2026-05-12'
modification_date: '2026-07-17'
author: Raven Tait, Splunk
status: production
type: TTP
description: |-
    The following analytic detects kernel-level events where a setuid binary launches a shell or interpreter with a NULL argument vector, which occurs when a privilege escalation exploit gains root and executes a process via execve() without constructing a legitimate argument array.
data_source:
    - Linux Messages Syslog
search: |
    `linux_syslog` "NULL argv" "empty string added"
    | rex field=_raw "process '(?<launching_process>[^']+)' launched '(?<launched_process>[^']+)' with NULL argv"
    | where isnotnull(launching_process) AND isnotnull(launched_process)
    | stats
        count                        AS occurrences,
        min(_time)                   AS firstTime,
        max(_time)                   AS lastTime,
        values(_raw)                 AS message,
        values(host)                 AS dest
        by host, launching_process, launched_process
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | table dest, launching_process, launched_process,
            firstTime, lastTime, occurrences, message
    | `linux_binary_launched_process_with_null_argv_filter`
how_to_implement: To successfully implement this search, you need to have relevant kernel logs ingested with the Splunk Add-On for Unix and Linux (https://splunkbase.splunk.com/app/833).
known_false_positives: Legitimate false positives are rare but can occur when custom or poorly written setuid binaries, PAM modules, or login frameworks invoke shells programmatically without constructing a proper argv array. However, mainstream setuid binaries like su, sudo, and pkexec on modern Linux distributions always pass arguments, so any hit involving those specific processes should be treated as high confidence.
references:
    - https://www.elastic.co/security-labs/copy-fail-dirtyfrag-linux-page-bugs-in-the-wild
finding:
    title: Binary spawned process with NULL argv on $dest$ indicating possible privilege escalation.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Linux Privilege Escalation
asset_type: Endpoint
cve:
    - CVE-2026-43284
    - CVE-2026-43500
mitre_attack_id:
    - T1068
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`linux_syslog` "NULL argv" "empty string added"

Stage 2: rex

| rex field=_raw
    "process '(?<launching_process>[^']+)' launched '(?<launched_process>[^']+)' with NULL argv"

Stage 3: where

| where isnotnull(launching_process) AND isnotnull(launched_process)

Stage 4: stats

| stats
    count                        AS occurrences,
    min(_time)                   AS firstTime,
    max(_time)                   AS lastTime,
    values(_raw)                 AS message,
    values(host)                 AS dest
    by host, launching_process, launched_process

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: table

| table dest, launching_process, launched_process,
        firstTime, lastTime, occurrences, message

Stage 8: search

| `linux_binary_launched_process_with_null_argv_filter`

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"NULL argv"
1"empty string added"

Linux Suspicious Docker Build Command Execution

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

The following analytic detects docker build being executed on Dockerfiles within the /tmp directory. This is not a typical location for this activity and can indicate an actor adding a container for malicious future actions.

Known False Positives

  • Developers or administrators may occasionally use the /tmp directory for testing Docker builds in non-production environments. Filter based on known users or systems where this activity has been approved.

MITRE ATT&CK Coverage

TacticTechniques
Execution

Telemetry Coverage

PlatformRecord / event type
LinuxEvent ID 1: Process Create

Rule Body

name: Linux Suspicious Docker Build Command Execution
id: dc4a58d2-fde3-4bdd-a36b-7368b2523589
version: 1
creation_date: '2026-07-08'
modification_date: '2026-07-08'
author: Raven Tait, Splunk
status: production
type: Anomaly
description: |-
    The following analytic detects docker build being executed on Dockerfiles within the /tmp directory.
    This is not a typical location for this activity and can indicate an actor adding a container for malicious future actions.
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="*docker*"
    Processes.process="*build*"
    (
        (
            Processes.process="*-f *"
            Processes.process="* /tmp*"
        )
        OR
        Processes.process_current_directory="/tmp*"
    )

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

    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `linux_suspicious_docker_build_command_execution_filter`
how_to_implement: |-
    The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: |-
    Developers or administrators may occasionally use the /tmp directory for testing Docker builds in non-production environments. Filter based on known users or systems where this activity has been approved.
references:
    - https://github.com/Aegrah/PANIX
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Suspicious Docker Build Command [$process$] observed on [$dest$] executed by [$user$].
threat_objects:
    - field: process_name
      type: process_name
    - field: process
      type: process
analytic_story:
    - Linux Post-Exploitation
asset_type: Endpoint
mitre_attack_id:
    - T1610
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="*docker*"
Processes.process="*build*"
(
    (
        Processes.process="*-f *"
        Processes.process="* /tmp*"
    )
    OR
    Processes.process_current_directory="/tmp*"
)

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

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `linux_suspicious_docker_build_command_execution_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • * /tmp*
  • *-f * corpus 3 (splunk 2, sigma 1)
  • *build*
  • *docker*
field:"CommandLine" kind:eq
Processes.process_current_directoryeq
  • /tmp* corpus 2 (elastic 1, splunk 1)
field:"CurrentDirectory" kind:eq value:"/tmp*"

Modify Registry Key (Windows Event Log)

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

Adversaries may interact with the Windows Registry to hide configuration information within Registry keys, remove information as part of cleaning up, or as part of other techniques to aid in persistence and execution

MITRE ATT&CK Coverage

TacticTechniques
Persistence
Defense Impairment

References

Telemetry Coverage

Rule Body

id: '8335.10406'
title: Modify Registry Key
description: 'Adversaries may interact with the Windows Registry to hide configuration
  information within Registry keys, remove information as part of cleaning up, or
  as part of other techniques to aid in persistence and execution. Threat Actor Association:
  APT27/Emissary Panda, APT29/Nobelium, APT30, APT41, APT43, Flax Typhoon, InvisiMole,
  Kimsuky, Lazarus, MuddyWater, RedEyes, REvil, Velvet Cholllima -- Software Association:
  Avos, BabyShark, BadRabbit, BianLian, BlackByte, DarkWatchman, Dharma, Dridex, Karius,
  Koxic, LockBit, Play, QBot/Qakbot, Ransom Cartel, SunBurst, Trojan.Killdisk/HermeticWiper,
  Trigona, Ursnif, VawTrack'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4657) OR
  "<EventID>4657<") Operation_Type="Existing registry value modified" | table _time,
  host, user parent_*, process, process_*, signature_id, Object_*, Operation_*, New_*,
  Old_*| eval note=Object_Name | bin span=1s | stats values(*) as * by _time, host
  | fields - Operation_*, New_*, Old_* `hec_collect`'
techniques:
- defense-evasion:modify registry
technique_id: 
- T1112
data_category:
- File monitoring
- Windows event logs
references:
- https://blog.trendmicro.com/trendlabs-security-intelligence/poweliks-malware-hides-in-windows-registry/
- https://www.netwrix.com/how_to_detect_modification_to_startup_items.html
- https://static1.squarespace.com/static/552092d5e4b0661088167e5c/t/5d497aefe58b7e00011f6947/1565096688890/Windows+Registry+Auditing+Cheat+Sheet+ver+Aug+2019.pdf

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4657) OR "<EventID>4657<") Operation_Type="Existing registry value modified"

Stage 2: table

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

Stage 3: eval

| eval note=Object_Name

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Stage 6: fields

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

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4657<"

Network Connection Discovery With Arp

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

The following analytic detects the execution of arp.exe with the -a flag, which is used to list network connections on a compromised system. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names, command-line executions, and related telemetry. Monitoring this activity is significant because both Red Teams and adversaries use arp.exe for situational awareness and Active Directory discovery. If confirmed malicious, this activity could allow attackers to map the network, identify active devices, and plan further lateral movement or attacks.

Known False Positives

  • Administrators or power users may use this command for troubleshooting.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Network Connection Discovery With Arp
id: ae008c0f-83bd-4ed4-9350-98d4328e15d2
version: 11
creation_date: '2021-08-24'
modification_date: '2026-08-30'
author: Mauricio Velazco, Splunk
status: production
type: Hunting
description: |-
    The following analytic detects the execution of `arp.exe` with the `-a` flag, which is used to list network connections on a compromised system. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names, command-line executions, and related telemetry. Monitoring this activity is significant because both Red Teams and adversaries use `arp.exe` for situational awareness and Active Directory discovery. If confirmed malicious, this activity could allow attackers to map the network, identify active devices, and plan further lateral movement or attacks.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly`
      count min(_time) as firstTime
            max(_time) as lastTime

    FROM datamodel=Endpoint.Processes WHERE

    (
        Processes.process_name="arp.exe"
        OR
        Processes.original_file_name="arp.exe"
    )
    Processes.process IN (
        "* -a*",
        "* -g *",
        "* /a *",
        "* /g *"
    )
    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)`
    | `network_connection_discovery_with_arp_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Administrators or power users may use this command for troubleshooting.
references:
    - https://attack.mitre.org/techniques/T1049/
    - https://www.microsoft.com/en-us/security/blog/2023/05/24/volt-typhoon-targets-us-critical-infrastructure-with-living-off-the-land-techniques/
    - https://thedfirreport.com/2023/05/22/icedid-macro-ends-in-nokoyawa-ransomware/
analytic_story:
    - Active Directory Discovery
    - Qakbot
    - Windows Post-Exploitation
    - Prestige Ransomware
    - Volt Typhoon
    - IcedID
    - Interlock Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1049
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

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

FROM datamodel=Endpoint.Processes WHERE

(
    Processes.process_name="arp.exe"
    OR
    Processes.original_file_name="arp.exe"
)
Processes.process IN (
    "* -a*",
    "* -g *",
    "* /a *",
    "* /g *"
)
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

| `network_connection_discovery_with_arp_filter`

Indicators

These rows show field, operator, and value matches.

O365 File Permissioned Application Consent Granted by User

#

Package installation (PowerShell)

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

Some programming languages, like Python, come with an easy, more or less official method of installing dependencies for your projects. These installers are usually tied to public code repositories where anyone can freely upload code packages for others to use. The intent of this use case is to identify installation of packages, with common repositories using pip, gem and npm. Use case will be used to with additional threat identifiers to potentially identify Dependency confusion style attacks.

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

References

Telemetry Coverage

Rule Body

id: '5987.6350'
title: Package installation
description: 'Some programming languages, like Python, come with an easy, more or
  less official method of installing dependencies for your projects. These installers
  are usually tied to public code repositories where anyone can freely upload code
  packages for others to use. The intent of this use case is to identify installation
  of packages, with common repositories using pip, gem and npm. Use case will be used
  to with additional threat identifiers to potentially identify Dependency confusion
  style attacks. '
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` TERM(EventCode=4104) (TERM(npm)
  OR TERM(pip) OR TERM(gem)) TERM(install) | regex process="(?i)install\s" | rex field=process
  "(?<reqs>(?i)requirements\.txt") | rex field=process "(?<extra>(?i)(\-{2}extra)?\-index\-url(\s+\S+)")
  | rex field=process "(?<source1>(?i)\-{2}source(\s+\S+)") | eval keywords=mvappend(reqs,
  extra, source1) | table _time, host, user, signature_id, process, process_*, keywords
  | bin span=1s | stats values(*) as * by _time, host '
techniques:
- command-and-control:ingress tool transfer
technique_id: 
- T1105
data_category:
- PowerShell logs
references:
- https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` TERM(EventCode=4104) (
    TERM(npm)
    OR TERM(pip)
    OR TERM(gem)
) TERM(install)

Stage 2: regex

| regex process="(?i)install\s"

Stage 3: rex

| rex field=process "(?<reqs>(?i)requirements\.txt")

The parser skipped this rex command.

Stage 4: rex

| rex field=process "(?<extra>(?i)(\-{2}extra)?\-index\-url(\s+\S+)")

The parser skipped this rex command.

Stage 5: rex

| rex field=process "(?<source1>(?i)\-{2}source(\s+\S+)")

The parser skipped this rex command.

Stage 6: eval

| eval keywords=mvappend(reqs, extra, source1)

Stage 7: table

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

Stage 8: bucket

| bin span=1s

Stage 9: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
processregex_match
  • (?i)install\s corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)install\s"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1npm
1pip
1gem
1install

PingID Mismatch Auth Source and Verification Response

#
Status
production
Severity
medium
Group by
auth_Country, dest, group.name, reason, session_id, signature, src, status, user, verify_Country
Author
Steven Dick
Source
github.com/splunk/security_content

The following analytic identifies discrepancies between the IP address of an authentication event and the IP address of the verification response event, focusing on differences in the originating countries. It leverages JSON logs from PingID, comparing the 'auth_Country' and 'verify_Country' fields. This activity is significant as it may indicate suspicious sign-in behavior, such as account compromise or unauthorized access attempts. If confirmed malicious, this could allow attackers to bypass authentication mechanisms, potentially leading to unauthorized access to sensitive systems and data.

Known False Positives

  • False positives may be generated by users working out the geographic region where the organizations services or technology is hosted.

MITRE ATT&CK Coverage

Rule Body

name: PingID Mismatch Auth Source and Verification Response
id: 15b0694e-caa2-4009-8d83-a1f98b86d086
version: 9
creation_date: '2023-12-20'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: TTP
description: The following analytic identifies discrepancies between the IP address of an authentication event and the IP address of the verification response event, focusing on differences in the originating countries. It leverages JSON logs from PingID, comparing the 'auth_Country' and 'verify_Country' fields. This activity is significant as it may indicate suspicious sign-in behavior, such as account compromise or unauthorized access attempts. If confirmed malicious, this could allow attackers to bypass authentication mechanisms, potentially leading to unauthorized access to sensitive systems and data.
data_source:
    - PingID
search: "`pingid` (\"result.status\" IN (\"SUCCESS*\",\"FAIL*\",\"UNSUCCESSFUL*\" ) NOT \"result.message\" IN (\"*pair*\",\"*create*\",\"*delete*\")) | eval user = upper('actors{}.name'), session_id = 'resources{}.websession', dest = 'resources{}.ipaddress', reason = 'result.message', object = 'resources{}.devicemodel', status = 'result.status' | join user session_id [ search `pingid` (\"result.status\" IN (\"POLICY\") AND \"resources{}.ipaddress\"=*) AND \"result.message\" IN(\"*Action: Authenticate*\",\"*Action: Approve*\",\"*Action: Allowed*\") | rex field=result.message \"IP Address: (?:N\\/A)?(?<policy_ipaddress>.+)?\\n\" | rex field=result.message \"Action: (?:N\\/A)?(?<signature>.+)?\\n\" | rex field=result.message \"Requested Application Name: (?:N\\/A)?(?<Requested_Application_Name>.+)?\\n\" | rex field=result.message \" Requested Application ID: (?:N\\/A)?(?<Requested_Application_ID>.+)?\\n\" | eval user = upper('actors{}.name'), session_id = 'resources{}.websession', src = coalesce('resources{}.ipaddress',policy_ipaddress), app = coalesce(Requested_Application_ID,Requested_Application_Name) | fields app, user, session_id, src, signature ] | iplocation prefix=auth_ dest | iplocation prefix=verify_ src | stats count min(_time) as firstTime max(_time) as lastTime values(app) as app values(session_id) as session_id by user, dest, auth_Country, src, verify_Country, object, signature, status, reason | where auth_Country != verify_Country | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `pingid_mismatch_auth_source_and_verification_response_filter`"
how_to_implement: Target environment must ingest JSON logging from a PingID(PingOne) enterprise environment, either via Webhook or Push Subscription.
known_false_positives: False positives may be generated by users working out the geographic region where the organizations services or technology is hosted.
references:
    - https://twitter.com/jhencinski/status/1618660062352007174
    - https://attack.mitre.org/techniques/T1098/005/
    - https://attack.mitre.org/techniques/T1556/006/
    - https://docs.pingidentity.com/r/en-us/pingoneforenterprise/p14e_subscriptions?tocId=3xhnxjX3VzKNs3SXigWnQA
finding:
    title: An authentication by [$user$] was detected from [$dest$ - $auth_Country$] and the verification was received from [$src$ - $verify_Country$].
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: src
          type: system
          score: 50
          message: An authentication by [$user$] was detected from [$dest$ - $auth_Country$] and the verification was received from [$src$ - $verify_Country$].
analytic_story:
    - Compromised User Account
asset_type: Identity
mitre_attack_id:
    - T1621
    - T1556.006
    - T1098.005
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: access

Stages and Predicates

Stage 1: search

`pingid` (
    "result.status" IN ("SUCCESS*","FAIL*","UNSUCCESSFUL*" )
    NOT "result.message" IN ("*pair*","*create*","*delete*")
)

Stage 2: eval

| eval user = upper('actors{}.name'), session_id = 'resources{}.websession',
    dest = 'resources{}.ipaddress', reason = 'result.message', object = 'resources{}.devicemodel',
    status = 'result.status'

Stage 3: join

| join user session_id
    [ search `pingid` ("result.status" IN ("POLICY") AND "resources{}.ipaddress"=*) AND "result.message" IN("*Action: Authenticate*","*Action: Approve*","*Action: Allowed*") | rex field=result.message "IP Address: (?:N\/A)?(?<policy_ipaddress>.+)?\n" | rex field=result.message "Action: (?:N\/A)?(?<signature>.+)?\n" | rex field=result.message "Requested Application Name: (?:N\/A)?(?<Requested_Application_Name>.+)?\n" | rex field=result.message " Requested Application ID: (?:N\/A)?(?<Requested_Application_ID>.+)?\n" | eval user = upper('actors{}.name'), session_id = 'resources{}.websession', src = coalesce('resources{}.ipaddress',policy_ipaddress), app = coalesce(Requested_Application_ID,Requested_Application_Name) | fields app, user, session_id, src, signature ]

Stage 4: search

| iplocation prefix=auth_ dest

Stage 5: search

| iplocation prefix=verify_ src

Stage 6: stats

| stats
    count
    min(_time) as firstTime
    max(_time) as lastTime
    values(app) as app
    values(session_id) as session_id
  by user, dest, auth_Country, src, verify_Country, object, signature, status, reason

Stage 7: where

| where auth_Country != verify_Country

Stage 8: search

| `security_content_ctime(firstTime)`

Stage 9: search

| `security_content_ctime(lastTime)`

Stage 10: search

| `pingid_mismatch_auth_source_and_verification_response_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
prefixeq
  • auth_
  • verify_
field:"prefix" kind:eq
resources{}.ipaddresseq
  • *
field:"resources{}.ipaddress" kind:eq value:"*"
result.messagein
  • *Action: Allowed*
  • *Action: Approve*
  • *Action: Authenticate*
field:"result.message" kind:in
result.statusin
  • FAIL*
  • POLICY
  • SUCCESS*
  • UNSUCCESSFUL*
field:"result.status" kind:in

Exclusions

The rule actively suppresses these predicates.

Search Terms

These SPL tokens match against raw event text.

StageTerm
4iplocation
4dest
5iplocation
5src

Powershell Fileless Process Injection via GetProcAddress

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

The following analytic detects the use of GetProcAddress in PowerShell script blocks, leveraging PowerShell Script Block Logging (EventCode=4104). This method captures the full command sent to PowerShell, which is then logged in Windows event logs. The presence of GetProcAddress is unusual for typical PowerShell scripts and often indicates malicious activity, as many attack toolkits use it to achieve code execution. If confirmed malicious, this activity could allow an attacker to execute arbitrary code, potentially leading to system compromise. Analysts should review parallel processes and the entire logged script block for further investigation.

Known False Positives

  • Limited false positives. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Powershell Fileless Process Injection via GetProcAddress
id: a26d9db4-c883-11eb-9d75-acde48001122
version: 14
creation_date: '2021-06-09'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects the use of `GetProcAddress` in PowerShell script blocks, leveraging PowerShell Script Block Logging (EventCode=4104). This method captures the full command sent to PowerShell, which is then logged in Windows event logs. The presence of `GetProcAddress` is unusual for typical PowerShell scripts and often indicates malicious activity, as many attack toolkits use it to achieve code execution. If confirmed malicious, this activity could allow an attacker to execute arbitrary code, potentially leading to system compromise. Analysts should review parallel processes and the entire logged script block for further investigation.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell` EventCode=4104 ScriptBlockText=*getprocaddress*
      | 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_fileless_process_injection_via_getprocaddress_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: Limited false positives. Filter as needed.
references:
    - https://help.splunk.com/en/security-offerings/splunk-user-behavior-analytics/get-data-in/5.4.1/add-other-data-to-splunk-uba/configure-powershell-logging-to-see-powershell-anomalies-in-splunk-uba.
    - https://blog.palantir.com/tampering-with-windows-event-tracing-background-offense-and-defense-4be7ac62ac63
    - https://static1.squarespace.com/static/552092d5e4b0661088167e5c/t/59c1814829f18782e24f1fe2/1505853768977/Windows+PowerShell+Logging+Cheat+Sheet+ver+Sept+2017+v2.1.pdf
    - https://www.crowdstrike.com/blog/investigating-powershell-command-and-script-logging/
    - https://www.splunk.com/en_us/blog/security/hunting-for-malicious-powershell-using-script-block-logging.html
finding:
    title: A suspicious powershell script contains GetProcAddress API on host $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Hellcat Ransomware
    - Malicious PowerShell
    - Hermetic Wiper
    - Data Destruction
asset_type: Endpoint
mitre_attack_id:
    - T1055
    - T1059.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`powershell` EventCode=4104 ScriptBlockText=*getprocaddress*

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTexteq
  • *getprocaddress* corpus 2 (sigma 1, splunk 1)
field:"ScriptBlockText" kind:eq value:"*getprocaddress*"

Scheduled Task with Potential SSH Tunnel - Windows (Sysmon)

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

Threat actors have been observed using scheduled tasks to create reverse SSH tunnels to facilitate persistence on a compromised machine as reported by DFIR. This use case detects scheduled tasks created with commands indicating potential SSH tunnels. The regex filtering matches on the patterns <user>@<IP address> and <port number>:<IP Address> :<port number>

MITRE ATT&CK Coverage

TacticTechniques
Execution
Persistence
Privilege Escalation
Command & Control

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '25326.47104'
title: Scheduled Task with Potential SSH Tunnel - Windows
description: Threat actors have been observed using scheduled tasks to create reverse
  SSH tunnels to facilitate persistence on a compromised machine as reported by DFIR.
  This use case detects scheduled tasks created with commands indicating potential
  SSH tunnels. The regex filtering matches on the patterns <user>@<IP address> and
  <port number>:<IP Address> :<port number>. Living Off the Land Binary and Scripts
  (LOLBAS) (LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  "@" "/create" ("-L" OR "-R" OR "-N" OR "-D" OR "-C" OR "IdentitiesOnly=yes" OR "StrictHostKeyChecking=no"
  OR "ssh") | where match(process, "\w+@\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") and match(process,
  "\d{1,5}:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}") and match(process, "(?i)\-(L|R|N|D|C)|IdentitiesOnly=yes|StrictHostKeyChecking=no|ssh")
  | table _time, host, user, process, process_*, parent_process_name, parent_process_*,
  signature_id | bin span=1s | stats values(*) as * by _time, host '
techniques:
- execution:scheduled task/job
- command-and-control:protocol tunneling
technique_id: 
- T1053
- T1572
data_category:
- Windows Sysmon
references:
- https://thedfirreport.com/2023/10/30/netsupport-intrusion-results-in-domain-compromise/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") "@" "/create" ("-L" OR "-R" OR "-N" OR "-D" OR "-C" OR "IdentitiesOnly=yes" OR "StrictHostKeyChecking=no" OR "ssh")

Stage 2: where

| where match(process, "\w+@\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
    and match(process, "\d{1,5}:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}")
    and match(process, "(?i)\-(L|R|N|D|C)|IdentitiesOnly=yes|StrictHostKeyChecking=no|ssh")

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
processregex_match
    • (?i)\-(L|R|N|D|C)
    • IdentitiesOnly=yes
    • StrictHostKeyChecking=no
    • ssh
    corpus 3 (splunk 3)
  • \d{1,5}:\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}:\d{1,5} corpus 3 (splunk 3)
  • \w+@\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1"@"
1"/create"
1"-L"
1"-R"
1"-N"
1"-D"
1"-C"
1"IdentitiesOnly=yes"
1"StrictHostKeyChecking=no"
1"ssh"

SecretDumps Offline NTDS Dumping Tool

#
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 potential use of the secretsdump.py tool to dump NTLM hashes from a copy of ntds.dit and the SAM, SYSTEM, and SECURITY registry hives. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on specific command-line patterns and process names associated with secretsdump.py. This activity is significant because it indicates an attempt to extract sensitive credential information offline, which is a common post-exploitation technique. If confirmed malicious, this could allow an attacker to obtain NTLM hashes, facilitating further lateral movement and potential privilege escalation within the network.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Credential Access

Telemetry Coverage

Rule Body

name: SecretDumps Offline NTDS Dumping Tool
id: 5672819c-be09-11eb-bbfb-acde48001122
version: 13
creation_date: '2021-05-26'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects the potential use of the secretsdump.py tool to dump NTLM hashes from a copy of ntds.dit and the SAM, SYSTEM, and SECURITY registry hives. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on specific command-line patterns and process names associated with secretsdump.py. This activity is significant because it indicates an attempt to extract sensitive credential information offline, which is a common post-exploitation technique. If confirmed malicious, this could allow an attacker to obtain NTLM hashes, facilitating further lateral movement and potential privilege escalation within the network.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.process_name = "python*.exe" Processes.process = "*.py*" Processes.process = "*-ntds*" (Processes.process = "*-system*"
        OR
        Processes.process = "*-sam*"
        OR
        Processes.process = "*-security*"
        OR
        Processes.process = "*-bootkey*")
      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)`
    | `secretdumps_offline_ntds_dumping_tool_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://github.com/SecureAuthCorp/impacket/blob/master/examples/secretsdump.py
finding:
    title: A secretdump process $process_name$ with secretdump commandline $process$ to dump credentials on host $dest$
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: A secretdump process $process_name$ with secretdump commandline $process$ to dump credentials on host $dest$
analytic_story:
    - Compromised Windows Host
    - Graceful Wipe Out Attack
    - Rhysida Ransomware
    - Credential Dumping
    - Storm-0501 Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1003.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.process_name = "python*.exe" Processes.process = "*.py*"
    Processes.process = "*-ntds*" (
        Processes.process = "*-system*"
        OR Processes.process = "*-sam*"
        OR Processes.process = "*-security*"
        OR Processes.process = "*-bootkey*"
    )
  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

| `secretdumps_offline_ntds_dumping_tool_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *-bootkey*
  • *-ntds*
  • *-sam*
  • *-security*
  • *-system*
  • *.py*
field:"CommandLine" kind:eq
Processes.process_nameeq
  • python*.exe
field:"process_basename" kind:eq value:"python*.exe"

ssh.exe Execution (Sysmon)

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

ssh.exe is a legitimate SSH client included in Windows systems,providing secure shell access to remote servers. Due to its availability and capabilities, it can be exploited by attackers for covert communication, remote command execution, or tunneling, making it a potential tool for living-off-the-land attacks. This use case detects executions of ssh.exe

MITRE ATT&CK Coverage

TacticTechniques
Stealth
Command & Control

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '25328.47113'
title: ssh.exe Execution
description: 'ssh.exe is a legitimate SSH client included in Windows systems,providing
  secure shell access to remote servers. Due to its availability and capabilities,
  it can be exploited by attackers for covert communication, remote command execution,
  or tunneling, making it a potential tool for living-off-the-land attacks. This use
  case detects executions of ssh.exe. -- Threat Actor Association: APT28 (aka.Fancy
  Bear, Fighting Ursa, Forest Blizzard, Pawn Storm, TA422, STRONTIUM) -- Living Off
  the Land Binary and Scripts (LOLBAS) (LOLBIN)'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  TERM(ssh) OR "ssh.exe" | where match(process_name, "(?i)^ssh\.exe")| table _time,
  host, user, process, process_*, parent_process_* | bin span=1s | stats values(*)
  as * by _time, host '
techniques:
- defense-evasion:indirect command execution
- command-and-control:protocol tunneling
technique_id: 
- T1202
- T1572
data_category:
- Windows Sysmon
references:
- https://lolbas-project.github.io/lolbas/Binaries/Ssh/

Stages and Predicates

Stage 1: search

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

Stage 2: where

| where match(process_name, "(?i)^ssh\.exe")

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
process_nameregex_match
  • (?i)^ssh.exe corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)^ssh.exe"

Search Terms

These SPL tokens match against raw event text.

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

Windows BitLockerToGo Process Execution

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

The following analytic detects BitLockerToGo.exe execution, which has been observed being abused by Lumma stealer malware. The malware leverages this legitimate Windows utility to manipulate registry keys, search for cryptocurrency wallets and credentials, and exfiltrate sensitive data. This activity is significant because BitLockerToGo.exe provides functionality for viewing, copying, and writing files as well as modifying registry branches - capabilities that the Lumma stealer exploits. However, note that if legitimate use of BitLockerToGo.exe is in the organization, this detection will

Known False Positives

  • False positives are likely, as BitLockerToGo.exe is a legitimate Windows utility used for managing BitLocker encryption. However, monitor for usage of BitLockerToGo.exe in your environment, tune as needed. If BitLockerToGo.exe is not used in your environment, move to TTP.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows BitLockerToGo Process Execution
id: 68cbc9e9-2882-46f2-b636-3b5080589d58
version: 7
creation_date: '2021-07-29'
modification_date: '2026-05-13'
author: Michael Haag, Nasreddine Bencherchali, Splunk
status: production
type: Hunting
description: The following analytic detects BitLockerToGo.exe execution, which has been observed being abused by Lumma stealer malware. The malware leverages this legitimate Windows utility to manipulate registry keys, search for cryptocurrency wallets and credentials, and exfiltrate sensitive data. This activity is significant because BitLockerToGo.exe provides functionality for viewing, copying, and writing files as well as modifying registry branches - capabilities that the Lumma stealer exploits. However, note that if legitimate use of BitLockerToGo.exe is in the organization, this detection will
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.process_name=bitlockertogo.exe
      BY Processes.action Processes.dest Processes.original_file_name
         Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
         Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
         Processes.process Processes.process_exec Processes.process_guid
         Processes.process_hash Processes.process_id Processes.process_integrity_level
         Processes.process_name Processes.process_path Processes.user
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_bitlockertogo_process_execution_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: False positives are likely, as BitLockerToGo.exe is a legitimate Windows utility used for managing BitLocker encryption. However, monitor for usage of BitLockerToGo.exe in your environment, tune as needed. If BitLockerToGo.exe is not used in your environment, move to TTP.
references:
    - https://securelist.com/fake-captcha-delivers-lumma-amadey/114312/
analytic_story:
    - Lumma Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1218
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.process_name=bitlockertogo.exe
  BY
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_bitlockertogo_process_execution_filter`

Indicators

These rows show field, operator, and value matches.

Windows Debugger Tool Execution

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

This analysis detects the use of debugger tools within a production environment. While these tools are legitimate for file analysis and debugging, they are abused by malware like PlugX and DarkGate for malicious DLL side-loading. The hunting query aids Security Operations Centers (SOCs) in identifying potentially suspicious tool executions, particularly for non-technical users in the production network.

Known False Positives

  • administrator or IT professional may execute this application for verifying files or debugging application.

MITRE ATT&CK Coverage

TacticTechniques
Stealth

Telemetry Coverage

Rule Body

name: Windows Debugger Tool Execution
id: e14d94a3-07fb-4b47-8406-f5e37180d422
version: 8
creation_date: '2023-12-06'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Hunting
description: This analysis detects the use of debugger tools within a production environment. While these tools are legitimate for file analysis and debugging, they are abused by malware like PlugX and DarkGate for malicious DLL side-loading. The hunting query aids Security Operations Centers (SOCs) in identifying potentially suspicious tool executions, particularly for non-technical users in the production network.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.process_name = "x32dbg.exe"
        OR
        Processes.process_name = "x64dbg.exe"
        OR
        Processes.process_name = "windbg.exe"
      BY Processes.action Processes.dest Processes.original_file_name
         Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
         Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
         Processes.process Processes.process_exec Processes.process_guid
         Processes.process_hash Processes.process_id Processes.process_integrity_level
         Processes.process_name Processes.process_path Processes.user
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_debugger_tool_execution_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: administrator or IT professional may execute this application for verifying files or debugging application.
references:
    - https://www.splunk.com/en_us/blog/security/enter-the-gates-an-analysis-of-the-darkgate-autoit-loader.html
    - https://www.trendmicro.com/en_us/research/23/b/investigating-the-plugx-trojan-disguised-as-a-legitimate-windows.html
analytic_story:
    - DarkGate Malware
    - PlugX
asset_type: Endpoint
mitre_attack_id:
    - T1036
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.process_name = "x32dbg.exe"
    OR
    Processes.process_name = "x64dbg.exe"
    OR
    Processes.process_name = "windbg.exe"
  BY
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_debugger_tool_execution_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.process_nameeq
  • windbg.exe corpus 2 (splunk 2)
  • x32dbg.exe
  • x64dbg.exe
field:"process_basename" kind:eq

Windows Masquerading Msdtc Process

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

The following analytic identifies the execution of msdtc.exe with specific command-line parameters (-a or -b), which are indicative of the PlugX malware. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names and command-line arguments. This activity is significant because PlugX uses these parameters to masquerade its malicious operations within legitimate processes, making it harder to detect. If confirmed malicious, this behavior could allow attackers to gain unauthorized access, exfiltrate data, and conduct espionage, severely compromising the affected system.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Stealth

Telemetry Coverage

Rule Body

name: Windows Masquerading Msdtc Process
id: 238f3a07-8440-480b-b26f-462f41d9a47c
version: 12
creation_date: '2023-12-06'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic identifies the execution of msdtc.exe with specific command-line parameters (-a or -b), which are indicative of the PlugX malware. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names and command-line arguments. This activity is significant because PlugX uses these parameters to masquerade its malicious operations within legitimate processes, making it harder to detect. If confirmed malicious, this behavior could allow attackers to gain unauthorized access, exfiltrate data, and conduct espionage, severely compromising the affected system.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.process_name = "msdtc.exe" Processes.process = "*msdtc.exe*" Processes.process IN ("* -a*", "* -b*")
      BY Processes.action Processes.dest Processes.original_file_name
         Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
         Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
         Processes.process Processes.process_exec Processes.process_guid
         Processes.process_hash Processes.process_id Processes.process_integrity_level
         Processes.process_name Processes.process_path Processes.user
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_masquerading_msdtc_process_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: No false positives have been identified at this time.
references:
    - https://malpedia.caad.fkie.fraunhofer.de/details/win.plugx
finding:
    title: msdtc.exe process with process commandline used by PlugX malware on $dest$.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Compromised Windows Host
    - PlugX
asset_type: Endpoint
mitre_attack_id:
    - T1036
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.process_name = "msdtc.exe" Processes.process = "*msdtc.exe*"
    Processes.process IN (
        "* -a*",
        "* -b*"
    )
  BY
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_masquerading_msdtc_process_filter`

Indicators

These rows show field, operator, and value matches.

Windows Service Created with Suspicious Service Path

#
Status
production
Severity
medium
Group by
ImagePath, ServiceType, StartType, computer_name, service_name, signature_id, user
Author
Teoderick Contreras, Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic detects the creation of a Windows Service with a binary path located in uncommon directories, using Windows Event ID 7045. It leverages logs from the wineventlog_system to identify services installed outside typical system directories. This activity is significant as adversaries, including those deploying Clop ransomware, often create malicious services for lateral movement, remote code execution, persistence, and execution. If confirmed malicious, this could allow attackers to maintain persistence, execute arbitrary code, and potentially escalate privileges, posing a severe threat to the environment.

Known False Positives

  • Legitimate applications may install services with uncommon services paths.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Service Created with Suspicious Service Path
id: 429141be-8311-11eb-adb6-acde48001122
version: 20
creation_date: '2022-08-26'
modification_date: '2026-05-13'
author: Teoderick Contreras, Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects the creation of a Windows Service with a binary path located in uncommon directories, using Windows Event ID 7045. It leverages logs from the `wineventlog_system` to identify services installed outside typical system directories. This activity is significant as adversaries, including those deploying Clop ransomware, often create malicious services for lateral movement, remote code execution, persistence, and execution. If confirmed malicious, this could allow attackers to maintain persistence, execute arbitrary code, and potentially escalate privileges, posing a severe threat to the environment.
data_source:
    - Windows Event Log System 7045
search: '`wineventlog_system` EventCode=7045 ImagePath = "*.exe" NOT (ImagePath IN ("*:\\Windows\\*", "*:\\Program File*", "*:\\Programdata\\*", "*%systemroot%\\*")) | stats count min(_time) as firstTime max(_time) as lastTime by EventCode ImagePath ServiceName ServiceType StartType Computer UserID | rename Computer as dest| `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_service_created_with_suspicious_service_path_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting logs with the Service name, Service File Name Service Start type, and Service Type from your endpoints.
known_false_positives: Legitimate applications may install services with uncommon services paths.
references:
    - https://www.mandiant.com/resources/fin11-email-campaigns-precursor-for-ransomware-data-theft
    - https://blog.virustotal.com/2020/11/keep-your-friends-close-keep-ransomware.html
finding:
    title: A service $ImagePath$ was created from a non-standard path using $ServiceName$ on $dest$
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: ImagePath
      type: service
analytic_story:
    - PlugX
    - Qakbot
    - China-Nexus Threat Activity
    - CISA AA23-347A
    - Flax Typhoon
    - Derusbi
    - Salt Typhoon
    - Active Directory Lateral Movement
    - Snake Malware
    - Clop Ransomware
    - Crypto Stealer
    - Brute Ratel C4
    - APT37 Rustonotto and FadeStealer
    - Gh0st RAT
asset_type: Endpoint
mitre_attack_id:
    - T1569.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_system` EventCode=7045 ImagePath = "*.exe" NOT (
    ImagePath IN ("*:\\Windows\\*", "*:\\Program File*", "*:\\Programdata\\*", "*%systemroot%\\*")
)

Stage 2: stats

| stats
    count
    min(_time) as firstTime
    max(_time) as lastTime
  by EventCode ImagePath ServiceName ServiceType StartType Computer UserID

Stage 3: rename

| rename Computer as dest

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `windows_service_created_with_suspicious_service_path_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 7045 corpus 19 (splunk 18, elastic 1)
field:"EventID" kind:eq value:"7045"
ImagePatheq
  • *.exe
field:"ImagePath" kind:eq value:"*.exe"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
ImagePathin*%systemroot%\*, *:\Program File*, *:\Programdata\*, *:\Windows\*excludes:ImagePath

Zscaler Virus Download threat blocked

#
Status
production
Severity
low
Group by
action, dest, deviceowner, src, url, urlcategory, user
Author
Gowthamaraj Rajendran, Rod Soto, Splunk
Source
github.com/splunk/security_content

The following analytic identifies attempts to download viruses that were blocked by Zscaler within a network. It leverages web proxy logs to detect blocked actions indicative of virus download attempts. Key data points such as device owner, user, URL category, destination URL, and IP are analyzed. This activity is significant as it helps in early detection and remediation of potential virus threats, enhancing network security. If confirmed malicious, this activity could indicate an attempt to compromise the network, potentially leading to data breaches or further malware infections.

Known False Positives

  • False positives are limited to Zscaler configuration.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access

Rule Body

name: Zscaler Virus Download threat blocked
id: aa19e627-d448-4a31-85cd-82068dec5691
version: 10
creation_date: '2024-04-17'
modification_date: '2026-05-13'
author: Gowthamaraj Rajendran, Rod Soto, Splunk
status: production
type: Anomaly
description: The following analytic identifies attempts to download viruses that were blocked by Zscaler within a network. It leverages web proxy logs to detect blocked actions indicative of virus download attempts. Key data points such as device owner, user, URL category, destination URL, and IP are analyzed. This activity is significant as it helps in early detection and remediation of potential virus threats, enhancing network security. If confirmed malicious, this activity could indicate an attempt to compromise the network, potentially leading to data breaches or further malware infections.
data_source: []
search: |-
    `zscaler_proxy` action=blocked threatname!="None" threatclass=Virus
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY action deviceowner user
           urlcategory url src
           dest
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `zscaler_virus_download_threat_blocked_filter`
how_to_implement: You must install the latest version of Zscaler Add-on from Splunkbase. You must be ingesting Zscaler events into your Splunk environment through an ingester. This analytic was written to be used with the "zscalernss-web" sourcetype leveraging the Zscaler proxy data. This enables the integration with Splunk Enterprise Security. Security teams are encouraged to adjust the detection parameters, ensuring the detection is tailored to their specific environment.
known_false_positives: False positives are limited to Zscaler configuration.
references:
    - https://help.zscaler.com/zia/nss-feed-output-format-web-logs
intermediate_findings:
    entities:
        - field: src
          type: system
          score: 20
          message: Potential Virus Download Threat from dest -[$dest$] on $src$ for user-[$user$].
        - field: user
          type: user
          score: 20
          message: Potential Virus Download Threat from dest -[$dest$] on $src$ for user-[$user$].
threat_objects:
    - field: url
      type: url
analytic_story:
    - Zscaler Browser Proxy Threats
asset_type: Web Server
mitre_attack_id:
    - T1566
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: web
security_domain: threat

Stages and Predicates

Stage 1: search

`zscaler_proxy` action=blocked threatname!="None" threatclass=Virus

Stage 2: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY action deviceowner user
       urlcategory url src
       dest

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `zscaler_virus_download_threat_blocked_filter`

Indicators

These rows show field, operator, and value matches.

Back to all Splunk rules