Detection rules › Splunk

Splunk rules: 0r

AWS IAM AccessDenied Discovery Events

#
Status
production
Severity
low
Group by
aws::awsRegion, aws::recipientAccountId, src, user, vendor_product
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

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

TacticTechniques
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

#
Status
production
Severity
low
Group by
Potentially_Exfiltrated, action, dest, src, transport
Author
Nasreddine Bencherchali, Splunk
Source
github.com/splunk/security_content

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.

Detect AWS Console Login by User from New Country

#
Status
production
Group by
src, user
Author
Bhavin Patel, Eric McGinnis Splunk
Source
github.com/splunk/security_content

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

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 =
1."New Country"
-"Previously Seen Country"(default)

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.

Search Terms

These SPL tokens match against raw event text.

StageTerm
2iplocation
2Authentication.src

Detect Password Spray Attempts

#
Status
production
Severity
medium
Group by
_time, app, authentication_method, counter, dest, event_action, signature, signature_id, sourcetype, src, unique_accounts
Author
Dean Luxton
Source
github.com/splunk/security_content

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

TacticTechniques
Credential Access

Telemetry Coverage

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 =
ifunique_accounts > 30 AND unique_accounts >= upperBound1
else0

Stage 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.

FieldKindValuesSearch
Authentication.actioneq
  • failure corpus 5 (splunk 5)
field:"event_action" kind:eq value:"failure"
isOutliereq
  • 1 corpus 33 (splunk 33)
field:"isOutlier" kind:eq value:"1"

Exclusions

The rule actively suppresses these predicates.

Search Terms

These SPL tokens match against raw event text.

StageTerm
16foreach
16*

Dotnet.exe Execution (Windows Event Log)

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

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

References

Telemetry Coverage

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.

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

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"dotnet"

Get ADUser with PowerShell Script Block

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

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

Telemetry Coverage

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.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTexteq
  • *-filter* corpus 3 (sigma 2, splunk 1)
  • *get-aduser* corpus 4 (sigma 2, splunk 2)
field:"ScriptBlockText" kind:eq

Gsuite Suspicious Shared File Name

#
Status
experimental
Severity
low
Group by
"parameters.doc_title", "parameters.doc_type", "parameters.owner", "parameters.target_user", email, phase, severity
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects shared files in Google Drive with suspicious filenames commonly used in spear phishing campaigns. It leverages GSuite Drive logs to identify documents with titles that include keywords like "dhl," "ups," "invoice," and "shipment." This activity is significant because such filenames are often used to lure users into opening malicious documents or clicking harmful links. If confirmed malicious, this activity could lead to unauthorized access, data theft, or further compromise of the user's system.

Known False Positives

  • normal user or normal transaction may contain the subject and file type attachment that this detection try to search

MITRE ATT&CK Coverage

TacticTechniques
Initial Access

Telemetry Coverage

PlatformRecord / event type
Google Workspaceany: Drive (any event)

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: Gsuite Suspicious Shared File Name
id: 07eed200-03f5-11ec-98fb-acde48001122
version: 12
creation_date: '2021-08-23'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: experimental
type: Anomaly
description: The following analytic detects shared files in Google Drive with suspicious filenames commonly used in spear phishing campaigns. It leverages GSuite Drive logs to identify documents with titles that include keywords like "dhl," "ups," "invoice," and "shipment." This activity is significant because such filenames are often used to lure users into opening malicious documents or clicking harmful links. If confirmed malicious, this activity could lead to unauthorized access, data theft, or further compromise of the user's system.
data_source:
    - G Suite Drive
