Detection rules › Splunk

Splunk rules: 04

ASL AWS Defense Evasion Update Cloudtrail

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

The following analytic detects UpdateTrail events within AWS CloudTrail logs, aiming to identify attempts by attackers to evade detection by altering logging configurations. By updating CloudTrail settings with incorrect parameters, such as changing multi-regional logging to a single region, attackers can impair the logging of their activities across other regions. This behavior is crucial for Security Operations Centers (SOCs) to identify, as it indicates an adversary's intent to operate undetected within a compromised AWS environment. The impact of such evasion tactics is significant, potentially allowing malicious activities to proceed without being logged, thereby hindering incident response and forensic investigations.

Known False Positives

  • While this search has no known false positives, it is possible that an AWS admin has updated cloudtrail logging. Please investigate this activity.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: ASL AWS Defense Evasion Update Cloudtrail
id: f3eb471c-16d0-404d-897c-7653f0a78cba
version: 12
creation_date: '2024-05-22'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: TTP
description: The following analytic detects `UpdateTrail` events within AWS CloudTrail logs, aiming to identify attempts by attackers to evade detection by altering logging configurations. By updating CloudTrail settings with incorrect parameters, such as changing multi-regional logging to a single region, attackers can impair the logging of their activities across other regions. This behavior is crucial for Security Operations Centers (SOCs) to identify, as it indicates an adversary's intent to operate undetected within a compromised AWS environment. The impact of such evasion tactics is significant, potentially allowing malicious activities to proceed without being logged, thereby hindering incident response and forensic investigations.
data_source:
    - ASL AWS CloudTrail
