Detection rules › Splunk
Splunk rules: 0r
AWS IAM AccessDenied Discovery Events
#The following analytic identifies excessive AccessDenied events within an hour timeframe for IAM users in AWS. It leverages AWS CloudTrail logs to detect multiple failed access attempts from the same source IP and user identity. This activity is significant as it may indicate that an access key has been compromised and is being misused for unauthorized discovery actions. If confirmed malicious, this could allow attackers to gather information about the AWS environment, potentially leading to further exploitation or privilege escalation.
Known False Positives
- It is possible to start this detection will need to be tuned by source IP or user. In addition, change the count values to an upper threshold to restrict false positives.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Discovery |
Rule Body
name: AWS IAM AccessDenied Discovery Events
id: 3e1f1568-9633-11eb-a69c-acde48001122
version: 11
creation_date: '2021-04-06'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: Anomaly
description: The following analytic identifies excessive AccessDenied events within an hour timeframe for IAM users in AWS. It leverages AWS CloudTrail logs to detect multiple failed access attempts from the same source IP and user identity. This activity is significant as it may indicate that an access key has been compromised and is being misused for unauthorized discovery actions. If confirmed malicious, this could allow attackers to gather information about the AWS environment, potentially leading to further exploitation or privilege escalation.
data_source:
- AWS CloudTrail
search: |-
`cloudtrail` (errorCode = "AccessDenied") user_type=IAMUser (userAgent!=*.amazonaws.com)
| bucket _time span=1h
| rename user_name as user
| stats count as failures min(_time) as firstTime max(_time) as lastTime, dc(signature) as methods, dc(dest) as sources values(signature) as signature values(dest) as dest
BY src, user, vendor_account
vendor_region, vendor_product
| where failures >= 5 and methods >= 1 and sources >= 1
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `aws_iam_accessdenied_discovery_events_filter`
how_to_implement: The Splunk AWS Add-on and Splunk App for AWS is required to utilize this data. The search requires AWS CloudTrail logs.
known_false_positives: It is possible to start this detection will need to be tuned by source IP or user. In addition, change the count values to an upper threshold to restrict false positives.
references:
- https://aws.amazon.com/premiumsupport/knowledge-center/troubleshoot-iam-permission-errors/
intermediate_findings:
entities:
- field: user
type: user
score: 20
message: User $user$ is seen to perform excessive number of discovery related api calls- $failures$, within an hour where the access was denied.
threat_objects:
- field: src
type: ip_address
analytic_story:
- Suspicious Cloud User Activities
asset_type: AWS Account
mitre_attack_id:
- T1580
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: cloud
security_domain: access
Stages and Predicates
Stage 1: search
`cloudtrail` (errorCode = "AccessDenied") user_type=IAMUser (userAgent!=*.amazonaws.com)
Stage 2: bucket
| bucket _time span=1h
Stage 3: rename
| rename user_name as user
Stage 4: stats
| stats
count as failures
min(_time) as firstTime
max(_time) as lastTime,
dc(signature) as methods,
dc(dest) as sources
values(signature) as signature
values(dest) as dest
BY src, user, vendor_account
vendor_region, vendor_product
Stage 5: where
| where failures >= 5 and methods >= 1 and sources >= 1
Stage 6: search
| `security_content_ctime(firstTime)`
Stage 7: search
| `security_content_ctime(lastTime)`
Stage 8: search
| `aws_iam_accessdenied_discovery_events_filter`
Indicators
These rows show field, operator, and value matches.
Cisco Secure Firewall - Potential Data Exfiltration
#The following analytic detects potentially suspicious large volumes of data sent by the connection initiator on flows from internal to external networks. It leverages Cisco Secure Firewall Threat Defense ConnectionEvent logs and thresholds on InitiatorBytes (bytes transmitted by the initiator), which for typical inside-initiated client sessions approximates upload or outbound payload from the internal host and avoids flagging large downloads where most bytes appear in ResponderBytes. Connections where the initiator sent at least 100 MB are flagged, as these may indicate unauthorized data exfiltration, especially if associated with unusual users, hosts, or processes. This analytic is scoped to inside-to-outside flows using a macro (cisco_secure_firewall_inside_to_outside) to abstract environment-specific zone definitions. If confirmed malicious, this behavior may reflect data staging and exfiltration over an encrypted or stealthy transport.
Known False Positives
- Large initiator-side transfers may occur due to legitimate activities such as cloud backups, file syncing, or developer build deployments. Backup servers, CI/CD pipelines, and enterprise sync tools (e.g., OneDrive, Dropbox) may exhibit similar patterns. Uncommon connection initiation (e.g., certain server-initiated or asymmetric paths) can change which side is logged as the initiator; tune or filter those scenarios if needed. Additional validation using user context, scheduled task windows, or endpoint telemetry is recommended to reduce false positives.
MITRE ATT&CK Coverage
Rule Body
name: Cisco Secure Firewall - Potential Data Exfiltration
id: 3d8536b6-52b4-4c3e-b695-3f2e90bb22be
version: 7
creation_date: '2025-04-03'
modification_date: '2026-05-13'
author: Nasreddine Bencherchali, Splunk
status: production
type: Anomaly
description: |
The following analytic detects potentially suspicious large volumes of data sent by the connection initiator on flows from internal to external networks. It leverages Cisco Secure Firewall Threat Defense ConnectionEvent logs and thresholds on InitiatorBytes (bytes transmitted by the initiator), which for typical inside-initiated client sessions approximates upload or outbound payload from the internal host and avoids flagging large downloads where most bytes appear in ResponderBytes. Connections where the initiator sent at least 100 MB are flagged, as these may indicate unauthorized data exfiltration, especially if associated with unusual users, hosts, or processes. This analytic is scoped to inside-to-outside flows using a macro (cisco_secure_firewall_inside_to_outside) to abstract environment-specific zone definitions. If confirmed malicious, this behavior may reflect data staging and exfiltration over an encrypted or stealthy transport.
data_source:
- Cisco Secure Firewall Threat Defense Connection Event
search: |
`cisco_secure_firewall` EventType=ConnectionEvent `cisco_secure_firewall_inside_to_outside`
| eval initiator_mb = round(InitiatorBytes / 1024 / 1024, 2)
| where initiator_mb >= 100
| eval Potentially_Exfiltrated = initiator_mb + " MB"
| stats min(_time) as firstTime max(_time) as lastTime
Values(url) as url
Values(rule) as rule
Values(dest_port) as dest_port
by src, dest, Potentially_Exfiltrated, transport, action
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `cisco_secure_firewall___potential_data_exfiltration_filter`
how_to_implement: |
This search requires Cisco Secure Firewall Threat Defense Logs, which
includes the ConnectionEvent EventType. This search uses two input macros named `cisco_secure_firewall` and `cisco_secure_firewall_inside_to_outside`.
We strongly recommend that you specify your environment-specific configurations
(index, source, sourcetype, etc.) for Cisco Secure Firewall Threat Defense logs. Replace the macro definitions
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 access policy must also enable logging.
known_false_positives: |
Large initiator-side transfers may occur due to legitimate activities such as cloud backups, file syncing, or developer build deployments.
Backup servers, CI/CD pipelines, and enterprise sync tools (e.g., OneDrive, Dropbox) may exhibit similar patterns.
Uncommon connection initiation (e.g., certain server-initiated or asymmetric paths) can change which side is logged as the initiator; tune or filter those scenarios if needed.
Additional validation using user context, scheduled task windows, or endpoint telemetry is recommended to reduce false positives.
references:
- https://www.cisco.com/c/en/us/td/docs/security/firepower/741/api/FQE/secure_firewall_estreamer_fqe_guide_740.pdf
intermediate_findings:
entities:
- field: src
type: system
score: 20
message: Potential data exfiltration activity from $src$ to $dest$ — With $Potentially_Exfiltrated$ transferred (initiator bytes)
threat_objects:
- field: url
type: url
analytic_story:
- Cisco Secure Firewall Threat Defense Analytics
asset_type: Network
mitre_attack_id:
- T1041
- T1567.002
- T1048.003
product:
- Splunk Enterprise
- Splunk Cloud
- Splunk Enterprise Security
category: network
security_domain: network
Stages and Predicates
Stage 1: search
`cisco_secure_firewall` EventType=ConnectionEvent `cisco_secure_firewall_inside_to_outside`
Stage 2: eval
| eval initiator_mb = round(InitiatorBytes / 1024 / 1024, 2)
Stage 3: where
| where initiator_mb >= 100
Stage 4: eval
| eval Potentially_Exfiltrated = initiator_mb + " MB"
Stage 5: stats
| stats min(_time) as firstTime max(_time) as lastTime
Values(url) as url
Values(rule) as rule
Values(dest_port) as dest_port
by src, dest, Potentially_Exfiltrated, transport, action
Stage 6: search
| `security_content_ctime(firstTime)`
Stage 7: search
| `security_content_ctime(lastTime)`
Stage 8: search
| `cisco_secure_firewall___potential_data_exfiltration_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EgressZone | eq |
| field:"EgressZone" kind:eq value:"outside" |
EventType | eq |
| field:"EventType" kind:eq value:"ConnectionEvent" |
IngressZone | eq |
| field:"IngressZone" kind:eq value:"inside" |
initiator_mb | ge |
| field:"initiator_mb" kind:ge value:"100" |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"cisco:sfw:estreamer" |
Detect AWS Console Login by User from New Country
#The following analytic identifies AWS console login events by users from a new country. It leverages AWS CloudTrail events and compares them against a lookup file of previously seen users and their login locations. This activity is significant because logins from new countries can indicate potential unauthorized access or compromised accounts. If confirmed malicious, this could lead to unauthorized access to AWS resources, data exfiltration, or further exploitation within the AWS environment.
Known False Positives
- When a legitimate new user logins for the first time, this activity will be detected. Check how old the account is and verify that the user activity is legitimate.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Resource Development | |
| Stealth |
Rule Body
name: Detect AWS Console Login by User from New Country
id: 67bd3def-c41c-4bf6-837b-ae196b4257c6
version: 9
creation_date: '2020-04-29'
modification_date: '2026-05-13'
author: Bhavin Patel, Eric McGinnis Splunk
status: production
type: Hunting
description: The following analytic identifies AWS console login events by users from a new country. It leverages AWS CloudTrail events and compares them against a lookup file of previously seen users and their login locations. This activity is significant because logins from new countries can indicate potential unauthorized access or compromised accounts. If confirmed malicious, this could lead to unauthorized access to AWS resources, data exfiltration, or further exploitation within the AWS environment.
data_source:
- AWS CloudTrail
search: |-
| tstats earliest(_time) as firstTime latest(_time) as lastTime FROM datamodel=Authentication
WHERE Authentication.signature=ConsoleLogin
BY Authentication.user Authentication.src
| iplocation Authentication.src
| `drop_dm_object_name(Authentication)`
| rename Country as justSeenCountry
| table firstTime lastTime user justSeenCountry
| join user type=outer [
| inputlookup previously_seen_users_console_logins
| rename Country as previouslySeenCountry
| stats min(firstTime) AS earliestseen
BY user previouslySeenCountry
| fields earliestseen user previouslySeenCountry]
| eval userCountry=if(firstTime >= relative_time(now(), "-24h@h"), "New Country","Previously Seen Country")
| where userCountry = "New Country"
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| table firstTime lastTime user previouslySeenCountry justSeenCountry userCountry
| `detect_aws_console_login_by_user_from_new_country_filter`
how_to_implement: You must install and configure the Splunk Add-on for AWS (version 5.1.0 or later) and Enterprise Security 6.2, which contains the required updates to the Authentication data model for cloud use cases. Run the `Previously Seen Users in AWS CloudTrail - Initial` support search only once to create a baseline of previously seen IAM users within the last 30 days. Run `Previously Seen Users in AWS CloudTrail - Update` hourly (or more frequently depending on how often you run the detection searches) to refresh the baselines. You can also provide additional filtering for this search by customizing the `detect_aws_console_login_by_user_from_new_country_filter` macro.
known_false_positives: When a legitimate new user logins for the first time, this activity will be detected. Check how old the account is and verify that the user activity is legitimate.
references: []
analytic_story:
- Suspicious AWS Login Activities
- Suspicious Cloud Authentication Activities
- AWS Identity and Access Management Account Takeover
- Compromised User Account
asset_type: AWS Instance
mitre_attack_id:
- T1535
- T1586.003
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: cloud
security_domain: threat
baselines:
- Previously Seen Users in CloudTrail - Initial
- Previously Seen Users In CloudTrail - Update
Stages and Predicates
Stage 1: tstats
| tstats earliest(_time) as firstTime latest(_time) as lastTime FROM datamodel=Authentication
WHERE Authentication.signature=ConsoleLogin
BY Authentication.user Authentication.src
Stage 2: search
| iplocation Authentication.src
Stage 3: search
| `drop_dm_object_name(Authentication)`
Stage 4: rename
| rename Country as justSeenCountry
Stage 5: table
| table firstTime lastTime user justSeenCountry
Stage 6: join
| join user type=outer [
| inputlookup previously_seen_users_console_logins
| rename Country as previouslySeenCountry
| stats min(firstTime) AS earliestseen
BY user previouslySeenCountry
| fields earliestseen user previouslySeenCountry]
Stage 7: eval
| eval
userCountry=if(
firstTime >= relative_time(now(), "-24h@h"),
"New Country",
"Previously Seen Country"
)
userCountry ="New Country""Previously Seen Country"Stage 8: where
| where userCountry = "New Country"
Stage 9: search
| `security_content_ctime(firstTime)`
Stage 10: search
| `security_content_ctime(lastTime)`
Stage 11: table
| table firstTime lastTime user previouslySeenCountry justSeenCountry userCountry
Stage 12: search
| `detect_aws_console_login_by_user_from_new_country_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Authentication.signature | eq |
| field:"signature" kind:eq value:"ConsoleLogin" |
userCountry | eq |
| field:"userCountry" kind:eq value:"New Country" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 2 | iplocation |
| 2 | Authentication.src |
Detect Password Spray Attempts
#This analytic employs the 3-sigma approach to detect an unusual volume of failed authentication attempts from a single source. A password spray attack is a type of brute force attack where an attacker tries a few common passwords across many different accounts to avoid detection and account lockouts. By utilizing the Authentication Data Model, this detection is effective for all CIM-mapped authentication events, providing comprehensive coverage and enhancing security against these attacks.
Known False Positives
- No false positives have been identified at this time.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Credential Access |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Security-Auditing | Event ID 4625: An account failed to log on. |
Rule Body
name: Detect Password Spray Attempts
id: 086ab581-8877-42b3-9aee-4a7ecb0923af
version: 12
creation_date: '2024-07-01'
modification_date: '2026-05-13'
author: Dean Luxton
status: production
type: TTP
description: This analytic employs the 3-sigma approach to detect an unusual volume of failed authentication attempts from a single source. A password spray attack is a type of brute force attack where an attacker tries a few common passwords across many different accounts to avoid detection and account lockouts. By utilizing the Authentication Data Model, this detection is effective for all CIM-mapped authentication events, providing comprehensive coverage and enhancing security against these attacks.
data_source:
- Windows Event Log Security 4625
search: "| tstats `security_content_summariesonly` values(Authentication.user) AS unique_user_names dc(Authentication.user) AS unique_accounts values(Authentication.app) as app count(Authentication.user) as total_failures from datamodel=Authentication.Authentication where Authentication.action=\"failure\" NOT Authentication.src IN (\"-\",\"unknown\") by Authentication.action Authentication.app Authentication.authentication_method Authentication.dest \n Authentication.signature Authentication.signature_id Authentication.src sourcetype _time span=5m \n| `drop_dm_object_name(\"Authentication\")`\n ```fill out time buckets for 0-count events during entire search length```\n| appendpipe [| timechart limit=0 span=5m count | table _time] | fillnull value=0 unique_accounts\n ``` Create aggregation field & apply to all null events```\n| eval counter=src+\"__\"+sourcetype+\"__\"+signature_id | eventstats values(counter) as fnscounter | eval counter=coalesce(counter,fnscounter) \n ``` stats version of mvexpand ```\n| stats values(app) as app values(unique_user_names) as unique_user_names values(total_failures) as total_failures values(src) as src values(signature_id) as signature_id values(sourcetype) as sourcetype count by counter unique_accounts _time\n ``` remove duplicate time buckets for each unique source```\n| sort - _time unique_accounts | dedup _time counter\n ```Find the outliers```\n| eventstats avg(unique_accounts) as comp_avg , stdev(unique_accounts) as comp_std by counter | eval upperBound=(comp_avg+comp_std*3) | eval isOutlier=if(unique_accounts > 30 and unique_accounts >= upperBound, 1, 0) | replace \"::ffff:*\" with * in src | where isOutlier=1 | foreach * \n [ eval <<FIELD>> = if(<<FIELD>>=\"null\",null(),<<FIELD>>)] \n| table _time, src, action, app, unique_accounts, unique_user_names, total_failures, sourcetype, signature_id, counter | `detect_password_spray_attempts_filter`"
how_to_implement: 'Ensure in-scope authentication data is CIM mapped and the src field is populated with the source device. Also ensure fill_nullvalue is set within the macro security_content_summariesonly. This search opporates best on a 5 minute schedule, looking back over the past 70 minutes. Configure 70 minute throttling on the two fields _time and counter. '
known_false_positives: No false positives have been identified at this time.
references:
- https://attack.mitre.org/techniques/T1110/003/
finding:
title: Potential Password Spraying attack from $src$ targeting $unique_accounts$ unique accounts.
entity:
field: unique_user_names
type: user
score: 50
threat_objects:
- field: src
type: system
analytic_story:
- Compromised User Account
- Active Directory Password Spraying
asset_type: Endpoint
atomic_guid:
- 90bc2e54-6c84-47a5-9439-0a2a92b4b175
mitre_attack_id:
- T1110.003
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: application
security_domain: access
Stages and Predicates
Stage 1: tstats
| tstats `security_content_summariesonly`
values(Authentication.user) AS unique_user_names
dc(Authentication.user) AS unique_accounts
values(Authentication.app) as app
count(Authentication.user) as total_failures
from datamodel=Authentication.Authentication
where Authentication.action="failure" NOT Authentication.src IN ("-","unknown")
by
Authentication.action
Authentication.app
Authentication.authentication_method
Authentication.dest
Authentication.signature
Authentication.signature_id
Authentication.src
sourcetype
_time span=5m
Stage 2: search
| `drop_dm_object_name("Authentication")`
Stage 3: appendpipe
| appendpipe [| timechart limit=0 span=5m count | table _time]
Stage 4: fillnull
| fillnull value=0 unique_accounts
Stage 5: eval
| eval counter=src+"__"+sourcetype+"__"+signature_id
Stage 6: eventstats
| eventstats values(counter) as fnscounter
Stage 7: eval
| eval counter=coalesce(counter,fnscounter)
Stage 8: stats
| stats
values(app) as app
values(unique_user_names) as unique_user_names
values(total_failures) as total_failures
values(src) as src
values(signature_id) as signature_id
values(sourcetype) as sourcetype
count
by counter unique_accounts _time
Stage 9: sort
| sort - _time unique_accounts
Stage 10: dedup
| dedup _time counter
Stage 11: eventstats
| eventstats avg(unique_accounts) as comp_avg , stdev(unique_accounts) as comp_std by counter
Stage 12: eval
| eval upperBound=(comp_avg+comp_std*3)
Stage 13: eval
| eval isOutlier=if(unique_accounts > 30 and unique_accounts >= upperBound, 1, 0)
isOutlier =unique_accounts > 30 AND unique_accounts >= upperBound10Stage 14: replace
| replace "::ffff:*" with * in src
Stage 15: where
| where isOutlier=1
Stage 16: search
| foreach *
[ eval <<FIELD>> = if(<<FIELD>>="null",null(),<<FIELD>>)]
Stage 17: table
| table _time, src, action, app, unique_accounts, unique_user_names, total_failures, sourcetype,
signature_id, counter
Stage 18: search
| `detect_password_spray_attempts_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Authentication.action | eq |
| field:"event_action" kind:eq value:"failure" |
isOutlier | eq |
| field:"isOutlier" kind:eq value:"1" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
Authentication.src | in | -, unknown | excludes:Authentication.src field:"Authentication.src" value:"-" field:"Authentication.src" value:"unknown" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 16 | foreach |
| 16 | * |
Dotnet.exe Execution (Windows Event Log)
#dotnet.exe comes with .NET Framework, is trusted binary and Default AppLocker rule does not block it so it will execute any dll even if applocker is enabled
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: '6582.7595'
title: Dotnet.exe Execution
description: dotnet.exe comes with .NET Framework, is trusted binary and Default AppLocker
rule does not block it so it will execute any dll even if applocker is enabled.
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<") ("dotnet") | table _time, host, user user, process, process_*,
parent_* | bin span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:system binary proxy execution
technique_id:
- T1218
data_category:
- Windows event logs
references:
- https://bohops.com/2019/08/19/dotnet-core-a-vector-for-awl-bypass-defense-evasion/
- https://lolbas-project.github.io/lolbas/OtherMSBinaries/Dotnet/
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<") ("dotnet")
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
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"4688" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>4688<" |
| 1 | "dotnet" |
Get ADUser with PowerShell Script Block
#The following analytic detects the execution of the Get-AdUser PowerShell cmdlet, which is used to enumerate all domain users. It leverages PowerShell Script Block Logging (EventCode=4104) to identify instances where this command is executed with a filter. This activity is significant as it may indicate an attempt by adversaries or Red Teams to gather information about domain users for situational awareness and Active Directory discovery. If confirmed malicious, this behavior could lead to further reconnaissance and potential exploitation of user accounts within the domain.
Known False Positives
- Administrators or power users may use this command for troubleshooting.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Discovery |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| PowerShell | Event ID 4104: Creating Scriptblock text (MessageNumber of MessageTotal). |
Rule Body
name: Get ADUser with PowerShell Script Block
id: 21432e40-04f4-11ec-b7e6-acde48001122
version: 10
creation_date: '2021-08-25'
modification_date: '2026-05-13'
author: Teoderick Contreras, Mauricio Velazco, Splunk
status: production
type: Hunting
description: The following analytic detects the execution of the `Get-AdUser` PowerShell cmdlet, which is used to enumerate all domain users. It leverages PowerShell Script Block Logging (EventCode=4104) to identify instances where this command is executed with a filter. This activity is significant as it may indicate an attempt by adversaries or Red Teams to gather information about domain users for situational awareness and Active Directory discovery. If confirmed malicious, this behavior could lead to further reconnaissance and potential exploitation of user accounts within the domain.
data_source:
- Powershell Script Block Logging 4104
search: |-
`powershell` EventCode=4104 ScriptBlockText = "*get-aduser*" ScriptBlockText = "*-filter*"
| fillnull
| stats count min(_time) as firstTime max(_time) as lastTime
BY dest signature signature_id
user_id vendor_product EventID
Guid Opcode Name
Path ProcessID ScriptBlockId
ScriptBlockText
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `get_aduser_with_powershell_script_block_filter`
how_to_implement: The following Hunting analytic requires PowerShell operational logs to be imported. Modify the powershell macro as needed to match the sourcetype or add index. This analytic is specific to 4104, or PowerShell Script Block Logging.
known_false_positives: Administrators or power users may use this command for troubleshooting.
references:
- https://www.blackhillsinfosec.com/red-blue-purple/
- https://attack.mitre.org/techniques/T1087/002/
- https://docs.microsoft.com/en-us/powershell/module/activedirectory/get-aduser?view=windowsserver2019-ps
analytic_story:
- Active Directory Discovery
- CISA AA23-347A
asset_type: Endpoint
mitre_attack_id:
- T1087.002
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: search
`powershell` EventCode=4104 ScriptBlockText = "*get-aduser*" ScriptBlockText = "*-filter*"
Stage 2: fillnull
| fillnull
Stage 3: stats
| stats count min(_time) as firstTime max(_time) as lastTime
BY dest signature signature_id
user_id vendor_product EventID
Guid Opcode Name
Path ProcessID ScriptBlockId
ScriptBlockText
Stage 4: search
| `security_content_ctime(firstTime)`
Stage 5: search
| `security_content_ctime(lastTime)`
Stage 6: search
| `get_aduser_with_powershell_script_block_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"4104" |
ScriptBlockText | eq |
| field:"ScriptBlockText" kind:eq |
HTTP Malware User Agent
#This Splunk query analyzes web logs to identify and categorize user agents, detecting various types of malware. This activity can signify possible compromised hosts on the network.
Known False Positives
- Filtering may be required in some instances depending on legacy system usage, filter as needed.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Command & Control |
Rule Body
name: HTTP Malware User Agent
id: 8c4866e4-f488-4253-8537-7dc4f954c292
version: 5
creation_date: '2026-01-06'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: TTP
description: This Splunk query analyzes web logs to identify and categorize user agents, detecting various types of malware. This activity can signify possible compromised hosts on the network.
data_source:
- Suricata
search: |-
| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Web
WHERE Web.http_user_agent != null
BY Web.http_user_agent Web.http_method, Web.url,
Web.url_length Web.src, Web.dest
| `drop_dm_object_name("Web")`
| lookup malware_user_agents malware_user_agent AS http_user_agent OUTPUT malware
| where isnotnull(malware)
| stats count min(firstTime) as first_seen max(lastTime) as last_seen
BY malware url http_user_agent
src dest
| `security_content_ctime(first_seen)`
| `security_content_ctime(last_seen)`
| `http_malware_user_agent_filter`
how_to_implement: To successfully implement this search, you need to be ingesting web or proxy logs, or ensure it is being filled by a proxy like device, into the Web Datamodel. For additional filtering, allow list private IP space or restrict by known good.
known_false_positives: Filtering may be required in some instances depending on legacy system usage, filter as needed.
references:
- https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_http_user_agents_list.csv
finding:
title: A known malware user agent $http_user_agent$ was performing a request from $src$.
entity:
field: src
type: system
score: 50
threat_objects:
- field: http_user_agent
type: http_user_agent
analytic_story:
- Lokibot
- Lumma Stealer
- Meduza Stealer
- Crypto Stealer
- RedLine Stealer
- Suspicious User Agents
asset_type: Network
mitre_attack_id:
- T1071.001
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: network
security_domain: network
Stages and Predicates
Stage 1: tstats
| tstats `security_content_summariesonly`
count
min(_time) as firstTime
max(_time) as lastTime
FROM datamodel=Web
WHERE Web.http_user_agent != null
BY Web.http_user_agent Web.http_method, Web.url,
Web.url_length Web.src, Web.dest
Stage 2: search
| `drop_dm_object_name("Web")`
Stage 3: lookup
| lookup malware_user_agents malware_user_agent AS http_user_agent OUTPUT malware
Stage 4: where
| where isnotnull(malware)
Stage 5: stats
| stats count min(firstTime) as first_seen max(lastTime) as last_seen
BY malware url http_user_agent
src dest
Stage 6: search
| `security_content_ctime(first_seen)`
Stage 7: search
| `security_content_ctime(last_seen)`
Stage 8: search
| `http_malware_user_agent_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Web.http_user_agent | ne |
| field:"c-useragent" kind:ne value:"null" |
malware | is_not_null | field:"malware" kind:is_not_null |
Linux Clipboard Data Copy
#The following analytic detects the use of the Linux 'xclip' command to copy data from the clipboard. It leverages Endpoint Detection and Response (EDR) telemetry, focusing on process names and command-line arguments related to clipboard operations. This activity is significant because adversaries can exploit clipboard data to capture sensitive information such as passwords or IP addresses. If confirmed malicious, this technique could lead to unauthorized data exfiltration, compromising sensitive information and potentially aiding further attacks within the environment.
Known False Positives
- False positives may be present on Linux desktop as it may commonly be used by administrators or end users. Filter as needed.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Collection |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| Linux | Event ID 1: Process Create |
Rule Body
name: Linux Clipboard Data Copy
id: 7173b2ad-6146-418f-85ae-c3479e4515fc
version: 11
creation_date: '2022-06-17'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: Anomaly
description: The following analytic detects the use of the Linux 'xclip' command to copy data from the clipboard. It leverages Endpoint Detection and Response (EDR) telemetry, focusing on process names and command-line arguments related to clipboard operations. This activity is significant because adversaries can exploit clipboard data to capture sensitive information such as passwords or IP addresses. If confirmed malicious, this technique could lead to unauthorized data exfiltration, compromising sensitive information and potentially aiding further attacks within the environment.
data_source:
- Sysmon for Linux EventID 1
search: |-
| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
WHERE Processes.process_name=xclip Processes.process IN ("*-o *", "*-sel *", "*-selection *", "*clip *","*clipboard*")
BY Processes.action Processes.dest Processes.original_file_name
Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
Processes.process Processes.process_exec Processes.process_guid
Processes.process_hash Processes.process_id Processes.process_integrity_level
Processes.process_name Processes.process_path Processes.user
Processes.user_id Processes.vendor_product
| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `linux_clipboard_data_copy_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 Linux desktop as it may commonly be used by administrators or end users. Filter as needed.
references:
- https://attack.mitre.org/techniques/T1115/
- https://linux.die.net/man/1/xclip
intermediate_findings:
entities:
- field: user
type: user
score: 20
message: An instance of $process_name$ was identified on endpoint $dest$ by user $user$ adding or removing content from the clipboard.
- field: dest
type: system
score: 20
message: An instance of $process_name$ was identified on endpoint $dest$ by user $user$ adding or removing content from the clipboard.
threat_objects:
- field: process_name
type: process_name
analytic_story:
- Linux Living Off The Land
asset_type: Endpoint
mitre_attack_id:
- T1115
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=xclip Processes.process IN (
"*-o *",
"*-sel *",
"*-selection *",
"*clip *",
"*clipboard*"
)
BY
Processes.action
Processes.dest
Processes.original_file_name
Processes.parent_process
Processes.parent_process_exec
Processes.parent_process_guid
Processes.parent_process_id
Processes.parent_process_name
Processes.parent_process_path
Processes.process
Processes.process_exec
Processes.process_guid
Processes.process_hash
Processes.process_id
Processes.process_integrity_level
Processes.process_name
Processes.process_path
Processes.user
Processes.user_id
Processes.vendor_product
Stage 2: search
| `drop_dm_object_name(Processes)`
Stage 3: search
| `security_content_ctime(firstTime)`
Stage 4: search
| `security_content_ctime(lastTime)`
Stage 5: search
| `linux_clipboard_data_copy_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Processes.process | in |
| field:"CommandLine" kind:in |
Processes.process_name | eq |
| field:"process_basename" kind:eq value:"xclip" |
Linux Impair Defenses Process Kill
#The following analytic identifies the execution of the 'pkill' command, which is used to terminate processes on a Linux system. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names and command-line executions. This activity is significant because threat actors often use 'pkill' to disable security defenses or terminate critical processes, facilitating further malicious actions. If confirmed malicious, this behavior could lead to the disruption of security applications, enabling attackers to evade detection and potentially corrupt or destroy files on the targeted system.
Known False Positives
- network admin can terminate a process using this linux command. Filter is needed.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Defense Impairment |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| Linux | Event ID 1: Process Create |
Rule Body
name: Linux Impair Defenses Process Kill
id: 435c6b33-adf9-47fe-be87-8e29fd6654f5
version: 11
creation_date: '2023-02-08'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Hunting
description: The following analytic identifies the execution of the 'pkill' command, which is used to terminate processes on a Linux system. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names and command-line executions. This activity is significant because threat actors often use 'pkill' to disable security defenses or terminate critical processes, facilitating further malicious actions. If confirmed malicious, this behavior could lead to the disruption of security applications, enabling attackers to evade detection and potentially corrupt or destroy files on the targeted system.
data_source:
- Sysmon for Linux EventID 1
search: |-
| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
WHERE Processes.process_name IN ( "pgrep", "pkill") Processes.process = "*pkill *"
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)`
| `linux_impair_defenses_process_kill_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: network admin can terminate a process using this linux command. Filter is needed.
references:
- https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/overview-of-the-cyber-weapons-used-in-the-ukraine-russia-war/
- https://cert.gov.ua/article/3718487
analytic_story:
- AwfulShred
- Data Destruction
- Scattered Lapsus$ Hunters
asset_type: Endpoint
mitre_attack_id:
- T1685
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: tstats
| tstats `security_content_summariesonly`
count
min(_time) as firstTime
max(_time) as lastTime
FROM datamodel=Endpoint.Processes
WHERE Processes.process_name IN ( "pgrep", "pkill") Processes.process = "*pkill *"
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
| `linux_impair_defenses_process_kill_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Processes.process | eq |
| field:"CommandLine" kind:eq value:"*pkill *" |
Processes.process_name | in |
| field:"process_basename" kind:in |
Microsoft Build Engine Suspicious Parent Process (Windows Event Log)
#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 |
|---|---|
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
id: '32492.57744'
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_winevent` (TERM(EventCode=4688) OR
"<EventID>4688<" OR Type=Process) ("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 event logs
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_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) ("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:"4688" |
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>4688<" |
| 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" |
Mimikatz Execution (Windows Event Log)
#Mimikatz is used to extract plaintexts passwords, hash, PIN code and Kerberos tickets from memory. This use case looks for keywords leveraged while using Mimikatz
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Credential Access |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
id: '13473.19309'
title: Mimikatz Execution
description: 'Mimikatz is used to extract plaintexts passwords, hash, PIN code and
Kerberos tickets from memory. This use case looks for keywords leveraged while using
Mimikatz -- Threat Actor Association: Alloy Taurus/Gallium, APT10/Cicada, APT15,
APT27/Emissary Panda, APT29/Nobelium, APT41/Wicked Panda, Carbanak, CL-STA-0043,
DarkSide, BlackMatter, FamousSparrow, FIN7, FIN12, Flax Typhoon, Hello Kitty / Five
Hands, Karakurt, Lapsus$, Lazarus, LockBit, Memento Team, Muddled Libra, Mustang
Panda (aka. Stately Taurus//Earth Preta/BRONZE PRESIDENT/TA416/RedDelta), OilRig,
TRACER KITTEN, TRAVELING SPIDER, Scattered Spider (aka. 0ktapus, UNC3944), SILENCE,
UNC2596 -- Software Association: AvosLocker, Blackcat/ALPHV, BlackByte, Conti, Cuba,
Midas, Lockbit, LV, Nefilim, Play, Qakbot, Ransom Cartel, Revil, SamSam, Stonefly,
Trigona, Vice Society, WASTEDLOCKER -- Atomics T1003.001 Test #6 Atomics T1003.001
Test #10 Atomics T1550.002 Test#1'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
"<EventID>4688<" OR Type=Process) ("mimikatz.exe") OR TERM(sekurlsa::logonpasswords)
OR TERM(sekurlsa::pth) OR TERM(sekurlsa::tickets) OR TERM(lsadump::lsa) | table
_time, host, user process, process_*, signature_id, parent_* src_* dest_* | bin
span=1s | stats values(*) as * by _time, host '
techniques:
- credential-access:unsecured credentials
- credential-access:os credential dumping
technique_id:
- T1552
- T1003
data_category:
- Windows event logs
- Process command-line parameters
references:
- https://www.sans.org/reading-room/whitepapers/detection/mimikatz-overview-defenses-detection-36780
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) ("mimikatz.exe") OR TERM(sekurlsa::logonpasswords) OR TERM(sekurlsa::pth) OR TERM(sekurlsa::tickets) OR TERM(lsadump::lsa)
Stage 2: table
| table _time, host, user process, process_*, signature_id, parent_* src_* dest_*
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 value:"4688" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>4688<" |
| 1 | "mimikatz.exe" |
| 1 | "sekurlsa::logonpasswords" |
| 1 | "sekurlsa::pth" |
| 1 | "sekurlsa::tickets" |
| 1 | "lsadump::lsa" |
Multiple nslookup commands (Windows Event Log)
#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 |
|---|---|
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
id: '12915.18547'
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_winevent` (TERM(EventCode=4688) OR
"<EventID>4688<" OR Type=Process) ("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 event logs
references:
- https://thedfirreport.com/2022/04/25/quantum-ransomware/
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) ("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:"4688" |
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>4688<" |
| 1 | "nslookup" |
| 1 | "nslookup.exe" |
Potential Cryptomining Commands (Windows Event Log)
#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 |
|---|---|
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
id: '19129.33154'
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_winevent` (TERM(EventCode=4688) OR
"<EventID>4688<" OR Type=Process) ("--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:
- Process command-line parameters
- Windows event logs
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_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) ("--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:"4688" |
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>4688<" |
| 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" |
PowerShell DownloadFile_DownloadString (Sysmon)
#Adversaries have the capability to move tools or files from an external system into a compromised environment. This involves copying tools or files from an external system controlled by the adversary to the victim network through the command and control channel. This use case detects PowerShell commands related to file downloads using DownloadFile and DownloadString methods. Executions involving Invoke-WebRequest and Invoke-Expression have been excluded as they are covered by other use cases.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Execution | |
| Command & Control |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
Rule Body
id: '29435.55089'
title: PowerShell DownloadFile_DownloadString
description: Adversaries have the capability to move tools or files from an external
system into a compromised environment. This involves copying tools or files from
an external system controlled by the adversary to the victim network through the
command and control channel. This use case detects PowerShell commands related to
file downloads using DownloadFile and DownloadString methods. Executions involving
Invoke-WebRequest and Invoke-Expression have been excluded as they are covered by
other use cases.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
("downloadfile" OR "downloadstring") "System.Net.WebClient" NOT ("Invoke-WebRequest"
OR "Invoke-Expression") | regex process="(?i)System\.Net\.WebClient.+\.Download(file|string)"|
regex process!="(?i)(^|\s|\;|\|)(iex|iwr)(\s|\;|\|)"| table _time, host, user, process,
process_name, parent_process_name | bin span=1s | stats values(*) as * by _time,
host '
techniques:
- execution:command and scripting interpreter:powershell
- execution:command and scripting interpreter
- command-and-control:ingress tool transfer
technique_id:
- T1059.001
- T1059
- T1105
data_category:
- Windows Sysmon
references:
- https://blog.talosintelligence.com/lazarus-three-rats/
- https://blog.talosintelligence.com/prometei-botnet-improves/
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") ("downloadfile" OR "downloadstring") "System.Net.WebClient" NOT ("Invoke-WebRequest" OR "Invoke-Expression")
Stage 2: regex
| regex process="(?i)System\.Net\.WebClient.+\.Download(file|string)"
Stage 3: regex
| regex process!="(?i)(^|\s|\;|\|)(iex|iwr)(\s|\;|\|)"
Stage 4: table
| table _time, host, user, process, process_name, parent_process_name
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" |
process | regex_match |
| field:"CommandLine" kind:regex_match value:"(?i)System.Net.WebClient.+.Download(file|string)" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
process | regex_match | (?i)(^|\s|\;||)(iex|iwr)(\s|\;||) | excludes:process field:"process" value:"(?i)(^|\s|\;||)(iex|iwr)(\s|\;||)" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>1<" |
| 1 | "downloadfile" |
| 1 | "downloadstring" |
| 1 | "System.Net.WebClient" |
Read-Only Attribute Removed - Windows (Windows Event Log)
#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 |
|---|---|
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
id: '17778.29822'
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_winevent` (TERM(EventCode=4688) OR
"<EventID>4688<" OR Type=Process) (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:
- Process command-line parameters
- Windows event logs
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_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) (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:"4688" |
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>4688<" |
| 1 | attrib |
| 1 | attrib.exe |
| 1 | "-r" |
Steal or Forge Authentication Certificates Behavior Identified
#The following analytic identifies potential threats related to the theft or forgery of authentication certificates. It detects when five or more analytics from the Windows Certificate Services story trigger within a specified timeframe. This detection leverages aggregated risk scores and event counts from the Risk data model. This activity is significant as it may indicate an ongoing attack aimed at compromising authentication mechanisms. If confirmed malicious, attackers could gain unauthorized access to sensitive systems and data, potentially leading to severe security breaches.
Known False Positives
- False positives may be present based on automated tooling or system administrators. Filter as needed.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Credential Access |
Rule Body
name: Steal or Forge Authentication Certificates Behavior Identified
id: 87ac670e-bbfd-44ca-b566-44e9f835518d
version: 9
creation_date: '2023-05-01'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: Correlation
description: The following analytic identifies potential threats related to the theft or forgery of authentication certificates. It detects when five or more analytics from the Windows Certificate Services story trigger within a specified timeframe. This detection leverages aggregated risk scores and event counts from the Risk data model. This activity is significant as it may indicate an ongoing attack aimed at compromising authentication mechanisms. If confirmed malicious, attackers could gain unauthorized access to sensitive systems and data, potentially leading to severe security breaches.
data_source: []
search: |-
| tstats `security_content_summariesonly` min(_time) as firstTime max(_time) as lastTime sum(All_Risk.calculated_risk_score) as risk_score, count(All_Risk.calculated_risk_score) as risk_event_count, values(All_Risk.annotations.mitre_attack.mitre_tactic_id) as annotations.mitre_attack.mitre_tactic_id, dc(All_Risk.annotations.mitre_attack.mitre_tactic_id) as mitre_tactic_id_count, values(All_Risk.annotations.mitre_attack.mitre_technique_id) as annotations.mitre_attack.mitre_technique_id, dc(All_Risk.annotations.mitre_attack.mitre_technique_id) as mitre_technique_id_count, values(All_Risk.tag) as tag, values(source) as source, dc(source) as source_count FROM datamodel=Risk.All_Risk
WHERE All_Risk.analyticstories="Windows Certificate Services" All_Risk.risk_object_type="system"
BY All_Risk.risk_object All_Risk.risk_object_type All_Risk.annotations.mitre_attack.mitre_tactic
| `drop_dm_object_name(All_Risk)`
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| where source_count >= 5
| `steal_or_forge_authentication_certificates_behavior_identified_filter`
how_to_implement: The Windows Certificate Services analytic story must have 5 or more analytics enabled. In addition, ensure data is being logged that is required. Modify the correlation as needed based on volume of noise related to the other analytics.
known_false_positives: False positives may be present based on automated tooling or system administrators. Filter as needed.
references:
- https://research.splunk.com/stories/windows_certificate_services/
- https://attack.mitre.org/techniques/T1649/
finding:
title: Steal or Forge Authentication Certificates Behavior Identified - $risk_object$
entity:
field: risk_object
type: system
score: 0
analytic_story:
- Windows Certificate Services
asset_type: Endpoint
atomic_guid:
- 290df60e-4b5d-4a5e-b0c7-dc5348ea0c86
- 78b274f8-acb0-428b-b1f7-7b0d0e73330a
- 7617f689-bbd8-44bc-adcd-6f8968897848
mitre_attack_id:
- T1649
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: tstats
| tstats `security_content_summariesonly`
min(_time) as firstTime
max(_time) as lastTime
sum(All_Risk.calculated_risk_score) as risk_score,
count(All_Risk.calculated_risk_score) as risk_event_count,
values(All_Risk.annotations.mitre_attack.mitre_tactic_id) as annotations.mitre_attack.mitre_tactic_id,
dc(All_Risk.annotations.mitre_attack.mitre_tactic_id) as mitre_tactic_id_count,
values(All_Risk.annotations.mitre_attack.mitre_technique_id) as annotations.mitre_attack.mitre_technique_id,
dc(All_Risk.annotations.mitre_attack.mitre_technique_id) as mitre_technique_id_count,
values(All_Risk.tag) as tag,
values(source) as source,
dc(source) as source_count
FROM datamodel=Risk.All_Risk
WHERE All_Risk.analyticstories="Windows Certificate Services" All_Risk.risk_object_type="system"
BY All_Risk.risk_object All_Risk.risk_object_type All_Risk.annotations.mitre_attack.mitre_tactic
Stage 2: search
| `drop_dm_object_name(All_Risk)`
Stage 3: search
| `security_content_ctime(firstTime)`
Stage 4: search
| `security_content_ctime(lastTime)`
Stage 5: where
| where source_count >= 5
Stage 6: search
| `steal_or_forge_authentication_certificates_behavior_identified_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
All_Risk.analyticstories | eq |
| field:"All_Risk.analyticstories" kind:eq value:"Windows Certificate Services" |
All_Risk.risk_object_type | eq |
| field:"All_Risk.risk_object_type" kind:eq value:"system" |
source_count | ge |
| field:"source_count" kind:ge value:"5" |
System Enumeration with WMIC (Windows Event Log)
#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 |
|---|---|
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
id: '16967.27502'
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_winevent` (TERM(EventCode=4688) OR
"<EventID>4688<" OR Type=Process) 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 event logs
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_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) 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:"4688" |
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>4688<" |
| 1 | wmic |
| 1 | "wmic.exe" |
System Info Gathering Using Dxdiag Application
#The following analytic identifies the execution of the dxdiag.exe process with specific command-line arguments, which is used to gather system information. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process creation events and command-line details. This activity is significant because dxdiag.exe is rarely used in corporate environments and its execution may indicate reconnaissance efforts by malicious actors. If confirmed malicious, this activity could allow attackers to collect detailed system information, aiding in further exploitation or lateral movement within the network.
Known False Positives
- This commandline can be used by a network administrator to audit host machine specifications. Thus, a filter is needed.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Reconnaissance |
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: System Info Gathering Using Dxdiag Application
id: f92d74f2-4921-11ec-b685-acde48001122
version: 8
creation_date: '2021-11-19'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Hunting
description: The following analytic identifies the execution of the dxdiag.exe process with specific command-line arguments, which is used to gather system information. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process creation events and command-line details. This activity is significant because dxdiag.exe is rarely used in corporate environments and its execution may indicate reconnaissance efforts by malicious actors. If confirmed malicious, this activity could allow attackers to collect detailed system information, aiding in further exploitation or lateral movement within the network.
data_source:
- Sysmon EventID 1
- Windows Event Log Security 4688
- CrowdStrike ProcessRollup2
search: |
| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time)
as lastTime from datamodel=Endpoint.Processes where
(Processes.process_name=dxdiag.exe OR Processes.original_file_name=dxdiag.exe)
Processes.process = "* /t *"
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)`
| `system_info_gathering_using_dxdiag_application_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: This commandline can be used by a network administrator to audit host machine specifications. Thus, a filter is needed.
references:
- https://app.any.run/tasks/df0baf9f-8baf-4c32-a452-16562ecb19be/
analytic_story:
- Remcos
asset_type: Endpoint
mitre_attack_id:
- T1592
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=dxdiag.exe OR Processes.original_file_name=dxdiag.exe)
Processes.process = "* /t *"
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
| `system_info_gathering_using_dxdiag_application_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Processes.original_file_name | eq |
| field:"OriginalFileName" kind:eq value:"dxdiag.exe" |
Processes.process | eq |
| field:"CommandLine" kind:eq value:"* /t *" |
Processes.process_name | eq |
| field:"process_basename" kind:eq value:"dxdiag.exe" |
Windows AD GPO New CSE Addition
#This detection identifies when a a new client side extension is added to an Active Directory Group Policy using the Group Policy Management Console.
Known False Positives
- General usage of group policy will trigger this detection, also please not GPOs modified using tools such as SharpGPOAbuse will not generate the AD audit events which enable this detection.
MITRE ATT&CK Coverage
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Security-Auditing | Event ID 5136: A directory service object was modified. |
Rule Body
name: Windows AD GPO New CSE Addition
id: 700c11d1-da09-47b2-81aa-358c143c7986
version: 10
creation_date: '2024-07-01'
modification_date: '2026-05-13'
author: Dean Luxton
status: production
type: TTP
description: This detection identifies when a a new client side extension is added to an Active Directory Group Policy using the Group Policy Management Console.
data_source:
- Windows Event Log Security 5136
search: |-
`wineventlog_security` EventCode=5136 ObjectClass=groupPolicyContainer AttributeLDAPDisplayName=gPCMachineExtensionNames
| stats min(_time) as _time values(eval(if(OperationType=="%%14675",AttributeValue,null))) as old_value values(eval(if(OperationType=="%%14674",AttributeValue,null))) as new_value values(OperationType) as OperationType values(dest) as dest
BY ObjectClass ObjectDN OpCorrelationID
src_user SubjectLogonId
| rex field=old_value max_match=10000 "(?P<old_values>\{.*?\})"
| rex field=new_value max_match=10000 "(?P<new_values>\{.*?\})"
| rex field=ObjectDN max_match=10000 "CN=(?P<policy_guid>\{.*?\})"
| mvexpand new_values
| where NOT new_values IN (old_values,"{00000000-0000-0000-0000-000000000000}",policy_guid) AND match(new_values, "^\{[A-Z
| \d]+\-[A-Z
| \d]+\-[A-Z
| \d]+\-[A-Z
| \d]+\-[A-Z
| \d]+\}")
| lookup msad_guid_lookup guid as new_values OUTPUTNEW displayName as policyType
| eval newPolicy=if(policyType like "%",policyType,new_values)
| join ObjectDN [
| search `admon` objectCategory="CN=Group-Policy-Container*" admonEventType=Update
| stats latest(displayName) as displayName
BY distinguishedName
| eval ObjectDN=upper(distinguishedName)]
| stats values(OpCorrelationID) as OpCorrelationID values(src_user) as src_user values(SubjectLogonId) as SubjectLogonId values(newPolicy) as newPolicy values(displayName) as policyName
BY ObjectDN
| `windows_ad_gpo_new_cse_addition_filter`
how_to_implement: Ensure you are ingesting Active Directory audit logs - specifically event 5136, admon data is also used to display the display name of the GPO. See lantern article in references for further on how to onboard AD audit data. Ensure the wineventlog_security and admon macros are configured with the correct indexes.
known_false_positives: General usage of group policy will trigger this detection, also please not GPOs modified using tools such as SharpGPOAbuse will not generate the AD audit events which enable this detection.
references:
- https://wald0.com/?p=179
- https://learn.microsoft.com/en-gb/archive/blogs/mempson/group-policy-client-side-extension-list
- https://lantern.splunk.com/Security/Product_Tips/Enterprise_Security/Enabling_an_audit_trail_from_Active_Directory
- https://github.com/FSecureLABS/SharpGPOAbuse
finding:
title: $src_user$ has added new GPO Client Side Extensions $newPolicy$ to the policy $policyName$
entity:
field: src_user
type: user
score: 50
analytic_story:
- Sneaky Active Directory Persistence Tricks
asset_type: Endpoint
mitre_attack_id:
- T1222.001
- T1484.001
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: search
`wineventlog_security` EventCode=5136 ObjectClass=groupPolicyContainer
AttributeLDAPDisplayName=gPCMachineExtensionNames
Stage 2: stats
| stats
min(_time) as _time
values(eval(if(OperationType=="%%14675",AttributeValue,null))) as old_value
values(eval(if(OperationType=="%%14674",AttributeValue,null))) as new_value
values(OperationType) as OperationType
values(dest) as dest
BY ObjectClass ObjectDN OpCorrelationID
src_user SubjectLogonId
Stage 3: rex
| rex field=old_value max_match=10000 "(?P<old_values>\{.*?\})"
Stage 4: rex
| rex field=new_value max_match=10000 "(?P<new_values>\{.*?\})"
Stage 5: rex
| rex field=ObjectDN max_match=10000 "CN=(?P<policy_guid>\{.*?\})"
Stage 6: mvexpand
| mvexpand new_values
Stage 7: where
| where NOT new_values IN (old_values,"{00000000-0000-0000-0000-000000000000}",policy_guid)
AND match(new_values, "^\{[A-Z
| \d]+\-[A-Z
| \d]+\-[A-Z
| \d]+\-[A-Z
| \d]+\-[A-Z
| \d]+\}")
Stage 8: lookup
| lookup msad_guid_lookup guid as new_values OUTPUTNEW displayName as policyType
Stage 9: eval
| eval newPolicy=if(policyType like "%",policyType,new_values)
newPolicy =like(policyType, "%")policyTypenew_valuesStage 10: join
| join ObjectDN [
| search `admon` objectCategory="CN=Group-Policy-Container*" admonEventType=Update
| stats latest(displayName) as displayName
BY distinguishedName
| eval ObjectDN=upper(distinguishedName)]
Stage 11: stats
| stats
values(OpCorrelationID) as OpCorrelationID
values(src_user) as src_user
values(SubjectLogonId) as SubjectLogonId
values(newPolicy) as newPolicy
values(displayName) as policyName
BY ObjectDN
Stage 12: search
| `windows_ad_gpo_new_cse_addition_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
AttributeLDAPDisplayName | eq |
| field:"AttributeLDAPDisplayName" kind:eq value:"gPCMachineExtensionNames" |
EventCode | eq |
| field:"EventID" kind:eq value:"5136" |
ObjectClass | eq |
| field:"ObjectClass" kind:eq value:"groupPolicyContainer" |
admonEventType | eq |
| field:"admonEventType" kind:eq value:"Update" |
new_values | regex_match |
| field:"new_values" kind:regex_match value:"^{[A-Z | \d]+\-[A-Z | \d]+\-[A-Z | \d]+\-[A-Z | \d]+\-[A-Z | \d]+}" |
objectCategory | eq |
| field:"objectCategory" kind:eq value:"CN=Group-Policy-Container*" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
new_values | in | old_values, policy_guid, {00000000-0000-0000-0000-000000000000} | excludes:new_values field:"new_values" value:"old_values" field:"new_values" value:"policy_guid" field:"new_values" value:"{00000000-0000-0000-0000-000000000000}" |
Windows Cloud Sensitive File Read Access By Uncommon Process
#This analytic detects uncommon processes reading or requesting read access to sensitive files from cloud providers on Windows endpoints. It monitors Windows Security Event 4663 for ReadData (AccessMask 0x1) operations against sensitive files from cloud providers such as Azure. Access by any process outside the known toolchain may indicate credential theft or cloud identity reconnaissance activity, including infostealer behavior such as one observed in Vidar Stealer variants. This detection currently only supports Azure sensitive files, but will be extended to support other cloud providers in the future.
Known False Positives
- False positives are expected from legitimate tooling. The detection excludes the Azure CLI bundled Python interpreter, Windows PowerShell, PowerShell 7+, VS Code, and the Azure Developer CLI by process path. Residual false positives may arise from CI/CD agents (e.g., Azure DevOps self-hosted runners, GitHub Actions runners) that invoke az or Azure PowerShell from non-standard install paths not covered by the exclusion list, backup or DLP agents that scan user profile directories, and custom automation scripts that shell out to Azure CLI from an unexpected working directory. Tune by adding confirmed-legitimate process paths and file paths to the companion filter macro windows_cloud_sensitive_file_read_access_by_uncommon_process_filter.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Credential Access |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Security-Auditing | Event ID 4663: An attempt was made to access an object. |
Rule Body
name: Windows Cloud Sensitive File Read Access By Uncommon Process
id: 313e4f5c-add3-4b4d-8348-6a009ce5fe40
version: 1
creation_date: '2026-08-19'
modification_date: '2026-08-19'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: |-
This analytic detects uncommon processes reading or requesting read access to sensitive files from cloud providers on Windows endpoints.
It monitors Windows Security Event 4663 for ReadData (AccessMask 0x1) operations against sensitive files from cloud providers such as Azure.
Access by any process outside the known toolchain may indicate credential theft or cloud identity reconnaissance activity, including infostealer behavior such as one observed in Vidar Stealer variants.
This detection currently only supports Azure sensitive files, but will be extended to support other cloud providers in the future.
data_source:
- Windows Event Log Security 4663
search: |-
`wineventlog_security`
EventCode=4663
ObjectType="File"
NOT process_path IN (
"*:\\AppData\\Local\\Programs\\Python\\*\\python.exe",
"*:\\AppData\\Local\\Python\\bin\\python.exe",
"*:\\AppData\\Local\\Python\\pythoncore-*\\python.exe",
"*:\\Program Files\\Azure Dev CLI\\azd.exe",
"*:\\Program Files\\Microsoft SDKs\\Azure\\CLI2\\python.exe",
"*:\\Program Files\\Microsoft VS Code\\Code.exe",
"*:\\Program Files\\nodejs\\node.exe",
"*:\\Program Files\\PowerShell\\7-preview\\pwsh.exe",
"*:\\Program Files\\PowerShell\\7\\pwsh.exe",
"*:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
"*:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
"*\\.azd\\bin\\azd.exe",
"*\\AppData\\Local\\Microsoft\\powershell\\pwsh.exe",
"*\\AppData\\Local\\Programs\\Azure Dev CLI\\azd.exe",
"*\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe"
)
ObjectName IN (
"*\\.azure\\accessTokens.json",
"*\\.azure\\azureProfile.json",
"*\\.azure\\msal_token_cache.json",
"*\\.azure\\TokenCache.dat",
"*\\Windows Azure Powershell\\TokenCache.dat"
)
```
We select only read-related operations:
0x1 = ReadData (or ListDirectory)
```
| eval AccessMask_ = tonumber(AccessMask, 16)
| where (bit_and(AccessMask_, 1) != 0)
| stats count min(_time) as firstTime
max(_time) as lastTime
by signature_id signature
ObjectType file_path file_name
process_path process_name process_id
AccessMask src_user dest
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `windows_cloud_sensitive_file_read_access_by_uncommon_process_filter`
how_to_implement: |-
To successfully implement this search, you must ingest Windows Security Event logs and track event code 4663.
To enable Event ID 4663, enable object access auditing through Group Policy: Computer Configuration > Windows Settings > Security Settings > Advanced Audit Policy Configuration > Audit Policies > Object Access > Audit File System, then enable Success auditing. Enable Failure auditing if your environment also requires denied access attempts.
Event ID 4663 is only generated for files with a matching System Access Control List (SACL), so configure auditing on the relevant sensitive files from cloud providers.
known_false_positives: |-
False positives are expected from legitimate tooling.
The detection excludes the Azure CLI bundled Python interpreter, Windows PowerShell, PowerShell 7+, VS Code, and the Azure Developer CLI by process path.
Residual false positives may arise from CI/CD agents (e.g., Azure DevOps self-hosted runners, GitHub Actions runners) that invoke az or Azure PowerShell from non-standard install paths not covered by the exclusion list, backup or DLP agents that scan user profile directories, and custom automation scripts that shell out to Azure CLI from an unexpected working directory.
Tune by adding confirmed-legitimate process paths and file paths to the companion filter macro windows_cloud_sensitive_file_read_access_by_uncommon_process_filter.
references:
- https://www.trendmicro.com/en_us/research/25/j/how-vidar-stealer-2-upgrades-infostealer-capabilities.html
intermediate_findings:
entities:
- field: dest
type: system
score: 20
message: An uncommon process [$process_name$] accessing sensitive file [$file_path$] with AccessMask [$AccessMask$] on $dest$
threat_objects:
- field: process_name
type: process_name
analytic_story:
- Vidar Stealer
asset_type: Endpoint
mitre_attack_id:
- T1528
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: search
`wineventlog_security`
EventCode=4663
ObjectType="File"
NOT process_path IN (
"*:\\AppData\\Local\\Programs\\Python\\*\\python.exe",
"*:\\AppData\\Local\\Python\\bin\\python.exe",
"*:\\AppData\\Local\\Python\\pythoncore-*\\python.exe",
"*:\\Program Files\\Azure Dev CLI\\azd.exe",
"*:\\Program Files\\Microsoft SDKs\\Azure\\CLI2\\python.exe",
"*:\\Program Files\\Microsoft VS Code\\Code.exe",
"*:\\Program Files\\nodejs\\node.exe",
"*:\\Program Files\\PowerShell\\7-preview\\pwsh.exe",
"*:\\Program Files\\PowerShell\\7\\pwsh.exe",
"*:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
"*:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
"*\\.azd\\bin\\azd.exe",
"*\\AppData\\Local\\Microsoft\\powershell\\pwsh.exe",
"*\\AppData\\Local\\Programs\\Azure Dev CLI\\azd.exe",
"*\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe"
)
ObjectName IN (
"*\\.azure\\accessTokens.json",
"*\\.azure\\azureProfile.json",
"*\\.azure\\msal_token_cache.json",
"*\\.azure\\TokenCache.dat",
"*\\Windows Azure Powershell\\TokenCache.dat"
)
Stage 2: eval
| eval AccessMask_ = tonumber(AccessMask, 16)
Stage 3: where
| where (bit_and(AccessMask_, 1) != 0)
Stage 4: stats
| stats count min(_time) as firstTime
max(_time) as lastTime
by signature_id signature
ObjectType file_path file_name
process_path process_name process_id
AccessMask src_user dest
Stage 5: search
| `security_content_ctime(firstTime)`
Stage 6: search
| `security_content_ctime(lastTime)`
Stage 7: search
| `windows_cloud_sensitive_file_read_access_by_uncommon_process_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
AccessMask_ | eq |
| field:"AccessMask_" kind:eq value:"1" |
EventCode | eq |
| field:"EventID" kind:eq value:"4663" |
ObjectName | in |
| field:"ObjectName" kind:in |
ObjectType | eq |
| field:"ObjectType" kind:eq value:"File" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
process_path | in | *:\AppData\Local\Programs\Python\*\python.exe, *:\AppData\Local\Python\bin\python.exe, *:\AppData\Local\Python\pythoncore-*\python.exe, *:\Program Files\Azure Dev CLI\azd.exe, *:\Program Files\Microsoft SDKs\Azure\CLI2\python.exe, *:\Program Files\Microsoft VS Code\Code.exe, *:\Program Files\PowerShell\7-preview\pwsh.exe, *:\Program Files\PowerShell\7\pwsh.exe, *:\Program Files\nodejs\node.exe, *:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe, *:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, *\.azd\bin\azd.exe, *\AppData\Local\Microsoft\powershell\pwsh.exe, *\AppData\Local\Programs\Azure Dev CLI\azd.exe, *\AppData\Local\Programs\Microsoft VS Code\Code.exe | excludes:process_path |
Windows Defender Disabled Detection (Sysmon)
#An attacker could disable security tools to avoid possible detection of their tools and activities. This can take the form of killing security software, real-time monitoring or Windows Defender Service
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Defense Impairment |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 13: RegistryEvent (Value Set) |
Rule Body
id: '1044.1071'
title: Windows Defender Disabled Detection
description: 'An attacker could disable security tools to avoid possible detection
of their tools and activities. This can take the form of killing security software,
real-time monitoring or Windows Defender Service. -- Threat Actor Association: FIN6,
FIN11, Magic Hound (aka APT35, Charming Kitten, Phosphorus, and Mint Sandstorm),
Vice Society, Wizard Spider -- Software Association: Bazarloader, BianLian, Blackbyte,
Black Basta, Clop, Conti, DirtyMoe, Lockbit, Sodinokibi/REvil, Vice Society, WhisperGates
-- #TrendingThreat #Russia #Ukraine - Atomics T1588.002 Test #1'
logic_format: Splunk
logic: ' `get_endpoint_data` `get_endpoint_data_sysmon` EventCode=13 AND (("WdNisDrv")
OR ("FirewallPolicy" AND "0x00000000")) | table _time, host, user dest, direction,
dvc, dvc_nt_host, event_id, eventtype, hashes, host, index, parent_process_id, process,
process_id, process_name, process_path, signature_id, source, sourcetype, tag, user_id
| bin span=60s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:impair defenses:disable or modify tools
technique_id:
- T1562.001
data_category:
- Windows Sysmon
references:
- https://github.com/swagkarna/Defeat-Defender
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_sysmon` EventCode=13 AND (("WdNisDrv") OR ("FirewallPolicy" AND "0x00000000"))
Stage 2: table
| table _time, host, user dest, direction, dvc, dvc_nt_host, event_id, eventtype, hashes, host,
index, parent_process_id, process, process_id, process_name, process_path, signature_id, source,
sourcetype, tag, user_id
Stage 3: bucket
| bin span=60s
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 value:"13" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "WdNisDrv" |
| 1 | "FirewallPolicy" |
| 1 | "0x00000000" |
Windows Impair Defenses Disable AV AutoStart via Registry
#The following analytic detects modifications to the registry related to the disabling of autostart functionality for certain antivirus products, such as Kingsoft and Tencent. Malware like ValleyRAT may alter specific registry keys to prevent these security tools from launching automatically at startup, thereby weakening system defenses. By monitoring changes in the registry entries associated with antivirus autostart settings, this detection enables security analysts to identify attempts to disable protective software. Detecting these modifications early is critical for maintaining system integrity and preventing further compromise by malicious actors.
Known False Positives
- No false positives have been identified at this time.
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 Impair Defenses Disable AV AutoStart via Registry
id: 31a13f43-812e-4752-a6ca-c6c87bf03e83
version: 13
creation_date: '2024-09-18'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects modifications to the registry related to the disabling of autostart functionality for certain antivirus products, such as Kingsoft and Tencent. Malware like ValleyRAT may alter specific registry keys to prevent these security tools from launching automatically at startup, thereby weakening system defenses. By monitoring changes in the registry entries associated with antivirus autostart settings, this detection enables security analysts to identify attempts to disable protective software. Detecting these modifications early is critical for maintaining system integrity and preventing further compromise by malicious actors.
data_source:
- Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Registry WHERE Registry.registry_path IN("*\\kingsoft\\antivirus\\KAVReport\\*" , "*\\kingsoft\\antivirus\\KSetting\\*", "*\\kingsoft\\antivirus\\Windhunter\\*" ,"*\\Tencent\\QQPCMgr\\*") AND ((Registry.registry_value_name IN("autostart","kxesc", "WindhunterSwitch") AND Registry.registry_value_data = "0x00000000") OR (Registry.registry_value_name = "WindhunterLevel" AND Registry.registry_value_data = "0x00000004")) 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_defenses_disable_av_autostart_via_registry_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting logs with the registry value name, registry path, and registry value data from your endpoints. If you are using Sysmon, you must have at least version 2.0 of the official Sysmon TA. https://splunkbase.splunk.com/app/5709
known_false_positives: No false positives have been identified at this time.
references:
- https://www.proofpoint.com/us/blog/threat-insight/chinese-malware-appears-earnest-across-cybercrime-threat-landscape
- https://www.fortinet.com/blog/threat-research/valleyrat-campaign-targeting-chinese-speakers
finding:
title: disable anti-virus autostart via registry on [$dest$].
entity:
field: user
type: user
score: 50
intermediate_findings:
entities:
- field: dest
type: system
score: 50
message: disable anti-virus autostart via registry on [$dest$].
analytic_story:
- Scattered Lapsus$ Hunters
- ValleyRAT
asset_type: Endpoint
mitre_attack_id:
- T1112
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: tstats
| tstats `security_content_summariesonly`
count
FROM datamodel=Endpoint.Registry
WHERE Registry.registry_path IN(
"*\\kingsoft\\antivirus\\KAVReport\\*" ,
"*\\kingsoft\\antivirus\\KSetting\\*",
"*\\kingsoft\\antivirus\\Windhunter\\*" ,
"*\\Tencent\\QQPCMgr\\*"
) AND (
(
Registry.registry_value_name IN("autostart","kxesc", "WindhunterSwitch")
AND Registry.registry_value_data = "0x00000000"
)
OR (
Registry.registry_value_name = "WindhunterLevel"
AND Registry.registry_value_data = "0x00000004"
)
)
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_defenses_disable_av_autostart_via_registry_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Registry.registry_path | in |
| field:"registry_path" kind:in |
Registry.registry_value_data | eq |
| field:"Details" kind:eq |
Registry.registry_value_name | eq |
| field:"registry_value_name" kind:eq value:"WindhunterLevel" |
Registry.registry_value_name | in |
| field:"registry_value_name" kind:in |
Windows Modify Registry Disable WinDefender Notifications
#The following analytic detects a suspicious registry modification aimed at disabling Windows Defender notifications. It leverages data from the Endpoint.Registry data model, specifically looking for changes to the registry path "*\SOFTWARE\Policies\Microsoft\Windows Defender Security Center\Notifications\DisableNotifications" with a value of "0x00000001". This activity is significant as it indicates an attempt to evade detection by disabling security alerts, a technique used by adversaries and malware like RedLine Stealer. If confirmed malicious, this could allow attackers to operate undetected, increasing the risk of further compromise and data exfiltration.
Known False Positives
- administrators may enable or disable this feature that may cause some false positive.
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 Modify Registry Disable WinDefender Notifications
id: 8e207707-ad40-4eb3-b865-3a52aec91f26
version: 12
creation_date: '2023-04-26'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects a suspicious registry modification aimed at disabling Windows Defender notifications. It leverages data from the Endpoint.Registry data model, specifically looking for changes to the registry path "*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender Security Center\\Notifications\\DisableNotifications" with a value of "0x00000001". This activity is significant as it indicates an attempt to evade detection by disabling security alerts, a technique used by adversaries and malware like RedLine Stealer. If confirmed malicious, this could allow attackers to operate undetected, increasing the risk of further compromise and data exfiltration.
data_source:
- Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path="*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender Security Center\\Notifications\\DisableNotifications" AND Registry.registry_value_data="0x00000001" by Registry.action Registry.dest Registry.process_guid Registry.process_id Registry.registry_hive Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.registry_value_name Registry.registry_value_type Registry.status Registry.user Registry.vendor_product | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `windows_modify_registry_disable_windefender_notifications_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Processes` node. In addition, confirm the latest CIM App 4.20 or higher is installed and the latest TA for the endpoint product.
known_false_positives: administrators may enable or disable this feature that may cause some false positive.
references:
- https://malpedia.caad.fkie.fraunhofer.de/details/win.redline_stealer
finding:
title: A registry modification to disable Windows Defender notification on $dest$
entity:
field: dest
type: system
score: 50
analytic_story:
- CISA AA23-347A
- RedLine Stealer
- SolarWinds WHD RCE Post Exploitation
asset_type: Endpoint
atomic_guid:
- 12e03af7-79f9-4f95-af48-d3f12f28a260
mitre_attack_id:
- T1112
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: tstats
| tstats `security_content_summariesonly`
count
min(_time) as firstTime
max(_time) as lastTime
from datamodel=Endpoint.Registry
where
Registry.registry_path="*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender Security Center\\Notifications\\DisableNotifications"
AND Registry.registry_value_data="0x00000001"
by
Registry.action
Registry.dest
Registry.process_guid
Registry.process_id
Registry.registry_hive
Registry.registry_path
Registry.registry_key_name
Registry.registry_value_data
Registry.registry_value_name
Registry.registry_value_type
Registry.status
Registry.user
Registry.vendor_product
Stage 2: search
| `drop_dm_object_name(Registry)`
Stage 3: search
| `security_content_ctime(lastTime)`
Stage 4: search
| `security_content_ctime(firstTime)`
Stage 5: search
| `windows_modify_registry_disable_windefender_notifications_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Registry.registry_path | eq |
| field:"registry_path" kind:eq value:"*\SOFTWARE\Policies\Microsoft\Windows Defender Security Center\Notifications\DisableNotifications" |
Registry.registry_value_data | eq |
| field:"Details" kind:eq value:"0x00000001" |
Windows SQL Server Extended Procedure DLL Loading Hunt
#This analytic detects when SQL Server loads DLLs to execute extended stored procedures. This is particularly important for security monitoring as it indicates the first-time use or version changes of potentially dangerous procedures like xp_cmdshell, sp_OACreate, and others. While this is a legitimate operation, adversaries may abuse these procedures for execution, discovery, or privilege escalation.
Known False Positives
- Legitimate administrative activity and normal database operations may trigger this detection. Common false positives include initial database startup and configuration, patch deployment and version updates, regular administrative tasks using extended stored procedures, and application servers that legitimately use OLE automation.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Execution | |
| Persistence |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| MSSQLSERVER | Event ID 8128 |
Rule Body
name: Windows SQL Server Extended Procedure DLL Loading Hunt
id: 182ba99f-2dde-4cdb-8e5c-e3b1e251cb10
version: 4
creation_date: '2025-02-13'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: Hunting
description: This analytic detects when SQL Server loads DLLs to execute extended stored procedures. This is particularly important for security monitoring as it indicates the first-time use or version changes of potentially dangerous procedures like xp_cmdshell, sp_OACreate, and others. While this is a legitimate operation, adversaries may abuse these procedures for execution, discovery, or privilege escalation.
data_source:
- Windows Event Log Application 8128
search: |-
`wineventlog_application` EventCode=8128
| rex field=EventData_Xml "<Data>(?<dll_name>[^<]+)</Data><Data>(?<dll_version>[^<]+)</Data><Data>(?<procedure_name>[^<]+)</Data>"
| rename host as dest
| eval dll_category=case( dll_name=="xpstar.dll", "Extended Procedures", dll_name=="odsole70.dll", "OLE Automation", dll_name=="xplog70.dll", "Logging Procedures", true(), "Other")
| stats count as execution_count, values(procedure_name) as procedures_used, latest(_time) as last_seen
BY dest dll_name dll_category
dll_version
| sort - execution_count
| `windows_sql_server_extended_procedure_dll_loading_hunt_filter`
how_to_implement: To successfully implement this detection, ensure Windows Event Log collection is enabled and collecting from the Application channel. SQL Server must be configured to log to the Windows Application log (enabled by default). The Splunk Windows TA is also required.
known_false_positives: Legitimate administrative activity and normal database operations may trigger this detection. Common false positives include initial database startup and configuration, patch deployment and version updates, regular administrative tasks using extended stored procedures, and application servers that legitimately use OLE automation.
references:
- https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/general-extended-stored-procedures-transact-sql
- https://learn.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms175543(v=sql.105)
- https://learn.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/using-extended-stored-procedures
analytic_story:
- SQL Server Abuse
asset_type: Windows
mitre_attack_id:
- T1505.001
- T1059.009
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: search
`wineventlog_application` EventCode=8128
Stage 2: rex
| rex field=EventData_Xml
"<Data>(?<dll_name>[^<]+)</Data><Data>(?<dll_version>[^<]+)</Data><Data>(?<procedure_name>[^<]+)</Data>"
Stage 3: rename
| rename host as dest
Stage 4: eval
| eval
dll_category=case(
dll_name=="xpstar.dll", "Extended Procedures",
dll_name=="odsole70.dll", "OLE Automation",
dll_name=="xplog70.dll", "Logging Procedures",
true(), "Other"
)
dll_category =dll_name="xpstar.dll""Extended Procedures"dll_name="odsole70.dll""OLE Automation"dll_name="xplog70.dll""Logging Procedures""Other"Stage 5: stats
| stats
count as execution_count,
values(procedure_name) as procedures_used,
latest(_time) as last_seen
BY dest dll_name dll_category
dll_version
Stage 6: sort
| sort - execution_count
Stage 7: search
| `windows_sql_server_extended_procedure_dll_loading_hunt_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"8128" |
WMI subscription execution (Sysmon)
#Adversaries may establish persistence and elevate privileges by executing malicious content triggered by a Windows Management Instrumentation (WMI) event subscription
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Execution | |
| Persistence | |
| Privilege Escalation |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
Rule Body
id: '5975.18225'
title: WMI subscription execution
description: 'Adversaries may establish persistence and elevate privileges by executing
malicious content triggered by a Windows Management Instrumentation (WMI) event
subscription. -- Threat Actor Association: APT29, Metador, Mustang Panda (aka. Stately
Taurus//Earth Preta/BRONZE PRESIDENT/TA416/RedDelta), TA551 - Software Association:
BumbleBee, TargetCompany, TrailBlazer, Trickbot -- Atomics T1047 Test#7 Atomics
T1047 Test#8 Atomics T1047 Test#9 -- While this use case can detect the above atomics,
it is not mapped to its MITRE execution techniques due to adversaries utilizing
this method of WMI for Privilege-Escalation and Persistence.'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` ("EventCode=1" OR "<EventID>1<")
TERM(WmiPrvSE) | regex parent_process_name="(?i)(WmiPrvSE)" | table _time, host,
user parent_*, process, process_*, signature_id | bin span=1s | stats values(*)
as * by _time, host '
techniques:
- persistence:event triggered execution:windows management instrumentation event subscription
- execution:windows management instrumentation
- privilege-escalation:event triggered execution:windows management instrumentation
event subscription
technique_id:
- T1546.003
- T1047
data_category:
- Windows Sysmon
references:
- https://pentestlab.blog/2020/01/21/persistence-wmi-event-subscription/
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_sysmon` ("EventCode=1" OR "<EventID>1<") TERM(WmiPrvSE)
Stage 2: regex
| regex parent_process_name="(?i)(WmiPrvSE)"
Stage 3: table
| table _time, host, user parent_*, process, process_*, signature_id
Stage 4: bucket
| bin span=1s
Stage 5: stats
| stats values(*) as * by _time, host
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
parent_process_name | regex_match |
| field:"parent_process_name" kind:regex_match value:"(?i)(WmiPrvSE)" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "EventCode=1" |
| 1 | "<EventID>1<" |
| 1 | WmiPrvSE |