search: |-
    `gsuite_drive` parameters.owner_is_team_drive=false "parameters.doc_title" IN ("*dhl*", "* ups *", "*delivery*", "*parcel*", "*label*", "*invoice*", "*postal*", "*fedex*", "* usps *", "* express *", "*shipment*", "*Banking/Tax*","*shipment*", "*new order*") parameters.doc_type IN ("document","pdf", "msexcel", "msword", "spreadsheet", "presentation")
      | rex field=parameters.owner "[^@]+@(?<source_domain>[^@]+)"
      | rex field=parameters.target_user "[^@]+@(?<dest_domain>[^@]+)"
      | where not source_domain="internal_test_email.com" and dest_domain="internal_test_email.com"
      | eval phase="plan"
      | eval severity="low"
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY email parameters.owner parameters.target_user
           parameters.doc_title parameters.doc_type phase
           severity
      | rename parameters.target_user AS user
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `gsuite_suspicious_shared_file_name_filter`
how_to_implement: To successfully implement this search, you need to be ingesting logs related to gsuite having the file attachment metadata like file type, file extension, source email, destination email, num of attachment and etc. In order for the search to work for your environment, please edit the query to use your company specific email domain instead of `internal_test_email.com`.
known_false_positives: normal user or normal transaction may contain the subject and file type attachment that this detection try to search
references:
    - https://www.redhat.com/en/topics/devops/what-is-devsecops
    - https://www.mandiant.com/resources/top-words-used-in-spear-phishing-attacks
intermediate_findings:
    entities:
        - field: email
          type: user
          score: 20
          message: suspicious share gdrive from $parameters.owner$ to $email$ namely as $parameters.doc_title$
        - field: parameters.owner
          type: user
          score: 20
          message: suspicious share gdrive from $parameters.owner$ to $email$ namely as $parameters.doc_title$
analytic_story:
    - Dev Sec Ops
asset_type: GSuite
mitre_attack_id:
    - T1566.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: endpoint

Stages and Predicates

Stage 1: search

`gsuite_drive` parameters.owner_is_team_drive=false "parameters.doc_title" IN (
    "*dhl*",
    "* ups *",
    "*delivery*",
    "*parcel*",
    "*label*",
    "*invoice*",
    "*postal*",
    "*fedex*",
    "* usps *",
    "* express *",
    "*shipment*",
    "*Banking/Tax*",
    "*shipment*",
    "*new order*"
) parameters.doc_type IN ("document","pdf", "msexcel", "msword", "spreadsheet", "presentation")

Stage 2: rex

| rex field=parameters.owner "[^@]+@(?<source_domain>[^@]+)"

Stage 3: rex

| rex field=parameters.target_user "[^@]+@(?<dest_domain>[^@]+)"

Stage 4: where

| where not source_domain="internal_test_email.com" and dest_domain="internal_test_email.com"

Stage 5: eval

| eval phase="plan"

Stage 6: eval

| eval severity="low"

Stage 7: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY email parameters.owner parameters.target_user
       parameters.doc_title parameters.doc_type phase
       severity

Stage 8: rename

| rename parameters.target_user AS user

Stage 9: search

| `security_content_ctime(firstTime)`

Stage 10: search

| `security_content_ctime(lastTime)`

Stage 11: search