search: |-
    `amazon_security_lake` api.operation=UpdateTrail
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY actor.user.uid api.operation api.service.name
           http_request.user_agent src_endpoint.ip actor.user.account.uid
           cloud.provider cloud.region
      | rename actor.user.uid as user api.operation as action api.service.name as dest http_request.user_agent as user_agent src_endpoint.ip as src actor.user.account.uid as vendor_account cloud.provider as vendor_product cloud.region as vendor_region
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `asl_aws_defense_evasion_update_cloudtrail_filter`
how_to_implement: The detection is based on Amazon Security Lake events from Amazon Web Services (AWS), which is a centralized data lake that provides security-related data from AWS services. To use this detection, you must ingest CloudTrail logs from Amazon Security Lake into Splunk. To run this search, ensure that you ingest events using the latest version of Splunk Add-on for Amazon Web Services (https://splunkbase.splunk.com/app/1876) or the Federated Analytics App.
known_false_positives: While this search has no known false positives, it is possible that an AWS admin has updated cloudtrail logging. Please investigate this activity.
references:
    - https://attack.mitre.org/techniques/T1562/008/
finding:
    title: User $user$ has updated a cloudtrail logging for account id $vendor_account$ from IP $src$
    entity:
        field: user
        type: user
        score: 50
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - AWS Defense Evasion
asset_type: AWS Account
mitre_attack_id:
    - T1685.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`amazon_security_lake` api.operation=UpdateTrail

Stage 2: fillnull

| fillnull

Stage 3: stats

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

Stage 4: rename

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

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `asl_aws_defense_evasion_update_cloudtrail_filter`

Indicators

These rows show field, operator, and value matches.

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

ASL AWS Network Access Control List Deleted

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

The following analytic detects the deletion of AWS Network Access Control Lists (ACLs). It leverages AWS CloudTrail logs to identify events where a user deletes a network ACL entry. This activity is significant because deleting a network ACL can remove critical access restrictions, potentially allowing unauthorized access to cloud instances. If confirmed malicious, this action could enable attackers to bypass network security controls, leading to unauthorized access, data exfiltration, or further compromise of the cloud environment.

Known False Positives

  • It's possible that a user has legitimately deleted a network ACL.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: ASL AWS Network Access Control List Deleted
id: e010ddf5-e9a5-44e5-bdd6-0c919ba8fc8b
version: 10
creation_date: '2022-10-04'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: Anomaly
description: The following analytic detects the deletion of AWS Network Access Control Lists (ACLs). It leverages AWS CloudTrail logs to identify events where a user deletes a network ACL entry. This activity is significant because deleting a network ACL can remove critical access restrictions, potentially allowing unauthorized access to cloud instances. If confirmed malicious, this action could enable attackers to bypass network security controls, leading to unauthorized access, data exfiltration, or further compromise of the cloud environment.
data_source:
    - ASL AWS CloudTrail
search: |-
    `amazon_security_lake` api.operation=DeleteNetworkAclEntry status=Success
      | spath input=api.request.data path=egress output=egress
      | spath input=api.request.data path=networkAclId output=networkAclId
      | search egress=false
      | 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 networkAclId
      | 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_network_access_control_list_deleted_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's possible that a user has legitimately deleted a network ACL.
references: []
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: User $user$ from $src$ has sucessfully deleted network ACLs entry.
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - AWS Network ACL Activity
    - Scattered Lapsus$ Hunters
asset_type: AWS Instance
mitre_attack_id:
    - T1686.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: network

Stages and Predicates

Stage 1: search

`amazon_security_lake` api.operation=DeleteNetworkAclEntry status=Success

Stage 2: spath

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

Stage 3: spath

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

Stage 4: search

| search egress=false

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 networkAclId

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
api.operationeq
  • DeleteNetworkAclEntry corpus 2 (splunk 2)
field:"aws::eventName" kind:eq value:"DeleteNetworkAclEntry"
egresseq
  • false corpus 2 (splunk 2)
field:"egress" kind:eq value:"false"
sourcetypeeq
  • aws:asl corpus 27 (splunk 27)
field:"sourcetype" kind:eq value:"aws:asl"
statuseq
  • Success corpus 21 (sigma 15, splunk 6)
field:"status" kind:eq value:"Success"

ASL AWS SAML Update identity provider

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

The following analytic detects updates to the SAML provider in AWS. It leverages AWS CloudTrail logs to identify the UpdateSAMLProvider event, analyzing fields such as sAMLProviderArn, sourceIPAddress, and userIdentity details. Monitoring updates to the SAML provider is crucial as it may indicate a perimeter compromise of federated credentials or unauthorized backdoor access set by an attacker. If confirmed malicious, this activity could allow attackers to manipulate identity federation, potentially leading to unauthorized access to cloud resources and sensitive data.

Known False Positives

  • Updating a SAML provider or creating a new one may not necessarily be malicious however it needs to be closely monitored.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access
Persistence
Privilege Escalation
Stealth

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: ASL AWS SAML Update identity provider
id: 635c26cc-0fd1-4098-8ec9-824bf9544b11
version: 7
creation_date: '2022-10-04'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: TTP
description: The following analytic detects updates to the SAML provider in AWS. It leverages AWS CloudTrail logs to identify the `UpdateSAMLProvider` event, analyzing fields such as `sAMLProviderArn`, `sourceIPAddress`, and `userIdentity` details. Monitoring updates to the SAML provider is crucial as it may indicate a perimeter compromise of federated credentials or unauthorized backdoor access set by an attacker. If confirmed malicious, this activity could allow attackers to manipulate identity federation, potentially leading to unauthorized access to cloud resources and sensitive data.
data_source:
    - ASL AWS CloudTrail
search: |-
    `amazon_security_lake` api.operation=UpdateSAMLProvider
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY actor.user.uid api.operation api.service.name
           http_request.user_agent src_endpoint.ip actor.user.account.uid
           cloud.provider cloud.region
      | rename actor.user.uid as user api.operation as action api.service.name as dest http_request.user_agent as user_agent src_endpoint.ip as src actor.user.account.uid as vendor_account cloud.provider as vendor_product cloud.region as vendor_region
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `asl_aws_saml_update_identity_provider_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: Updating a SAML provider or creating a new one may not necessarily be malicious however it needs to be closely monitored.
references:
    - https://www.cisa.gov/uscert/ncas/alerts/aa21-008a
    - https://www.splunk.com/en_us/blog/security/a-golden-saml-journey-solarwinds-continued.html
    - https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/wp-m-unc2452-2021-000343-01.pdf
    - https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps
finding:
    title: User $user$ from IP address $src$ updated the SAML provider
    entity:
        field: user
        type: user
        score: 50
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - Cloud Federated Credential Abuse
asset_type: AWS Federated Account
mitre_attack_id:
    - T1078
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`amazon_security_lake` api.operation=UpdateSAMLProvider

Stage 2: fillnull

| fillnull

Stage 3: stats

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

Stage 4: rename

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

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `asl_aws_saml_update_identity_provider_filter`

Indicators

These rows show field, operator, and value matches.

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

Cisco Duo Admin Login Unusual Os

#
Status
production
Severity
medium
Group by
"access_device.browser", "access_device.browser_version", "access_device.location.city", "access_device.location.country", "access_device.location.state", "access_device.os", "access_device.os_version", "actor.details", "actor.type", "outcome.result", src_ip, user
Author
Patrick Bareiss, Splunk
Source
github.com/splunk/security_content

The following analytic identifies Duo admin login attempts from operating systems that are unusual for your environment, excluding commonly used OS such as Mac OS X. Please adjust to your environment. It works by analyzing Duo activity logs for admin login actions and filtering out logins from expected operating systems. The analytic then aggregates events by browser, version, source IP, location, and OS details to highlight anomalies. Detecting admin logins from unexpected operating systems is critical for a SOC, as it may indicate credential compromise, unauthorized access, or attacker activity using unfamiliar devices. Such behavior can precede privilege escalation, policy changes, or other malicious actions within the Duo environment. Early detection enables rapid investigation and response, reducing the risk of account takeover and minimizing potential damage to organizational security controls.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Rule Body

name: Cisco Duo Admin Login Unusual Os
id: c4824cc6-d644-458e-a39a-67cd67da75e3
version: 6
creation_date: '2025-07-10'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: TTP
description: The following analytic identifies Duo admin login attempts from operating systems that are unusual for your environment, excluding commonly used OS such as Mac OS X. Please adjust to your environment. It works by analyzing Duo activity logs for admin login actions and filtering out logins from expected operating systems. The analytic then aggregates events by browser, version, source IP, location, and OS details to highlight anomalies. Detecting admin logins from unexpected operating systems is critical for a SOC, as it may indicate credential compromise, unauthorized access, or attacker activity using unfamiliar devices. Such behavior can precede privilege escalation, policy changes, or other malicious actions within the Duo environment. Early detection enables rapid investigation and response, reducing the risk of account takeover and minimizing potential damage to organizational security controls.
data_source:
    - Cisco Duo Activity
search: |-
    `cisco_duo_activity` "action.name"=admin_login NOT access_device.os IN ("Mac OS X")
      | rename actor.name as user access_device.ip.address as src_ip
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY access_device.browser access_device.browser_version src_ip
           access_device.location.city access_device.location.country access_device.location.state
           access_device.os access_device.os_version actor.details
           actor.type outcome.result user
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `cisco_duo_admin_login_unusual_os_filter`
how_to_implement: The analytic leverages Duo activity logs to be ingested using the Cisco Security Cloud App (https://splunkbase.splunk.com/app/7404).
known_false_positives: No false positives have been identified at this time.
references:
    - https://splunkbase.splunk.com/app/7404
finding:
    title: A user $user$ has logged in using an unusual OS $access_device.os$ using browser $access_device.browser$ from $src_ip$.
    entity:
        field: user
        type: user
        score: 50
threat_objects:
    - field: access_device.browser
      type: http_user_agent
    - field: src_ip
      type: ip_address
analytic_story:
    - Cisco Duo Suspicious Activity
asset_type: Identity
mitre_attack_id:
    - T1556
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: identity

Stages and Predicates

Stage 1: search

`cisco_duo_activity` "action.name"=admin_login NOT access_device.os IN ("Mac OS X")

Stage 2: rename

| rename actor.name as user access_device.ip.address as src_ip

Stage 3: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY access_device.browser access_device.browser_version src_ip
       access_device.location.city access_device.location.country access_device.location.state
       access_device.os access_device.os_version actor.details
       actor.type outcome.result user

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `cisco_duo_admin_login_unusual_os_filter`

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
access_device.oseqMac OS Xexcludes:access_device.os field:"access_device.os" value:"Mac OS X"

Cisco Secure Firewall - Rare Snort Rule Triggered

#
Status
production
Group by
InlineResult, InlineResultReason, MitreAttackGroups, class_desc, signature_id
Author
Nasreddine Bencherchali, Splunk
Source
github.com/splunk/security_content

This analytic identifies Snort signatures that have triggered only once in the past 7 days across all Cisco Secure Firewall IntrusionEvent logs. While these rules typically do not trigger in day-to-day network activity, their sudden appearance may indicate early-stage compromise, previously unseen malware, or reconnaissance activity against less commonly exposed services. Investigating these outliers can provide valuable insight into new or low-noise adversary behaviors.

Known False Positives

  • False positives may occur with certain rare activity. Apply additional filters where required.

MITRE ATT&CK Coverage

Rule Body

name: Cisco Secure Firewall - Rare Snort Rule Triggered
id: e20313d2-7d63-4fcf-b2d9-d6e12c6c7bd7
version: 6
creation_date: '2025-04-16'
modification_date: '2026-05-13'
author: Nasreddine Bencherchali, Splunk
status: production
type: Hunting
description: |
    This analytic identifies Snort signatures that have triggered only once in the past 7 days across all Cisco Secure Firewall IntrusionEvent logs. While these rules typically do not trigger in day-to-day network activity, their sudden appearance may indicate early-stage compromise, previously unseen malware, or reconnaissance activity against less commonly exposed services. Investigating these outliers can provide valuable insight into new or low-noise adversary behaviors.
data_source:
    - Cisco Secure Firewall Threat Defense Intrusion Event
search: |
    `cisco_secure_firewall` EventType=IntrusionEvent earliest=-7d
    | stats dc(_time) as TriggerCount min(_time) as firstTime max(_time) as lastTime
            values(signature) as signature
            values(src) as src
            values(dest) as dest
            values(dest_port) as dest_port
            values(transport) as transport
            values(app) as app
            values(rule) as rule
            by signature_id class_desc MitreAttackGroups InlineResult InlineResultReason
    | where TriggerCount = 1
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `cisco_secure_firewall___rare_snort_rule_triggered_filter`
how_to_implement: |
    This search requires Cisco Secure Firewall Threat Defense Logs, which
    includes the IntrusionEvent EventType. This search uses an input macro named `cisco_secure_firewall`.
    We strongly recommend that you specify your environment-specific configurations
    (index, source, sourcetype, etc.) for Cisco Secure Firewall Threat Defense logs. Replace the macro definition
    with configurations for your Splunk environment. The search also uses a post-filter
    macro designed to filter out known false positives.
    The logs are to be ingested using the Splunk Add-on for Cisco Security Cloud (https://splunkbase.splunk.com/app/7404).
    The intrusion access policy must also be configured.
known_false_positives: False positives may occur with certain rare activity. Apply additional filters where required.
references:
    - https://www.cisco.com/c/en/us/td/docs/security/firepower/741/api/FQE/secure_firewall_estreamer_fqe_guide_740.pdf
analytic_story:
    - Cisco Secure Firewall Threat Defense Analytics
asset_type: Network
mitre_attack_id:
    - T1598
    - T1583.006
product:
    - Splunk Enterprise
    - Splunk Cloud
    - Splunk Enterprise Security
category: network
security_domain: network

Stages and Predicates

Stage 1: search

`cisco_secure_firewall` EventType=IntrusionEvent earliest=-7d

Stage 2: stats

| stats dc(_time) as TriggerCount min(_time) as firstTime max(_time) as lastTime
        values(signature) as signature
        values(src) as src
        values(dest) as dest
        values(dest_port) as dest_port
        values(transport) as transport
        values(app) as app
        values(rule) as rule
        by signature_id class_desc MitreAttackGroups InlineResult InlineResultReason

Stage 3: where

| where TriggerCount = 1

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `cisco_secure_firewall___rare_snort_rule_triggered_filter`

Indicators

These rows show field, operator, and value matches.

ConsentPromptBehaviorAdmin Registry Value Modified (PowerShell)

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

Adversaries may bypass UAC mechanisms to elevate process privileges on system. Windows User Account Control (UAC) allows a program to elevate its privileges (tracked as integrity levels ranging from low to high) to perform a task under administrator-level permissions, possibly by prompting the user for confirmation. The impact to the user ranges from denying the operation under high enforcement to allowing the user to perform the action if they are in the local administrators group and click through the prompt or allowing them to enter an administrator password to complete the action. This use case detects registry modification events or process executions with registry modification commands targeting \Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '31193.55843'
title: ConsentPromptBehaviorAdmin Registry Value Modified
description: 'Adversaries may bypass UAC mechanisms to elevate process privileges
  on system. Windows User Account Control (UAC) allows a program to elevate its privileges
  (tracked as integrity levels ranging from low to high) to perform a task under administrator-level
  permissions, possibly by prompting the user for confirmation. The impact to the
  user ranges from denying the operation under high enforcement to allowing the user
  to perform the action if they are in the local administrators group and click through
  the prompt or allowing them to enter an administrator password to complete the action.
  This use case detects registry modification events or process executions with registry
  modification commands targeting \Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin.
  -- Software Association: 8Base'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4103) OR
  "<EventID>4103<" OR TERM(EventCode=4104) OR "<EventID>4104<") ("Set-Item-Property"
  OR "sp " OR "ADD") "ConsentPromptBehaviorAdmin" "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"
  | table _time, host, user, process | bin span=1s | stats values(*) as * by _time,
  host '
techniques:
- privilege-escalation:abuse elevation control mechanism:bypass user account control
technique_id:
- T1548.002
data_category:
- PowerShell logs
references:
- https://attack.mitre.org/techniques/T1548/002/
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1548.002/T1548.002.md#atomic-test-22---disable-uac-admin-consent-prompt-via-consentpromptbehavioradmin-registry-key
- https://www.trendmicro.com/vinfo/us/security/news/ransomware-spotlight/ransomware-spotlight-8base?utm_source=trendmicroresearch&utm_medium=smk&utm_campaign=0424_8base

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<") ("Set-Item-Property" OR "sp " OR "ADD") "ConsentPromptBehaviorAdmin" "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"

Stage 2: table

| table _time, host, user, process

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Indicators

These rows show field, operator, and value matches.

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

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4103<"
1"<EventID>4104<"
1"Set-Item-Property"
1"sp "
1"ADD"
1"ConsentPromptBehaviorAdmin"
1"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"

Dxcap Proxy Execution (Windows Event Log)

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

DXCap.exe is a command-line tool for graphics diagnostics capture and playback. It supports Direct3D 10 through Direct3D 12 across all feature levels. Local execution of a process as a subprocess of Dxcap.exe

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '6583.7596'
title: Dxcap Proxy Execution
description: DXCap.exe is a command-line tool for graphics diagnostics capture and
  playback. It supports Direct3D 10 through Direct3D 12 across all feature levels.
  Local execution of a process as a subprocess of Dxcap.exe Living Off the Land Binary
  and Scripts (LOLBAS) (LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=process) "dxcap" | table _time, host, user user, process,
  process_*, parent_* | bin span=1s | stats values(*) as * by _time, host | where
  match(parent_process_name, "(?i)dxcap") OR match(process, "(?i)dxcap.+?\-c") '
techniques:
- defense-evasion:system binary proxy execution
technique_id: 
- T1218
data_category:
- Windows event logs
references:
- https://lolbas-project.github.io/lolbas/OtherMSBinaries/Dxcap/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=process) "dxcap"

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Stage 5: where

| where match(parent_process_name, "(?i)dxcap") OR match(process, "(?i)dxcap.+?\-c")

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"dxcap"

ESXi Shell Access Enabled

#
Status
production
Severity
medium
Group by
Message, dest, user
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

This detection identifies when the ESXi Shell is enabled on a host, which may indicate that a malicious actor is preparing to execute commands locally or establish persistent access. Enabling the shell outside of approved maintenance windows can be a sign of compromise or unauthorized administrative activity.

Known False Positives

  • Limited false positives in most environments, however tune as needed. Some Administrators may enable this for troubleshooting.

MITRE ATT&CK Coverage

TacticTechniques
Lateral Movement

Rule Body

name: ESXi Shell Access Enabled
id: 15e79d0a-c659-42fd-9668-94108528f2ec
version: 4
creation_date: '2025-07-11'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: TTP
description: This detection identifies when the ESXi Shell is enabled on a host, which may indicate that a malicious actor is preparing to execute commands locally or establish persistent access. Enabling the shell outside of approved maintenance windows can be a sign of compromise or unauthorized administrative activity.
data_source:
    - VMWare ESXi Syslog
search: '`esxi_syslog` Message="*ESXi Shell*" Message="*has been enabled*" | rex field=_raw "''(?<user>\w+)@" | rex field=_raw "Z (?<dest>[\w\.]+)\s" | stats min(_time) as firstTime max(_time) as lastTime count by dest user Message | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `esxi_shell_access_enabled_filter`'
how_to_implement: This is based on syslog data generated by VMware ESXi hosts. To implement this search, you must configure your ESXi systems to forward syslog output to your Splunk deployment. These logs must be ingested with the appropriate Splunk Technology Add-on for VMware ESXi Logs, which provides field extractions and CIM compatibility.
known_false_positives: Limited false positives in most environments, however tune as needed. Some Administrators may enable this for troubleshooting.
finding:
    title: ESXi Shell access was enabled on ESXi host $dest$.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - ESXi Post Compromise
    - Black Basta Ransomware
asset_type: Infrastructure
mitre_attack_id:
    - T1021
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`esxi_syslog` Message="*ESXi Shell*" Message="*has been enabled*"

Stage 2: rex

| rex field=_raw "'(?<user>\w+)@"

Stage 3: rex

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

Stage 4: stats

| stats min(_time) as firstTime max(_time) as lastTime count by dest user Message

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `esxi_shell_access_enabled_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Messageeq
  • *ESXi Shell*
  • *has been enabled*
field:"Message" kind:eq
sourcetypein
  • vmw-syslog corpus 23 (splunk 23)
  • vmware:esxlog* corpus 23 (splunk 23)
field:"sourcetype" kind:in

Geographic Improbable Location

#
Status
experimental
Severity
low
Group by
_time, host, index, sourcetype, src, user
Author
Marissa Bower, Raven Tait
Source
github.com/splunk/security_content

Geolocation data can be inaccurate or easily spoofed by Remote Employment Fraud (REF) workers. REF actors sometimes slip up and reveal their true location, creating what we call 'improbable travel' scenarios — logins from opposite sides of the world within minutes. This identifies situations where these travel scenarios occur.

Known False Positives

  • Legitimate usage of some VPNs may cause false positives. Tune as needed.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access
Persistence
Privilege Escalation
Stealth

Rule Body

name: Geographic Improbable Location
id: 64f91df1-49ec-46aa-81bd-2282d3cea765
version: 4
creation_date: '2025-06-12'
modification_date: '2026-05-13'
author: Marissa Bower, Raven Tait
status: experimental
type: Anomaly
description: Geolocation data can be inaccurate or easily spoofed by Remote Employment Fraud (REF) workers. REF actors sometimes slip up and reveal their true location, creating what we call 'improbable travel' scenarios — logins from opposite sides of the world within minutes. This identifies situations where these travel scenarios occur.
data_source:
    - Okta
search: '| tstats summariesonly=true values(Authentication.app) as app from datamodel=Authentication.Authentication where (`okta` OR (index="firewall" AND sourcetype="pan:globalprotect")) AND Authentication.action="success" AND Authentication.app IN ("Workday", "Slack", "*GlobalProtect", "Jira*", "Atlassian Cloud", "Zoom") AND NOT Authentication.user="unknown" by _time index sourcetype host Authentication.user Authentication.src span=1s | `drop_dm_object_name("Authentication")` | fields user,src,app,_time,count,host | eval user=lower(replace(user, "((^.*\\\)|(@.*$))", "")) | join type=outer user [| inputlookup identity_lookup_expanded where user_status=active | rex field=email "^(?<user>[a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$" | rename email as user_email bunit as user_bunit priority as user_priority work_country as user_work_country work_city as user_work_city | fields user user_email user_bunit user_priority user_work_country user_work_city] | eventstats dc(src) as src_count by user | eventstats dc(user) as user_count by src | sort 0 + _time | iplocation src | lookup local=true asn_lookup_by_cidr ip as src OUTPUT ip asn description | eval session_lat=if(isnull(src_lat), lat, src_lat), session_lon=if(isnull(src_long), lon, src_long), session_city=if(isnull(src_city), City, src_city), session_country=if(isnull(src_country), Country, src_country), session_region=if(isnull(src_region), Region, src_region) | eval session_city=if(isnull(session_city) OR match(session_city,"^\s+|^$"), null(), session_city), session_country=if(isnull(session_country) OR match(session_country,"^\s+|^$"), null(), session_country), session_region=if(isnull(session_region) OR match(session_region,"^\s+|^$"), null(), session_region) | where isnotnull(session_lat) and isnotnull(session_lon) | eval session_city=if(isnull(session_city),"-",session_city), session_country=if(isnull(session_country),"-",session_country), session_region=if(isnull(session_region),"-",session_region) | streamstats current=t window=2 earliest(session_region) as prev_region,earliest(session_lat) as prev_lat, earliest(session_lon) as prev_lon, earliest(session_city) as prev_city, earliest(session_country) as prev_country, earliest(_time) as prev_time, earliest(src) as prev_src, latest(user_bunit) as user_bunit, earliest(app) as prev_app values(user_work_country) as user_work_country by user | where (src!=prev_src) AND !(prev_city=session_city AND prev_country=session_country) AND ((isnotnull(prev_city) AND isnotnull(session_city)) OR prev_country!=session_country) | `globedistance(session_lat,session_lon,prev_lat,prev_lon,"m")` | eval time_diff=if((_time-prev_time)==0, 1, _time - prev_time) | eval speed = round(distance*3600/time_diff,2) | eval distance= round(distance,2) | eval user_work_country=case(user_work_country="usa","United States", user_work_country="cze","Czechia", user_work_country="pol","Poland", user_work_country="ind","India", user_work_country="fra","France", user_work_country="can","Canada", user_work_country="mys","Malaysia", user_work_country="kor","South Korea", user_work_country="aus","Australia", user_work_country="bel","Belgium", user_work_country="dnk","Denmark", user_work_country="bra","Brazil", user_work_country="deu","Germany", user_work_country="jpn","Japan", user_work_country="che","Switzerland", user_work_country="swe","Sweden", user_work_country="zaf","South Africa", user_work_country="irl","Ireland", user_work_country="ita","Italy", user_work_country="nor","Norway", user_work_country="gbr","United Kingdom", user_work_country="hkg","Hong Kong", user_work_country="chn","China", user_work_country="esp","Spain", user_work_country="nld", "Netherlands", user_work_country="twn","Taiwan", user_work_country="est","Estonia", user_work_country="sgp","Singapore", user_work_country="are","United Arab Emirates", 1=1,"N/A") | lookup local=true asn_lookup_by_cidr ip as prev_src OUTPUT ip as prev_ip asn as prev_asn description as prev_description | eval suspect=if(!user_work_country==session_country,"Sketchy","Normal") | search (speed>500 AND distance>750) | table _time,prev_time,user,host,src,prev_src,app,prev_app,distance,speed,suspect,session_city,session_region, session_country,prev_city,prev_region,prev_country,user_priority,user_work_*,prev_ip,ip,asn,prev_asn,prev_description,description | rename _time as event_time | convert ctime(event_time) timeformat="%Y-%m-%d %H:%M:%S" | convert ctime(prev_time) timeformat="%Y-%m-%d %H:%M:%S" | eval problem=if(!session_country==prev_country AND (!session_country==user_work_country),"Yes","Nope") | search NOT (prev_city="-" OR session_city="-") AND NOT [inputlookup known_devices_public_ip_filter.csv | fields ip | rename ip as src] | dedup user host prev_src src | fillnull value="N/A" | search problem="Yes"| `geographic_improbable_location_filter`'
how_to_implement: The analytic leverages Okta OktaIm2 logs to be ingested using the Splunk Add-on for Okta Identity Cloud (https://splunkbase.splunk.com/app/6553). This also utilizes Splunk Enterprise Security Suite for several macros and lookups. The known_devices_public_ip_filter lookup is a placeholder for known public edge devices in your network.
known_false_positives: Legitimate usage of some VPNs may cause false positives. Tune as needed.
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: Improbable travel speed between locations observed for $user$.
analytic_story:
    - Remote Employment Fraud
asset_type: Identity
mitre_attack_id:
    - T1078
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: identity

Stages and Predicates

Stage 1: tstats

| tstats summariesonly=true
    values(Authentication.app) as app
  from datamodel=Authentication.Authentication
  where (`okta` OR (index="firewall" AND sourcetype="pan:globalprotect"))
    AND Authentication.action="success" AND Authentication.app IN (
        "Workday",
        "Slack",
        "*GlobalProtect",
        "Jira*",
        "Atlassian Cloud",
        "Zoom"
    ) AND NOT Authentication.user="unknown"
  by _time index sourcetype host Authentication.user Authentication.src span=1s

Stage 2: search

| `drop_dm_object_name("Authentication")`

Stage 3: fields

| fields user,src,app,_time,count,host

Stage 4: eval

| eval user=lower(replace(user, "((^.*\\\)|(@.*$))", ""))

Stage 5: join

| join type=outer user
    [
        | inputlookup identity_lookup_expanded where user_status=active
        | rex field=email "^(?<user>[a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$"
        | rename email as user_email bunit as user_bunit priority as user_priority
            work_country as user_work_country work_city as user_work_city
        | fields user user_email user_bunit user_priority user_work_country user_work_city
    ]

Stage 6: eventstats

| eventstats dc(src) as src_count by user

Stage 7: eventstats

| eventstats dc(user) as user_count by src

Stage 8: sort

| sort 0 + _time

Stage 9: search

| iplocation src

Stage 10: lookup

| lookup local=true asn_lookup_by_cidr ip as src OUTPUT ip asn description
Lookup table
asn_lookup_by_cidr
Key field
ip as src
Output columns
['ip', 'ip'], ['asn', 'asn'], ['description', 'description']

Stage 11: eval

| eval session_lat=if(isnull(src_lat), lat, src_lat),
    session_lon=if(isnull(src_long), lon, src_long),
    session_city=if(isnull(src_city), City, src_city),
    session_country=if(isnull(src_country), Country, src_country),
    session_region=if(isnull(src_region), Region, src_region)
session_city =
ifisnull(src_city)City
elsesrc_city
session_country =
ifisnull(src_country)Country
elsesrc_country
session_lat =
ifisnull(src_lat)lat
elsesrc_lat
session_lon =
ifisnull(src_long)lon
elsesrc_long
session_region =
ifisnull(src_region)Region
elsesrc_region

Stage 12: eval

| eval session_city=if(isnull(session_city) OR match(session_city,"^\s+|^$"), null(), session_city),
    session_country=if(
        isnull(session_country) OR match(session_country,"^\s+|^$"),
        null(),
        session_country
    ),
    session_region=if(
        isnull(session_region) OR match(session_region,"^\s+|^$"),
        null(),
        session_region
    )

Stage 13: where

| where isnotnull(session_lat) and isnotnull(session_lon)

Stage 14: eval

| eval session_city=if(isnull(session_city),"-",session_city),
    session_country=if(isnull(session_country),"-",session_country),
    session_region=if(isnull(session_region),"-",session_region)
session_city =
ifisnull(session_city)"-"
elsesession_city
session_country =
ifisnull(session_country)"-"
elsesession_country
session_region =
ifisnull(session_region)"-"
elsesession_region

Stage 15: streamstats

| streamstats current=t window=2
    earliest(session_region) as prev_region,
    earliest(session_lat) as prev_lat,
    earliest(session_lon) as prev_lon,
    earliest(session_city) as prev_city,
    earliest(session_country) as prev_country,
    earliest(_time) as prev_time,
    earliest(src) as prev_src,
    latest(user_bunit) as user_bunit,
    earliest(app) as prev_app
    values(user_work_country) as user_work_country
  by user

Stage 16: where

| where (src!=prev_src) AND !(prev_city=session_city AND prev_country=session_country) AND ((isnotnull(prev_city) AND isnotnull(session_city)) OR prev_country!=session_country)

Stage 17: search

| `globedistance(session_lat,session_lon,prev_lat,prev_lon,"m")`

Stage 18: eval

| eval time_diff=if((_time-prev_time)==0, 1, _time - prev_time)

Stage 19: eval

| eval speed = round(distance*3600/time_diff,2)

Stage 20: eval

| eval distance= round(distance,2)

Stage 21: eval

| eval
    user_work_country=case(
        user_work_country="usa", "United States",
        user_work_country="cze", "Czechia",
        user_work_country="pol", "Poland",
        user_work_country="ind", "India",
        user_work_country="fra", "France",
        user_work_country="can", "Canada",
        user_work_country="mys", "Malaysia",
        user_work_country="kor", "South Korea",
        user_work_country="aus", "Australia",
        user_work_country="bel", "Belgium",
        user_work_country="dnk", "Denmark",
        user_work_country="bra", "Brazil",
        user_work_country="deu", "Germany",
        user_work_country="jpn", "Japan",
        user_work_country="che", "Switzerland",
        user_work_country="swe", "Sweden",
        user_work_country="zaf", "South Africa",
        user_work_country="irl", "Ireland",
        user_work_country="ita", "Italy",
        user_work_country="nor", "Norway",
        user_work_country="gbr", "United Kingdom",
        user_work_country="hkg", "Hong Kong",
        user_work_country="chn", "China",
        user_work_country="esp", "Spain",
        user_work_country="nld", "Netherlands",
        user_work_country="twn", "Taiwan",
        user_work_country="est", "Estonia",
        user_work_country="sgp", "Singapore",
        user_work_country="are", "United Arab Emirates",
        1=1, "N/A"
    )
user_work_country =
ifuser_work_country = "usa""United States"
elifuser_work_country = "cze""Czechia"
elifuser_work_country = "pol""Poland"
elifuser_work_country = "ind""India"
elifuser_work_country = "fra""France"
elifuser_work_country = "can""Canada"
elifuser_work_country = "mys""Malaysia"
elifuser_work_country = "kor""South Korea"
elifuser_work_country = "aus""Australia"
elifuser_work_country = "bel""Belgium"
elifuser_work_country = "dnk""Denmark"
elifuser_work_country = "bra""Brazil"
elifuser_work_country = "deu""Germany"
elifuser_work_country = "jpn""Japan"
elifuser_work_country = "che""Switzerland"
elifuser_work_country = "swe""Sweden"
elifuser_work_country = "zaf""South Africa"
elifuser_work_country = "irl""Ireland"
elifuser_work_country = "ita""Italy"
elifuser_work_country = "nor""Norway"
elifuser_work_country = "gbr""United Kingdom"
elifuser_work_country = "hkg""Hong Kong"
elifuser_work_country = "chn""China"
elifuser_work_country = "esp""Spain"
elifuser_work_country = "nld""Netherlands"
elifuser_work_country = "twn""Taiwan"
elifuser_work_country = "est""Estonia"
elifuser_work_country = "sgp""Singapore"
elifuser_work_country = "are""United Arab Emirates"
else"N/A"

Stage 22: lookup

| lookup local=true asn_lookup_by_cidr ip as prev_src OUTPUT ip as prev_ip asn as prev_asn
    description as prev_description
Lookup table
asn_lookup_by_cidr
Key field
ip as prev_src
Output columns
['ip', 'prev_ip'], ['asn', 'prev_asn'], ['description', 'prev_description']

Stage 23: eval

| eval suspect=if(!user_work_country==session_country,"Sketchy","Normal")
suspect =
1."Sketchy"
-"Normal"(default)

Stage 24: search

| search (speed>500 AND distance>750)

Stage 25: table

| table
    _time,prev_time,user,host,src,prev_src,app,prev_app,distance,speed,suspect,session_city,session_region,
    session_country,prev_city,prev_region,prev_country,user_priority,user_work_*,prev_ip,ip,asn,prev_asn,prev_description,description

Stage 26: rename

| rename _time as event_time

Stage 27: convert

| convert ctime(event_time) timeformat="%Y-%m-%d %H:%M:%S"

Stage 28: convert

| convert ctime(prev_time) timeformat="%Y-%m-%d %H:%M:%S"

Stage 29: eval

| eval
    problem=if(
        !session_country==prev_country AND (!session_country==user_work_country),
        "Yes",
        "Nope"
    )
problem =
1."Yes"
-"Nope"(default)

Stage 30: search

| search NOT (prev_city="-" OR session_city="-")
    AND NOT [inputlookup known_devices_public_ip_filter.csv | fields ip | rename ip as src]

Stage 31: dedup

| dedup user host prev_src src

Stage 32: fillnull

| fillnull value="N/A"

Stage 33: search

| search problem="Yes"

Stage 34: search

| `geographic_improbable_location_filter`

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

Search Terms

These SPL tokens match against raw event text.

StageTerm
9iplocation
9src

GitHub Enterprise Repository Archived

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

The following analytic detects when a repository is archived in GitHub Enterprise. The detection monitors GitHub Enterprise audit logs for repository archival events by tracking actor details, repository information, and associated metadata. For a SOC, identifying repository archival is important as it could indicate attempts to make critical code inaccessible or preparation for repository deletion. While archiving is a legitimate feature, unauthorized archival of active repositories could signal account compromise, insider threats, or attempts to disrupt development operations. The impact of unauthorized repository archival includes loss of active development access, disruption to workflows and CI/CD pipelines, and potential business delays if critical repositories are affected. Additionally, archived repositories may be targeted for subsequent deletion, potentially resulting in permanent loss of intellectual property if proper backups are not maintained.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access
Impact

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: GitHub Enterprise Repository Archived
id: 8367cb99-bae1-4748-ae3b-0927bb381424
version: 8
creation_date: '2025-01-15'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: Anomaly
description: The following analytic detects when a repository is archived in GitHub Enterprise. The detection monitors GitHub Enterprise audit logs for repository archival events by tracking actor details, repository information, and associated metadata. For a SOC, identifying repository archival is important as it could indicate attempts to make critical code inaccessible or preparation for repository deletion. While archiving is a legitimate feature, unauthorized archival of active repositories could signal account compromise, insider threats, or attempts to disrupt development operations. The impact of unauthorized repository archival includes loss of active development access, disruption to workflows and CI/CD pipelines, and potential business delays if critical repositories are affected. Additionally, archived repositories may be targeted for subsequent deletion, potentially resulting in permanent loss of intellectual property if proper backups are not maintained.
data_source:
    - GitHub Enterprise Audit Logs
search: |-
    `github_enterprise` action=repo.archived
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY actor, actor_id, actor_is_bot,
           actor_location.country_code, business, business_id,
           org, org_id, repo,
           repo_id, user_agent, visibility,
           action
      | eval user=actor
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `github_enterprise_repository_archived_filter`
how_to_implement: You must ingest GitHub Enterprise logs using Audit log streaming as described in this documentation https://docs.github.com/en/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise#setting-up-streaming-to-splunk using a Splunk HTTP Event Collector.
known_false_positives: No false positives have been identified at this time.
references:
    - https://www.googlecloudcommunity.com/gc/Community-Blog/Monitoring-for-Suspicious-GitHub-Activity-with-Google-Security/ba-p/763610
    - https://docs.github.com/en/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise#setting-up-streaming-to-splunk
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: $user$ archived a repository in GitHub Enterprise
threat_objects:
    - field: user_agent
      type: http_user_agent
analytic_story:
    - GitHub Malicious Activity
    - NPM Supply Chain Compromise
asset_type: GitHub
mitre_attack_id:
    - T1485
    - T1195
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: network

Stages and Predicates

Stage 1: search

`github_enterprise` action=repo.archived

Stage 2: fillnull

| fillnull

Stage 3: stats

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

Stage 4: eval

| eval user=actor

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `github_enterprise_repository_archived_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
actioneq
  • repo.archived corpus 3 (sigma 1, splunk 1, panther 1)
field:"action" kind:eq value:"repo.archived"
sourcetypeeq
  • httpevent corpus 12 (splunk 12)
field:"sourcetype" kind:eq value:"httpevent"

Linux Auditd Find Credentials From Password Stores

#
Status
production
Severity
medium
Group by
argc, dest, execve_command
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects suspicious attempts to find credentials stored in password stores, indicating a potential attacker's effort to access sensitive login information. Password stores are critical repositories that contain valuable credentials, and unauthorized access to them can lead to significant security breaches. By monitoring for unusual or unauthorized activities related to password store access, this analytic helps identify potential credential theft attempts, allowing security teams to respond promptly and prevent unauthorized access to critical systems and data.

Known False Positives

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

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Linux Auditd Find Credentials From Password Stores
id: 4de73044-9a1d-4a51-a1c2-85267d8dcab3
version: 11
creation_date: '2024-08-12'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects suspicious attempts to find credentials stored in password stores, indicating a potential attacker's effort to access sensitive login information. Password stores are critical repositories that contain valuable credentials, and unauthorized access to them can lead to significant security breaches. By monitoring for unusual or unauthorized activities related to password store access, this analytic helps identify potential credential theft attempts, allowing security teams to respond promptly and prevent unauthorized access to critical systems and data.
data_source:
    - Linux Auditd Execve
search: |-
    `linux_auditd` execve_command IN ("*find*", "*grep*") AND execve_command IN ("*password*", "*pass *", "*credential*", "*creds*")
      | rename host as dest
      | rename comm as process_name
      | rename exe as process
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY argc execve_command dest
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `linux_auditd_find_credentials_from_password_stores_filter`
how_to_implement: To implement this detection, the process begins by ingesting auditd data, that consists of SYSCALL, TYPE, EXECVE and PROCTITLE events, which captures command-line executions and process details on Unix/Linux systems. These logs should be ingested and processed using Splunk Add-on for Unix and Linux (https://splunkbase.splunk.com/app/833), which is essential for correctly parsing and categorizing the data. The next step involves normalizing the field names  to match the field names set by the Splunk Common Information Model (CIM) to ensure consistency across different data sources and enhance the efficiency of data modeling. This approach enables effective monitoring and detection of linux endpoints where auditd is deployed
known_false_positives: Administrator or network operator can use this application for automation purposes. Please update the filter macros to remove false positives.
references:
    - https://www.splunk.com/en_us/blog/security/deep-dive-on-persistence-privilege-escalation-technique-and-detection-in-linux-platform.html
    - https://github.com/peass-ng/PEASS-ng/tree/master/linPEAS
finding:
    title: A [$execve_command$] event occurred on host - [$dest$] to find credentials stored in password managers.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Linux Living Off The Land
    - Linux Privilege Escalation
    - Linux Persistence Techniques
    - Compromised Linux Host
    - Scattered Lapsus$ Hunters
    - Hellcat Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1555.005
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`linux_auditd` execve_command IN ("*find*", "*grep*") AND execve_command IN (
    "*password*",
    "*pass *",
    "*credential*",
    "*creds*"
)

Stage 2: rename

| rename host as dest

Stage 3: rename

| rename comm as process_name

Stage 4: rename

| rename exe as process

Stage 5: stats

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

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `linux_auditd_find_credentials_from_password_stores_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
execve_commandin
  • *credential*
  • *creds*
  • *find* corpus 7 (splunk 7)
  • *grep* corpus 7 (splunk 7)
  • *pass *
  • *password*
field:"execve_command" kind:in
sourcetypeeq
  • auditd corpus 58 (splunk 58)
field:"sourcetype" kind:eq value:"auditd"

Malicious PowerShell Process With Obfuscation Techniques

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

The following analytic detects PowerShell processes launched with command-line arguments indicative of obfuscation techniques. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names, parent processes, and complete command-line executions. This activity is significant because obfuscated PowerShell commands are often used by attackers to evade detection and execute malicious scripts. If confirmed malicious, this activity could lead to unauthorized code execution, privilege escalation, or persistent access within the environment, posing a significant security risk.

Known False Positives

  • These characters might be legitimately on the command-line, but it is not common.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

name: Malicious PowerShell Process With Obfuscation Techniques
id: cde75cf6-3c7a-4dd6-af01-27cdb4511fd4
version: 18
creation_date: '2020-04-29'
modification_date: '2026-05-13'
author: David Dorsey, Splunk
status: production
type: TTP
description: The following analytic detects PowerShell processes launched with command-line arguments indicative of obfuscation techniques. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names, parent processes, and complete command-line executions. This activity is significant because obfuscated PowerShell commands are often used by attackers to evade detection and execute malicious scripts. If confirmed malicious, this activity could lead to unauthorized code execution, privilege escalation, or persistent access within the environment, posing a significant security risk.
data_source:
    - Sysmon EventID 1
search: '| tstats `security_content_summariesonly` count values(Processes.process) as process values(Processes.parent_process) as parent_process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where `process_powershell` 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)`| eval num_obfuscation = (mvcount(split(process,"`"))-1) + (mvcount(split(process, "^"))-1) + (mvcount(split(process, "''"))-1) | search num_obfuscation > 10 | `malicious_powershell_process_with_obfuscation_techniques_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: These characters might be legitimately on the command-line, but it is not common.
references: []
finding:
    title: Powershell.exe running with potential obfuscated arguments on $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Malicious PowerShell
    - Hermetic Wiper
    - Data Destruction
    - GhostRedirector IIS Module and Rungan Backdoor
    - Hellcat Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1059.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    values(Processes.process) as process
    values(Processes.parent_process) as parent_process
    min(_time) as firstTime
    max(_time) as lastTime
  from datamodel=Endpoint.Processes
  where `process_powershell`
  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: eval

| eval
    num_obfuscation = (mvcount(split(process,"`"))-1) + (mvcount(split(process, "^"))-1) + (mvcount(
        split(process, "'")
    )-1)

Stage 6: search

| search num_obfuscation > 10

Stage 7: search

| `malicious_powershell_process_with_obfuscation_techniques_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • PowerShell.EXE corpus 134 (sigma 86, splunk 30, elastic 18)
  • powershell_ise.EXE corpus 52 (splunk 30, sigma 18, elastic 4)
  • pwsh.dll corpus 115 (sigma 81, splunk 30, elastic 4)
field:"OriginalFileName" kind:eq
Processes.process_nameeq
  • powershell.exe corpus 187 (elastic 140, splunk 44, kusto 3)
  • powershell_ise.exe corpus 53 (splunk 29, elastic 24)
  • pwsh.exe corpus 78 (elastic 49, splunk 29)
field:"process_basename" kind:eq
num_obfuscationgt
  • 10
field:"num_obfuscation" kind:gt value:"10"

Microsoft Build Engine Suspicious Parent Process (Sysmon)

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

Adversaries may take advantage of trusted developer utilities to proxy execution of malicious payloads. There are many utilities used for software development related tasks that can be used to execute code in various forms to assist in development, debugging, and reverse engineering. These utilities may often be signed with legitimate certificates that allow them to execute on a system and proxy execution of malicious code through a trusted process that effectively bypasses application control solutions. This use case detects msbuild.exe spawned by a scripting interpreter (such as CMD, PowerShell, etc.).

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '32492.57742'
title: Microsoft Build Engine Suspicious Parent Process
description: Adversaries may take advantage of trusted developer utilities to proxy
  execution of malicious payloads. There are many utilities used for software development
  related tasks that can be used to execute code in various forms to assist in development,
  debugging, and reverse engineering. These utilities may often be signed with legitimate
  certificates that allow them to execute on a system and proxy execution of malicious
  code through a trusted process that effectively bypasses application control solutions.
  This use case detects msbuild.exe spawned by a scripting interpreter (such as CMD,
  PowerShell, etc.).
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  ("msbuild.exe" OR TERM(msbuild)) ("cmd.exe" OR "powershell.exe" OR "pwsh.exe" OR
  "powershell_ise.exe" OR "cscript.exe" OR "wscript.exe" OR "mshta.exe") | regex process_name="(?i)msbuild\.exe"|
  regex parent_process_name="(?i)(cmd|powershell(_ise)?|pwsh|cscript|wscript|mshta)\.exe"
  | table _time, host, user, process, process_*, parent_* | bin span=1s | stats values(*)
  as * by _time, host '
techniques:
- execution:command and scripting interpreter:powershell
- defense-evasion:trusted developer utilities proxy execution:msbuild
- execution:command and scripting interpreter
- defense-evasion:trusted developer utilities proxy execution
- execution:command and scripting interpreter:visual basic
- execution:command and scripting interpreter:windows command shell
technique_id:
- T1059.001
- T1127.001
- T1059
- T1127
- T1059.005
- T1059.003
data_category:
- Windows Sysmon
references:
- https://attack.mitre.org/techniques/T1127/
- https://attack.mitre.org/techniques/T1127/001/
- https://attack.mitre.org/techniques/T1059/
- https://attack.mitre.org/techniques/T1059/001/
- https://attack.mitre.org/techniques/T1059/003/
- https://attack.mitre.org/techniques/T1059/005/
- https://detection.fyi/elastic/detection-rules/windows/defense_evasion_execution_msbuild_started_by_script/?query=msbuild

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") ("msbuild.exe" OR TERM(msbuild)) ("cmd.exe" OR "powershell.exe" OR "pwsh.exe" OR "powershell_ise.exe" OR "cscript.exe" OR "wscript.exe" OR "mshta.exe")

Stage 2: regex

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

Stage 3: regex

| regex parent_process_name="(?i)(cmd|powershell(_ise)?|pwsh|cscript|wscript|mshta)\.exe"

Stage 4: table

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

Stage 5: bucket

| bin span=1s

Stage 6: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
parent_process_nameregex_match
  • (?i)(cmd|powershell(_ise)?|pwsh|cscript|wscript|mshta).exe corpus 2 (splunk 2)
field:"parent_process_name" kind:regex_match value:"(?i)(cmd|powershell(_ise)?|pwsh|cscript|wscript|mshta).exe"
process_nameregex_match
  • (?i)msbuild.exe corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)msbuild.exe"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1"msbuild.exe"
1msbuild
1"cmd.exe"
1"powershell.exe"
1"pwsh.exe"
1"powershell_ise.exe"
1"cscript.exe"
1"wscript.exe"
1"mshta.exe"

Multiple nslookup commands (Sysmon)

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

Threat actors have been observed gathering host based network information by running a batch script, which ran nslookup for each host in the environment

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '12915.18551'
title: Multiple nslookup commands
description: 'Threat actors have been observed gathering host based network information
  by running a batch script, which ran nslookup for each host in the environment.Living
  Off the Land Binary and Scripts (LOLBAS) (LOLBIN) -- Software Association: Rhysida'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  ("nslookup" OR "nslookup.exe") | table _time, host, user process, process_*, signature_id,
  parent_* | bin span=60s | stats values(*) as * by _time, host | where match(process_name,
  "(?i)nslookup.exe") and event_count > 2 '
techniques:
- discovery:system network configuration discovery
- discovery:remote system discovery
technique_id: 
- T1016
- T1018
data_category:
- Windows Sysmon
references:
- https://thedfirreport.com/2022/04/25/quantum-ransomware/

Stages and Predicates

Stage 1: search

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

Stage 2: table

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

Stage 3: bucket

| bin span=60s

Stage 4: stats

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

Stage 5: where

| where match(process_name, "(?i)nslookup.exe") and event_count > 2

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
event_countgt
  • 2 corpus 3 (splunk 3)
field:"event_count" kind:gt value:"2"
process_nameregex_match
  • (?i)nslookup.exe corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)nslookup.exe"

Search Terms

These SPL tokens match against raw event text.

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

Okta Suspicious Use of a Session Cookie

#

Potential Cryptomining Commands (Sysmon)

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

Adversaries may leverage the resources of co-opted systems in order to solve resource intensive problems, which may impact system and/or hosted service availability. One common purpose for Resource Hijacking is to validate transactions of cryptocurrency networks and earn virtual currency. This use case detects common plaintext and base64 encoded commands for cryptomining activity.

MITRE ATT&CK Coverage

TacticTechniques
Impact

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '19129.34163'
title: Potential Cryptomining Commands
description: Adversaries may leverage the resources of co-opted systems in order to
  solve resource intensive problems, which may impact system and/or hosted service
  availability. One common purpose for Resource Hijacking is to validate transactions
  of cryptocurrency networks and earn virtual currency. This use case detects common
  plaintext and base64 encoded commands for cryptomining activity.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  ("--cpu-priority=" OR "--donate-level=" OR " -o pool." OR " --nicehash" OR " --algo="
  OR "stratum+tcp://" OR "stratum+udp://" OR "LS1kb25hdGUtbGV2ZWw9" OR "0tZG9uYXRlLWxldmVsP"
  OR "tLWRvbmF0ZS1sZXZlbD" OR "c3RyYXR1bSt0Y3A6Ly" OR "N0cmF0dW0rdGNwOi8v" OR "zdHJhdHVtK3RjcDovL"
  OR "c3RyYXR1bSt1ZHA6Ly" OR "N0cmF0dW0rdWRwOi8v" OR "zdHJhdHVtK3VkcDovL") | regex
  process!="(?i)(pool\.(c|o))\s|gcc\s-" | table _time, host, user, process, process_*,
  parent_process_name | bin span=1s | stats values(*) as * by _time, host '
techniques:
- impact:resource hijacking
technique_id: 
- T1496
data_category:
- Windows Sysmon
- Process command-line parameters
references:
- https://xmrig.com/docs/miner/command-line-options
- https://www.trendmicro.com/en_us/research/24/j/unmasking-prometei-a-deep-dive-into-our-mxdr-findings.html

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") ("--cpu-priority=" OR "--donate-level=" OR " -o pool." OR " --nicehash" OR " --algo=" OR "stratum+tcp://" OR "stratum+udp://" OR "LS1kb25hdGUtbGV2ZWw9" OR "0tZG9uYXRlLWxldmVsP" OR "tLWRvbmF0ZS1sZXZlbD" OR "c3RyYXR1bSt0Y3A6Ly" OR "N0cmF0dW0rdGNwOi8v" OR "zdHJhdHVtK3RjcDovL" OR "c3RyYXR1bSt1ZHA6Ly" OR "N0cmF0dW0rdWRwOi8v" OR "zdHJhdHVtK3VkcDovL")

Stage 2: regex

| regex process!="(?i)(pool\.(c|o))\s|gcc\s-"

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

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

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
processregex_match(?i)(pool.(c|o))\s, gcc\s-excludes:process field:"process" value:"(?i)(pool.(c|o))\s" field:"process" value:"gcc\s-"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1"--cpu-priority="
1"--donate-level="
1" -o pool."
1" --nicehash"
1" --algo="
1"stratum+tcp://"
1"stratum+udp://"
1"LS1kb25hdGUtbGV2ZWw9"
1"0tZG9uYXRlLWxldmVsP"
1"tLWRvbmF0ZS1sZXZlbD"
1"c3RyYXR1bSt0Y3A6Ly"
1"N0cmF0dW0rdGNwOi8v"
1"zdHJhdHVtK3RjcDovL"
1"c3RyYXR1bSt1ZHA6Ly"
1"N0cmF0dW0rdWRwOi8v"
1"zdHJhdHVtK3VkcDovL"

Read-Only Attribute Removed - Windows (Sysmon)

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

This use case detects commands removing read-only attributes from files on Windows systems. This technique is used by threat actors to modify or delete critical system files

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '17778.29991'
title: Read-Only Attribute Removed - Windows
description: 'This use case detects commands removing read-only attributes from files
  on Windows systems. This technique is used by threat actors to modify or delete
  critical system files. Atomics T1222.001 Test #3'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  (TERM(attrib) OR TERM(attrib.exe)) "-r" | regex process="(?i)\s+-r\s+" | table _time,
  host, user parent_*, process, process_* | bin span=1s | stats values(*) as * by
  _time, host '
techniques:
- defense-evasion:file and directory permissions modification:windows file and directory
  permissions modification
technique_id:
- T1222.001
data_category:
- Windows Sysmon
references:
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1222.001/T1222.001.md#atomic-test-3---attrib---remove-read-only-attribute

Stages and Predicates

Stage 1: search

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

Stage 2: regex

| regex process="(?i)\s+-r\s+"

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
processregex_match
  • (?i)\s+-r\s+ corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)\s+-r\s+"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1attrib
1attrib.exe
1"-r"

Splunk XSS Privilege Escalation via Custom Urls in Dashboard

#
Status
production
Group by
_time, host, index, sourcetype
Author
Rod Soto, Chase Franklin
Source
github.com/splunk/security_content

This is a composed hunting search that looks for POST requests to splunk_internal_metrics/data/ui/views which can be used to elevate privileges on the Splunk server via custom urls. The way to find privilege escalation is by looking at created users with high privielges after payload has been executed. This search looks at POST request and then looks at created users privileges.

Known False Positives

  • This is a hunting search and requires operator to search for specific indicators of user creation in proximity to POST requests against vulnerable endpoint. It is not possible to detect payload during runtime.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access

Rule Body

name: Splunk XSS Privilege Escalation via Custom Urls in Dashboard
id: 01e1e386-7656-4f36-a55a-52fe39b04a96
version: 7
creation_date: '2024-07-01'
modification_date: '2026-05-14'
author: Rod Soto, Chase Franklin
status: production
type: Hunting
description: This is a composed hunting search that looks for POST requests to splunk_internal_metrics/data/ui/views which can be used to elevate privileges on the Splunk server via custom urls. The way to find privilege escalation is by looking at created users with high privielges after payload has been executed. This search looks at POST request and then looks at created users privileges.
data_source:
    - Splunk
search: '`splunkd_ui` method=POST /*/data/ui/views* | stats values(method) as method by _time index, sourcetype, host | eval event="post_request" | append [| search `audittrail` action="edit_user" operation="create" | rex field=_raw "object=\"(?<newUser>.*)\"" | stats count values(operation) as operation values(splunk_server) as splunk_server values(user) as user by _time index, sourcetype, host, newUser | eval event="create_user"] | sort - _time | transaction host startswith=event="post_request" endswith=event="create_user" maxspan=10m | table _time index, sourcetype, host, method, user, splunk_server, operation, event, newUser eventcount | `splunk_xss_privilege_escalation_via_custom_urls_in_dashboard_filter`'
how_to_implement: Requires access to internal indexes _audit and _internal.
known_false_positives: This is a hunting search and requires operator to search for specific indicators of user creation in proximity to POST requests against vulnerable endpoint. It is not possible to detect payload during runtime.
references:
    - https://advisory.splunk.com/
analytic_story:
    - Splunk Vulnerabilities
asset_type: Splunk Server
cve:
    - CVE-2024-36992
mitre_attack_id:
    - T1189
product:
    - Splunk Enterprise
    - Splunk Cloud
    - Splunk Enterprise Security
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`splunkd_ui` method=POST /*/data/ui/views*

Stage 2: stats

| stats values(method) as method by _time index, sourcetype, host

Stage 3: eval

| eval event="post_request"

Stage 4: append

| append
    [
        | search `audittrail` action="edit_user" operation="create"
        | rex field=_raw "object=\"(?<newUser>.*)\""
        | stats
            count
            values(operation) as operation
            values(splunk_server) as splunk_server
            values(user) as user
          by _time index, sourcetype, host, newUser
        | eval event="create_user"
    ]

Stage 5: sort

| sort - _time

Stage 6: macro (not parsed)

| transaction host startswith=event="post_request" endswith=event="create_user" maxspan=10m

Stage 7: table

| table _time index, sourcetype, host, method, user, splunk_server, operation, event, newUser
    eventcount

Stage 8: search

| `splunk_xss_privilege_escalation_via_custom_urls_in_dashboard_filter`

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
1/*/data/ui/views*

System Enumeration with WMIC (Sysmon)

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

An adversary may attempt to get detailed information about the operating system and hardware, including version, patches, hotfixes, service packs, and architecture. Adversaries may use the information from System Information Discovery during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions. This use case detects several WMIC executions in a short period of time

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '16967.27503'
title: System Enumeration with WMIC
description: 'An adversary may attempt to get detailed information about the operating
  system and hardware, including version, patches, hotfixes, service packs, and architecture.
  Adversaries may use the information from System Information Discovery during automated
  discovery to shape follow-on behaviors, including whether or not the adversary fully
  infects the target and/or attempts specific actions. This use case detects several
  WMIC executions in a short period of time. -- Threat Actor Association: Volt Typhoon
  -- Atomics T1082 Test #25'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  TERM(wmic) OR "wmic.exe" | table _time, host, user, process, process_*, parent_process*|
  regex process_name="(?i)wmic"| bin span=120s | stats values(*) as * by _time, host
  | eventstats dc(process) as dc_process by host, _time| where dc_process > 5 '
techniques:
- discovery:system information discovery
- execution:windows management instrumentation
technique_id: 
- T1082
- T1047
data_category:
- Windows Sysmon
references:
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1082/T1082.md#atomic-test-25---system-information-discovery-with-wmic

Stages and Predicates

Stage 1: search

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

Stage 2: table

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

Stage 3: regex

| regex process_name="(?i)wmic"

Stage 4: bucket

| bin span=120s

Stage 5: stats

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

Stage 6: eventstats

| eventstats dc(process) as dc_process by host, _time

Stage 7: where

| where dc_process > 5

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
dc_processgt
  • 5 corpus 2 (splunk 2)
field:"dc_process" kind:gt value:"5"
process_nameregex_match
  • (?i)wmic corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)wmic"

Search Terms

These SPL tokens match against raw event text.

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

Web Spring4Shell HTTP Request Class Module

#
Status
production
Severity
medium
Group by
bytes_in, bytes_out, dest, http_method, http_user_agent, src, uri_path, url
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

The following analytic detects HTTP requests containing payloads related to the Spring4Shell vulnerability (CVE-2022-22965). It leverages Splunk Stream HTTP data to inspect the HTTP request body and form data for specific fields such as "class.module.classLoader.resources.context.parent.pipeline.first". This activity is significant as it indicates an attempt to exploit a critical vulnerability in Spring Framework, potentially leading to remote code execution. If confirmed malicious, this could allow attackers to gain unauthorized access, execute arbitrary code, and compromise the affected system.

Known False Positives

  • False positives may occur and filtering may be required. Restrict analytic to asset type.

MITRE ATT&CK Coverage

Rule Body

name: Web Spring4Shell HTTP Request Class Module
id: fcdfd69d-0ca3-4476-920e-9b633cb4593e
version: 9
creation_date: '2022-04-06'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects HTTP requests containing payloads related to the Spring4Shell vulnerability (CVE-2022-22965). It leverages Splunk Stream HTTP data to inspect the HTTP request body and form data for specific fields such as "class.module.classLoader.resources.context.parent.pipeline.first". This activity is significant as it indicates an attempt to exploit a critical vulnerability in Spring Framework, potentially leading to remote code execution. If confirmed malicious, this could allow attackers to gain unauthorized access, execute arbitrary code, and compromise the affected system.
data_source:
    - Splunk Stream HTTP
search: |-
    `stream_http` http_method IN ("POST")
      | stats values(form_data) as http_request_body min(_time) as firstTime max(_time) as lastTime count
        BY src dest http_method
           http_user_agent uri_path url
           bytes_in bytes_out
      | search http_request_body IN ("*class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=_*", "*class.module.classLoader.resources.context.parent.pipeline.first.pattern*","*suffix=.jsp*")
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `web_spring4shell_http_request_class_module_filter`
how_to_implement: To successfully implement this search, you need to be ingesting logs with the stream HTTP logs or network logs that catch network traffic. Make sure that the http-request-body, payload, or request field is enabled.
known_false_positives: False positives may occur and filtering may be required. Restrict analytic to asset type.
references:
    - https://github.com/DDuarte/springshell-rce-poc/blob/master/poc.py
finding:
    title: A http body request related to Spring4Shell has been sent to $dest$ by $src$.
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - Spring4Shell CVE-2022-22965
asset_type: Web Server
cve:
    - CVE-2022-22965
mitre_attack_id:
    - T1190
    - T1133
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: web
security_domain: network

Stages and Predicates

Stage 1: search

`stream_http` http_method IN ("POST")

Stage 2: stats

| stats values(form_data) as http_request_body min(_time) as firstTime max(_time) as lastTime count
    BY src dest http_method
       http_user_agent uri_path url
       bytes_in bytes_out

Stage 3: search

| search http_request_body IN (
    "*class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=_*",
    "*class.module.classLoader.resources.context.parent.pipeline.first.pattern*",
    "*suffix=.jsp*"
)

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `web_spring4shell_http_request_class_module_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
http_methodin
  • POST
field:"http_method" kind:in value:"POST"
http_request_bodyin
  • *class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=_*
  • *class.module.classLoader.resources.context.parent.pipeline.first.pattern*
  • *suffix=.jsp*
field:"http_request_body" kind:in
sourcetypeeq
  • stream:http
field:"sourcetype" kind:eq value:"stream:http"

Windows AD Domain Controller Audit Policy Disabled

#
Status
production
Severity
medium
Group by
AuditPolicyChanges, SubcategoryGuid
Author
Dean Luxton
Source
github.com/splunk/security_content

The following analytic detects the disabling of audit policies on a domain controller. It leverages EventCode 4719 from Windows Security Event Logs to identify changes where success or failure auditing is removed. This activity is significant as it suggests an attacker may have gained access to the domain controller and is attempting to evade detection by tampering with audit policies. If confirmed malicious, this could lead to severe consequences, including data theft, privilege escalation, and full network compromise. Immediate investigation is required to determine the source and intent of the change.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows AD Domain Controller Audit Policy Disabled
id: fc3ccef1-60a4-4239-bd66-b279511b4d14
version: 12
creation_date: '2023-01-25'
modification_date: '2026-05-13'
author: Dean Luxton
status: production
type: TTP
description: The following analytic detects the disabling of audit policies on a domain controller. It leverages EventCode 4719 from Windows Security Event Logs to identify changes where success or failure auditing is removed. This activity is significant as it suggests an attacker may have gained access to the domain controller and is attempting to evade detection by tampering with audit policies. If confirmed malicious, this could lead to severe consequences, including data theft, privilege escalation, and full network compromise. Immediate investigation is required to determine the source and intent of the change.
data_source:
    - Windows Event Log Security 4719
search: |-
    `wineventlog_security` EventCode=4719 (AuditPolicyChanges IN ("%%8448","%%8450","%%8448, %%8450") OR Changes IN ("Failure removed","Success removed","Success removed, Failure removed")) dest_category="domain_controller"
      | replace "%%8448" with "Success removed", "%%8450" with "Failure removed", "%%8448, %%8450" with "Success removed, Failure removed" in AuditPolicyChanges
      | eval AuditPolicyChanges=coalesce(AuditPolicyChanges,Changes), SubcategoryGuid=coalesce(SubcategoryGuid,Subcategory_GUID)
      | stats min(_time) as _time values(host) as dest
        BY AuditPolicyChanges SubcategoryGuid
      | lookup advanced_audit_policy_guids GUID as SubcategoryGuid OUTPUT Category SubCategory
      | `windows_ad_domain_controller_audit_policy_disabled_filter`
how_to_implement: Ensure you are ingesting EventCode `4719` from your domain controllers, the category domain_controller exists in assets and identities, and that assets and identities is enabled. If A&I is not configured, you will need to manually filter the results within the base search.
known_false_positives: No false positives have been identified at this time.
references:
    - https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4719
finding:
    title: GPO $SubCategory$ of $Category$ was disabled on $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Windows Audit Policy Tampering
asset_type: Endpoint
mitre_attack_id:
    - T1685
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security` EventCode=4719 (
    AuditPolicyChanges IN ("%%8448","%%8450","%%8448, %%8450")
    OR Changes IN ("Failure removed","Success removed","Success removed, Failure removed")
) dest_category="domain_controller"

Stage 2: replace

| replace "%%8448" with "Success removed", "%%8450" with "Failure removed", "%%8448, %%8450" with "Success removed, Failure removed" in AuditPolicyChanges

Stage 3: eval

| eval AuditPolicyChanges=coalesce(AuditPolicyChanges,Changes),
    SubcategoryGuid=coalesce(SubcategoryGuid,Subcategory_GUID)

Stage 4: stats

| stats min(_time) as _time values(host) as dest
    BY AuditPolicyChanges SubcategoryGuid

Stage 5: lookup

| lookup advanced_audit_policy_guids GUID as SubcategoryGuid OUTPUT Category SubCategory
Lookup table
advanced_audit_policy_guids
Key field
GUID as SubcategoryGuid
Output columns
['Category', 'Category'], ['SubCategory', 'SubCategory']

Stage 6: search

| `windows_ad_domain_controller_audit_policy_disabled_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
AuditPolicyChangesin
  • %%8448 corpus 2 (splunk 2)
  • %%8448, %%8450 corpus 2 (splunk 2)
  • %%8450 corpus 2 (splunk 2)
field:"AuditPolicyChanges" kind:in
Changesin
  • Failure removed corpus 2 (splunk 2)
  • Success removed corpus 2 (splunk 2)
  • Success removed, Failure removed corpus 2 (splunk 2)
field:"Changes" kind:in
EventCodeeq
  • 4719 corpus 2 (splunk 2)
field:"EventID" kind:eq value:"4719"
dest_categoryeq
  • domain_controller
field:"dest_category" kind:eq value:"domain_controller"

Windows AD Hidden OU Creation

#
Status
production
Severity
medium
Group by
LogonId, ObjectClass, ObjectDN, OpCorrelationID, _time, user
Author
Dean Luxton
Source
github.com/splunk/security_content

This analytic is looking for when an ACL is applied to an OU which denies listing the objects residing in the OU. This activity combined with modifying the owner of the OU will hide AD objects even from domain administrators.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows AD Hidden OU Creation
id: 66b6ad5e-339a-40af-b721-dacefc7bdb75
version: 10
creation_date: '2024-07-01'
modification_date: '2026-05-13'
author: Dean Luxton
status: production
type: TTP
description: This analytic is looking for when an ACL is applied to an OU which denies listing the objects residing in the OU. This activity combined with modifying the owner of the OU will hide AD objects even from domain administrators.
data_source:
    - Windows Event Log Security 5136
search: '`wineventlog_security` EventCode=5136 ObjectClass=organizationalUnit | stats min(_time) as _time values(eval(if(OperationType=="%%14675",AttributeValue,null))) as old_value values(eval(if(OperationType=="%%14674",AttributeValue,null))) as new_value values(OperationType) as OperationType values(dest) as dest by ObjectClass ObjectDN OpCorrelationID src_user SubjectLogonId  | rex field=old_value max_match=10000 "\((?P<old_values>.*?)\)"  | rex field=new_value max_match=10000 "\((?P<new_ace>.*?)\)"  | mvexpand new_ace  | where NOT new_ace IN (old_values)  | rex field=new_ace "(?P<aceType>.*?);(?P<aceFlags>.*?);(?P<aceAccessRights>.*?);(?P<aceObjectGuid>.*?);(?P<aceInheritedTypeGuid>.*?);(?P<aceSid>.*?)$"  | rex max_match=100 field=aceAccessRights "(?P<AccessRights>[A-Z]{2})"  | rex max_match=100 field=aceFlags "(?P<aceFlags>[A-Z]{2})"  | lookup msad_guid_lookup guid as aceObjectGuid OUTPUT displayName as ControlAccessRights  | lookup ace_access_rights_lookup access_rights_string as AccessRights OUTPUT access_rights_value  | lookup ace_type_lookup ace_type_string as aceType OUTPUT ace_type_value as aceType | lookup ace_flag_lookup flag_string as aceFlags OUTPUT flag_value as ace_flag_value ``` Optional SID resolution lookups | lookup identity_lookup_expanded objectSid as aceSid OUTPUT downLevelDomainName as user  | lookup admon_groups_def objectSid as aceSid OUTPUT cn as group ``` | lookup builtin_groups_lookup builtin_group_string  as aceSid OUTPUT builtin_group_name as builtin_group | eval aceType=coalesce(ace_type_value,aceType), aceFlags=coalesce(ace_flag_value,"This object only"), aceAccessRights=if(aceAccessRights="CCDCLCSWRPWPDTLOCRSDRCWDWO","Full control",coalesce(access_rights_value,AccessRights)), aceControlAccessRights=coalesce(ControlAccessRights,aceObjectGuid), user=coalesce(user, group, builtin_group, aceSid) | stats values(aceType) as aceType values(aceFlags) as aceFlags values(aceControlAccessRights) as aceControlAccessRights values(aceAccessRights) as aceAccessRights values(new_ace) as new_ace values(aceInheritedTypeGuid) as aceInheritedTypeGuid by _time ObjectClass ObjectDN src_user SubjectLogonId user OpCorrelationID | eval aceControlAccessRights=if(mvcount(aceControlAccessRights)=1 AND aceControlAccessRights="","All rights",''aceControlAccessRights'') | search aceType IN ("Access denied",D) AND aceAccessRights IN ("List contents","List objects",LC,LO) | `windows_ad_hidden_ou_creation_filter`'
how_to_implement: Ensure you are ingesting Active Directory audit logs - specifically event 5136. See lantern article in references for further on how to onboard AD audit data. Ensure the wineventlog_security macro is configured with the correct indexes and include lookups for SID resolution if evt_resolve_ad_obj is set to 0.
known_false_positives: No false positives have been identified at this time.
references:
    - https://happycamper84.medium.com/sneaky-persistence-via-hidden-objects-in-ad-1c91fc37bf54
    - https://lantern.splunk.com/Security/Product_Tips/Enterprise_Security/Enabling_an_audit_trail_from_Active_Directory
finding:
    title: $src_user$ has hidden the contents of OU $ObjectDN$ from $user$
    entity:
        field: src_user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 50
          message: $src_user$ has hidden the contents of OU $ObjectDN$ from $user$
analytic_story:
    - Sneaky Active Directory Persistence Tricks
asset_type: Endpoint
mitre_attack_id:
    - T1222.001
    - T1484
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security` EventCode=5136 ObjectClass=organizationalUnit

Stage 2: stats

| stats
    min(_time) as _time
    values(eval(if(OperationType=="%%14675",AttributeValue,null))) as old_value
    values(eval(if(OperationType=="%%14674",AttributeValue,null))) as new_value
    values(OperationType) as OperationType
    values(dest) as dest
  by ObjectClass ObjectDN OpCorrelationID src_user SubjectLogonId

Stage 3: rex

| rex field=old_value max_match=10000 "\((?P<old_values>.*?)\)"

Stage 4: rex

| rex field=new_value max_match=10000 "\((?P<new_ace>.*?)\)"

Stage 5: mvexpand

| mvexpand new_ace

Stage 6: where

| where NOT new_ace IN (old_values)

Stage 7: rex

| rex field=new_ace
    "(?P<aceType>.*?);(?P<aceFlags>.*?);(?P<aceAccessRights>.*?);(?P<aceObjectGuid>.*?);(?P<aceInheritedTypeGuid>.*?);(?P<aceSid>.*?)$"

Stage 8: rex

| rex max_match=100 field=aceAccessRights "(?P<AccessRights>[A-Z]{2})"

Stage 9: rex

| rex max_match=100 field=aceFlags "(?P<aceFlags>[A-Z]{2})"

Stage 10: lookup

| lookup msad_guid_lookup guid as aceObjectGuid OUTPUT displayName as ControlAccessRights
Lookup table
msad_guid_lookup
Key field
guid as aceObjectGuid
Output columns
['displayName', 'ControlAccessRights']

Stage 11: lookup

| lookup ace_access_rights_lookup access_rights_string as AccessRights OUTPUT access_rights_value
Lookup table
ace_access_rights_lookup
Key field
access_rights_string as AccessRights
Output columns
['access_rights_value', 'access_rights_value']

Stage 12: lookup

| lookup ace_type_lookup ace_type_string as aceType OUTPUT ace_type_value as aceType
Lookup table
ace_type_lookup
Key field
ace_type_string as aceType
Output columns
['ace_type_value', 'aceType']

Stage 13: lookup

| lookup ace_flag_lookup flag_string as aceFlags OUTPUT flag_value as ace_flag_value
Lookup table
ace_flag_lookup
Key field
flag_string as aceFlags
Output columns
['flag_value', 'ace_flag_value']

Stage 14: lookup

| lookup builtin_groups_lookup builtin_group_string  as aceSid OUTPUT
    builtin_group_name as builtin_group
Lookup table
builtin_groups_lookup
Key field
builtin_group_string as aceSid
Output columns
['builtin_group_name', 'builtin_group']

Stage 15: eval

| eval aceType=coalesce(ace_type_value,aceType),
    aceFlags=coalesce(ace_flag_value,"This object only"),
    aceAccessRights=if(
        aceAccessRights="CCDCLCSWRPWPDTLOCRSDRCWDWO",
        "Full control",
        coalesce(access_rights_value,AccessRights)
    ),
    aceControlAccessRights=coalesce(ControlAccessRights,aceObjectGuid),
    user=coalesce(user, group, builtin_group, aceSid)

Stage 16: stats

| stats
    values(aceType) as aceType
    values(aceFlags) as aceFlags
    values(aceControlAccessRights) as aceControlAccessRights
    values(aceAccessRights) as aceAccessRights
    values(new_ace) as new_ace
    values(aceInheritedTypeGuid) as aceInheritedTypeGuid
  by _time ObjectClass ObjectDN src_user SubjectLogonId user OpCorrelationID

Stage 17: eval

| eval
    aceControlAccessRights=if(
        mvcount(aceControlAccessRights)=1 AND aceControlAccessRights="",
        "All rights",
        'aceControlAccessRights'
    )
aceControlAccessRights =
ifmvcount(aceControlAccessRights) = 1 AND aceControlAccessRights = """All rights"
else'aceControlAccessRights'

Stage 18: search

| search aceType IN ("Access denied",D) AND aceAccessRights IN (
    "List contents",
    "List objects",
    LC,
    LO
)

Stage 19: search

| `windows_ad_hidden_ou_creation_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 5136 corpus 25 (splunk 24, elastic 1)
field:"EventID" kind:eq value:"5136"
ObjectClasseq
  • organizationalUnit
field:"ObjectClass" kind:eq value:"organizationalUnit"
aceAccessRightsin
  • LC
  • LO
  • List contents
  • List objects
field:"aceAccessRights" kind:in
aceTypein
  • Access denied corpus 2 (splunk 2)
  • D corpus 2 (splunk 2)
field:"aceType" kind:in

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
new_aceeqold_valuesexcludes:new_ace field:"new_ace" value:"old_values"

Windows Azure Storage Utility Execution Via CLI

#
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

This analytic detects the execution of Azure Storage utilities such as AzCopy and Storage Explorer via the CLI. These tools enable large-scale data transfers over trusted cloud channels, allowing malicious activity to blend with legitimate traffic and evade traditional network defenses. Adversaries may leverage them post-compromise to stage or extract sensitive data from endpoints. While legitimate administrative use is expected, anomalous execution patterns, unexpected users, or unusual parent processes should be treated as potential indicators of compromise and investigated promptly.

Known False Positives

  • Legitimate IT operations and cloud administrators frequently use Windows Azure Storage Tools for data management and backups. Investigate unexpected usage to rule out unauthorized access or exfiltration.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Azure Storage Utility Execution Via CLI
id: 980648f3-f4cc-4d56-86cf-0d6e7aa5d34e
version: 2
creation_date: '2021-05-07'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: Anomaly
description: |-
    This analytic detects the execution of Azure Storage utilities such as AzCopy and Storage Explorer via the CLI.
    These tools enable large-scale data transfers over trusted cloud channels, allowing malicious activity to blend with legitimate traffic and evade traditional network defenses.
    Adversaries may leverage them post-compromise to stage or extract sensitive data from endpoints.
    While legitimate administrative use is expected, anomalous execution patterns, unexpected users, or unusual parent processes should be treated as potential indicators of compromise and investigated promptly.
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 IN (
        "AzCopy.exe",
        "StorageExplorer.exe"
    )

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

    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_azure_storage_utility_execution_via_cli_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Legitimate IT operations and cloud administrators frequently use Windows Azure Storage Tools for data management and backups. Investigate unexpected usage to rule out unauthorized access or exfiltration.
references:
    - https://blog.talosintelligence.com/emerging-interlock-ransomware/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Azure storage utility $process_name$ executed by $parent_process_name$ on $dest$ via commandline $process$.
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process
      type: process
    - field: process_name
      type: process_name
analytic_story:
    - Data Exfiltration
asset_type: Endpoint
mitre_attack_id:
    - T1567.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

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

from datamodel=Endpoint.Processes where

Processes.process_name IN (
    "AzCopy.exe",
    "StorageExplorer.exe"
)

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

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_azure_storage_utility_execution_via_cli_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.process_namein
  • AzCopy.exe
  • StorageExplorer.exe corpus 2 (elastic 1, splunk 1)
field:"process_basename" kind:in

Windows Bypass UAC via Pkgmgr Tool

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

The following analytic detects the execution of the deprecated 'pkgmgr.exe' process with an XML input file, which is unusual and potentially suspicious. This detection leverages Endpoint Detection and Response (EDR) telemetry, focusing on process execution details and command-line arguments. The significance lies in the deprecated status of 'pkgmgr.exe' and the use of XML files, which could indicate an attempt to bypass User Account Control (UAC). If confirmed malicious, this activity could allow an attacker to execute commands with elevated privileges, leading to potential system compromise and unauthorized changes.

Known False Positives

  • False positives may be present on recent Windows Operating Systems. Filtering may be required based on process_name. In addition, look for non-standard, unsigned, module loads into LSASS. If query is too noisy, modify by adding Endpoint.processes process_name to query to identify the process making the modification.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Bypass UAC via Pkgmgr Tool
id: cce58e2c-988a-4319-9390-0daa9eefa3cd
version: 9
creation_date: '2023-07-27'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic detects the execution of the deprecated 'pkgmgr.exe' process with an XML input file, which is unusual and potentially suspicious. This detection leverages Endpoint Detection and Response (EDR) telemetry, focusing on process execution details and command-line arguments. The significance lies in the deprecated status of 'pkgmgr.exe' and the use of XML files, which could indicate an attempt to bypass User Account Control (UAC). If confirmed malicious, this activity could allow an attacker to execute commands with elevated privileges, leading to potential system compromise and unauthorized changes.
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 = pkgmgr.exe Processes.process = "*.xml*" NOT(Processes.parent_process_path IN("*:\\windows\\system32\\*", "*:\\windows\\syswow64\\*", "*:\\Program Files*")) 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_bypass_uac_via_pkgmgr_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: False positives may be present on recent Windows Operating Systems. Filtering may be required based on process_name. In addition, look for non-standard, unsigned, module loads into LSASS. If query is too noisy, modify by adding Endpoint.processes process_name to query to identify the process making the modification.
references:
    - https://asec.ahnlab.com/en/17692/
    - https://www.blackberry.com/us/en/solutions/endpoint-security/ransomware-protection/warzone#:~:text=Warzone%20RAT%20(AKA%20Ave%20Maria)%20is%20a%20remote%20access%20trojan,is%20as%20an%20information%20stealer.
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: A pkgmgr.exe executed with package manager xml input file on $dest$
        - field: dest
          type: system
          score: 20
          message: A pkgmgr.exe executed with package manager xml input file on $dest$
analytic_story:
    - Warzone RAT
asset_type: Endpoint
mitre_attack_id:
    - T1548.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  from datamodel=Endpoint.Processes
  where  Processes.process_name = pkgmgr.exe Processes.process = "*.xml*" NOT(
      Processes.parent_process_path IN(
          "*:\\windows\\system32\\*",
          "*:\\windows\\syswow64\\*",
          "*:\\Program Files*"
      )
  )
  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_bypass_uac_via_pkgmgr_tool_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *.xml* corpus 6 (sigma 4, splunk 2)
field:"CommandLine" kind:eq value:"*.xml*"
Processes.process_nameeq
  • pkgmgr.exe corpus 2 (elastic 1, splunk 1)
field:"process_basename" kind:eq value:"pkgmgr.exe"

Exclusions

The rule actively suppresses these predicates.

Windows Cabinet File Extraction Via Expand

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

Detects usage of expand.exe to extract Microsoft Cabinet (CAB) archives, with emphasis on extractions into C:\\ProgramData or similar staging locations. In recent APT37 activity, a CAB payload (e.g., wonder.cab) was expanded into ProgramData prior to persistence and execution. This behavior is a strong signal for ingress tool transfer and staging of payloads.

Known False Positives

  • Legitimate software deployment or administrators may use expand.exe for local file extraction. Filter by approved deployment tools, signed parent processes, and sanctioned paths.

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

Telemetry Coverage

Rule Body

name: Windows Cabinet File Extraction Via Expand
id: 4e3e3b8c-6d3a-4b47-9f5a-9e3e0a0a6f2f
version: 5
creation_date: '2025-10-13'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: |
    Detects usage of expand.exe to extract Microsoft Cabinet (CAB) archives, with
    emphasis on extractions into `C:\\ProgramData` or similar staging locations. In
    recent APT37 activity, a CAB payload (e.g., wonder.cab) was expanded into
    ProgramData prior to persistence and execution. This behavior is a strong signal
    for ingress tool transfer and staging of payloads.
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="expand.exe"
      (Processes.process="*-F:*" OR Processes.process="*/F:*")
      Processes.process="*\\ProgramData\\*"
    by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.original_file_name Processes.parent_process_exec Processes.parent_process_guid Processes.parent_process_id Processes.parent_process_path Processes.process_exec Processes.process_guid Processes.process_hash Processes.process_id Processes.process_integrity_level Processes.process_path Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_cabinet_file_extraction_via_expand_filter`
how_to_implement: |
    This analytic relies on process creation telemetry mapped to the Endpoint.Processes
    datamodel (e.g., Sysmon EID 1 or EDR). Ensure full command-line logging is enabled
    to capture expand.exe arguments, including `/F:*` or `-F:*` and destination paths.
known_false_positives: |
    Legitimate software deployment or administrators may use expand.exe for local
    file extraction. Filter by approved deployment tools, signed parent processes,
    and sanctioned paths.
references:
    - https://www.zscaler.com/blogs/security-research/apt37-targets-windows-rust-backdoor-and-python-loader
finding:
    title: expand.exe extracted cabinet contents on $dest$ executed by $user$.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: expand.exe extracted cabinet contents on $dest$ executed by $user$.
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - APT37 Rustonotto and FadeStealer
    - NetSupport RMM Tool Abuse
asset_type: Endpoint
mitre_attack_id:
    - T1105
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="expand.exe"
  (Processes.process="*-F:*" OR Processes.process="*/F:*")
  Processes.process="*\\ProgramData\\*"
  by
    Processes.dest
    Processes.user
    Processes.parent_process_name
    Processes.process_name
    Processes.process
    Processes.original_file_name
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_path
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_path
    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_cabinet_file_extraction_via_expand_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *-F:*
  • */F:*
  • *\ProgramData\* corpus 5 (sigma 3, elastic 1, splunk 1)
field:"CommandLine" kind:eq
Processes.process_nameeq
  • expand.exe corpus 8 (elastic 7, splunk 1)
field:"process_basename" kind:eq value:"expand.exe"

Windows DLL Side-Loading In Calc

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

The following analytic detects the loading of the "WindowsCodecs.dll" by calc.exe from a non-standard location This could be indicative of a potential DLL side-loading technique. This detection leverages Sysmon EventCode 7 to identify the DLL side-loading activity. In previous versions of the "calc.exe" binary, namely on Windows 7, it was vulnerable to DLL side-loading, where an attacker is able to load an arbitrary DLL named "WindowsCodecs.dll". This technique has been observed in Qakbot malware. This activity is significant as it indicates potential malware execution through a trusted process, which can bypass security controls. If confirmed malicious, this could allow attackers to execute arbitrary code, maintain persistence, and escalate privileges within the environment.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 7: Image loaded

Rule Body

name: Windows DLL Side-Loading In Calc
id: af01f6db-26ac-440e-8d89-2793e303f137
version: 13
creation_date: '2022-10-24'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects the loading of the "WindowsCodecs.dll" by calc.exe from a non-standard location This could be indicative of a potential DLL side-loading technique. This detection leverages Sysmon EventCode 7 to identify the DLL side-loading activity. In previous versions of the "calc.exe" binary, namely on Windows 7, it was vulnerable to DLL side-loading, where an attacker is able to load an arbitrary DLL named "WindowsCodecs.dll". This technique has been observed in Qakbot malware. This activity is significant as it indicates potential malware execution through a trusted process, which can bypass security controls. If confirmed malicious, this could allow attackers to execute arbitrary code, maintain persistence, and escalate privileges within the environment.
data_source:
    - Sysmon EventID 7
search: |
    `sysmon`
    EventCode=7
    Image="*\\calc.exe"
    ImageLoaded="*\\WindowsCodecs.dll"
    NOT Image IN ("*:\\Windows\\System32\\*", "*:\\Windows\\SysWOW64\\*")
    NOT ImageLoaded IN("*:\\Windows\\System32\\*", "*:\\Windows\\SysWOW64\\*", "*:\\Windows\\WinSXS\\*")

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

    by Image ImageLoaded dest loaded_file loaded_file_path original_file_name
       process_exec process_guid process_hash process_id process_name
       process_path service_dll_signature_exists service_dll_signature_verified
       signature signature_id user_id vendor_product

    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_dll_side_loading_in_calc_filter`
how_to_implement: To successfully implement this search you need to be ingesting information on processes that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Processes` and `Filesystem` node. In addition, confirm the latest CIM App 4.20 or higher is installed and the latest TA for the endpoint product.
known_false_positives: No false positives have been identified at this time.
references:
    - https://www.bitdefender.com/blog/hotforsecurity/new-qakbot-malware-strain-replaces-windows-calculator-dll-to-infected-pcs/
    - https://www.menlosecurity.com/blog/an-anatomy-of-heat-attacks-used-by-qakbot-campaigns
finding:
    title: The [ $Image$ ] process loaded the [ $ImageLoaded$ ] DLL from a non-standard location on [ $dest$ ]
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Qakbot
    - Earth Alux
asset_type: Endpoint
mitre_attack_id:
    - T1574.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon`
EventCode=7
Image="*\\calc.exe"
ImageLoaded="*\\WindowsCodecs.dll"
NOT Image IN ("*:\\Windows\\System32\\*", "*:\\Windows\\SysWOW64\\*")
NOT ImageLoaded IN("*:\\Windows\\System32\\*", "*:\\Windows\\SysWOW64\\*", "*:\\Windows\\WinSXS\\*")

Stage 2: fillnull

| fillnull

Stage 3: stats

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

by Image ImageLoaded dest loaded_file loaded_file_path original_file_name
   process_exec process_guid process_hash process_id process_name
   process_path service_dll_signature_exists service_dll_signature_verified
   signature signature_id user_id vendor_product

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `windows_dll_side_loading_in_calc_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 7 corpus 39 (splunk 39)
field:"EventID" kind:eq value:"7"
Imageeq
  • *\calc.exe corpus 15 (sigma 14, splunk 1)
field:"Image" kind:eq value:"*\calc.exe"
ImageLoadedeq
  • *\WindowsCodecs.dll corpus 2 (sigma 1, splunk 1)
field:"ImageLoaded" kind:eq value:"*\WindowsCodecs.dll"

Exclusions

The rule actively suppresses these predicates.

Windows Impair Defense Disable Controlled Folder Access

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

The following analytic detects a modification in the Windows registry that disables the Windows Defender Controlled Folder Access feature. It leverages data from the Endpoint.Registry data model, specifically monitoring changes to the EnableControlledFolderAccess registry setting. This activity is significant because Controlled Folder Access is designed to protect critical folders from unauthorized access, including ransomware attacks. If this activity is confirmed malicious, it could allow attackers to bypass a key security feature, potentially leading to unauthorized access or modification of sensitive files.

Known False Positives

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

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows Impair Defense Disable Controlled Folder Access
id: 3032741c-d6fc-4c69-8988-be8043d6478c
version: 11
creation_date: '2024-01-30'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects a modification in the Windows registry that disables the Windows Defender Controlled Folder Access feature. It leverages data from the Endpoint.Registry data model, specifically monitoring changes to the EnableControlledFolderAccess registry setting. This activity is significant because Controlled Folder Access is designed to protect critical folders from unauthorized access, including ransomware attacks. If this activity is confirmed malicious, it could allow attackers to bypass a key security feature, potentially leading to unauthorized access or modification of sensitive files.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path= "*\\Windows Defender\\Windows Defender Exploit Guard\\Controlled Folder Access\\EnableControlledFolderAccess" Registry.registry_value_data="0x00000000" by Registry.action Registry.dest Registry.process_guid Registry.process_id Registry.registry_hive Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.registry_value_name Registry.registry_value_type Registry.status Registry.user Registry.vendor_product | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_impair_defense_disable_controlled_folder_access_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Registry` node.
known_false_positives: It is unusual to turn this feature off a Windows system since it is a default security control, although it is not rare for some policies to disable it. Although no false positives have been identified, use the provided filter macro to tune the search.
references:
    - https://x.com/malmoeb/status/1742604217989415386?s=20
    - https://github.com/undergroundwires/privacy.sexy
finding:
    title: Windows Defender ControlledFolderAccess feature set to disable on $dest$.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Windows Defense Evasion Tactics
    - Windows Registry Abuse
    - BlankGrabber Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1685
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Registry
  where
    Registry.registry_path= "*\\Windows Defender\\Windows Defender Exploit Guard\\Controlled Folder Access\\EnableControlledFolderAccess"
    Registry.registry_value_data="0x00000000"
  by
    Registry.action
    Registry.dest
    Registry.process_guid
    Registry.process_id
    Registry.registry_hive
    Registry.registry_path
    Registry.registry_key_name
    Registry.registry_value_data
    Registry.registry_value_name
    Registry.registry_value_type
    Registry.status
    Registry.user
    Registry.vendor_product

Stage 2: search

| `drop_dm_object_name(Registry)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_impair_defense_disable_controlled_folder_access_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Registry.registry_patheq
  • *\Windows Defender\Windows Defender Exploit Guard\Controlled Folder Access\EnableControlledFolderAccess
field:"registry_path" kind:eq value:"*\Windows Defender\Windows Defender Exploit Guard\Controlled Folder Access\EnableControlledFolderAccess"
Registry.registry_value_dataeq
  • 0x00000000 corpus 41 (splunk 33, elastic 8)
field:"Details" kind:eq value:"0x00000000"

Windows New InProcServer32 Added

#
Status
production
Group by
TargetObject, computer_name, details, process_guid, registry_path, registry_value_name, user
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

The following analytic detects the addition of new InProcServer32 registry keys on Windows endpoints. It leverages data from the Endpoint.Registry datamodel to identify changes in registry paths associated with InProcServer32. This activity is significant because malware often uses this mechanism to achieve persistence or execute malicious code by registering a new InProcServer32 key pointing to a harmful DLL. If confirmed malicious, this could allow an attacker to persist in the environment or execute arbitrary code, posing a significant threat to system integrity and security.

Known False Positives

  • False positives are expected. Filtering will be needed to properly reduce legitimate applications from the results.

MITRE ATT&CK Coverage

TacticTechniques
Persistence
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows New InProcServer32 Added
id: 0fa86e31-0f73-4ec7-9ca3-dc88e117f1db
version: 9
creation_date: '2024-04-04'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: Hunting
description: The following analytic detects the addition of new InProcServer32 registry keys on Windows endpoints. It leverages data from the Endpoint.Registry datamodel to identify changes in registry paths associated with InProcServer32. This activity is significant because malware often uses this mechanism to achieve persistence or execute malicious code by registering a new InProcServer32 key pointing to a harmful DLL. If confirmed malicious, this could allow an attacker to persist in the environment or execute arbitrary code, posing a significant threat to system integrity and security.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Registry where Registry.registry_path="*\\InProcServer32\\*" by Registry.registry_path Registry.registry_key_name Registry.registry_value_name Registry.registry_value_data Registry.dest Registry.process_guid Registry.user | `drop_dm_object_name(Registry)` |`security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_new_inprocserver32_added_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Registry` node.
known_false_positives: False positives are expected. Filtering will be needed to properly reduce legitimate applications from the results.
references:
    - https://www.netspi.com/blog/technical/red-team-operations/microsoft-outlook-remote-code-execution-cve-2024-21378/
analytic_story:
    - Hellcat Ransomware
    - Outlook RCE CVE-2024-21378
asset_type: Endpoint
cve:
    - CVE-2024-21378
mitre_attack_id:
    - T1112
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
  FROM datamodel=Endpoint.Registry
  where Registry.registry_path="*\\InProcServer32\\*"
  by
    Registry.registry_path
    Registry.registry_key_name
    Registry.registry_value_name
    Registry.registry_value_data
    Registry.dest
    Registry.process_guid
    Registry.user

Stage 2: search

| `drop_dm_object_name(Registry)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_new_inprocserver32_added_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Registry.registry_patheq
  • *\InProcServer32\* corpus 2 (splunk 2)
field:"registry_path" kind:eq value:"*\InProcServer32\*"

Windows Raw Access To Disk Volume Partition

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

The following analytic detects suspicious raw access reads to the device disk partition of a host machine. It leverages Sysmon EventCode 9 logs to identify processes attempting to read or write to the boot sector, excluding legitimate system processes. This activity is significant as it is commonly associated with destructive actions by adversaries, such as wiping, encrypting, or overwriting the boot sector, as seen in attacks involving malware like HermeticWiper. If confirmed malicious, this behavior could lead to severe impacts, including system inoperability, data loss, or compromised boot integrity.

Known False Positives

  • There are som minimal number of normal applications from system32 folder like svchost.exe accessing the MBR. In this case we used 'system32' and 'syswow64' path as a filter for this detection.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 9: RawAccessRead

Rule Body

name: Windows Raw Access To Disk Volume Partition
id: a85aa37e-9647-11ec-90c5-acde48001122
version: 13
creation_date: '2022-02-25'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic detects suspicious raw access reads to the device disk partition of a host machine. It leverages Sysmon EventCode 9 logs to identify processes attempting to read or write to the boot sector, excluding legitimate system processes. This activity is significant as it is commonly associated with destructive actions by adversaries, such as wiping, encrypting, or overwriting the boot sector, as seen in attacks involving malware like HermeticWiper. If confirmed malicious, this behavior could lead to severe impacts, including system inoperability, data loss, or compromised boot integrity.
data_source:
    - Sysmon EventID 9
search: '`sysmon` EventCode=9 Device = \\Device\\HarddiskVolume* NOT (Image IN("*\\Windows\\System32\\*", "*\\Windows\\SysWOW64\\*")) | stats count min(_time) as firstTime max(_time) as lastTime by dest dvc process_exec process_guid process_id process_name process_path signature signature_id user_id vendor_product Device Image | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_raw_access_to_disk_volume_partition_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting logs with the raw access read event (like sysmon eventcode 9), process name and process guid from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA.
known_false_positives: There are som minimal number of normal applications from system32 folder like svchost.exe accessing the MBR. In this case we used 'system32' and 'syswow64' path as a filter for this detection.
references:
    - https://blog.talosintelligence.com/2022/02/threat-advisory-hermeticwiper.html
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Process accessing disk partition $Device$ on $dest$
analytic_story:
    - CISA AA22-264A
    - Graceful Wipe Out Attack
    - Data Destruction
    - Hermetic Wiper
    - Caddy Wiper
    - BlackByte Ransomware
    - NjRAT
    - Disk Wiper
    - PathWiper
    - Void Manticore
asset_type: Endpoint
mitre_attack_id:
    - T1561.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon` EventCode=9 Device = \\Device\\HarddiskVolume* NOT (
    Image IN("*\\Windows\\System32\\*", "*\\Windows\\SysWOW64\\*")
)

Stage 2: stats

| stats
    count
    min(_time) as firstTime
    max(_time) as lastTime
  by
    dest
    dvc
    process_exec
    process_guid
    process_id
    process_name
    process_path
    signature
    signature_id
    user_id
    vendor_product
    Device
    Image

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_raw_access_to_disk_volume_partition_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Deviceeq
  • \\Device\\HarddiskVolume*
field:"Device" kind:eq value:"\\Device\\HarddiskVolume*"
EventCodeeq
  • 9 corpus 2 (splunk 2)
field:"EventID" kind:eq value:"9"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
Imagein*\Windows\SysWOW64\*, *\Windows\System32\*excludes:Image field:"Image" value:"*\Windows\SysWOW64\*" field:"Image" value:"*\Windows\System32\*"

Windows RMM Named Pipe

#
Status
production
Severity
low
Group by
PipeName, dest, dvc, process_guid, process_id, process_name, signature, signature_id, user_id, vendor_product
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

The following analytic detects the creation or connection to known suspicious named pipes, which is a technique often used by offensive tools. It leverages Sysmon EventCodes 17 and 18 to identify known default pipe names used by RMM tools. If confirmed malicious, this could allow an attacker to abuse these to potentially gain persistence, command and control, or further system compromise.

Known False Positives

  • Some false positives may occur from RMM software used in your environment. Apply filters based on known legitimate RMM software in your environment to reduce false positives.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows RMM Named Pipe
id: c07c7138-edf5-4a16-8b24-3842599235bf
version: 5
creation_date: '2025-12-08'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: Anomaly
description: |
    The following analytic detects the creation or connection to known suspicious named pipes, which is a technique often used by offensive tools.
    It leverages Sysmon EventCodes 17 and 18 to identify  known default pipe names used by RMM tools.
    If confirmed malicious,  this could allow an attacker to abuse these to potentially gain persistence, command and control, or further system compromise.
data_source:
    - Sysmon EventID 17
    - Sysmon EventID 18
search: |
    `sysmon`
    (EventCode=17 OR EventCode=18)
    NOT process_path IN (
      "*:\\Program Files \(x86\)\\Adobe*",
      "*:\\Program Files \(x86\)\\Google*",
      "*:\\Program Files \(x86\)\\Microsoft*",
      "*:\\Program Files\\Adobe*",
      "*:\\Program Files\\Google*",
      "*:\\Program Files\\Microsoft*",
      "*:\\Windows\\system32\\SearchIndexer.exe",
      "*:\\Windows\\System32\\svchost.exe",
      "*:\\Windows\\SystemApps\\Microsoft*",
      "*\\Amazon\\SSM\\Instance*",
      "*\\AppData\\Local\\Google*",
      "*\\AppData\\Local\\Kingsoft\\*",
      "*\\AppData\\Local\\Microsoft*",
      "System"
    )

    | stats  min(_time) as firstTime max(_time) as lastTime
    count by dest dvc process_exec process_guid process_id process_path signature signature_id
    vendor_product pipe_name user_id Image process_name

    | lookup suspicious_rmm_named_pipes suspicious_pipe_name AS pipe_name OUTPUT tool, description
    | where isnotnull(tool)
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_rmm_named_pipe_filter`
how_to_implement: |
    To successfully implement this search, you need to be ingesting
    logs with the process name and pipename from your endpoints. If you are using Sysmon,
    you must have at least version 6.0.4 of the Sysmon TA.
known_false_positives: |
    Some false positives may occur from RMM software used in your environment. Apply filters
    based on known legitimate RMM software in your environment to reduce false positives.
references:
    - https://attack.mitre.org/techniques/T1218/009/
    - https://docs.microsoft.com/en-us/windows/win32/ipc/named-pipes
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: An instance of $process_name$ located in $process_path$ was identified on endpoint $dest$ accessing known RMM named pipe $pipe_name$.
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - Cactus Ransomware
    - CISA AA24-241A
    - Command And Control
    - GhostRedirector IIS Module and Rungan Backdoor
    - Gozi Malware
    - Insider Threat
    - Interlock Ransomware
    - Ransomware
    - Remote Monitoring and Management Software
    - Scattered Lapsus$ Hunters
    - Scattered Spider
    - Seashell Blizzard
asset_type: Endpoint
mitre_attack_id:
    - T1559
    - T1021.002
    - T1055
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon`
(EventCode=17 OR EventCode=18)
NOT process_path IN (
  "*:\\Program Files \(x86\)\\Adobe*",
  "*:\\Program Files \(x86\)\\Google*",
  "*:\\Program Files \(x86\)\\Microsoft*",
  "*:\\Program Files\\Adobe*",
  "*:\\Program Files\\Google*",
  "*:\\Program Files\\Microsoft*",
  "*:\\Windows\\system32\\SearchIndexer.exe",
  "*:\\Windows\\System32\\svchost.exe",
  "*:\\Windows\\SystemApps\\Microsoft*",
  "*\\Amazon\\SSM\\Instance*",
  "*\\AppData\\Local\\Google*",
  "*\\AppData\\Local\\Kingsoft\\*",
  "*\\AppData\\Local\\Microsoft*",
  "System"
)

Stage 2: stats

| stats  min(_time) as firstTime max(_time) as lastTime
count by dest dvc process_exec process_guid process_id process_path signature signature_id
vendor_product pipe_name user_id Image process_name

Stage 3: lookup

| lookup suspicious_rmm_named_pipes suspicious_pipe_name AS pipe_name OUTPUT tool, description
Lookup table
suspicious_rmm_named_pipes
Key field
suspicious_pipe_name as pipe_name
Output columns
['tool', 'tool'], ['description', 'description']

Stage 4: where

| where isnotnull(tool)

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `windows_rmm_named_pipe_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 17 corpus 4 (splunk 4)
  • 18 corpus 4 (splunk 4)
field:"EventID" kind:eq
toolis_not_null
  • (no value, null check)
field:"tool" kind:is_not_null

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process_pathin*:\Program Files \(x86\)\Adobe*, *:\Program Files \(x86\)\Google*, *:\Program Files \(x86\)\Microsoft*, *:\Program Files\Adobe*, *:\Program Files\Google*, *:\Program Files\Microsoft*, *:\Windows\System32\svchost.exe, *:\Windows\SystemApps\Microsoft*, *:\Windows\system32\SearchIndexer.exe, *\Amazon\SSM\Instance*, *\AppData\Local\Google*, *\AppData\Local\Kingsoft\*, *\AppData\Local\Microsoft*, Systemexcludes:process_path

Windows System Discovery Using Qwinsta

#
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

The following analytic detects the execution of "qwinsta.exe" on a Windows operating system. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process execution logs. The "qwinsta.exe" tool is significant because it can display detailed session information on a remote desktop session host server. This behavior is noteworthy as it is commonly abused by Qakbot malware to gather system information and send it back to its Command and Control (C2) server. If confirmed malicious, this activity could lead to unauthorized data exfiltration and further compromise of the host.

Known False Positives

  • Administrator may execute this commandline tool for auditing purposes. Filter as needed.

MITRE ATT&CK Coverage

TacticTechniques
Discovery

Telemetry Coverage

Rule Body

name: Windows System Discovery Using Qwinsta
id: 2e765c1b-144a-49f0-93d0-1df4287cca04
version: 8
creation_date: '2022-10-21'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Hunting
description: The following analytic detects the execution of "qwinsta.exe" on a Windows operating system. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process execution logs. The "qwinsta.exe" tool is significant because it can display detailed session information on a remote desktop session host server. This behavior is noteworthy as it is commonly abused by Qakbot malware to gather system information and send it back to its Command and Control (C2) server. If confirmed malicious, this activity could lead to unauthorized data exfiltration and further compromise of the host.
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 = "qwinsta.exe"
        OR
        Processes.original_file_name = "qwinsta.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_system_discovery_using_qwinsta_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 may execute this commandline tool for auditing purposes. Filter as needed.
references:
    - https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/qwinsta
    - https://securelist.com/qakbot-technical-analysis/103931/
analytic_story:
    - Qakbot
asset_type: Endpoint
mitre_attack_id:
    - T1033
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 = "qwinsta.exe"
    OR
    Processes.original_file_name = "qwinsta.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_system_discovery_using_qwinsta_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • qwinsta.exe corpus 2 (sigma 1, splunk 1)
field:"OriginalFileName" kind:eq value:"qwinsta.exe"
Processes.process_nameeq
  • qwinsta.exe corpus 9 (elastic 8, splunk 1)
field:"process_basename" kind:eq value:"qwinsta.exe"

Back to all Splunk rules