Detection rules › Splunk
Splunk rules: 04
ASL AWS Defense Evasion Update Cloudtrail
#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
| Tactic | Techniques |
|---|---|
| Defense Impairment |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
api.operation | eq |
| field:"aws::eventName" kind:eq value:"UpdateTrail" |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"aws:asl" |
ASL AWS Network Access Control List Deleted
#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
| Tactic | Techniques |
|---|---|
| Defense Impairment |
Telemetry Coverage
Rules Detecting the Same Action
These rules filter on the same operation.
- AWS Network Access Control List Deleted (Splunk)
- EC2 Network ACL Modified (Panther)
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.
| Field | Kind | Values | Search |
|---|---|---|---|
api.operation | eq |
| field:"aws::eventName" kind:eq value:"DeleteNetworkAclEntry" |
egress | eq |
| field:"egress" kind:eq value:"false" |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"aws:asl" |
status | eq |
| field:"status" kind:eq value:"Success" |
ASL AWS SAML Update identity provider
#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
| Tactic | Techniques |
|---|---|
| Initial Access | |
| Persistence | |
| Privilege Escalation | |
| Stealth |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| AWS | CloudTrail event UpdateSAMLProvider: Updates the metadata document for an existing SAML provider in IAM. |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
api.operation | eq |
| field:"aws::eventName" kind:eq value:"UpdateSAMLProvider" |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"aws:asl" |
Cisco Duo Admin Login Unusual Os
#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
| Tactic | Techniques |
|---|---|
| Persistence | |
| Defense Impairment | |
| Credential Access |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
action.name | eq |
| field:"action.name" kind:eq value:"admin_login" |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"cisco:duo:activity" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
access_device.os | eq | Mac OS X | excludes:access_device.os field:"access_device.os" value:"Mac OS X" |
Cisco Secure Firewall - Rare Snort Rule Triggered
#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
| Tactic | Techniques |
|---|---|
| Reconnaissance | |
| Resource Development |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
EventType | eq |
| field:"EventType" kind:eq value:"IntrusionEvent" |
TriggerCount | eq |
| field:"TriggerCount" kind:eq value:"1" |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"cisco:sfw:estreamer" |
ConsentPromptBehaviorAdmin Registry Value Modified (PowerShell)
#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
| Tactic | Techniques |
|---|---|
| Privilege Escalation |
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
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.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 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)
#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
| Tactic | Techniques |
|---|---|
| Stealth |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Security-Auditing | Event ID 4688: A new process has been created. |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"4688" |
parent_process_name | regex_match |
| field:"parent_process_name" kind:regex_match value:"(?i)dxcap" |
process | regex_match |
| field:"CommandLine" kind:regex_match value:"(?i)dxcap.+?\-c" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>4688<" |
| 1 | "dxcap" |
ESXi Shell Access Enabled
#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
| Tactic | Techniques |
|---|---|
| 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.
| Field | Kind | Values | Search |
|---|---|---|---|
Message | eq |
| field:"Message" kind:eq |
sourcetype | in |
| field:"sourcetype" kind:in |
Geographic Improbable Location
#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
| Tactic | Techniques |
|---|---|
| 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
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 =isnull(src_city)Citysrc_citysession_country =isnull(src_country)Countrysrc_countrysession_lat =isnull(src_lat)latsrc_latsession_lon =isnull(src_long)lonsrc_longsession_region =isnull(src_region)Regionsrc_regionStage 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 =isnull(session_city)"-"session_citysession_country =isnull(session_country)"-"session_countrysession_region =isnull(session_region)"-"session_regionStage 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 =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""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
Stage 23: eval
| eval suspect=if(!user_work_country==session_country,"Sketchy","Normal")
suspect ="Sketchy""Normal"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 ="Yes""Nope"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.
| Field | Kind | Values | Search |
|---|---|---|---|
Authentication.action | eq |
| field:"event_action" kind:eq value:"success" |
Authentication.app | in |
| field:"app" kind:in |
distance | gt |
| field:"distance" kind:gt value:"750" |
index | eq |
| field:"index" kind:eq value:"firewall" |
prev_city | is_not_null | field:"prev_city" kind:is_not_null | |
problem | eq |
| field:"problem" kind:eq value:"Yes" |
session_city | is_not_null | field:"session_city" kind:is_not_null | |
session_lat | is_not_null | field:"session_lat" kind:is_not_null | |
session_lon | is_not_null | field:"session_lon" kind:is_not_null | |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"pan:globalprotect" |
speed | gt |
| field:"speed" kind:gt value:"500" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
Authentication.user | eq | unknown | excludes:Authentication.user field:"Authentication.user" value:"unknown" |
prev_city | cross_field_compare | session_city | excludes:prev_city field:"prev_city" value:"session_city" |
prev_country | cross_field_compare | session_country | excludes:prev_country field:"prev_country" value:"session_country" |
prev_city | eq | - | excludes:prev_city field:"prev_city" value:"-" |
session_city | eq | - | excludes:session_city field:"session_city" value:"-" |
1 | eq | 1 | excludes:1 field:"1" value:"1" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 9 | iplocation |
| 9 | src |
GitHub Enterprise Repository Archived
#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
| Tactic | Techniques |
|---|---|
| Initial Access | |
| Impact |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| GitHub | Audit log action repo.archived: Repository archived |
Rules Detecting the Same Action
These rules filter on the same operation.
- GitHub Organizations Repository Archived (Splunk)
- GitHub Repository Archive Status Changed (Sigma)
- GitHub Repository Archived (Panther)
- GitHub Repository Archived Or Deleted (YARA-L)
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.
| Field | Kind | Values | Search |
|---|---|---|---|
action | eq |
| field:"action" kind:eq value:"repo.archived" |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"httpevent" |
Linux Auditd Find Credentials From Password Stores
#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
| Tactic | Techniques |
|---|---|
| Credential Access |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| Linux | auditd EXECVE record: Arguments supplied to the execve system call |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
execve_command | in |
| field:"execve_command" kind:in |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"auditd" |
Malicious PowerShell Process With Obfuscation Techniques
#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
| Tactic | Techniques |
|---|---|
| Execution |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event 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.
| Field | Kind | Values | Search |
|---|---|---|---|
Processes.original_file_name | eq |
| field:"OriginalFileName" kind:eq |
Processes.process_name | eq |
| field:"process_basename" kind:eq |
num_obfuscation | gt |
| field:"num_obfuscation" kind:gt value:"10" |
Microsoft Build Engine Suspicious Parent Process (Sysmon)
#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
| Tactic | Techniques |
|---|---|
| Execution | |
| Stealth |
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
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event 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.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"1" |
parent_process_name | regex_match |
| field:"parent_process_name" kind:regex_match value:"(?i)(cmd|powershell(_ise)?|pwsh|cscript|wscript|mshta).exe" |
process_name | regex_match |
| field:"process_name" kind:regex_match value:"(?i)msbuild.exe" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>1<" |
| 1 | "msbuild.exe" |
| 1 | msbuild |
| 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)
#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
| Tactic | Techniques |
|---|---|
| Discovery |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event 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.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"1" |
event_count | gt |
| field:"event_count" kind:gt value:"2" |
process_name | regex_match |
| field:"process_name" kind:regex_match value:"(?i)nslookup.exe" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>1<" |
| 1 | "nslookup" |
| 1 | "nslookup.exe" |
Potential Cryptomining Commands (Sysmon)
#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
| Tactic | Techniques |
|---|---|
| Impact |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event 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.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"1" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
process | regex_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.
| Stage | Term |
|---|---|
| 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)
#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
| Tactic | Techniques |
|---|---|
| Defense Impairment |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event 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.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"1" |
process | regex_match |
| field:"CommandLine" kind:regex_match value:"(?i)\s+-r\s+" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>1<" |
| 1 | attrib |
| 1 | attrib.exe |
| 1 | "-r" |
Splunk XSS Privilege Escalation via Custom Urls in Dashboard
#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
| Tactic | Techniques |
|---|---|
| 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.
| Field | Kind | Values | Search |
|---|---|---|---|
action | eq |
| field:"action" kind:eq value:"edit_user" |
method | eq |
| field:"method" kind:eq value:"POST" |
operation | eq |
| field:"operation" kind:eq value:"create" |
sourcetype | eq |
| field:"sourcetype" kind:eq |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | /*/data/ui/views* |
System Enumeration with WMIC (Sysmon)
#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
| Tactic | Techniques |
|---|---|
| Execution | |
| Discovery |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event 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.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"1" |
dc_process | gt |
| field:"dc_process" kind:gt value:"5" |
process_name | regex_match |
| field:"process_name" kind:regex_match value:"(?i)wmic" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>1<" |
| 1 | wmic |
| 1 | "wmic.exe" |
Web Spring4Shell HTTP Request Class Module
#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
| Tactic | Techniques |
|---|---|
| Initial Access | |
| Persistence |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
http_method | in |
| field:"http_method" kind:in value:"POST" |
http_request_body | in |
| field:"http_request_body" kind:in |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"stream:http" |
Windows AD Domain Controller Audit Policy Disabled
#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
| Tactic | Techniques |
|---|---|
| Defense Impairment |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Security-Auditing | Event ID 4719: System audit policy was changed. |
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
Stage 6: search
| `windows_ad_domain_controller_audit_policy_disabled_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
AuditPolicyChanges | in |
| field:"AuditPolicyChanges" kind:in |
Changes | in |
| field:"Changes" kind:in |
EventCode | eq |
| field:"EventID" kind:eq value:"4719" |
dest_category | eq |
| field:"dest_category" kind:eq value:"domain_controller" |
Windows Azure Storage Utility Execution Via CLI
#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
| Tactic | Techniques |
|---|---|
| Exfiltration |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
| Security-Auditing | Event ID 4688: A new process has been created. |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
Processes.process_name | in |
| field:"process_basename" kind:in |
Windows Bypass UAC via Pkgmgr Tool
#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
| Tactic | Techniques |
|---|---|
| Privilege Escalation |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
| Security-Auditing | Event ID 4688: A new process has been created. |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
Processes.process | eq |
| field:"CommandLine" kind:eq value:"*.xml*" |
Processes.process_name | eq |
| field:"process_basename" kind:eq value:"pkgmgr.exe" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
Processes.parent_process_path | in | *:\Program Files*, *:\windows\system32\*, *:\windows\syswow64\* | excludes:Processes.parent_process_path field:"Processes.parent_process_path" value:"*:\Program Files*" field:"Processes.parent_process_path" value:"*:\windows\system32\*" field:"Processes.parent_process_path" value:"*:\windows\syswow64\*" |
Windows Cabinet File Extraction Via Expand
#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
| Tactic | Techniques |
|---|---|
| Command & Control |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
| Security-Auditing | Event ID 4688: A new process has been created. |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
Processes.process | eq |
| field:"CommandLine" kind:eq |
Processes.process_name | eq |
| field:"process_basename" kind:eq value:"expand.exe" |
Windows DLL Side-Loading In Calc
#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
| Tactic | Techniques |
|---|---|
| Execution | |
| Stealth |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event 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.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"7" |
Image | eq |
| field:"Image" kind:eq value:"*\calc.exe" |
ImageLoaded | eq |
| field:"ImageLoaded" kind:eq value:"*\WindowsCodecs.dll" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
Image | in | *:\Windows\SysWOW64\*, *:\Windows\System32\* | excludes:Image field:"Image" value:"*:\Windows\SysWOW64\*" field:"Image" value:"*:\Windows\System32\*" |
ImageLoaded | in | *:\Windows\SysWOW64\*, *:\Windows\System32\*, *:\Windows\WinSXS\* | excludes:ImageLoaded field:"ImageLoaded" value:"*:\Windows\SysWOW64\*" field:"ImageLoaded" value:"*:\Windows\System32\*" field:"ImageLoaded" value:"*:\Windows\WinSXS\*" |
Windows Impair Defense Disable Controlled Folder Access
#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
| Tactic | Techniques |
|---|---|
| Defense Impairment |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 13: RegistryEvent (Value Set) |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
Registry.registry_path | eq |
| field:"registry_path" kind:eq value:"*\Windows Defender\Windows Defender Exploit Guard\Controlled Folder Access\EnableControlledFolderAccess" |
Registry.registry_value_data | eq |
| field:"Details" kind:eq value:"0x00000000" |
Windows New InProcServer32 Added
#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
| Tactic | Techniques |
|---|---|
| Persistence | |
| Defense Impairment |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 13: RegistryEvent (Value Set) |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
Registry.registry_path | eq |
| field:"registry_path" kind:eq value:"*\InProcServer32\*" |
Windows Raw Access To Disk Volume Partition
#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
| Tactic | Techniques |
|---|---|
| Impact |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event 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.
| Field | Kind | Values | Search |
|---|---|---|---|
Device | eq |
| field:"Device" kind:eq value:"\\Device\\HarddiskVolume*" |
EventCode | eq |
| field:"EventID" kind:eq value:"9" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
Image | in | *\Windows\SysWOW64\*, *\Windows\System32\* | excludes:Image field:"Image" value:"*\Windows\SysWOW64\*" field:"Image" value:"*\Windows\System32\*" |
Windows RMM Named Pipe
#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
| Tactic | Techniques |
|---|---|
| Execution | |
| Privilege Escalation | |
| Stealth | |
| Lateral Movement |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 17: PipeEvent (Pipe Created) |
| Sysmon | Event ID 18: PipeEvent (Pipe Connected) |
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
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.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq |
tool | is_not_null | field:"tool" kind:is_not_null |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
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\svchost.exe, *:\Windows\SystemApps\Microsoft*, *:\Windows\system32\SearchIndexer.exe, *\Amazon\SSM\Instance*, *\AppData\Local\Google*, *\AppData\Local\Kingsoft\*, *\AppData\Local\Microsoft*, System | excludes:process_path |
Windows System Discovery Using Qwinsta
#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
| Tactic | Techniques |
|---|---|
| Discovery |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
| Security-Auditing | Event ID 4688: A new process has been created. |
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.
| Field | Kind | Values | Search |
|---|---|---|---|
Processes.original_file_name | eq |
| field:"OriginalFileName" kind:eq value:"qwinsta.exe" |
Processes.process_name | eq |
| field:"process_basename" kind:eq value:"qwinsta.exe" |