| `gsuite_suspicious_shared_file_name_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
dest_domaineq
  • internal_test_email.com corpus 3 (splunk 3)
field:"dest_domain" kind:eq value:"internal_test_email.com"
parameters.doc_titlein
  • * express *
  • * ups *
  • * usps *
  • *Banking/Tax*
  • *delivery*
  • *dhl*
  • *fedex*
  • *invoice*
  • *label*
  • *new order*
  • *parcel*
  • *postal*
  • *shipment*
field:"parameters.doc_title" kind:in
parameters.doc_typein
  • document
  • msexcel
  • msword
  • pdf
  • presentation
  • spreadsheet
field:"parameters.doc_type" kind:in
parameters.owner_is_team_driveeq
  • false
field:"parameters.owner_is_team_drive" kind:eq value:"false"
sourcetypeeq
  • gws:reports:drive corpus 3 (splunk 3)
field:"sourcetype" kind:eq value:"gws:reports:drive"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
source_domaineqinternal_test_email.comexcludes:source_domain field:"source_domain" value:"internal_test_email.com"

HTTP Malware User Agent

#
Status
production
Severity
medium
Group by
Web.src, Web.url_length, c-uri, c-useragent, cs-host, cs-method, dest, http_user_agent, malware, src, url
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

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

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
Lookup table
malware_user_agents
Key field
malware_user_agent as http_user_agent
Output columns
['malware', '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.

Linux Clipboard Data Copy

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

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

TacticTechniques
Collection

Telemetry Coverage

PlatformRecord / event type
LinuxEvent 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.

FieldKindValuesSearch
Processes.processin
  • *-o * corpus 3 (splunk 3)
  • *-sel *
  • *-selection *
  • *clip *
  • *clipboard*
field:"CommandLine" kind:in
Processes.process_nameeq
  • xclip
field:"process_basename" kind:eq value:"xclip"

Linux Impair Defenses Process Kill

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

The following analytic 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

TacticTechniques
Defense Impairment

Telemetry Coverage

PlatformRecord / event type
LinuxEvent 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.

FieldKindValuesSearch
Processes.processeq
  • *pkill *
field:"CommandLine" kind:eq value:"*pkill *"
Processes.process_namein
  • pgrep corpus 2 (elastic 1, splunk 1)
  • pkill corpus 2 (elastic 1, splunk 1)
field:"process_basename" kind:in

Microsoft Build Engine Suspicious Parent Process (Windows Event Log)

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

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

MITRE ATT&CK Coverage

References

Telemetry Coverage

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.

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

Search Terms

These SPL tokens match against raw event text.

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

Mimikatz Execution (Windows Event Log)

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

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

References

Telemetry Coverage

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.

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

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"mimikatz.exe"
1"sekurlsa::logonpasswords"
1"sekurlsa::pth"
1"sekurlsa::tickets"
1"lsadump::lsa"

Multiple nslookup commands (Windows Event Log)

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

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

MITRE ATT&CK Coverage

References

Telemetry Coverage

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.

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

Search Terms

These SPL tokens match against raw event text.

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

Potential Cryptomining Commands (Windows Event Log)

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

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

MITRE ATT&CK Coverage

TacticTechniques
Impact

References

Telemetry Coverage

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.

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

Exclusions

The rule actively suppresses these predicates.

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

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>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)

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

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

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent 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.

FieldKindValuesSearch
EventCodeeq
  • 1 corpus 226 (splunk 226)
field:"EventID" kind:eq value:"1"
processregex_match
  • (?i)System.Net.WebClient.+.Download(file|string) corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)System.Net.WebClient.+.Download(file|string)"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
processregex_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.

StageTerm
1"<EventID>1<"
1"downloadfile"
1"downloadstring"
1"System.Net.WebClient"

Read-Only Attribute Removed - Windows (Windows Event Log)

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

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

MITRE ATT&CK Coverage

References

Telemetry Coverage

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.

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

Search Terms

These SPL tokens match against raw event text.

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

Steal or Forge Authentication Certificates Behavior Identified

#
Status
production
Severity
informational
Group by
All_Risk.annotations.mitre_attack.mitre_tactic, All_Risk.risk_object, All_Risk.risk_object_type
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

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

TacticTechniques
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.

System Enumeration with WMIC (Windows Event Log)

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

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

MITRE ATT&CK Coverage

References

Telemetry Coverage

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.

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

Search Terms

These SPL tokens match against raw event text.

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

System Info Gathering Using Dxdiag Application

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

The following analytic 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

TacticTechniques
Reconnaissance

Telemetry Coverage

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.

Windows AD GPO New CSE Addition

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

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

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
Lookup table
msad_guid_lookup
Key field
guid as new_values
Output columns
['displayName', 'policyType']

Stage 9: eval

| eval newPolicy=if(policyType like "%",policyType,new_values)
newPolicy =
iflike(policyType, "%")policyType
elsenew_values

Stage 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.

FieldKindValuesSearch
AttributeLDAPDisplayNameeq
  • gPCMachineExtensionNames corpus 7 (sigma 3, elastic 3, splunk 1)
field:"AttributeLDAPDisplayName" kind:eq value:"gPCMachineExtensionNames"
EventCodeeq
  • 5136 corpus 25 (splunk 24, elastic 1)
field:"EventID" kind:eq value:"5136"
ObjectClasseq
  • groupPolicyContainer corpus 6 (sigma 3, splunk 3)
field:"ObjectClass" kind:eq value:"groupPolicyContainer"
admonEventTypeeq
  • Update corpus 5 (splunk 5)
field:"admonEventType" kind:eq value:"Update"
new_valuesregex_match
  • ^{[A-Z | \d]+\-[A-Z | \d]+\-[A-Z | \d]+\-[A-Z | \d]+\-[A-Z | \d]+}
field:"new_values" kind:regex_match value:"^{[A-Z | \d]+\-[A-Z | \d]+\-[A-Z | \d]+\-[A-Z | \d]+\-[A-Z | \d]+}"
objectCategoryeq
  • CN=Group-Policy-Container* corpus 3 (splunk 3)
field:"objectCategory" kind:eq value:"CN=Group-Policy-Container*"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
new_valuesinold_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

#
Status
production
Severity
low
Group by
ObjectType, access_mask, dest, file_name, process_id, process_name, signature, signature_id, target_filename, user
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

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

TacticTechniques
Credential Access

Telemetry Coverage

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.

FieldKindValuesSearch
AccessMask_eq
  • 1 transforms: binary_and_any corpus 2 (splunk 2)
field:"AccessMask_" kind:eq value:"1"
EventCodeeq
  • 4663 corpus 31 (splunk 31)
field:"EventID" kind:eq value:"4663"
ObjectNamein
  • *\.azure\TokenCache.dat
  • *\.azure\accessTokens.json
  • *\.azure\azureProfile.json
  • *\.azure\msal_token_cache.json
  • *\Windows Azure Powershell\TokenCache.dat
field:"ObjectName" kind:in
ObjectTypeeq
  • File corpus 12 (sigma 8, splunk 4)
field:"ObjectType" kind:eq value:"File"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process_pathin*:\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.exeexcludes:process_path

Windows Defender Disabled Detection (Sysmon)

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

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

TacticTechniques
Defense Impairment

References

Telemetry Coverage

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.

FieldKindValuesSearch
EventCodeeq
  • 13 corpus 18 (splunk 18)
field:"EventID" kind:eq value:"13"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"WdNisDrv"
1"FirewallPolicy"
1"0x00000000"

Windows Impair Defenses Disable AV AutoStart via Registry

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

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

TacticTechniques
Persistence
Defense Impairment

Telemetry Coverage

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.

FieldKindValuesSearch
Registry.registry_pathin
  • *\Tencent\QQPCMgr\*
  • *\kingsoft\antivirus\KAVReport\*
  • *\kingsoft\antivirus\KSetting\*
  • *\kingsoft\antivirus\Windhunter\*
field:"registry_path" kind:in
Registry.registry_value_dataeq
  • 0x00000000 corpus 41 (splunk 33, elastic 8)
  • 0x00000004 corpus 4 (elastic 2, splunk 2)
field:"Details" kind:eq
Registry.registry_value_nameeq
  • WindhunterLevel
field:"registry_value_name" kind:eq value:"WindhunterLevel"
Registry.registry_value_namein
  • WindhunterSwitch
  • autostart
  • kxesc
field:"registry_value_name" kind:in

Windows Modify Registry Disable WinDefender Notifications

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

The following analytic detects a 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

TacticTechniques
Persistence
Defense Impairment

Telemetry Coverage

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.

FieldKindValuesSearch
Registry.registry_patheq
  • *\SOFTWARE\Policies\Microsoft\Windows Defender Security Center\Notifications\DisableNotifications
field:"registry_path" kind:eq value:"*\SOFTWARE\Policies\Microsoft\Windows Defender Security Center\Notifications\DisableNotifications"
Registry.registry_value_dataeq
  • 0x00000001 corpus 61 (splunk 52, elastic 9)
field:"Details" kind:eq value:"0x00000001"

Windows Process Execution From RDP Share

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

The following analytic identifies process executions originating from RDP shares on Windows endpoints. Remote Desktop Protocol (RDP) shares, typically accessed via the "tsclient" path, allow users to share files between their local machine and a remote desktop session. However, threat actors may exploit RDP shares to execute malicious processes or transfer harmful files onto a compromised system. This detection focuses on identifying any process executions that originate from RDP shares, which could indicate unauthorized access or malicious activity. Security teams should investigate any instances of such process executions, especially if they are found on systems that should not be using RDP shares or if the executed processes are unfamiliar or suspicious.

Known False Positives

  • Legitimate use of RDP shares by users to transfer and execute files may trigger this detection. It is essential to review the context of the process execution to determine if it is authorized activity.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Process Execution From RDP Share
id: 6b1b84c4-3834-4dee-b062-9b79bdb31d15
version: 5
creation_date: '2025-10-24'
modification_date: '2026-05-13'
author: Nasreddine Bencherchali, Splunk
status: production
type: Anomaly
description: |
    The following analytic identifies process executions originating from RDP shares on Windows endpoints.
    Remote Desktop Protocol (RDP) shares, typically accessed via the "tsclient" path, allow users to share files between their local machine and a remote desktop session. However, threat actors may exploit RDP shares to execute malicious processes or transfer harmful files onto a compromised system.
    This detection focuses on identifying any process executions that originate from RDP shares, which could indicate unauthorized access or malicious activity.
    Security teams should investigate any instances of such process executions, especially if they are found on systems that should not be using RDP shares or if the executed processes are unfamiliar or suspicious.
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 = "*\\\\tsclient\\*"

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

    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_process_execution_from_rdp_share_filter`
how_to_implement: |
    The detection is based on data that originates from Endpoint Detection
    and Response (EDR) agents. These agents are designed to provide security-related
    telemetry from the endpoints where the agent is installed. To implement this search,
    you must ingest logs that contain the process GUID, process name, and parent process.
    Additionally, you must ingest complete command-line executions. These logs must
    be processed using the appropriate Splunk Technology Add-ons that are specific to
    the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint`
    data model. Use the Splunk Common Information Model (CIM) to normalize the field
    names and speed up the data modeling process.
known_false_positives: |
    Legitimate use of RDP shares by users to transfer and execute files may trigger
    this detection. It is essential to review the context of the process execution
    to determine if it is authorized activity.
references:
    - https://jsac.jpcert.or.jp/archive/2024/pdf/JSAC2024_2_7_hara_shoji_higashi_vickie-su_nick-dai_en.pdf
    - https://thedfirreport.com/2020/04/04/gogoogle-ransomware/
    - https://www.welivesecurity.com/2022/09/30/amazon-themed-campaigns-lazarus-netherlands-belgium/
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Process $process_name$ executed $process$ from RDP share on host $dest$
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process_name
      type: process_name
analytic_story:
    - Hidden Cobra Malware
asset_type: Endpoint
mitre_attack_id:
    - T1021.001
    - T1105
    - T1059
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 = "*\\\\tsclient\\*"
  by
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_process_execution_from_rdp_share_filter`

Indicators

These rows show field, operator, and value matches.

Windows SQL Server Extended Procedure DLL Loading Hunt

#
Status
production
Group by
dest, dll_category, dll_name, dll_version
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

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

Telemetry Coverage

ProviderRecord / event type
MSSQLSERVEREvent 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 =
ifdll_name="xpstar.dll""Extended Procedures"
elifdll_name="odsole70.dll""OLE Automation"
elifdll_name="xplog70.dll""Logging Procedures"
else"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.

WMI subscription execution (Sysmon)

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

Adversaries may establish persistence and elevate privileges by executing malicious content triggered by a Windows Management Instrumentation (WMI) event subscription

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent 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.

FieldKindValuesSearch
parent_process_nameregex_match
  • (?i)(WmiPrvSE) corpus 2 (splunk 2)
field:"parent_process_name" kind:regex_match value:"(?i)(WmiPrvSE)"

Search Terms

These SPL tokens match against raw event text.

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

Back to all Splunk rules