Detection rules › Elastic

Elastic rules: 2y

Attempt to Deactivate an Okta Network Zone

#
Status
production
Severity
medium
Author
Elastic
Source
github.com/elastic/detection-rules

Detects attempts to deactivate an Okta network zone. Okta network zones can be configured to limit or restrict access to a network based on IP addresses or geolocations. An adversary may attempt to modify, delete, or deactivate an Okta network zone in order to remove or weaken an organization's security controls.

Known False Positives

  • Consider adding exceptions to this rule to filter false positives if your organization's Okta network zones are regularly modified.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

[metadata]
creation_date = "2020/11/06"
integration = ["okta"]
maturity = "production"
updated_date = "2026/04/10"

[rule]
author = ["Elastic"]
description = """
Detects attempts to deactivate an Okta network zone. Okta network zones can be configured to limit or restrict access to
a network based on IP addresses or geolocations. An adversary may attempt to modify, delete, or deactivate an Okta
network zone in order to remove or weaken an organization's security controls.
"""
false_positives = [
    """
    Consider adding exceptions to this rule to filter false positives if your organization's Okta network zones are
    regularly modified.
    """,
]
index = ["filebeat-*", "logs-okta*"]
language = "kuery"
license = "Elastic License v2"
name = "Attempt to Deactivate an Okta Network Zone"
note = """## Triage and analysis

### Investigating Attempt to Deactivate an Okta Network Zone

The Okta network zones can be configured to restrict or limit access to a network based on IP addresses or geolocations. Deactivating a network zone in Okta may remove or weaken the security controls of an organization, which might be an indicator of an adversary's attempt to evade defenses.

#### Possible investigation steps

- Identify the actor related to the alert by reviewing the `okta.actor.id`, `okta.actor.type`, `okta.actor.alternate_id`, or `okta.actor.display_name` fields.
- Examine the `event.action` field to confirm the deactivation of a network zone.
- Check the `okta.target.id`, `okta.target.type`, `okta.target.alternate_id`, or `okta.target.display_name` to identify the network zone that was deactivated.
- Investigate the `event.time` field to understand when the event happened.
- Review the actor's activities before and after the event to understand the context of this event.

### False positive analysis

- Check the `okta.client.user_agent.raw_user_agent` field to understand the device and software used by the actor. If these match the actor's normal behavior, it might be a false positive.
- Check if the actor is a known administrator or part of the IT team who might have a legitimate reason to deactivate a network zone.
- Verify the actor's actions with any known planned changes or maintenance activities.

### Response and remediation

- If unauthorized access or actions are confirmed, immediately lock the affected actor account and require a password change.
- Re-enable the deactivated network zone if it was deactivated without authorization.
- Review and update the privileges of the actor who initiated the deactivation.
- Check the security policies and procedures to identify any gaps and update them as necessary.
- Implement additional monitoring and logging of Okta events to improve visibility of user actions.
- Communicate and train the employees about the importance of following proper procedures for modifying network zone settings.

## Setup

The Okta Fleet integration, Filebeat module, or similarly structured data is required to be compatible with this rule."""
references = [
    "https://help.okta.com/en/prod/Content/Topics/Security/network/network-zones.htm",
    "https://developer.okta.com/docs/reference/api/system-log/",
    "https://developer.okta.com/docs/reference/api/event-types/",
    "https://www.elastic.co/security-labs/testing-okta-visibility-and-detection-dorothy",
    "https://www.elastic.co/security-labs/monitoring-okta-threats-with-elastic-security",
    "https://www.elastic.co/security-labs/starter-guide-to-understanding-okta",
]
risk_score = 47
rule_id = "8a5c1e5f-ad63-481e-b53a-ef959230f7f1"
severity = "medium"
tags = [
    "Use Case: Identity and Access Audit",
    "Data Source: Okta",
    "Use Case: Network Security Monitoring",
    "Tactic: Defense Evasion",
    "Resources: Investigation Guide",
]
timestamp_override = "event.ingested"
type = "query"

query = '''
data_stream.dataset:okta.system and event.action:zone.deactivate
'''


[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1484"
name = "Domain or Tenant Policy Modification"
reference = "https://attack.mitre.org/techniques/T1484/"

[[rule.threat.technique.subtechnique]]
id = "T1484.002"
name = "Trust Modification"
reference = "https://attack.mitre.org/techniques/T1484/002/"

[[rule.threat.technique]]
id = "T1562"
name = "Impair Defenses"
reference = "https://attack.mitre.org/techniques/T1562/"

[[rule.threat.technique.subtechnique]]
id = "T1562.007"
name = "Disable or Modify Cloud Firewall"
reference = "https://attack.mitre.org/techniques/T1562/007/"

[rule.threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"

Stages and Predicates

Stage 1: query

data_stream.dataset:okta.system and event.action:zone.deactivate

Indicators

These rows show field, operator, and value matches.

AWS IAM Long-Term Access Key Correlated with Elevated Detection Alerts

#
Status
production
Severity
high
Time window
6m
Group by
source.ip
Author
Elastic
Source
github.com/elastic/detection-rules

Correlates open detection alerts that share the same long-term IAM access key ID ( prefix AKIA). It fires when the rule AWS Long-Term Access Key First Seen from Source IP (rule_id: 9f8e3c5e-f72e-4e91-93f6-e98a4fae3e4f) has triggered for that key and at least one other open alert for the same key is medium, high, or critical severity. This higher-order rule helps prioritize long-term key novelty when it co-occurs with elevated detections that may indicate post-compromise activity.

Known False Positives

  • The same automation identity may legitimately trigger a first-seen-IP alert and unrelated medium-or-higher findings in the same window (for example, a noisy compliance rule). Review sibling `kibana.alert.rule.name` values, rule tags, and CloudTrail context for the access key before escalating.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access
Credential Access

Rule Body

[metadata]
creation_date = "2026/04/06"
integration = ["aws"]
maturity = "production"
updated_date = "2026/07/20"
min_stack_comments = "Changing min stack to 9.3.0, the latest minimum supported version for 9.X releases."
min_stack_version = "9.3.0"

[rule]
author = ["Elastic"]
description = """
Correlates open detection alerts that share the same long-term IAM access key ID ( prefix AKIA). It fires when the rule
AWS Long-Term Access Key First Seen from Source IP (rule_id: 9f8e3c5e-f72e-4e91-93f6-e98a4fae3e4f) has triggered for
that key and at least one other open alert for the same key is medium, high, or critical severity. This higher-order
rule helps prioritize long-term key novelty when it co-occurs with elevated detections that may indicate post-compromise
activity.
"""
false_positives = [
    """
    The same automation identity may legitimately trigger a first-seen-IP alert and unrelated medium-or-higher findings
    in the same window (for example, a noisy compliance rule). Review sibling `kibana.alert.rule.name` values, rule
    tags, and CloudTrail context for the access key before escalating.
    """,
]
from = "now-6m"
language = "esql"
license = "Elastic License v2"
name = "AWS IAM Long-Term Access Key Correlated with Elevated Detection Alerts"
note = """## Triage and analysis

### Investigating AWS IAM Long-Term Access Key Correlated with Elevated Detection Alerts

This is a [higher-order](https://www.elastic.co/guide/en/security/current/rules-ui-create.html) rule. It evaluates **open** signals in `.alerts-security.*` grouped by
`aws.cloudtrail.user_identity.access_key_id`. A match requires:

1. At least one alert from **AWS Long-Term Access Key First Seen from Source IP** (`kibana.alert.rule.rule_id` **9f8e3c5e-f72e-4e91-93f6-e98a4fae3e4f**).
2. At least one **different** alert on the **same access key** with **medium or higher** severity, implemented as
   `kibana.alert.risk_score >= 47` or `kibana.alert.severity` in `medium`, `high`, or `critical`.

### Possible investigation steps

- **`Esql.alert_count_long_term_key_new_ip_rule`**: Confirm the first-seen-IP rule contributed to the correlation.
- **`Esql.alert_count_other_elevated`**: Count of sibling alerts meeting the elevated threshold (excluding the long-term-key new-IP rule).
- **`Esql.kibana_alert_rule_name_values`** / **`Esql.kibana_alert_rule_id_values`**: Identify which rules fired; map tactics and whether activity looks like post-compromise follow-through.
- **`aws.cloudtrail.user_identity.access_key_id`**: Pivot in CloudTrail and IAM (last used, attached policies, user or root context).
- **`Esql.aws_cloudtrail_user_identity_arn_values`**, **`Esql.source_ip_values`**: Reconstruct session context across alerts.

### False positive analysis

- Overlapping scheduled jobs, penetration tests, or purple-team runs that reuse the same IAM access key across many detectors.
- Custom rules calibrated with **medium** severity but **low** risk scores still qualify via `kibana.alert.severity`.

### Response and remediation

- Treat as elevated priority versus the standalone first-seen-IP rule: rotate or disable the access key if abuse is suspected,
  scope CloudTrail for the key, and review open sibling alerts to closure.

### Additional information

- Default risk score to severity mapping in Elastic Security is commonly **21** low, **47** medium, **73** high, **99** critical; confirm in your deployment if customized.

"""
references = [
    "https://kudelskisecurity.com/research/investigating-two-variants-of-the-trivy-supply-chain-compromise",
]
risk_score = 73
rule_id = "98cfaa44-83f0-4aba-90c4-363fb9d51a75"
severity = "high"
tags = [
    "Domain: Cloud",
    "Data Source: AWS",
    "Data Source: Amazon Web Services",
    "Data Source: AWS CloudTrail",
    "Data Source: AWS IAM",
    "Use Case: Threat Detection",
    "Tactic: Credential Access",
    "Tactic: Initial Access",
    "Resources: Investigation Guide",
    "Rule Type: Higher-Order Rule",
]
timestamp_override = "event.ingested"
type = "esql"

query = '''
from .alerts-security.* METADATA _id, _version, _index

// Sibling rule: AWS Long-Term Access Key First Seen from Source IP
// rule_id = 9f8e3c5e-f72e-4e91-93f6-e98a4fae3e4f

| where kibana.alert.workflow_status == "open"
    and event.kind == "signal"
    and source.ip is not null
    and kibana.alert.rule.name is not null
    and not kibana.alert.rule.type in ("threat_match", "machine_learning")
    and not kibana.alert.rule.name like "Deprecated - *"
    and not KQL("""kibana.alert.rule.tags : "Rule Type: Higher-Order Rule" """)
    and (
        kibana.alert.rule.rule_id == "9f8e3c5e-f72e-4e91-93f6-e98a4fae3e4f"
        or kibana.alert.risk_score >= 47
        or kibana.alert.severity in ("medium", "high", "critical")
    )

| eval Esql.is_long_term_key_new_ip_rule = kibana.alert.rule.rule_id == "9f8e3c5e-f72e-4e91-93f6-e98a4fae3e4f"
| eval Esql.is_other_elevated_rule = kibana.alert.rule.rule_id != "9f8e3c5e-f72e-4e91-93f6-e98a4fae3e4f"
    and (
        kibana.alert.risk_score >= 47
        or kibana.alert.severity in ("medium", "high", "critical")
    )

| stats
    Esql.alert_count_long_term_key_new_ip_rule = SUM(CASE(Esql.is_long_term_key_new_ip_rule, 1, 0)),
    Esql.alert_count_other_elevated_rule = SUM(CASE(Esql.is_other_elevated_rule, 1, 0)),
    Esql.kibana_alert_rule_name_values = VALUES(kibana.alert.rule.name),
    Esql.kibana_alert_rule_id_values = VALUES(kibana.alert.rule.rule_id),
    Esql.kibana_alert_risk_score_values = VALUES(kibana.alert.risk_score),
    Esql.kibana_alert_severity_values = VALUES(kibana.alert.severity),
    Esql.user_entity_id_values = VALUES(user.entity.id),
    Esql.timestamp_min = MIN(@timestamp),
    Esql.timestamp_max = MAX(@timestamp)
  by source.ip

| where Esql.alert_count_long_term_key_new_ip_rule > 0
    and Esql.alert_count_other_elevated_rule > 0

| keep
    source.ip,
    Esql.alert_count_long_term_key_new_ip_rule,
    Esql.alert_count_other_elevated_rule,
    Esql.kibana_alert_rule_name_values,
    Esql.kibana_alert_rule_id_values,
    Esql.kibana_alert_risk_score_values,
    Esql.kibana_alert_severity_values,
    Esql.user_entity_id_values,
    Esql.timestamp_min,
    Esql.timestamp_max
'''


[[rule.threat]]
framework = "MITRE ATT&CK"
[[rule.threat.technique]]
id = "T1552"
name = "Unsecured Credentials"
reference = "https://attack.mitre.org/techniques/T1552/"


[rule.threat.tactic]
id = "TA0006"
name = "Credential Access"
reference = "https://attack.mitre.org/tactics/TA0006/"

[[rule.threat]]
framework = "MITRE ATT&CK"
[[rule.threat.technique]]
id = "T1078"
name = "Valid Accounts"
reference = "https://attack.mitre.org/techniques/T1078/"
[[rule.threat.technique.subtechnique]]
id = "T1078.004"
name = "Cloud Accounts"
reference = "https://attack.mitre.org/techniques/T1078/004/"

[rule.threat.tactic]
id = "TA0001"
name = "Initial Access"
reference = "https://attack.mitre.org/tactics/TA0001/"

[rule.investigation_fields]
field_names = [
    "source.ip",
    "Esql.user_entity_id_values",
    "Esql.alert_count_long_term_key_new_ip_rule",
    "Esql.alert_count_other_elevated_rule",
    "Esql.kibana_alert_rule_name_values",
    "Esql.kibana_alert_rule_id_values",
    "Esql.kibana_alert_risk_score_values",
    "Esql.kibana_alert_severity_values",
    "Esql.timestamp_min",
    "Esql.timestamp_max",
]

Stages and Predicates

Stage 1: from

from .alerts-security.* METADATA _id, _version, _index

Stage 2: where

| where kibana.alert.workflow_status == "open"
    and event.kind == "signal"
    and source.ip is not null
    and kibana.alert.rule.name is not null
    and not kibana.alert.rule.type in ("threat_match", "machine_learning")
    and not kibana.alert.rule.name like "Deprecated - *"
    and not KQL("""kibana.alert.rule.tags : "Rule Type: Higher-Order Rule" """)
    and (
        kibana.alert.rule.rule_id == "9f8e3c5e-f72e-4e91-93f6-e98a4fae3e4f"
        or kibana.alert.risk_score >= 47
        or kibana.alert.severity in ("medium", "high", "critical")
    )

Stage 3: eval

| eval Esql.is_long_term_key_new_ip_rule = kibana.alert.rule.rule_id == "9f8e3c5e-f72e-4e91-93f6-e98a4fae3e4f"

Stage 4: eval

| eval Esql.is_other_elevated_rule = kibana.alert.rule.rule_id != "9f8e3c5e-f72e-4e91-93f6-e98a4fae3e4f"
    and (
        kibana.alert.risk_score >= 47
        or kibana.alert.severity in ("medium", "high", "critical")
    )

Stage 5: stats

| stats
    Esql.alert_count_long_term_key_new_ip_rule = SUM(CASE(Esql.is_long_term_key_new_ip_rule, 1, 0)),
    Esql.alert_count_other_elevated_rule = SUM(CASE(Esql.is_other_elevated_rule, 1, 0)),
    Esql.kibana_alert_rule_name_values = VALUES(kibana.alert.rule.name),
    Esql.kibana_alert_rule_id_values = VALUES(kibana.alert.rule.rule_id),
    Esql.kibana_alert_risk_score_values = VALUES(kibana.alert.risk_score),
    Esql.kibana_alert_severity_values = VALUES(kibana.alert.severity),
    Esql.user_entity_id_values = VALUES(user.entity.id),
    Esql.timestamp_min = MIN(@timestamp),
    Esql.timestamp_max = MAX(@timestamp)
  by source.ip

Stage 6: where

| where Esql.alert_count_long_term_key_new_ip_rule > 0
    and Esql.alert_count_other_elevated_rule > 0

Stage 7: keep

| keep
    source.ip,
    Esql.alert_count_long_term_key_new_ip_rule,
    Esql.alert_count_other_elevated_rule,
    Esql.kibana_alert_rule_name_values,
    Esql.kibana_alert_rule_id_values,
    Esql.kibana_alert_risk_score_values,
    Esql.kibana_alert_severity_values,
    Esql.user_entity_id_values,
    Esql.timestamp_min,
    Esql.timestamp_max

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

Output Fields

These fields are emitted when the rule matches.

FieldSource
source.ipKEEP source.ip
Esql.alert_count_long_term_key_new_ip_ruleKEEP Esql.alert_count_long_term_key_new_ip_rule
Esql.alert_count_other_elevated_ruleKEEP Esql.alert_count_other_elevated_rule
Esql.kibana_alert_rule_name_valuesKEEP Esql.kibana_alert_rule_name_values
Esql.kibana_alert_rule_id_valuesKEEP Esql.kibana_alert_rule_id_values
Esql.kibana_alert_risk_score_valuesKEEP Esql.kibana_alert_risk_score_values
Esql.kibana_alert_severity_valuesKEEP Esql.kibana_alert_severity_values
Esql.user_entity_id_valuesKEEP Esql.user_entity_id_values
Esql.timestamp_minKEEP Esql.timestamp_min
Esql.timestamp_maxKEEP Esql.timestamp_max

AWS Lambda Function Policy Updated to Allow Public Invocation

#
Status
production
Severity
high
Time window
6m
Author
Elastic
Source
github.com/elastic/detection-rules

Identifies when an AWS Lambda function policy is updated to allow public invocation. This rule detects use of the AddPermission API where the Principal is set to "*", enabling any AWS account to invoke the function. Adversaries may abuse this configuration to establish persistence, create a covert execution path, or operate a function as an unauthenticated backdoor. Public invocation is rarely required outside very specific workloads and should be considered high-risk when performed unexpectedly.

Known False Positives

  • Some organizations may legitimately expose Lambda functions for cross-account or anonymous invocation (e.g., custom public APIs, integrations, or legacy architectures). Validate whether the function owner explicitly intended to make the function publicly invokable. Routine CI/CD deployments or IaC templates may also temporarily set permissive policies; confirm this is expected behavior before treating it as suspicious.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

[metadata]
creation_date = "2024/04/30"
integration = ["aws"]
maturity = "production"
updated_date = "2026/08/05"

[rule]
author = ["Elastic"]
description = """
Identifies when an AWS Lambda function policy is updated to allow public invocation. This rule detects use of the
AddPermission API where the Principal is set to "*", enabling any AWS account to invoke the function. Adversaries may
abuse this configuration to establish persistence, create a covert execution path, or operate a function as an
unauthenticated backdoor. Public invocation is rarely required outside very specific workloads and should be considered
high-risk when performed unexpectedly.
"""
event_category_override = "event.type"
false_positives = [
    """
    Some organizations may legitimately expose Lambda functions for cross-account or anonymous invocation (e.g., custom
    public APIs, integrations, or legacy architectures). Validate whether the function owner explicitly intended to make
    the function publicly invokable. Routine CI/CD deployments or IaC templates may also temporarily set permissive
    policies; confirm this is expected behavior before treating it as suspicious.
    """,
]
from = "now-6m"
index = ["filebeat-*", "logs-aws.cloudtrail-*"]
language = "eql"
license = "Elastic License v2"
name = "AWS Lambda Function Policy Updated to Allow Public Invocation"
note = """## Triage and analysis

### Investigating AWS Lambda Function Policy Updated to Allow Public Invocation

AWS Lambda policies control who can invoke a function. When the `Principal` is set to `*`, the function becomes publicly invokable by any AWS account. Adversaries may modify Lambda permissions to create a stealthy execution backdoor or to maintain persistence inside an AWS environment. This activity is uncommon in most production environments and should receive careful scrutiny when detected.

### Possible investigation steps

**Identify the actor**
- Identify the actor who made the change by reviewing `aws.cloudtrail.user_identity.arn` and access key ID. Determine whether this principal typically administers Lambda functions.

**Review request details**
- Review request details in `aws.cloudtrail.request_parameters` to understand the exact permission added:
  - Confirm that the `Principal` is set to `"*"`.
  - Note the `Action` (`lambda:InvokeFunction`) and any `SourceArn` restrictions (sometimes present, often missing in malicious cases).

**Analyze source context**
- Check the source of the request using `source.ip`, geo information, and user agent. Unexpected networks, automation tools, or CLI usage may indicate credential compromise.

**Correlate timing and related events**
- Evaluate timing and sequence by correlating `@timestamp` with other events. Look for surrounding actions such as:
  - Creation or update of Lambda function code.
  - Publishing new Lambda layers.
  - Changes to roles attached to the function.

**Assess function sensitivity and impact**
- Assess the function’s role and data sensitivity. Determine whether public invocation could:
  - Enable unmonitored code execution,
  - Trigger access to internal resources via the function’s IAM role,
  - Be chained with persistence or privilege escalation behavior.

**Validate operational intent**
- Validate the operational context. Confirm with the function owner whether the permission change was intentional, part of a deployment, or unexpected.

### False positive analysis

- Public invocation may be intentional for certain workloads (e.g., webhook handlers, openly accessible compute functions). Compare the event with documentation, IaC templates, or the deployment pipeline.
- Some teams may regularly modify permissions during testing or refactoring; check whether this aligns with existing workflows.
- Evaluate whether the function already had permissive invocation policies and whether the update is part of expected configuration drift.

### Response and remediation

- Remove unauthorized public invocation permissions immediately by reverting the Lambda function policy to the approved baseline.
- Investigate for follow-on activity: execution of the function, updates to code, modifications to IAM roles, or API calls issued using the function's role.
- Rotate or disable credentials associated with the identity that issued the `AddPermission` call if compromise is suspected.
- Enable or refine monitoring for Lambda policy updates, layer additions, and code changes to detect future unauthorized modifications.
- Conduct a security review of the Lambda function and any downstream resources it can access to ensure no misuse has occurred.
- Work with the application team to enforce least-privilege invocation policies and deploy guardrails (e.g., SCPs, IAM Conditions, or automated compliance checks) preventing public invocation unless explicitly authorized.

### Additional information
- **[AWS IR Playbooks](https://github.com/aws-samples/aws-incident-response-playbooks/blob/c151b0dc091755fffd4d662a8f29e2f6794da52c/playbooks/)** 
- **[AWS Customer Playbook Framework](https://github.com/aws-samples/aws-customer-playbook-framework/tree/a8c7b313636b406a375952ac00b2d68e89a991f2/docs)** 
- **[AWS Knowledge Center – Security Best Practices](https://aws.amazon.com/premiumsupport/knowledge-center/security-best-practices/)**
"""
references = [
    "https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence",
    "https://stratus-red-team.cloud/attack-techniques/AWS/aws.persistence.lambda-backdoor-function/",
    "https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html",
]
risk_score = 73
rule_id = "151d8f72-0747-11ef-a0c2-f661ea17fbcc"
severity = "high"
tags = [
    "Domain: Cloud",
    "Platform: AWS",
    "Data Source: AWS CloudTrail",
    "Service: AWS Lambda",
    "Tactic: Persistence",
    "Rule Type: Event Correlation (EQL)",
    "Resources: Investigation Guide",
]
timestamp_override = "event.ingested"
type = "eql"

query = '''
info where data_stream.dataset == "aws.cloudtrail" 
    and event.provider == "lambda.amazonaws.com" 
    and event.outcome == "success" 
    and event.action : "AddPermission*" 
    and stringContains(aws.cloudtrail.request_parameters, "lambda:InvokeFunction") 
    and stringContains(aws.cloudtrail.request_parameters, "principal=\\*")
    and not user_agent.original like~ ("*Terraform*", "*Pulumi*")
'''


[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1546"
name = "Event Triggered Execution"
reference = "https://attack.mitre.org/techniques/T1546/"

[rule.threat.tactic]
id = "TA0003"
name = "Persistence"
reference = "https://attack.mitre.org/tactics/TA0003/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1578"
name = "Modify Cloud Compute Infrastructure"
reference = "https://attack.mitre.org/techniques/T1578/"

[[rule.threat.technique.subtechnique]]
id = "T1578.005"
name = "Modify Cloud Compute Configurations"
reference = "https://attack.mitre.org/techniques/T1578/005/"

[rule.threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"
[rule.investigation_fields]
field_names = [
    "@timestamp",
    "user.name",
    "user_agent.original",
    "source.ip",
    "aws.cloudtrail.user_identity.arn",
    "aws.cloudtrail.user_identity.type",
    "aws.cloudtrail.user_identity.access_key_id",
    "event.action",
    "event.outcome",
    "cloud.account.id",
    "cloud.region",
    "aws.cloudtrail.request_parameters",
    "aws.cloudtrail.response_elements",
]

Stages and Predicates

Stage 1: info

info where data_stream.dataset == "aws.cloudtrail" 
    and event.provider == "lambda.amazonaws.com" 
    and event.outcome == "success" 
    and event.action : "AddPermission*" 
    and stringContains(aws.cloudtrail.request_parameters, "lambda:InvokeFunction") 
    and stringContains(aws.cloudtrail.request_parameters, "principal=\\*")
    and not user_agent.original like~ ("*Terraform*", "*Pulumi*")

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
aws.cloudtrail.request_parameterscontains
  • lambda:InvokeFunction corpus 2 (elastic 2)
  • principal=\* corpus 2 (elastic 2)
field:"aws::requestParameters" kind:contains
data_stream.dataseteq
  • aws.cloudtrail corpus 40 (elastic 40)
field:"data_stream.dataset" kind:eq value:"aws.cloudtrail"
event.actionwildcard
  • AddPermission* corpus 2 (elastic 2)
field:"EventType" kind:wildcard value:"AddPermission*"
event.outcomeeq
  • success corpus 82 (elastic 82)
field:"event.outcome" kind:eq value:"success"
event.providereq
  • lambda.amazonaws.com corpus 5 (elastic 5)
field:"Provider_Name" kind:eq value:"lambda.amazonaws.com"

Exclusions

The rule actively suppresses these predicates.

Azure AKS Ephemeral Container Added to Pod

#
Status
production
Severity
medium
Time window
9m
Author
Elastic
Source
github.com/elastic/detection-rules

Detects an identity injecting an ephemeral (debug) container into a running AKS (Azure Kubernetes Service) pod via the pods/ephemeralcontainers subresource, excluding known AKS control-plane and platform identities. Ephemeral containers share the target pod's namespaces and give stealthy interactive access to its processes and mounted secrets without creating a new pod. Coverage includes workload service accounts (system:serviceaccount:*), so a compromised in-cluster token used to attach a debug container is not excluded.

Known False Positives

  • Operators and support tooling use ephemeral containers (kubectl debug) for legitimate troubleshooting. Baseline expected users and exclude verified break-glass or platform identities after review.

MITRE ATT&CK Coverage

TacticTechniques
Execution

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

[metadata]
creation_date = "2026/07/09"
integration = ["azure"]
maturity = "production"
updated_date = "2026/07/09"

[rule]
author = ["Elastic"]
description = """
Detects an identity injecting an ephemeral (debug) container into a running AKS (Azure Kubernetes Service) pod via the
pods/ephemeralcontainers subresource, excluding known AKS control-plane and platform identities. Ephemeral containers
share the target pod's namespaces and give stealthy interactive access to its processes and mounted secrets without
creating a new pod. Coverage includes workload service accounts (system:serviceaccount:*), so a compromised in-cluster
token used to attach a debug container is not excluded.
"""
false_positives = [
    """
    Operators and support tooling use ephemeral containers (kubectl debug) for legitimate troubleshooting. Baseline
    expected users and exclude verified break-glass or platform identities after review.
    """,
]
from = "now-9m"
index = ["logs-azure.platformlogs-*"]
language = "kuery"
license = "Elastic License v2"
name = "Azure AKS Ephemeral Container Added to Pod"
note = """## Triage and analysis

### Investigating Azure AKS Ephemeral Container Added to Pod

AKS kube-audit events are carried under the flattened `azure.platformlogs.properties.log.*` subtree and share the ARM
operation `event.action: Microsoft.ContainerService/managedClusters/diagnosticLogs/Read`. An ephemeral container is
attached to a running pod (via `kubectl debug`) and shares that pod's process and network namespaces. Adversaries use it
as a stealthier alternative to `exec` to read mounted secrets and interact with the workload.

### Possible investigation steps

- Identify the acting identity in `azure.platformlogs.properties.log.user.username` (and its groups in
  `azure.platformlogs.properties.log.user.groups`) and whether it should debug pods. A username of `masterclient` with
  the `system:masters` group is the AKS local cluster-admin certificate (`az aks get-credentials --admin`); on clusters
  with local accounts disabled it should not appear at all, so its presence is itself notable. Entra-integrated admins
  appear as their UPN/objectId instead.
- Inspect the injected container in the `azure.platformlogs.properties.log.requestObject.spec.ephemeralContainers.*`
  fields: the `image`, `command`, and `targetContainerName` show what was run and against which container, and
  `securityContext.capabilities.add` (e.g. `SYS_PTRACE`, `SYS_ADMIN`) or a privileged context indicates offensive
  debugging.
- Review `azure.platformlogs.properties.log.userAgent` to distinguish an interactive `kubectl debug` from automation or
  custom tooling, and `azure.platformlogs.properties.log.responseStatus.code` to tell a successful injection (200) from
  a denied attempt (403) by an identity lacking RBAC.
- Identify the target pod in `azure.platformlogs.properties.log.objectRef.name` /
  `azure.platformlogs.properties.log.objectRef.namespace`.
- Evaluate the source in `azure.platformlogs.properties.log.sourceIPs` and pivot on it for related exec sessions, secret
  reads, or RBAC changes.

### False positive analysis

- Operators and support tooling use ephemeral containers for legitimate troubleshooting; baseline expected users and
  exclude verified break-glass or platform identities.

### Response and remediation

- If unauthorized, remove the ephemeral container (delete or replace the pod), revoke the acting identity's tokens, and
  review the RBAC that permitted the injection.
- Inspect the target pod for accessed secrets or tampering and rotate any exposed credentials.
- Collect kube-audit and identity artifacts per incident response procedures.
"""
references = [
    "https://kubernetes.io/docs/tasks/debug/debug-application/debug-running-pod/#ephemeral-container",
    "https://microsoft.github.io/Threat-Matrix-for-Kubernetes/",
    "https://unit42.paloaltonetworks.com/hildegard-malware-teamtnt/",
]
risk_score = 47
rule_id = "d4209683-ee18-439f-b816-1bbe6ee6bbc8"
setup = """The Azure Fleet integration collecting AKS diagnostic logs forwarded through Event Hub into the `azure.platformlogs`
data stream is required for this rule. Enable either the `kube-audit` or the `kube-audit-admin` log category (Microsoft
recommends `kube-audit-admin` alone to reduce volume, as it only drops read-only get/list events). Mutating
ephemeral-container writes are recorded in both categories with the same `auditID`, so clusters that enable both
categories may generate two alerts per injection.
"""
severity = "medium"
tags = [
    "Domain: Cloud",
    "Domain: Kubernetes",
    "Data Source: Azure",
    "Data Source: Azure Platform Logs",
    "Data Source: Kubernetes",
    "Use Case: Threat Detection",
    "Tactic: Execution",
    "Resources: Investigation Guide",
]
timestamp_override = "event.ingested"
type = "query"

query = '''
data_stream.dataset:azure.platformlogs and
  event.action:"Microsoft.ContainerService/managedClusters/diagnosticLogs/Read" and
  azure.platformlogs.category:("kube-audit" or "kube-audit-admin") and
  azure.platformlogs.properties.log.stage:"ResponseComplete" and
  azure.platformlogs.properties.log.objectRef.resource:"pods" and
  azure.platformlogs.properties.log.objectRef.subresource:"ephemeralcontainers" and
  azure.platformlogs.properties.log.verb:("update" or "patch") and
  not azure.platformlogs.properties.log.user.username:(
    system\:node\:* or "aksService" or "hcpService" or "readinessChecker" or
    system\:serviceaccount\:kube-system\:*
  )
'''


[[rule.threat]]
framework = "MITRE ATT&CK"
[[rule.threat.technique]]
id = "T1610"
name = "Deploy Container"
reference = "https://attack.mitre.org/techniques/T1610/"


[rule.threat.tactic]
id = "TA0002"
name = "Execution"
reference = "https://attack.mitre.org/tactics/TA0002/"

[rule.investigation_fields]
field_names = [
    "@timestamp",
    "event.action",
    "azure.platformlogs.category",
    "azure.platformlogs.properties.log.verb",
    "azure.platformlogs.properties.log.user.username",
    "azure.platformlogs.properties.log.user.groups",
    "azure.platformlogs.properties.log.userAgent",
    "azure.platformlogs.properties.log.sourceIPs",
    "azure.platformlogs.properties.log.objectRef.namespace",
    "azure.platformlogs.properties.log.objectRef.name",
    "azure.platformlogs.properties.log.objectRef.subresource",
    "azure.platformlogs.properties.log.requestObject.spec.ephemeralContainers.name",
    "azure.platformlogs.properties.log.requestObject.spec.ephemeralContainers.image",
    "azure.platformlogs.properties.log.requestObject.spec.ephemeralContainers.command",
    "azure.platformlogs.properties.log.requestObject.spec.ephemeralContainers.targetContainerName",
    "azure.platformlogs.properties.log.requestObject.spec.ephemeralContainers.securityContext.capabilities.add",
    "azure.platformlogs.properties.log.responseStatus.code",
]

Stages and Predicates

Stage 1: query

data_stream.dataset:azure.platformlogs and
  event.action:"Microsoft.ContainerService/managedClusters/diagnosticLogs/Read" and
  azure.platformlogs.category:("kube-audit" or "kube-audit-admin") and
  azure.platformlogs.properties.log.stage:"ResponseComplete" and
  azure.platformlogs.properties.log.objectRef.resource:"pods" and
  azure.platformlogs.properties.log.objectRef.subresource:"ephemeralcontainers" and
  azure.platformlogs.properties.log.verb:("update" or "patch") and
  not azure.platformlogs.properties.log.user.username:(
    system\:node\:* or "aksService" or "hcpService" or "readinessChecker" or
    system\:serviceaccount\:kube-system\:*
  )

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

High Number of Process and/or Service Terminations

#
Status
production
Severity
medium
Time window
9m
Group by
host.id
Author
Elastic
Source
github.com/elastic/detection-rules

This rule identifies a high number (10) of process terminations (stop, delete, or suspend) from the same host within a short time period.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment
Impact

Rule Body

[metadata]
creation_date = "2020/12/03"
integration = ["endpoint", "windows", "system"]
maturity = "production"
updated_date = "2026/05/04"

[rule]
author = ["Elastic"]
description = """
This rule identifies a high number (10) of process terminations (stop, delete, or suspend) from the same host within a
short time period.
"""
from = "now-9m"
index = [
    "endgame-*",
    "logs-endpoint.events.process-*",
    "logs-system.security*",
    "logs-windows.forwarded*",
    "logs-windows.sysmon_operational-*",
    "winlogbeat-*",
]
language = "kuery"
license = "Elastic License v2"
name = "High Number of Process and/or Service Terminations"
note = """## Triage and analysis

### Investigating High Number of Process and/or Service Terminations

Attackers can stop services and kill processes for a variety of purposes. For example, they can stop services associated with business applications and databases to release the lock on files used by these applications so they may be encrypted, or stop security and backup solutions, etc.

This rule identifies a high number (10) of service and/or process terminations (stop, delete, or suspend) from the same host within a short time period.

#### Possible investigation steps

- Investigate the script execution chain (parent process tree) for unknown processes. Examine their executable files for prevalence, whether they are located in expected locations, and if they are signed with valid digital signatures.
- Identify the user account that performed the action and whether it should perform this kind of action.
- Contact the account owner and confirm whether they are aware of this activity.
- Investigate other alerts associated with the user/host during the past 48 hours.
- Check if any files on the host machine have been encrypted.

### False positive analysis

- This activity is unlikely to happen legitimately. Benign true positives (B-TPs) can be added as exceptions if necessary.

### Response and remediation

- Initiate the incident response process based on the outcome of the triage.
- Isolate the involved host to prevent further destructive behavior, which is commonly associated with this activity.
- Investigate credential exposure on systems compromised or used by the attacker to ensure all compromised accounts are identified. Reset passwords for these accounts and other potentially compromised credentials, such as email, business systems, and web services.
- Reimage the host operating system or restore it to the operational state.
- If any other destructive action was identified on the host, it is recommended to prioritize the investigation and look for ransomware preparation and execution activities.
- Run a full antimalware scan. This may reveal additional artifacts left in the system, persistence mechanisms, and malware components.
- Determine the initial vector abused by the attacker and take action to prevent reinfection through the same vector.
- Using the incident response data, update logging and audit policies to improve the mean time to detect (MTTD) and the mean time to respond (MTTR).
"""

setup = """## Setup

This rule is designed for data generated by [Elastic Defend](https://www.elastic.co/security/endpoint-security), which provides native endpoint detection and response, along with event enrichments designed to work with our detection rules.

Setup instructions: https://ela.st/install-elastic-defend

### Additional data sources

This rule also supports the following third-party data sources. For setup instructions, refer to the links below:

- [Sysmon Event ID 1 - Process Creation](https://ela.st/sysmon-event-1-setup)
- [Windows Process Creation Logs](https://ela.st/audit-process-creation)
"""

references = ["https://www.elastic.co/security-labs/luna-ransomware-attack-pattern"]
risk_score = 47
rule_id = "035889c4-2686-4583-a7df-67f89c292f2c"
severity = "medium"
tags = [
    "Domain: Endpoint",
    "OS: Windows",
    "Use Case: Threat Detection",
    "Tactic: Impact",
    "Resources: Investigation Guide",
    "Data Source: Elastic Endgame",
    "Data Source: Elastic Defend",
    "Data Source: Sysmon",
    "Data Source: Windows Security Event Logs",
]
timestamp_override = "event.ingested"
type = "threshold"

query = '''
event.category:process and host.os.type:windows and event.type:start and process.name:(net.exe or sc.exe or taskkill.exe) and
 process.args:(stop or pause or delete or "/PID" or "/IM" or "/T" or "/F" or "/t" or "/f" or "/im" or "/pid") and
 not process.parent.name:(osquerybeat.exe or agentbeat.exe)
'''


[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1489"
name = "Service Stop"
reference = "https://attack.mitre.org/techniques/T1489/"

[rule.threat.tactic]
id = "TA0040"
name = "Impact"
reference = "https://attack.mitre.org/tactics/TA0040/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1562"
name = "Impair Defenses"
reference = "https://attack.mitre.org/techniques/T1562/"

[[rule.threat.technique.subtechnique]]
id = "T1562.001"
name = "Disable or Modify Tools"
reference = "https://attack.mitre.org/techniques/T1562/001/"

[rule.threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"
[rule.threshold]
field = ["host.id"]
value = 10

Stages and Predicates

Stage 1: query

event.category:process and host.os.type:windows and event.type:start and process.name:(net.exe or sc.exe or taskkill.exe) and
 process.args:(stop or pause or delete or "/PID" or "/IM" or "/T" or "/F" or "/t" or "/f" or "/im" or "/pid") and
 not process.parent.name:(osquerybeat.exe or agentbeat.exe)
Threshold
gte 10

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
event.categoryeq
  • process corpus 105 (elastic 105)
field:"event.category" kind:eq value:"process"
event.typeeq
  • start corpus 67 (elastic 67)
field:"event.type" kind:eq value:"start"
process.argsin
  • /F
  • /IM
  • /PID
  • /T
  • /f
  • /im
  • /pid
  • /t
  • delete
  • pause
  • stop
field:"process.args" kind:in
process.namein
  • net.exe corpus 5 (splunk 3, elastic 1, kusto 1)
  • sc.exe corpus 5 (splunk 3, elastic 2)
  • taskkill.exe
field:"process_basename" kind:in

Exclusions

The rule actively suppresses these predicates.

M365 Identity OAuth Flow by First-Party Microsoft App from Multiple IPs

#
Status
production
Severity
high
Time window
1h
Group by
Esql.time_window_date_trunc, o365.audit.ApplicationId, o365.audit.ObjectId, o365.audit.UserId
Author
Elastic
Source
github.com/elastic/detection-rules

Identifies sign-ins on behalf of a principal user to the Microsoft Graph or legacy Azure AD API from multiple IPs using first-party Microsoft applications from the FOCI (Family of Client IDs) group. Developer tools like Azure CLI, VSCode, and Azure PowerShell accessing these resources from multiple IPs are flagged, along with any FOCI application accessing the deprecated Windows Azure Active Directory from multiple IPs. This behavior may indicate an adversary using a phished OAuth authorization code or refresh token, as seen in attacks like ConsentFix where attackers steal localhost OAuth codes and replay them from attacker infrastructure.

MITRE ATT&CK Coverage

Telemetry Coverage

PlatformRecord / event type
Microsoft 365UserLoggedIn

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

[metadata]
creation_date = "2025/05/01"
integration = ["o365"]
maturity = "production"
updated_date = "2026/04/10"

[rule]
author = ["Elastic"]
description = """
Identifies sign-ins on behalf of a principal user to the Microsoft Graph or legacy Azure AD API from multiple IPs using
first-party Microsoft applications from the FOCI (Family of Client IDs) group. Developer tools like Azure CLI, VSCode,
and Azure PowerShell accessing these resources from multiple IPs are flagged, along with any FOCI application accessing
the deprecated Windows Azure Active Directory from multiple IPs. This behavior may indicate an adversary using a phished
OAuth authorization code or refresh token, as seen in attacks like ConsentFix where attackers steal localhost OAuth
codes and replay them from attacker infrastructure.
"""
from = "now-60m"
interval = "59m"
language = "esql"
license = "Elastic License v2"
name = "M365 Identity OAuth Flow by First-Party Microsoft App from Multiple IPs"
note = """## Triage and analysis

### Investigating M365 Identity OAuth Flow by First-Party Microsoft App from Multiple IPs

This rule detects when the same user authenticates to Microsoft Graph or legacy Azure AD using FOCI applications from multiple IP addresses within a 30-minute window. This pattern is a strong indicator of OAuth code/token theft attacks like ConsentFix, where the victim completes the OAuth authorize flow on their device (first IP), and the attacker exchanges the stolen authorization code for tokens from their infrastructure (second IP).

The rule aggregates events by user, application, and resource, requiring both `OAuth2:Authorize` and `OAuth2:Token` requests from at least 2 different IPs to fire - this indicates the code was generated on one IP and exchanged on another.

### Possible investigation steps

- Review `o365.audit.UserId` to identify the affected user and determine if they are a high-value target.
- Analyze `Esql.source_ip_values` to see all unique IP addresses used within the 30-minute window. Determine whether these originate from different geographic regions, cloud providers (AWS, Azure, GCP), or anonymizing infrastructure (Tor, VPNs).
- Use `Esql.time_window_date_trunc` to pivot into raw events and reconstruct the full sequence of resource access events with exact timestamps.
- Check `Esql.source_as_organization_name_values` for unfamiliar ASN organizations that may indicate attacker infrastructure.
- Review `Esql.o365_audit_ApplicationId_values` to confirm which first-party application was used.
- Pivot to `azure.auditlogs` to check for device join or registration events around the same timeframe, which may indicate persistence attempts.
- Correlate with `azure.identityprotection` to identify related risk detections such as anonymized IP access or token replay.
- Search for additional sign-ins from the IPs involved across other users to determine if this is part of a broader campaign.

### False positive analysis

- Developers or IT administrators working across environments (office, home, cloud VMs) may produce similar behavior.
- Users on VPN who switch servers or traveling between networks may show multiple IPs.
- Mobile users moving between cellular and WiFi networks during the time window.
- Consider correlating with device compliance status to distinguish managed vs. unmanaged access.

### Response and remediation

- If confirmed unauthorized, immediately revoke all refresh tokens for the affected user via Entra ID.
- Remove any devices registered during this session by checking `azure.auditlogs` for `Add device` events.
- Notify the user and determine whether they may have shared an OAuth code via phishing.
- Block the attacker IPs at the perimeter and add to threat intel feeds.
- Implement Conditional Access policies to restrict OAuth flows for these applications to compliant devices and approved locations.
- Monitor for follow-on activity like lateral movement, privilege escalation, or data exfiltration via Graph API.
"""
references = [
    "https://www.volexity.com/blog/2025/04/22/phishing-for-codes-russian-threat-actors-target-microsoft-365-oauth-workflows/",
    "https://github.com/dirkjanm/ROADtools",
    "https://dirkjanm.io/phishing-for-microsoft-entra-primary-refresh-tokens/",
    "https://pushsecurity.com/blog/consentfix",
    "https://github.com/secureworks/family-of-client-ids-research",
]
risk_score = 73
rule_id = "36188365-f88f-4f70-8c1d-0b9554186b9c"
setup = """## Setup

The Office 365 Logs Fleet integration, Filebeat module, or similarly structured data is required to be compatible with this rule.
"""
severity = "high"
tags = [
    "Domain: Cloud",
    "Domain: Email",
    "Domain: Identity",
    "Data Source: Microsoft 365",
    "Data Source: Microsoft 365 Audit Logs",
    "Use Case: Identity and Access Audit",
    "Use Case: Threat Detection",
    "Resources: Investigation Guide",
    "Tactic: Defense Evasion",
]
timestamp_override = "event.ingested"
type = "esql"

query = '''
from logs-o365.audit-*
| where
    data_stream.dataset == "o365.audit" and
    event.action == "UserLoggedIn" and
    source.ip is not null and
    o365.audit.UserId is not null and
    o365.audit.ApplicationId is not null and
    o365.audit.UserType in ("0", "2", "3", "10") and
    (
        /* Developer tools accessing Graph OR Legacy AAD */
        (
            o365.audit.ApplicationId in (
                "aebc6443-996d-45c2-90f0-388ff96faa56",
                "29d9ed98-a469-4536-ade2-f981bc1d605e",
                "04b07795-8ddb-461a-bbee-02f9e1bf7b46",
                "1950a258-227b-4e31-a9cf-717495945fc2"
            ) and
            o365.audit.ObjectId in (
                "00000003-0000-0000-c000-000000000000",
                "00000002-0000-0000-c000-000000000000"
            )
        ) or
        /* Any FOCI app accessing Legacy AAD only */
        (
            o365.audit.ApplicationId in (
                "00b41c95-dab0-4487-9791-b9d2c32c80f2",
                "1fec8e78-bce4-4aaf-ab1b-5451cc387264",
                "26a7ee05-5602-4d76-a7ba-eae8b7b67941",
                "27922004-5251-4030-b22d-91ecd9a37ea4",
                "4813382a-8fa7-425e-ab75-3b753aab3abb",
                "ab9b8c07-8f02-4f72-87fa-80105867a763",
                "d3590ed6-52b3-4102-aeff-aad2292ab01c",
                "872cd9fa-d31f-45e0-9eab-6e460a02d1f1",
                "af124e86-4e96-495a-b70a-90f90ab96707",
                "2d7f3606-b07d-41d1-b9d2-0d0c9296a6e8",
                "844cca35-0656-46ce-b636-13f48b0eecbd",
                "87749df4-7ccf-48f8-aa87-704bad0e0e16",
                "cf36b471-5b44-428c-9ce7-313bf84528de",
                "0ec893e0-5785-4de6-99da-4ed124e5296c",
                "22098786-6e16-43cc-a27d-191a01a1e3b5",
                "4e291c71-d680-4d0e-9640-0a3358e31177",
                "57336123-6e14-4acc-8dcf-287b6088aa28",
                "57fcbcfa-7cee-4eb1-8b25-12d2030b4ee0",
                "66375f6b-983f-4c2c-9701-d680650f588f",
                "9ba1a5c7-f17a-4de9-a1f1-6178c8d51223",
                "a40d7d7d-59aa-447e-a655-679a4107e548",
                "a569458c-7f2b-45cb-bab9-b7dee514d112",
                "b26aadf8-566f-4478-926f-589f601d9c74",
                "c0d2a505-13b8-4ae0-aa9e-cddd5eab0b12",
                "d326c1ce-6cc6-4de2-bebc-4591e5e13ef0",
                "e9c51622-460d-4d3d-952d-966a5b1da34c",
                "eb539595-3fe1-474e-9c1d-feb3625d1be5",
                "ecd6b820-32c2-49b6-98a6-444530e5a77a",
                "f05ff7c9-f75a-4acd-a3b5-f4b6a870245d",
                "f44b1140-bc5e-48c6-8dc0-5cf5a53c0e34",
                "be1918be-3fe3-4be9-b32b-b542fc27f02e",
                "cab96880-db5b-4e15-90a7-f3f1d62ffe39",
                "d7b530a4-7680-4c23-a8bf-c52c121d2e87",
                "dd47d17a-3194-4d86-bfd5-c6ae6f5651e3",
                "e9b154d0-7658-433b-bb25-6b8e0a8a7c59"
            ) and
            o365.audit.ObjectId == "00000002-0000-0000-c000-000000000000"
        )
    )
| eval
    Esql.time_window_date_trunc = date_trunc(30 minutes, @timestamp),
    Esql.oauth_authorize_user_id_case = case(
        o365.audit.ExtendedProperties.RequestType == "OAuth2:Authorize" and o365.audit.ExtendedProperties.ResultStatusDetail == "Redirect",
        o365.audit.UserId,
        null
    ),
    Esql.oauth_token_user_id_case = case(
        o365.audit.ExtendedProperties.RequestType == "OAuth2:Token",
        o365.audit.UserId,
        null
    )
| stats
    Esql.source_ip_count_distinct = count_distinct(source.ip),
    Esql.source_ip_values = values(source.ip),
    Esql.o365_audit_ApplicationId_values = values(o365.audit.ApplicationId),
    Esql.source_as_organization_name_values = values(source.`as`.organization.name),
    Esql.oauth_token_count_distinct = count_distinct(Esql.oauth_token_user_id_case),
    Esql.oauth_authorize_count_distinct = count_distinct(Esql.oauth_authorize_user_id_case)
  by
    o365.audit.UserId,
    Esql.time_window_date_trunc,
    o365.audit.ApplicationId,
    o365.audit.ObjectId
| keep
    Esql.time_window_date_trunc,
    Esql.source_ip_values,
    Esql.source_ip_count_distinct,
    Esql.o365_audit_ApplicationId_values,
    Esql.source_as_organization_name_values,
    Esql.oauth_token_count_distinct,
    Esql.oauth_authorize_count_distinct
| where
    Esql.source_ip_count_distinct >= 2 and
    Esql.oauth_token_count_distinct > 0 and
    Esql.oauth_authorize_count_distinct > 0
'''


[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1550"
name = "Use Alternate Authentication Material"
reference = "https://attack.mitre.org/techniques/T1550/"

[[rule.threat.technique.subtechnique]]
id = "T1550.001"
name = "Application Access Token"
reference = "https://attack.mitre.org/techniques/T1550/001/"

[rule.threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1528"
name = "Steal Application Access Token"
reference = "https://attack.mitre.org/techniques/T1528/"

[rule.threat.tactic]
id = "TA0006"
name = "Credential Access"
reference = "https://attack.mitre.org/tactics/TA0006/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1078"
name = "Valid Accounts"
reference = "https://attack.mitre.org/techniques/T1078/"

[[rule.threat.technique.subtechnique]]
id = "T1078.004"
name = "Cloud Accounts"
reference = "https://attack.mitre.org/techniques/T1078/004/"

[[rule.threat.technique]]
id = "T1566"
name = "Phishing"
reference = "https://attack.mitre.org/techniques/T1566/"

[[rule.threat.technique.subtechnique]]
id = "T1566.002"
name = "Spearphishing Link"
reference = "https://attack.mitre.org/techniques/T1566/002/"

[rule.threat.tactic]
id = "TA0001"
name = "Initial Access"
reference = "https://attack.mitre.org/tactics/TA0001/"

Stages and Predicates

Stage 1: from

from logs-o365.audit-*

Stage 2: where

| where
    data_stream.dataset == "o365.audit" and
    event.action == "UserLoggedIn" and
    source.ip is not null and
    o365.audit.UserId is not null and
    o365.audit.ApplicationId is not null and
    o365.audit.UserType in ("0", "2", "3", "10") and
    (
        (
            o365.audit.ApplicationId in (
                "aebc6443-996d-45c2-90f0-388ff96faa56",
                "29d9ed98-a469-4536-ade2-f981bc1d605e",
                "04b07795-8ddb-461a-bbee-02f9e1bf7b46",
                "1950a258-227b-4e31-a9cf-717495945fc2"
            ) and
            o365.audit.ObjectId in (
                "00000003-0000-0000-c000-000000000000",
                "00000002-0000-0000-c000-000000000000"
            )
        ) or
        (
            o365.audit.ApplicationId in (
                "00b41c95-dab0-4487-9791-b9d2c32c80f2",
                "1fec8e78-bce4-4aaf-ab1b-5451cc387264",
                "26a7ee05-5602-4d76-a7ba-eae8b7b67941",
                "27922004-5251-4030-b22d-91ecd9a37ea4",
                "4813382a-8fa7-425e-ab75-3b753aab3abb",
                "ab9b8c07-8f02-4f72-87fa-80105867a763",
                "d3590ed6-52b3-4102-aeff-aad2292ab01c",
                "872cd9fa-d31f-45e0-9eab-6e460a02d1f1",
                "af124e86-4e96-495a-b70a-90f90ab96707",
                "2d7f3606-b07d-41d1-b9d2-0d0c9296a6e8",
                "844cca35-0656-46ce-b636-13f48b0eecbd",
                "87749df4-7ccf-48f8-aa87-704bad0e0e16",
                "cf36b471-5b44-428c-9ce7-313bf84528de",
                "0ec893e0-5785-4de6-99da-4ed124e5296c",
                "22098786-6e16-43cc-a27d-191a01a1e3b5",
                "4e291c71-d680-4d0e-9640-0a3358e31177",
                "57336123-6e14-4acc-8dcf-287b6088aa28",
                "57fcbcfa-7cee-4eb1-8b25-12d2030b4ee0",
                "66375f6b-983f-4c2c-9701-d680650f588f",
                "9ba1a5c7-f17a-4de9-a1f1-6178c8d51223",
                "a40d7d7d-59aa-447e-a655-679a4107e548",
                "a569458c-7f2b-45cb-bab9-b7dee514d112",
                "b26aadf8-566f-4478-926f-589f601d9c74",
                "c0d2a505-13b8-4ae0-aa9e-cddd5eab0b12",
                "d326c1ce-6cc6-4de2-bebc-4591e5e13ef0",
                "e9c51622-460d-4d3d-952d-966a5b1da34c",
                "eb539595-3fe1-474e-9c1d-feb3625d1be5",
                "ecd6b820-32c2-49b6-98a6-444530e5a77a",
                "f05ff7c9-f75a-4acd-a3b5-f4b6a870245d",
                "f44b1140-bc5e-48c6-8dc0-5cf5a53c0e34",
                "be1918be-3fe3-4be9-b32b-b542fc27f02e",
                "cab96880-db5b-4e15-90a7-f3f1d62ffe39",
                "d7b530a4-7680-4c23-a8bf-c52c121d2e87",
                "dd47d17a-3194-4d86-bfd5-c6ae6f5651e3",
                "e9b154d0-7658-433b-bb25-6b8e0a8a7c59"
            ) and
            o365.audit.ObjectId == "00000002-0000-0000-c000-000000000000"
        )
    )

Stage 3: eval

| eval
    Esql.time_window_date_trunc = date_trunc(30 minutes, @timestamp),
    Esql.oauth_authorize_user_id_case = case(
        o365.audit.ExtendedProperties.RequestType == "OAuth2:Authorize" and o365.audit.ExtendedProperties.ResultStatusDetail == "Redirect",
        o365.audit.UserId,
        null
    ),
    Esql.oauth_token_user_id_case = case(
        o365.audit.ExtendedProperties.RequestType == "OAuth2:Token",
        o365.audit.UserId,
        null
    )
Esql.oauth_authorize_user_id_case =
ifo365.audit.ExtendedProperties.RequestType == "OAuth2:Authorize" and o365.audit.ExtendedProperties.ResultStatusDetail == "Redirect"o365.audit.UserId
elsenull
Esql.oauth_token_user_id_case =
ifo365.audit.ExtendedProperties.RequestType == "OAuth2:Token"o365.audit.UserId
elsenull

Stage 4: stats

| stats
    Esql.source_ip_count_distinct = count_distinct(source.ip),
    Esql.source_ip_values = values(source.ip),
    Esql.o365_audit_ApplicationId_values = values(o365.audit.ApplicationId),
    Esql.source_as_organization_name_values = values(source.`as`.organization.name),
    Esql.oauth_token_count_distinct = count_distinct(Esql.oauth_token_user_id_case),
    Esql.oauth_authorize_count_distinct = count_distinct(Esql.oauth_authorize_user_id_case)
  by
    o365.audit.UserId,
    Esql.time_window_date_trunc,
    o365.audit.ApplicationId,
    o365.audit.ObjectId

Stage 5: keep

| keep
    Esql.time_window_date_trunc,
    Esql.source_ip_values,
    Esql.source_ip_count_distinct,
    Esql.o365_audit_ApplicationId_values,
    Esql.source_as_organization_name_values,
    Esql.oauth_token_count_distinct,
    Esql.oauth_authorize_count_distinct

Stage 6: where

| where
    Esql.source_ip_count_distinct >= 2 and
    Esql.oauth_token_count_distinct > 0 and
    Esql.oauth_authorize_count_distinct > 0

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Esql.oauth_authorize_count_distinctgt
  • 0
field:"Esql.oauth_authorize_count_distinct" kind:gt value:"0"
Esql.oauth_token_count_distinctgt
  • 0
field:"Esql.oauth_token_count_distinct" kind:gt value:"0"
Esql.source_ip_count_distinctge
  • 2 corpus 3 (elastic 3)
field:"Esql.source_ip_count_distinct" kind:ge value:"2"
data_stream.dataseteq
  • o365.audit corpus 8 (elastic 8)
field:"data_stream.dataset" kind:eq value:"o365.audit"
event.actioneq
  • UserLoggedIn corpus 2 (elastic 2)
field:"EventType" kind:eq value:"UserLoggedIn"
o365.audit.ApplicationIdin
  • 00b41c95-dab0-4487-9791-b9d2c32c80f2
  • 04b07795-8ddb-461a-bbee-02f9e1bf7b46
  • 0ec893e0-5785-4de6-99da-4ed124e5296c
  • 1950a258-227b-4e31-a9cf-717495945fc2
  • 1fec8e78-bce4-4aaf-ab1b-5451cc387264
  • 22098786-6e16-43cc-a27d-191a01a1e3b5
  • 26a7ee05-5602-4d76-a7ba-eae8b7b67941
  • 27922004-5251-4030-b22d-91ecd9a37ea4
  • 29d9ed98-a469-4536-ade2-f981bc1d605e
  • 2d7f3606-b07d-41d1-b9d2-0d0c9296a6e8
  • 4813382a-8fa7-425e-ab75-3b753aab3abb
  • 4e291c71-d680-4d0e-9640-0a3358e31177
  • 57336123-6e14-4acc-8dcf-287b6088aa28
  • 57fcbcfa-7cee-4eb1-8b25-12d2030b4ee0
  • 66375f6b-983f-4c2c-9701-d680650f588f
  • 844cca35-0656-46ce-b636-13f48b0eecbd
  • 872cd9fa-d31f-45e0-9eab-6e460a02d1f1
  • 87749df4-7ccf-48f8-aa87-704bad0e0e16
  • 9ba1a5c7-f17a-4de9-a1f1-6178c8d51223
  • a40d7d7d-59aa-447e-a655-679a4107e548
  • a569458c-7f2b-45cb-bab9-b7dee514d112
  • ab9b8c07-8f02-4f72-87fa-80105867a763
  • aebc6443-996d-45c2-90f0-388ff96faa56
  • af124e86-4e96-495a-b70a-90f90ab96707
  • b26aadf8-566f-4478-926f-589f601d9c74
  • be1918be-3fe3-4be9-b32b-b542fc27f02e
  • c0d2a505-13b8-4ae0-aa9e-cddd5eab0b12
  • cab96880-db5b-4e15-90a7-f3f1d62ffe39
  • cf36b471-5b44-428c-9ce7-313bf84528de
  • d326c1ce-6cc6-4de2-bebc-4591e5e13ef0
  • d3590ed6-52b3-4102-aeff-aad2292ab01c
  • d7b530a4-7680-4c23-a8bf-c52c121d2e87
  • dd47d17a-3194-4d86-bfd5-c6ae6f5651e3
  • e9b154d0-7658-433b-bb25-6b8e0a8a7c59
  • e9c51622-460d-4d3d-952d-966a5b1da34c
  • eb539595-3fe1-474e-9c1d-feb3625d1be5
  • ecd6b820-32c2-49b6-98a6-444530e5a77a
  • f05ff7c9-f75a-4acd-a3b5-f4b6a870245d
  • f44b1140-bc5e-48c6-8dc0-5cf5a53c0e34
field:"m365::ApplicationId" kind:in
o365.audit.ApplicationIdis_not_null
  • (no value, null check)
field:"m365::ApplicationId" kind:is_not_null
o365.audit.ObjectIdeq
  • 00000002-0000-0000-c000-000000000000
field:"m365::ObjectId" kind:eq value:"00000002-0000-0000-c000-000000000000"
o365.audit.ObjectIdin
  • 00000002-0000-0000-c000-000000000000
  • 00000003-0000-0000-c000-000000000000
field:"m365::ObjectId" kind:in
o365.audit.UserIdis_not_null
  • (no value, null check)
field:"m365::UserId" kind:is_not_null
o365.audit.UserTypein
  • 0
  • 10
  • 2
  • 3
field:"m365::UserType" kind:in
source.ipis_not_null
  • (no value, null check)
field:"src_ip" kind:is_not_null

Output Fields

These fields are emitted when the rule matches.

FieldSource
Esql.time_window_date_truncKEEP Esql.time_window_date_trunc
Esql.source_ip_valuesKEEP Esql.source_ip_values
Esql.source_ip_count_distinctKEEP Esql.source_ip_count_distinct
Esql.o365_audit_ApplicationId_valuesKEEP Esql.o365_audit_ApplicationId_values
Esql.source_as_organization_name_valuesKEEP Esql.source_as_organization_name_values
Esql.oauth_token_count_distinctKEEP Esql.oauth_token_count_distinct
Esql.oauth_authorize_count_distinctKEEP Esql.oauth_authorize_count_distinct

M365 Identity User Brute Force Attempted

#
Status
production
Severity
medium
Time window
1h
Group by
Esql.time_window_date_trunc
Author
Elastic, Willem D'Haese, Austin Songer
Source
github.com/elastic/detection-rules

Identifies brute-force authentication activity targeting Microsoft 365 user accounts using failed sign-in patterns that match password spraying, credential stuffing, or password guessing behavior. Adversaries may attempt brute-force authentication with credentials obtained from previous breaches, leaks, marketplaces or guessable passwords.

Known False Positives

  • Automated processes that attempt to authenticate using expired credentials and unbounded retries may lead to false positives.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

[metadata]
creation_date = "2020/11/30"
integration = ["o365"]
maturity = "production"
updated_date = "2026/09/10"

[rule]
author = ["Elastic", "Willem D'Haese", "Austin Songer"]
description = """
Identifies brute-force authentication activity targeting Microsoft 365 user accounts using failed sign-in patterns that
match password spraying, credential stuffing, or password guessing behavior. Adversaries may attempt brute-force
authentication with credentials obtained from previous breaches, leaks, marketplaces or guessable passwords.
"""
false_positives = [
    """
    Automated processes that attempt to authenticate using expired credentials and unbounded retries may lead to false
    positives.
    """,
]
from = "now-60m"
interval = "10m"
language = "esql"
license = "Elastic License v2"
name = "M365 Identity User Brute Force Attempted"
note = """## Triage and Analysis

### Investigating M365 Identity User Brute Force Attempted

Identifies brute-force authentication activity targeting Microsoft 365 user accounts using failed sign-in patterns that match password spraying, credential stuffing, or password guessing behavior. Adversaries may attempt brute-force authentication with credentials obtained from previous breaches, leaks, marketplaces or guessable passwords.

### Possible investigation steps

- Review `user_id_list`: Enumerates the user accounts targeted. Look for naming patterns or privilege levels (e.g., admins).
- Check `login_errors`: A consistent error such as `"InvalidUserNameOrPassword"` confirms a spray-style attack using one or a few passwords.
- Examine `ip_list` and `source_orgs`: Determine if the traffic originates from a known corporate VPN, datacenter, or suspicious ASN like hosting providers or anonymizers.
- Review `countries` and `unique_country_count`: Geographic anomalies (e.g., login attempts from unexpected regions) may indicate malicious automation.
- Validate `total_attempts` vs `duration_seconds`: A high frequency of login attempts over a short period may suggest automation rather than manual logins.
- Cross-reference with successful logins: Pivot to surrounding sign-in logs (`azure.signinlogs`) or risk detections (`identityprotection`) for any account that eventually succeeded.
- Check for multi-factor challenges or bypasses: Determine if any of the accounts were protected or if the attack bypassed MFA.

### False positive analysis

- IT administrators using automation tools (e.g., PowerShell) during account provisioning may trigger false positives if login attempts cluster.
- Penetration testing or red team simulations may resemble spray activity.
- Infrequent, low-volume login testing tools like ADFS testing scripts can exhibit similar patterns.

### Response and remediation

- Initiate an internal incident ticket and inform the affected identity/IT team.
- Temporarily disable impacted user accounts if compromise is suspected.
- Investigate whether any login attempts succeeded after the spray window.
- Block the offending IPs or ASN temporarily via firewall or conditional access policies.
- Rotate passwords for all targeted accounts and audit for password reuse.
- Enforce or verify MFA is enabled for all user accounts.
- Consider deploying account lockout or progressive delay mechanisms if not already enabled.
"""
references = [
    "https://learn.microsoft.com/en-us/security/operations/incident-response-playbook-password-spray",
    "https://learn.microsoft.com/en-us/purview/audit-log-detailed-properties",
    "https://securityscorecard.com/research/massive-botnet-targets-m365-with-stealthy-password-spraying-attacks/",
    "https://github.com/0xZDH/Omnispray",
    "https://github.com/0xZDH/o365spray",
]
risk_score = 47
rule_id = "26f68dba-ce29-497b-8e13-b4fde1db5a2d"
severity = "medium"
tags = [
    "Domain: Cloud",
    "Domain: SaaS",
    "Data Source: Microsoft 365",
    "Data Source: Microsoft 365 Audit Logs",
    "Use Case: Identity and Access Audit",
    "Use Case: Threat Detection",
    "Tactic: Credential Access",
    "Resources: Investigation Guide",
]
timestamp_override = "event.ingested"
type = "esql"

query = '''
from logs-o365.audit-*
| mv_expand event.category
| eval
    Esql.time_window_date_trunc = date_trunc(5 minutes, @timestamp),
    Esql_priv.o365_audit_UserId_lower = to_lower(o365.audit.UserId),
    Esql.o365_audit_LogonError = o365.audit.LogonError,
    Esql.o365_audit_ExtendedProperties_RequestType_lower = to_lower(o365.audit.ExtendedProperties.RequestType)
| where
    data_stream.dataset == "o365.audit" and
    event.category == "authentication" and
    event.provider in ("AzureActiveDirectory", "Exchange") and
    event.action in ("UserLoginFailed", "PasswordLogonInitialAuthUsingPassword") and
    Esql.o365_audit_ExtendedProperties_RequestType_lower rlike "(oauth.*|.*login.*)" and
    Esql.o365_audit_LogonError != "IdsLocked" and
    Esql.o365_audit_LogonError not in (
        "EntitlementGrantsNotFound",
        "UserStrongAuthEnrollmentRequired",
        "UserStrongAuthClientAuthNRequired",
        "InvalidReplyTo",
        "SsoArtifactExpiredDueToConditionalAccess",
        "PasswordResetRegistrationRequiredInterrupt",
        "SsoUserAccountNotFoundInResourceTenant",
        "UserStrongAuthExpired",
        "CmsiInterrupt"
    ) and
    Esql_priv.o365_audit_UserId_lower != "not available" and
    o365.audit.Target.Type in ("0", "2", "6", "10")
| stats
    Esql.o365_audit_UserId_lower_count_distinct = count_distinct(Esql_priv.o365_audit_UserId_lower),
    Esql_priv.o365_audit_UserId_lower_values = values(Esql_priv.o365_audit_UserId_lower),
    Esql.o365_audit_LogonError_values = values(Esql.o365_audit_LogonError),
    Esql.o365_audit_LogonError_count_distinct = count_distinct(Esql.o365_audit_LogonError),
    Esql.o365_audit_ExtendedProperties_RequestType_values = values(Esql.o365_audit_ExtendedProperties_RequestType_lower),
    Esql.source_ip_values = values(source.ip),
    Esql.source_ip_count_distinct = count_distinct(source.ip),
    Esql.source_as_organization_name_values = values(source.`as`.organization.name),
    Esql.source_geo_country_name_values = values(source.geo.country_name),
    Esql.source_geo_country_name_count_distinct = count_distinct(source.geo.country_name),
    Esql.source_as_organization_name_count_distinct = count_distinct(source.`as`.organization.name),
    Esql.timestamp_first_seen = min(@timestamp),
    Esql.timestamp_last_seen = max(@timestamp),
    Esql.event_count = count(*)
  by Esql.time_window_date_trunc
| eval
    Esql.event_duration_seconds = date_diff("seconds", Esql.timestamp_first_seen, Esql.timestamp_last_seen),
    Esql.brute_force_type = case(
        Esql.o365_audit_UserId_lower_count_distinct >= 15 and Esql.o365_audit_LogonError_count_distinct == 1 and Esql.event_count >= 10 and Esql.event_duration_seconds <= 1800, "password_spraying",
        Esql.o365_audit_UserId_lower_count_distinct >= 8 and Esql.event_count >= 15 and Esql.o365_audit_LogonError_count_distinct <= 3 and Esql.source_ip_count_distinct <= 5 and Esql.event_duration_seconds <= 600, "credential_stuffing",
        Esql.o365_audit_UserId_lower_count_distinct == 1 and Esql.o365_audit_LogonError_count_distinct == 1 and Esql.event_count >= 20 and Esql.event_duration_seconds <= 300, "password_guessing",
        "other"
    )
| keep
    Esql.time_window_date_trunc,
    Esql.o365_audit_UserId_lower_count_distinct,
    Esql_priv.o365_audit_UserId_lower_values,
    Esql.o365_audit_LogonError_values,
    Esql.o365_audit_LogonError_count_distinct,
    Esql.o365_audit_ExtendedProperties_RequestType_values,
    Esql.source_ip_values,
    Esql.source_ip_count_distinct,
    Esql.source_as_organization_name_values,
    Esql.source_geo_country_name_values,
    Esql.source_geo_country_name_count_distinct,
    Esql.source_as_organization_name_count_distinct,
    Esql.timestamp_first_seen,
    Esql.timestamp_last_seen,
    Esql.event_duration_seconds,
    Esql.event_count,
    Esql.brute_force_type
| where Esql.brute_force_type != "other"
'''


[[rule.threat]]
framework = "MITRE ATT&CK"
[[rule.threat.technique]]
id = "T1110"
name = "Brute Force"
reference = "https://attack.mitre.org/techniques/T1110/"
[[rule.threat.technique.subtechnique]]
id = "T1110.001"
name = "Password Guessing"
reference = "https://attack.mitre.org/techniques/T1110/001/"

[[rule.threat.technique.subtechnique]]
id = "T1110.003"
name = "Password Spraying"
reference = "https://attack.mitre.org/techniques/T1110/003/"

[[rule.threat.technique.subtechnique]]
id = "T1110.004"
name = "Credential Stuffing"
reference = "https://attack.mitre.org/techniques/T1110/004/"



[rule.threat.tactic]
id = "TA0006"
name = "Credential Access"
reference = "https://attack.mitre.org/tactics/TA0006/"

Stages and Predicates

Stage 1: from

from logs-o365.audit-*

Stage 2: mv_expand

| mv_expand event.category

Stage 3: eval

| eval
    Esql.time_window_date_trunc = date_trunc(5 minutes, @timestamp),
    Esql_priv.o365_audit_UserId_lower = to_lower(o365.audit.UserId),
    Esql.o365_audit_LogonError = o365.audit.LogonError,
    Esql.o365_audit_ExtendedProperties_RequestType_lower = to_lower(o365.audit.ExtendedProperties.RequestType)

Stage 4: where

| where
    data_stream.dataset == "o365.audit" and
    event.category == "authentication" and
    event.provider in ("AzureActiveDirectory", "Exchange") and
    event.action in ("UserLoginFailed", "PasswordLogonInitialAuthUsingPassword") and
    Esql.o365_audit_ExtendedProperties_RequestType_lower rlike "(oauth.*|.*login.*)" and
    Esql.o365_audit_LogonError != "IdsLocked" and
    Esql.o365_audit_LogonError not in (
        "EntitlementGrantsNotFound",
        "UserStrongAuthEnrollmentRequired",
        "UserStrongAuthClientAuthNRequired",
        "InvalidReplyTo",
        "SsoArtifactExpiredDueToConditionalAccess",
        "PasswordResetRegistrationRequiredInterrupt",
        "SsoUserAccountNotFoundInResourceTenant",
        "UserStrongAuthExpired",
        "CmsiInterrupt"
    ) and
    Esql_priv.o365_audit_UserId_lower != "not available" and
    o365.audit.Target.Type in ("0", "2", "6", "10")

Stage 5: stats

| stats
    Esql.o365_audit_UserId_lower_count_distinct = count_distinct(Esql_priv.o365_audit_UserId_lower),
    Esql_priv.o365_audit_UserId_lower_values = values(Esql_priv.o365_audit_UserId_lower),
    Esql.o365_audit_LogonError_values = values(Esql.o365_audit_LogonError),
    Esql.o365_audit_LogonError_count_distinct = count_distinct(Esql.o365_audit_LogonError),
    Esql.o365_audit_ExtendedProperties_RequestType_values = values(Esql.o365_audit_ExtendedProperties_RequestType_lower),
    Esql.source_ip_values = values(source.ip),
    Esql.source_ip_count_distinct = count_distinct(source.ip),
    Esql.source_as_organization_name_values = values(source.`as`.organization.name),
    Esql.source_geo_country_name_values = values(source.geo.country_name),
    Esql.source_geo_country_name_count_distinct = count_distinct(source.geo.country_name),
    Esql.source_as_organization_name_count_distinct = count_distinct(source.`as`.organization.name),
    Esql.timestamp_first_seen = min(@timestamp),
    Esql.timestamp_last_seen = max(@timestamp),
    Esql.event_count = count(*)
  by Esql.time_window_date_trunc

Stage 6: eval

| eval
    Esql.event_duration_seconds = date_diff("seconds", Esql.timestamp_first_seen, Esql.timestamp_last_seen),
    Esql.brute_force_type = case(
        Esql.o365_audit_UserId_lower_count_distinct >= 15 and Esql.o365_audit_LogonError_count_distinct == 1 and Esql.event_count >= 10 and Esql.event_duration_seconds <= 1800, "password_spraying",
        Esql.o365_audit_UserId_lower_count_distinct >= 8 and Esql.event_count >= 15 and Esql.o365_audit_LogonError_count_distinct <= 3 and Esql.source_ip_count_distinct <= 5 and Esql.event_duration_seconds <= 600, "credential_stuffing",
        Esql.o365_audit_UserId_lower_count_distinct == 1 and Esql.o365_audit_LogonError_count_distinct == 1 and Esql.event_count >= 20 and Esql.event_duration_seconds <= 300, "password_guessing",
        "other"
    )
Esql.brute_force_type =
ifEsql.o365_audit_UserId_lower_count_distinct >= 15 and Esql.o365_audit_LogonError_count_distinct == 1 and Esql.event_count >= 10 and Esql.event_duration_seconds <= 1800"password_spraying"
elifEsql.o365_audit_UserId_lower_count_distinct >= 8 and Esql.event_count >= 15 and Esql.o365_audit_LogonError_count_distinct <= 3 and Esql.source_ip_count_distinct <= 5 and Esql.event_duration_seconds <= 600"credential_stuffing"
elifEsql.o365_audit_UserId_lower_count_distinct == 1 and Esql.o365_audit_LogonError_count_distinct == 1 and Esql.event_count >= 20 and Esql.event_duration_seconds <= 300"password_guessing"
else"other"

Stage 7: keep

| keep
    Esql.time_window_date_trunc,
    Esql.o365_audit_UserId_lower_count_distinct,
    Esql_priv.o365_audit_UserId_lower_values,
    Esql.o365_audit_LogonError_values,
    Esql.o365_audit_LogonError_count_distinct,
    Esql.o365_audit_ExtendedProperties_RequestType_values,
    Esql.source_ip_values,
    Esql.source_ip_count_distinct,
    Esql.source_as_organization_name_values,
    Esql.source_geo_country_name_values,
    Esql.source_geo_country_name_count_distinct,
    Esql.source_as_organization_name_count_distinct,
    Esql.timestamp_first_seen,
    Esql.timestamp_last_seen,
    Esql.event_duration_seconds,
    Esql.event_count,
    Esql.brute_force_type

Stage 8: where

| where Esql.brute_force_type != "other"

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
Esql.o365_audit_LogonErrorinCmsiInterrupt, EntitlementGrantsNotFound, InvalidReplyTo, PasswordResetRegistrationRequiredInterrupt, SsoArtifactExpiredDueToConditionalAccess, SsoUserAccountNotFoundInResourceTenant, UserStrongAuthClientAuthNRequired, UserStrongAuthEnrollmentRequired, UserStrongAuthExpiredexcludes:Esql.o365_audit_LogonError

Output Fields

These fields are emitted when the rule matches.

FieldSource
Esql.time_window_date_truncKEEP Esql.time_window_date_trunc
Esql.o365_audit_UserId_lower_count_distinctKEEP Esql.o365_audit_UserId_lower_count_distinct
Esql_priv.o365_audit_UserId_lower_valuesKEEP Esql_priv.o365_audit_UserId_lower_values
Esql.o365_audit_LogonError_valuesKEEP Esql.o365_audit_LogonError_values
Esql.o365_audit_LogonError_count_distinctKEEP Esql.o365_audit_LogonError_count_distinct
Esql.o365_audit_ExtendedProperties_RequestType_valuesKEEP Esql.o365_audit_ExtendedProperties_RequestType_values
Esql.source_ip_valuesKEEP Esql.source_ip_values
Esql.source_ip_count_distinctKEEP Esql.source_ip_count_distinct
Esql.source_as_organization_name_valuesKEEP Esql.source_as_organization_name_values
Esql.source_geo_country_name_valuesKEEP Esql.source_geo_country_name_values
Esql.source_geo_country_name_count_distinctKEEP Esql.source_geo_country_name_count_distinct
Esql.source_as_organization_name_count_distinctKEEP Esql.source_as_organization_name_count_distinct
Esql.timestamp_first_seenKEEP Esql.timestamp_first_seen
Esql.timestamp_last_seenKEEP Esql.timestamp_last_seen
Esql.event_duration_secondsKEEP Esql.event_duration_seconds
Esql.event_countKEEP Esql.event_count
Esql.brute_force_typeKEEP Esql.brute_force_type

M365 SharePoint/OneDrive File Access via PowerShell

#
Status
production
Severity
high
Time window
9m
Group by
user.id, user_agent.original
Author
Elastic
Source
github.com/elastic/detection-rules

Identifies file downloads or access from OneDrive or SharePoint using PowerShell-based user agents. Adversaries may use native PowerShell cmdlets like Invoke-WebRequest or Invoke-RestMethod with Microsoft Graph API to exfiltrate data after compromising OAuth tokens via device code phishing or other credential theft techniques. This rule detects both direct PowerShell access and PnP PowerShell module usage for file operations. FileAccessed events are included to detect adversaries reading file content via API and saving locally, bypassing traditional download methods. Normal users access SharePoint/OneDrive via browsers or sync clients, making PowerShell-based file access inherently suspicious.

Known False Positives

  • Legitimate automation scripts using PowerShell to interact with SharePoint or OneDrive for business purposes.
  • IT administrators using PnP PowerShell for site management, migration, or backup operations.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

[metadata]
creation_date = "2026/02/24"
integration = ["o365"]
maturity = "production"
updated_date = "2026/07/08"

[rule]
author = ["Elastic"]
description = """
Identifies file downloads or access from OneDrive or SharePoint using PowerShell-based user agents. Adversaries may use
native PowerShell cmdlets like Invoke-WebRequest or Invoke-RestMethod with Microsoft Graph API to exfiltrate data after
compromising OAuth tokens via device code phishing or other credential theft techniques. This rule detects both direct
PowerShell access and PnP PowerShell module usage for file operations. FileAccessed events are included to detect
adversaries reading file content via API and saving locally, bypassing traditional download methods. Normal users access
SharePoint/OneDrive via browsers or sync clients, making PowerShell-based file access inherently suspicious.
"""
false_positives = [
    "Legitimate automation scripts using PowerShell to interact with SharePoint or OneDrive for business purposes.",
    "IT administrators using PnP PowerShell for site management, migration, or backup operations.",
]
from = "now-9m"
index = ["filebeat-*", "logs-o365.audit-*"]
language = "kuery"
license = "Elastic License v2"
name = "M365 SharePoint/OneDrive File Access via PowerShell"
note = """## Triage and Analysis

### Investigating M365 SharePoint/OneDrive File Access via PowerShell

This rule detects file downloads and access from OneDrive or SharePoint using PowerShell-based user agents. Threat actors commonly use device code phishing to obtain OAuth tokens, then use native PowerShell or PnP PowerShell modules to enumerate and exfiltrate files from SharePoint and OneDrive. FileAccessed events are included because adversaries may read file content via the Graph API `/content` endpoint and save locally, bypassing traditional download events.

#### Possible Investigation Steps

- Identify the user whose token was used and determine if they typically use PowerShell for file operations.
- Review the OAuth application/client ID used to authenticate. Look for public client IDs that may indicate device code phishing.
- Check the source IP address and compare with the user's typical access locations.
- Identify which SharePoint site or OneDrive was accessed.
- Correlate with Azure AD sign-in logs to determine if device code authentication was used.
- Look for rapid sequential file downloads from the same session, which may indicate bulk data exfiltration.
- Check for search activity from the same user/session that may indicate reconnaissance before download.

### False Positive Analysis

- IT administrators legitimately using PnP PowerShell for site management, migration, or backup operations.
- Automated scripts using PowerShell for legitimate data processing or synchronization tasks.
- Consider creating exceptions for known automation service accounts.

### Response and Remediation

- If unauthorized activity is confirmed, immediately revoke the OAuth token and terminate active sessions for the affected user.
- Reset the user's credentials and require reauthentication with MFA.
- Review all files accessed during the session to assess data exposure.
- Implement conditional access policies to restrict device code authentication flow.
- Consider blocking public client IDs that are not needed for business operations.
- Review and audit OAuth application permissions in your tenant.
"""
references = [
    "https://www.volexity.com/blog/2025/02/13/multiple-russian-threat-actors-targeting-microsoft-device-code-authentication/",
    "https://cloud.google.com/blog/topics/threat-intelligence/expansion-shinyhunters-saas-data-theft",
    "https://pnp.github.io/powershell/",
]
risk_score = 73
rule_id = "491651da-125b-11f1-af7d-f661ea17fbce"
severity = "high"
tags = [
    "Domain: Cloud",
    "Domain: SaaS",
    "Data Source: Microsoft 365",
    "Data Source: Microsoft 365 Audit Logs",
    "Use Case: Threat Detection",
    "Tactic: Collection",
    "Tactic: Exfiltration",
    "Resources: Investigation Guide",
]
timestamp_override = "event.ingested"
type = "new_terms"

query = '''
data_stream.dataset: "o365.audit" and
    event.provider: ("SharePoint" or "OneDrive") and
    event.action: ("FileDownloaded" or "FileAccessed") and
    event.outcome: "success" and
    user_agent.original: (*PowerShell* or *PnPPS* or *PnPCoreSDK* or *SharePointPnP*)
'''


[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1213"
name = "Data from Information Repositories"
reference = "https://attack.mitre.org/techniques/T1213/"

[[rule.threat.technique.subtechnique]]
id = "T1213.002"
name = "Sharepoint"
reference = "https://attack.mitre.org/techniques/T1213/002/"

[[rule.threat.technique]]
id = "T1530"
name = "Data from Cloud Storage"
reference = "https://attack.mitre.org/techniques/T1530/"

[rule.threat.tactic]
id = "TA0009"
name = "Collection"
reference = "https://attack.mitre.org/tactics/TA0009/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[rule.threat.tactic]
id = "TA0010"
name = "Exfiltration"
reference = "https://attack.mitre.org/tactics/TA0010/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1059"
name = "Command and Scripting Interpreter"
reference = "https://attack.mitre.org/techniques/T1059/"

[[rule.threat.technique.subtechnique]]
id = "T1059.001"
name = "PowerShell"
reference = "https://attack.mitre.org/techniques/T1059/001/"

[rule.threat.tactic]
id = "TA0002"
name = "Execution"
reference = "https://attack.mitre.org/tactics/TA0002/"

[rule.investigation_fields]
field_names = [
    "@timestamp",
    "user.id",
    "user_agent.original",
    "event.action",
    "event.provider",
    "source.ip",
    "source.geo.country_name",
    "o365.audit.ApplicationId",
    "o365.audit.SiteUrl",
    "file.name",
    "file.directory",
]

[rule.new_terms]
field = "new_terms_fields"
value = ["user.id", "user_agent.original"]
[[rule.new_terms.history_window_start]]
field = "history_window_start"
value = "now-7d"

Stages and Predicates

Stage 1: new_terms

data_stream.dataset: "o365.audit" and
    event.provider: ("SharePoint" or "OneDrive") and
    event.action: ("FileDownloaded" or "FileAccessed") and
    event.outcome: "success" and
    user_agent.original: (*PowerShell* or *PnPPS* or *PnPCoreSDK* or *SharePointPnP*)

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
data_stream.dataseteq
  • o365.audit corpus 38 (elastic 38)
field:"data_stream.dataset" kind:eq value:"o365.audit"
event.actionin
  • FileAccessed
  • FileDownloaded
field:"EventType" kind:in
event.outcomeeq
  • success corpus 306 (elastic 306)
field:"event.outcome" kind:eq value:"success"
event.providerin
  • OneDrive corpus 3 (elastic 3)
  • SharePoint corpus 3 (elastic 3)
field:"Provider_Name" kind:in
user_agent.originalwildcard
  • *PnPCoreSDK*
  • *PnPPS*
  • *PowerShell*
  • *SharePointPnP*
field:"aws::userAgent" kind:wildcard

Node Script Execution and Immediate Deletion

#
Time window
10s
Sequence by
process.entity_id
Source
github.com/elastic/protections-artifacts

Detects Node.js executing a JavaScript file followed by immediate deletion of that script. This anti-forensics pattern is used to execute malicious logic and then destroy the evidence, making post-incident inspection difficult. The tight timing window between execution and deletion distinguishes this from normal cleanup or build processes.

MITRE ATT&CK Coverage

Rule Body

[rule]
description = """
Detects Node.js executing a JavaScript file followed by immediate deletion of that script. This anti-forensics pattern
is used to execute malicious logic and then destroy the evidence, making post-incident inspection difficult. The tight
timing window between execution and deletion distinguishes this from normal cleanup or build processes.
"""
id = "1059825f-8f64-4b69-a398-2a54003d1946"
license = "Elastic License v2"
name = "Node Script Execution and Immediate Deletion"
os_list = ["linux", "windows"]
reference = ["https://www.elastic.co/security-labs/axios-supply-chain-compromise-detections"]
version = "1.0.2"

query = '''
sequence by process.entity_id with maxspan=10s
  [process where event.type == "start" and event.action in ("exec", "start") and
    process.name in ("node", "node.exe") and process.args_count <= 2 and
    process.args like~ (
      "/tmp/*.js", "/private/tmp/*.js",
      "/var/tmp/*.js", "/private/var/tmp/*.js",
      "/Users/Shared/*.js",
      "/var/folders/*/T/*.js", "/private/var/folders/*/T/*.js",
      "/Users/*/Library/Caches/*.js",
      "/dev/shm/*.js",
      "?:\\\\Users\\\\*\\\\AppData\\\\Local\\\\Temp\\\\*.js",
      "?:\\\\Windows\\\\Temp\\\\*.js",
      "?:\\\\ProgramData\\\\Temp\\\\*.js"
    )] as event0
  [file where event.action == "deletion" and file.extension : "js" and
   stringcontains~(event0.process.command_line, file.name) and
   not (
     process.executable like "/actions-runner/externals/node24/bin/node" and
     file.path like (
       "/tmp/github-runner-*/index.js",
       "/root/setup-pnpm/node_modules/.pnpm/pnpm@*/node_modules/pnpm/dist/node_modules/env-paths/index.js"
     )
   )]
'''

min_endpoint_version = "8.16.0"
optional_actions = []
[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0

[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 1

[[actions]]
action = "kill_process"
field = "process.parent.entity_id"
state = 0

[[actions]]
action = "kill_process"
field = "process.parent.entity_id"
state = 1

[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1070"
name = "Indicator Removal"
reference = "https://attack.mitre.org/techniques/T1070/"
[[threat.technique.subtechnique]]
id = "T1070.004"
name = "File Deletion"
reference = "https://attack.mitre.org/techniques/T1070/004/"



[threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"

[internal]
min_endpoint_version = "8.16.0"

Stages and Predicates

Ordered sequence: each step below must occur in order within 10s, correlated by process.entity_id.

Stage 1: process

[process where event.type == "start" and event.action in ("exec", "start") and
    process.name in ("node", "node.exe") and process.args_count <= 2 and
    process.args like~ (
      "/tmp/*.js", "/private/tmp/*.js",
      "/var/tmp/*.js", "/private/var/tmp/*.js",
      "/Users/Shared/*.js",
      "/var/folders/*/T/*.js", "/private/var/folders/*/T/*.js",
      "/Users/*/Library/Caches/*.js",
      "/dev/shm/*.js",
      "?:\\\\Users\\\\*\\\\AppData\\\\Local\\\\Temp\\\\*.js",
      "?:\\\\Windows\\\\Temp\\\\*.js",
      "?:\\\\ProgramData\\\\Temp\\\\*.js"
    )] as event0

Stage 2: file

[file where event.action == "deletion" and file.extension : "js" and
   stringcontains~(event0.process.command_line, file.name) and
   not (
     process.executable like "/actions-runner/externals/node24/bin/node" and
     file.path like (
       "/tmp/github-runner-*/index.js",
       "/root/setup-pnpm/node_modules/.pnpm/pnpm@*/node_modules/pnpm/dist/node_modules/env-paths/index.js"
     )
   )]

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
event.actioneq
  • deletion corpus 13 (elastic 13)
field:"EventType" kind:eq value:"deletion"
event.actionin
  • exec corpus 180 (elastic 180)
  • start corpus 157 (elastic 157)
field:"EventType" kind:in
event.typeeq
  • start corpus 1036 (elastic 1036)
field:"event.type" kind:eq value:"start"
event0.process.command_linecontains
  • file.name (field reference)
field:"event0.process.command_line" kind:contains value:"file.name"
file.extensionwildcard
  • js corpus 22 (elastic 22)
field:"file.extension" kind:wildcard value:"js"
process.argswildcard
  • /Users/*/Library/Caches/*.js corpus 2 (elastic 2)
  • /Users/Shared/*.js corpus 2 (elastic 2)
  • /dev/shm/*.js corpus 3 (elastic 3)
  • /private/tmp/*.js corpus 2 (elastic 2)
  • /private/var/folders/*/T/*.js corpus 2 (elastic 2)
  • /private/var/tmp/*.js corpus 2 (elastic 2)
  • /tmp/*.js corpus 3 (elastic 3)
  • /var/folders/*/T/*.js corpus 2 (elastic 2)
  • /var/tmp/*.js corpus 3 (elastic 3)
  • ?:\\ProgramData\\Temp\\*.js corpus 2 (elastic 2)
  • ?:\\Users\\*\\AppData\\Local\\Temp\\*.js corpus 2 (elastic 2)
  • ?:\\Windows\\Temp\\*.js corpus 2 (elastic 2)
field:"process.args" kind:wildcard
process.args_countle
  • 2 transforms: number corpus 17 (elastic 17)
field:"process.args_count" kind:le value:"2"
process.namein
  • node corpus 25 (elastic 25)
  • node.exe corpus 6 (elastic 6)
field:"process_basename" kind:in

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
file.pathwildcard/tmp/github-runner-*/index.js, /root/setup-pnpm/node_modules/.pnpm/pnpm@*/node_modules/pnpm/dist/node_modules/env-paths/index.jsexcludes:file.path field:"file.path" value:"/tmp/github-runner-*/index.js" field:"file.path" value:"/root/setup-pnpm/node_modules/.pnpm/pnpm@*/node_modules/pnpm/dist/node_modules/env-paths/index.js"
process.executableeq/actions-runner/externals/node24/bin/nodeexcludes:process.executable field:"process.executable" value:"/actions-runner/externals/node24/bin/node"

NullSessionPipe Registry Modification

#
Status
production
Severity
medium
Time window
9m
Author
Elastic
Source
github.com/elastic/detection-rules

Identifies NullSessionPipe registry modifications that specify which pipes can be accessed anonymously. This could be indicative of adversary lateral movement preparation by making the added pipe available to everyone.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

[metadata]
creation_date = "2021/03/22"
integration = ["endpoint", "windows", "m365_defender", "sentinel_one_cloud_funnel", "crowdstrike"]
maturity = "production"
updated_date = "2026/05/04"

[rule]
author = ["Elastic"]
description = """
Identifies NullSessionPipe registry modifications that specify which pipes can be accessed anonymously. This could be
indicative of adversary lateral movement preparation by making the added pipe available to everyone.
"""
from = "now-9m"
index = [
    "logs-endpoint.events.registry-*",
    "endgame-*",
    "logs-windows.sysmon_operational-*",
    "winlogbeat-*",
    "logs-m365_defender.event-*",
    "logs-sentinel_one_cloud_funnel.*",
    "logs-crowdstrike.fdr*",
]
language = "eql"
license = "Elastic License v2"
name = "NullSessionPipe Registry Modification"
note = """## Triage and analysis

> **Disclaimer**:
> This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs.

### Investigating NullSessionPipe Registry Modification

The NullSessionPipe registry setting in Windows defines which named pipes can be accessed without authentication, facilitating anonymous connections. Adversaries may exploit this by modifying the registry to enable lateral movement, allowing unauthorized access to network resources. The detection rule monitors changes to this registry path, flagging modifications that introduce new accessible pipes, which could indicate malicious intent.

### Possible investigation steps

- Review the registry event details to confirm the specific named pipes added or modified in the NullSessionPipes registry path. Focus on the registry.data.strings field to identify any new or suspicious entries.
- Correlate the timestamp of the registry change event with other security events or logs from the same host to identify any concurrent suspicious activities, such as unusual network connections or process executions.
- Investigate the user account or process responsible for the registry modification by examining the event data for user context or process identifiers. This can help determine if the change was made by an unauthorized user or malicious process.
- Check for any recent alerts or logs related to lateral movement or unauthorized access attempts on the network, focusing on the host where the registry change was detected.
- Assess the risk and impact of the modified named pipes by determining if they are commonly used in legitimate operations or if they are known to be exploited by malware or threat actors.

### False positive analysis

- Legitimate administrative tools or scripts may modify the NullSessionPipe registry setting as part of routine network management. Review the source of the change and verify if it aligns with known administrative activities.
- Some network services or applications might require anonymous access to specific pipes for functionality. Identify these services and document them to differentiate between expected and unexpected modifications.
- Scheduled tasks or automated deployment scripts could alter the registry setting during updates or installations. Ensure these tasks are documented and verify their legitimacy.
- Security software or network monitoring tools might adjust the NullSessionPipe settings for scanning purposes. Confirm with your security team if such tools are in use and adjust the detection rule to exclude these known activities.
- Regularly review and update the list of known exceptions in your detection system to prevent alert fatigue and ensure focus on genuine threats.

### Response and remediation

- Immediately isolate the affected system from the network to prevent further unauthorized access or lateral movement.
- Review the registry changes to identify any unauthorized pipes added to the NullSessionPipes registry key and remove them to restore secure configurations.
- Conduct a thorough scan of the affected system using updated antivirus and anti-malware tools to detect and remove any malicious software that may have been introduced.
- Analyze network logs and system event logs to identify any unauthorized access attempts or successful connections made through the modified pipes, and block any suspicious IP addresses or accounts.
- Reset credentials for any accounts that may have been compromised or used in conjunction with the unauthorized access to ensure they cannot be reused by adversaries.
- Escalate the incident to the security operations center (SOC) or incident response team for further investigation and to determine if additional systems have been affected.
- Implement enhanced monitoring and alerting for changes to the NullSessionPipes registry key and similar registry paths to detect and respond to future unauthorized modifications promptly."""
references = [
    "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/",
    "https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/network-access-restrict-anonymous-access-to-named-pipes-and-shares",
]
risk_score = 47
rule_id = "ddab1f5f-7089-44f5-9fda-de5b11322e77"
severity = "medium"
tags = [
    "Domain: Endpoint",
    "OS: Windows",
    "Use Case: Threat Detection",
    "Tactic: Lateral Movement",
    "Tactic: Defense Evasion",
    "Data Source: Elastic Endgame",
    "Data Source: Elastic Defend",
    "Data Source: Sysmon",
    "Data Source: Microsoft Defender XDR",
    "Data Source: SentinelOne",
    "Data Source: Crowdstrike",
    "Resources: Investigation Guide",
]
timestamp_override = "event.ingested"
type = "eql"

query = '''
registry where host.os.type == "windows" and event.type == "change" and
  registry.value : "NullSessionPipes" and
  length(registry.data.strings) > 0 and
  not registry.data.strings : "(empty)"
'''

setup = """## Setup

This rule is designed for data generated by [Elastic Defend](https://www.elastic.co/security/endpoint-security), which provides native endpoint detection and response, along with event enrichments designed to work with our detection rules.

Setup instructions: https://ela.st/install-elastic-defend

### Additional data sources

This rule also supports the following third-party data sources. For setup instructions, refer to the links below:

- [CrowdStrike](https://ela.st/crowdstrike-integration)
- [Microsoft Defender XDR](https://ela.st/m365-defender)
- [SentinelOne Cloud Funnel](https://ela.st/sentinel-one-cloud-funnel)
- [Sysmon Registry Events](https://ela.st/sysmon-event-reg-setup)
"""


[[rule.threat]]
framework = "MITRE ATT&CK"
[[rule.threat.technique]]
id = "T1021"
name = "Remote Services"
reference = "https://attack.mitre.org/techniques/T1021/"
[[rule.threat.technique.subtechnique]]
id = "T1021.002"
name = "SMB/Windows Admin Shares"
reference = "https://attack.mitre.org/techniques/T1021/002/"



[rule.threat.tactic]
id = "TA0008"
name = "Lateral Movement"
reference = "https://attack.mitre.org/tactics/TA0008/"
[[rule.threat]]
framework = "MITRE ATT&CK"
[[rule.threat.technique]]
id = "T1112"
name = "Modify Registry"
reference = "https://attack.mitre.org/techniques/T1112/"


[rule.threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"

Stages and Predicates

Stage 1: registry

registry where host.os.type == "windows" and event.type == "change" and
  registry.value : "NullSessionPipes" and
  length(registry.data.strings) > 0 and
  not registry.data.strings : "(empty)"

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
registry.data.stringseq(empty)excludes:registry.data.strings field:"registry.data.strings" value:"(empty)"

Pluggable Authentication Module (PAM) Creation in Unusual Directory

#
Status
production
Severity
low
Time window
9m
Author
Elastic
Source
github.com/elastic/detection-rules

This rule detects the creation of Pluggable Authentication Module (PAM) shared object files in unusual directories. Attackers may compile PAM shared object files in temporary directories, to move them to system directories later, potentially allowing them to maintain persistence on a compromised system, or harvest account credentials.

Known False Positives

  • Trusted system module updates or allowed Pluggable Authentication Module (PAM) daemon configuration changes.

MITRE ATT&CK Coverage

Rule Body

[metadata]
creation_date = "2024/12/16"
integration = ["endpoint", "sentinel_one_cloud_funnel"]
maturity = "production"
updated_date = "2026/03/24"

[rule]
author = ["Elastic"]
description = """
This rule detects the creation of Pluggable Authentication Module (PAM) shared object files in unusual directories.
Attackers may compile PAM shared object files in temporary directories, to move them to system directories later,
potentially allowing them to maintain persistence on a compromised system, or harvest account credentials.
"""
false_positives = [
    "Trusted system module updates or allowed Pluggable Authentication Module (PAM) daemon configuration changes.",
]
from = "now-9m"
index = ["logs-endpoint.events.file*", "logs-sentinel_one_cloud_funnel.*", "endgame-*"]
language = "eql"
license = "Elastic License v2"
name = "Pluggable Authentication Module (PAM) Creation in Unusual Directory"
note = """## Triage and analysis

> **Disclaimer**:
> This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs.

### Investigating Pluggable Authentication Module (PAM) Creation in Unusual Directory

Pluggable Authentication Modules (PAM) are integral to Linux systems, managing authentication tasks. Adversaries may exploit PAM by creating malicious modules in non-standard directories, aiming to gain persistence or capture credentials. The detection rule identifies such anomalies by monitoring the creation of PAM files outside typical system paths, excluding benign processes and known directories, thus highlighting potential threats.

### Possible investigation steps

- Review the file creation event details, focusing on the file path and name to determine the exact location and nature of the PAM shared object file created.
- Investigate the process that created the file by examining the process name and its parent process to understand the context and legitimacy of the file creation.
- Check the user account associated with the process that created the file to assess if it has the necessary permissions and if the activity aligns with typical user behavior.
- Analyze recent system logs and command history for any suspicious activities or commands that might indicate an attempt to compile or move PAM modules.
- Correlate the event with other security alerts or anomalies on the system to identify potential patterns or coordinated actions that could indicate a broader compromise.
- If possible, retrieve and analyze the contents of the PAM shared object file to identify any malicious code or indicators of compromise.

### False positive analysis

- Development and testing environments may compile PAM modules in temporary directories. To manage this, exclude paths commonly used for development, such as "/tmp/dev/*" or "/var/tmp/test/*".
- Containerized applications might create PAM modules in non-standard directories. Exclude processes like "dockerd" and "containerd" to prevent false positives from container operations.
- Package managers or system update tools may temporarily store PAM modules in unusual directories during updates. Exclude paths like "/var/cache/pacman/pkg/*" or "/var/lib/dpkg/tmp.ci/*" to avoid alerts during legitimate system updates.
- Custom scripts or automation tools might generate PAM modules in user-specific directories. Identify and exclude these specific scripts or paths if they are known to be safe and necessary for operations.
- Temporary backup or recovery operations might involve copying PAM modules to non-standard locations. Exclude paths used for backups, such as "/backup/*" or "/recovery/*", if these operations are verified as secure.

### Response and remediation

- Immediately isolate the affected system from the network to prevent further unauthorized access or lateral movement by the adversary.
- Conduct a thorough review of the unusual directory where the PAM file was created to identify any other suspicious files or activities, and remove any malicious files found.
- Analyze the process that created the PAM file to determine if it was initiated by a legitimate user or process, and terminate any malicious processes.
- Reset credentials for any accounts that may have been compromised, focusing on those with elevated privileges or access to sensitive systems.
- Restore the affected system from a known good backup to ensure that no malicious modifications persist.
- Implement additional monitoring on the affected system and similar systems to detect any further attempts to create PAM files in unusual directories.
- Escalate the incident to the security operations team for further investigation and to assess the potential impact on other systems within the network."""
references = [
    "https://github.com/zephrax/linux-pam-backdoor",
    "https://github.com/eurialo/pambd",
    "http://0x90909090.blogspot.com/2016/06/creating-backdoor-in-pam-in-5-line-of.html",
    "https://www.trendmicro.com/en_us/research/19/i/skidmap-linux-malware-uses-rootkit-capabilities-to-hide-cryptocurrency-mining-payload.html",
]
risk_score = 21
rule_id = "5c832156-5785-4c9c-a2e7-0d80d2ba3daa"
severity = "low"
tags = [
    "Domain: Endpoint",
    "OS: Linux",
    "Use Case: Threat Detection",
    "Tactic: Credential Access",
    "Tactic: Persistence",
    "Data Source: Elastic Defend",
    "Data Source: SentinelOne",
    "Data Source: Elastic Endgame",
    "Resources: Investigation Guide",
]
timestamp_override = "event.ingested"
type = "eql"
query = '''
file where host.os.type == "linux" and event.type == "creation" and file.name like "pam_*.so" and not file.path like (
  "/lib/security/*",
  "/lib64/security/*",
  "/lib/x86_64-linux-gnu/security/*",
  "/usr/lib/security/*",
  "/usr/lib64/security/*",
  "/usr/lib/x86_64-linux-gnu/security/*"
) and not (
  process.name in ("dockerd", "containerd", "steam", "buildkitd", "unsquashfs", "pacman", "executor") or
  file.path like (
    "/build/rootImage/nix/store/*", "/home/*/.local/share/containers/*", "/nix/store/*", "/var/lib/containerd/*",
    "/var/snap/*", "/usr/share/nix/nix/store/*", "/tmp/cura/squashfs-root/*", "/home/*/docker/*", "/tmp/containerd*",
    "/var/lib/rancher/*/agent/containerd/*", "/var/lib/lxc/*", "/var/lib/containers/storage/*", "/var/lib/checkpoint*",
    "/var/lib/docker/overlay2/*", "/srv/docker/*", "/podman/storage/*", "/opt/jail/driver-jail*", "/build/tmp/work/iot*",
    "/tmp/containers-root/*", "/cce-14/*", "/cce-usr/*", "/var/tmp/portage/*", "/media/*", "/data/var/lib/docker/overlay2/*",
    "/home/*/.cache/bazel/*", "/home/*/.cache/umu/*/SteamLinuxRuntime*"
  )
)
'''

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1543"
name = "Create or Modify System Process"
reference = "https://attack.mitre.org/techniques/T1543/"

[[rule.threat.technique]]
id = "T1556"
name = "Modify Authentication Process"
reference = "https://attack.mitre.org/techniques/T1556/"

[[rule.threat.technique.subtechnique]]
id = "T1556.003"
name = "Pluggable Authentication Modules"
reference = "https://attack.mitre.org/techniques/T1556/003/"

[rule.threat.tactic]
id = "TA0003"
name = "Persistence"
reference = "https://attack.mitre.org/tactics/TA0003/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1556"
name = "Modify Authentication Process"
reference = "https://attack.mitre.org/techniques/T1556/"

[[rule.threat.technique.subtechnique]]
id = "T1556.003"
name = "Pluggable Authentication Modules"
reference = "https://attack.mitre.org/techniques/T1556/003/"

[rule.threat.tactic]
id = "TA0006"
name = "Credential Access"
reference = "https://attack.mitre.org/tactics/TA0006/"

Stages and Predicates

Stage 1: file

file where host.os.type == "linux" and event.type == "creation" and file.name like "pam_*.so" and not file.path like (
  "/lib/security/*",
  "/lib64/security/*",
  "/lib/x86_64-linux-gnu/security/*",
  "/usr/lib/security/*",
  "/usr/lib64/security/*",
  "/usr/lib/x86_64-linux-gnu/security/*"
) and not (
  process.name in ("dockerd", "containerd", "steam", "buildkitd", "unsquashfs", "pacman", "executor") or
  file.path like (
    "/build/rootImage/nix/store/*", "/home/*/.local/share/containers/*", "/nix/store/*", "/var/lib/containerd/*",
    "/var/snap/*", "/usr/share/nix/nix/store/*", "/tmp/cura/squashfs-root/*", "/home/*/docker/*", "/tmp/containerd*",
    "/var/lib/rancher/*/agent/containerd/*", "/var/lib/lxc/*", "/var/lib/containers/storage/*", "/var/lib/checkpoint*",
    "/var/lib/docker/overlay2/*", "/srv/docker/*", "/podman/storage/*", "/opt/jail/driver-jail*", "/build/tmp/work/iot*",
    "/tmp/containers-root/*", "/cce-14/*", "/cce-usr/*", "/var/tmp/portage/*", "/media/*", "/data/var/lib/docker/overlay2/*",
    "/home/*/.cache/bazel/*", "/home/*/.cache/umu/*/SteamLinuxRuntime*"
  )
)

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
file.pathwildcard/build/rootImage/nix/store/*, /home/*/.local/share/containers/*, /nix/store/*, /var/lib/containerd/*, /var/snap/*, /usr/share/nix/nix/store/*, /tmp/cura/squashfs-root/*, /home/*/docker/*, /tmp/containerd*, /var/lib/rancher/*/agent/containerd/*, /var/lib/lxc/*, /var/lib/containers/storage/*, /var/lib/checkpoint*, /var/lib/docker/overlay2/*, /srv/docker/*, /podman/storage/*, /opt/jail/driver-jail*, /build/tmp/work/iot*, /tmp/containers-root/*, /cce-14/*, /cce-usr/*, /var/tmp/portage/*, /media/*, /data/var/lib/docker/overlay2/*, /home/*/.cache/bazel/*, /home/*/.cache/umu/*/SteamLinuxRuntime*excludes:file.path
process.nameinbuildkitd, containerd, dockerd, executor, pacman, steam, unsquashfsexcludes:process.name
file.pathstarts_with/lib/security/, /lib64/security/, /lib/x86_64-linux-gnu/security/, /usr/lib/security/, /usr/lib64/security/, /usr/lib/x86_64-linux-gnu/security/excludes:file.path

Potential Account Takeover - Mixed Logon Types

#
Status
production
Severity
medium
Time window
15m
Group by
user.id, user.name, winlog.logon.type
Author
Elastic
Source
github.com/elastic/detection-rules

Identifies a user account (often a service account) that normally logs in with high volume using one logon type suddenly showing successful logons using a different logon type with low count. This pattern may indicate account takeover or use of stolen credentials from a new context (e.g. interactive or network logon where only batch/service was expected).

MITRE ATT&CK Coverage

TacticTechniques
Privilege Escalation

Telemetry Coverage

Rule Body

[metadata]
creation_date = "2026/02/25"
integration = ["system", "windows"]
maturity = "production"
updated_date = "2026/05/04"

[rule]
author = ["Elastic"]
description = """
Identifies a user account (often a service account) that normally logs in with high volume using one logon type
suddenly showing successful logons using a different logon type with low count. This pattern may indicate account
takeover or use of stolen credentials from a new context (e.g. interactive or network logon where only batch/service
was expected).
"""
from = "now-15m"
interval = "14m"
language = "esql"
license = "Elastic License v2"
name = "Potential Account Takeover - Mixed Logon Types"
note = """## Triage and analysis

### Investigating Potential Account Takeover - Mixed Logon Types

A high-volume account (e.g. service account tied to a specific logon type such as Batch or Network) that also shows successful logons with a different logon type and low count may indicate credential compromise and use from a new context (account takeover or misuse).

### Possible investigation steps

- Confirm with the account owner or service owner whether the additional logon type is expected (e.g. new automation, RDP for maintenance).
- Review which logon types appear in Esql.logon_type_values and which has the low count (likely the anomalous one).
- Correlate with other alerts for the same user (e.g. logon from new source IP, password changes, MFA changes).
- Check whether the account is a known service account; if so, verify if any new scripts or systems were authorized to use it.

### False positive analysis

- Legitimate expansion of use (e.g. service account also used for occasional interactive logon for troubleshooting) can trigger this. Tune thresholds (e.g. max_logon >= 1000, min_logon <= 10) or add exclusions for known service accounts with documented multi-context use.
- New scheduled tasks or automation that use a different logon type may cause a short-lived spike in the "other" logon type; review over a longer window if needed.

### Response and remediation

- If takeover or misuse is confirmed: force password reset, revoke sessions, rotate service account credentials, and restrict logon type or source where possible.
- Investigate how credentials may have been compromised and address the vector.
"""

setup = """## Setup

Audit Logon must be enabled to generate the events used by this rule.
Setup instructions: https://ela.st/audit-logon
"""

references = ["https://attack.mitre.org/techniques/T1078/"]
risk_score = 47
rule_id = "b2c3d4e5-f6a7-5b6c-9d0e-1f2a3b4c5d6e"
severity = "medium"
tags = [
    "Domain: Endpoint",
    "OS: Windows",
    "Use Case: Threat Detection",
    "Tactic: Privilege Escalation",
    "Data Source: Windows Security Event Logs",
    "Resources: Investigation Guide",
]
timestamp_override = "event.ingested"
type = "esql"

query = '''
from logs-system.security*, logs-windows.forwarded*, winlogbeat-* metadata _id, _version, _index
| WHERE event.category == "authentication" and event.action == "logged-in" and winlog.event_id == "4624" and
        event.outcome == "success" and not user.id in ("S-1-5-18", "S-1-5-19", "S-1-5-20") and
        to_lower(user.name) != "administrator"
| STATS logon_count = COUNT(*), host_names = VALUES(host.name) by user.name, user.id, winlog.logon.type
| STATS
    Esql.max_logon = MAX(logon_count),
    Esql.min_logon = MIN(logon_count),
    Esql.unique_host_count = COUNT_DISTINCT(host_names),
    Esql.host_name_values = VALUES(host_names),
    Esql.logon_type_values = VALUES(winlog.logon.type),
    Esql.count_distinct_logon_types = COUNT_DISTINCT(winlog.logon.type) by user.name, user.id

// high count of logons is often associated with service account tied to a specific service, if observed in use with a different logon type it's suspicious
| WHERE Esql.count_distinct_logon_types >= 2 and Esql.max_logon >= 1000 and (Esql.min_logon >= 1 and Esql.min_logon <= 10) and Esql.unique_host_count >= 2
| EVAL winlog.logon.type = MV_FIRST(Esql.logon_type_values), host.name = MV_FIRST(Esql.host_name_values)
| KEEP user.name, user.id, host.name, winlog.logon.type, Esql.*
'''

[[rule.threat]]
framework = "MITRE ATT&CK"
[[rule.threat.technique]]
id = "T1078"
name = "Valid Accounts"
reference = "https://attack.mitre.org/techniques/T1078/"


[rule.threat.tactic]
id = "TA0004"
name = "Privilege Escalation"
reference = "https://attack.mitre.org/tactics/TA0004/"

Stages and Predicates

Stage 1: from

from logs-system.security*, logs-windows.forwarded*, winlogbeat-* metadata _id, _version, _index

Stage 2: where

| WHERE event.category == "authentication" and event.action == "logged-in" and winlog.event_id == "4624" and
        event.outcome == "success" and not user.id in ("S-1-5-18", "S-1-5-19", "S-1-5-20") and
        to_lower(user.name) != "administrator"

Stage 3: stats

| STATS logon_count = COUNT(*), host_names = VALUES(host.name) by user.name, user.id, winlog.logon.type

Stage 4: stats

| STATS
    Esql.max_logon = MAX(logon_count),
    Esql.min_logon = MIN(logon_count),
    Esql.unique_host_count = COUNT_DISTINCT(host_names),
    Esql.host_name_values = VALUES(host_names),
    Esql.logon_type_values = VALUES(winlog.logon.type),
    Esql.count_distinct_logon_types = COUNT_DISTINCT(winlog.logon.type) by user.name, user.id

Stage 5: where

| WHERE Esql.count_distinct_logon_types >= 2 and Esql.max_logon >= 1000 and (Esql.min_logon >= 1 and Esql.min_logon <= 10) and Esql.unique_host_count >= 2

Stage 6: eval

| EVAL winlog.logon.type = MV_FIRST(Esql.logon_type_values), host.name = MV_FIRST(Esql.host_name_values)

Stage 7: keep

| KEEP user.name, user.id, host.name, winlog.logon.type, Esql.*

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

Output Fields

These fields are emitted when the rule matches.

FieldSource
user.nameKEEP user.name
user.idKEEP user.id
host.nameKEEP host.name
winlog.logon.typeKEEP winlog.logon.type
Esql.*KEEP Esql.*

Potential Discovery of DPAPI Master Keys

#
Source
github.com/elastic/protections-artifacts

Identifies an unusual process accessing Data Protection API Master keys. Adversaries may attempt to discover and acquire credentials from the Windows Credential Manager.

MITRE ATT&CK Coverage

Rule Body

[rule]
description = """
Identifies an unusual process accessing Data Protection API Master keys. Adversaries may attempt to discover and acquire
credentials from the Windows Credential Manager.
"""
id = "84bbe951-5141-4eb3-b9cf-8dfeea62a94e"
license = "Elastic License v2"
name = "Potential Discovery of DPAPI Master Keys"
os_list = ["windows"]
reference = ["http://www.harmj0y.net/blog/redteaming/operational-guidance-for-offensive-user-dpapi-abuse/"]
version = "1.0.38"

query = '''
file where event.action == "open" and
 file.path : ("?:\\USERS\\*\\APPDATA\\*\\MICROSOFT\\PROTECT\\S-1-5-21*\\*",
              "?:\\USERS\\*\\APPDATA\\*\\MICROSOFT\\PROTECT\\S-1-12-1-*\\*",
              "?:\\WINDOWS\\SYSTEM32\\MICROSOFT\\PROTECT\\S-1-5-18\\USER\\*") and
 process.executable : ("C:\\*", "\\Device\\Mup\\*") and
 user.id like ("S-1-5-21*", "S-1-12-*") and
 not file.name : ("desktop.ini", "exclude", ".fdignore", ".rgignore", ".ignore", ".gitignore") and
 not process.executable :
           ("?:\\Program Files\\*",
            "?:\\Program Files (x86)\\*",
            "?:\\Windows\\System32\\lsass.exe",
            "?:\\Windows\\System32\\svchost.exe",
            "?:\\Windows\\System32\\Robocopy.exe",
            "System",
            "?:\\Windows\\ccmcache\\*.exe",
            "?:\\WINDOWS\\CCM\\*.exe",
            "?:\\Windows\\SysWOW64\\prevhost.exe",
            "?:\\Windows\\System32\\prevhost.exe",
            "?:\\Veritas\\NetBackup\\bin\\bpbkar32.exe",
            "?:\\Windows\\System32\\taskhostw.exe",
            "?:\\Windows\\System32\\taskhost.exe",
            "?:\\Windows\\System32\\sdiagnhost.exe",
            "?:\\Windows\\System32\\wbem\\WmiPrvSE.exe",
            "?:\\$WINDOWS.~BT\\Sources\\setuphost.exe",
            "?:\\Windows\\explorer.exe",
            "?:\\Windows\\System32\\sppsvc.exe",
            "?:\\Windows\\System32\\backgroundTaskHost.exe",
            "?:\\Windows\\System32\\dllhost.exe",
            "?:\\Windows\\WID\\Binn\\sqlservr.exe",
            "?:\\Windows\\System32\\SearchProtocolHost.exe",
            "?:\\ProgramData\\Microsoft\\Windows Defender Advanced Threat Protection\\*.exe",
            "?:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\*.exe",
            "?:\\ProgramData\\Microsoft\\Windows Defender Advanced Threat Protection\\Platform\\*.exe",
            "?:\\Program Files\\Windows Defender Advanced Threat Protection\\*.exe",
            "?:\\Windows\\System32\\igfxtray.exe",
            "?:\\$WINDOWS.~BT\\Sources\\SetupCore.exe",
            "?:\\Windows\\System32\\pacjsworker.exe",
            "?:\\Windows\\System32\\MoUsoCoreWorker.exe",
            "?:\\Windows\\System32\\conhost.exe",
            "?:\\Windows\\System32\\LocationNotificationWindows.exe",
            "?:\\Windows\\System32\\MRT.exe",
            "?:\\Windows\\twain_32\\Brimc16a\\Common\\TwDsUiLaunch.exe",
            "?:\\Windows\\Microsoft.NET\\Framework64\\*\\csc.exe",
            "?:\\Users\\*\\AppData\\Local\\JetBrains\\Toolbox\\apps\\datagrip\\ch-0\\203.5981.102\\bin\\datagrip64.exe",
            "?:\\Windows\\cybercnsagent\\osqueryi.exe") and
 /* MSSQL service account */
 not (process.name : "sqlservr.exe" and file.path : "?:\\Users\\svc_*") and
 not (process.name : ("MicrosoftEdgeUpdate.exe", "Teams.exe") and
      process.code_signature.subject_name : "Microsoft Corporation" and process.code_signature.trusted == true) and
 not (process.code_signature.subject_name : ("ESET, spol. s r.o.", "Intel(R) pGFX", "ForensiT Limited", "Johannes Schindelin") and
      process.code_signature.trusted == true) and
 not (process.name : "r-LiteCollector.exe" and process.code_signature.status : "errorCode_endpoint*")
'''

min_endpoint_version = "8.0.0"
optional_actions = []
[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0

[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1555"
name = "Credentials from Password Stores"
reference = "https://attack.mitre.org/techniques/T1555/"
[[threat.technique.subtechnique]]
id = "T1555.004"
name = "Windows Credential Manager"
reference = "https://attack.mitre.org/techniques/T1555/004/"



[threat.tactic]
id = "TA0006"
name = "Credential Access"
reference = "https://attack.mitre.org/tactics/TA0006/"

[internal]
min_endpoint_version = "8.0.0"

Stages and Predicates

Stage 1: file

file where event.action == "open" and
 file.path : ("?:\\USERS\\*\\APPDATA\\*\\MICROSOFT\\PROTECT\\S-1-5-21*\\*",
              "?:\\USERS\\*\\APPDATA\\*\\MICROSOFT\\PROTECT\\S-1-12-1-*\\*",
              "?:\\WINDOWS\\SYSTEM32\\MICROSOFT\\PROTECT\\S-1-5-18\\USER\\*") and
 process.executable : ("C:\\*", "\\Device\\Mup\\*") and
 user.id like ("S-1-5-21*", "S-1-12-*") and
 not file.name : ("desktop.ini", "exclude", ".fdignore", ".rgignore", ".ignore", ".gitignore") and
 not process.executable :
           ("?:\\Program Files\\*",
            "?:\\Program Files (x86)\\*",
            "?:\\Windows\\System32\\lsass.exe",
            "?:\\Windows\\System32\\svchost.exe",
            "?:\\Windows\\System32\\Robocopy.exe",
            "System",
            "?:\\Windows\\ccmcache\\*.exe",
            "?:\\WINDOWS\\CCM\\*.exe",
            "?:\\Windows\\SysWOW64\\prevhost.exe",
            "?:\\Windows\\System32\\prevhost.exe",
            "?:\\Veritas\\NetBackup\\bin\\bpbkar32.exe",
            "?:\\Windows\\System32\\taskhostw.exe",
            "?:\\Windows\\System32\\taskhost.exe",
            "?:\\Windows\\System32\\sdiagnhost.exe",
            "?:\\Windows\\System32\\wbem\\WmiPrvSE.exe",
            "?:\\$WINDOWS.~BT\\Sources\\setuphost.exe",
            "?:\\Windows\\explorer.exe",
            "?:\\Windows\\System32\\sppsvc.exe",
            "?:\\Windows\\System32\\backgroundTaskHost.exe",
            "?:\\Windows\\System32\\dllhost.exe",
            "?:\\Windows\\WID\\Binn\\sqlservr.exe",
            "?:\\Windows\\System32\\SearchProtocolHost.exe",
            "?:\\ProgramData\\Microsoft\\Windows Defender Advanced Threat Protection\\*.exe",
            "?:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\*.exe",
            "?:\\ProgramData\\Microsoft\\Windows Defender Advanced Threat Protection\\Platform\\*.exe",
            "?:\\Program Files\\Windows Defender Advanced Threat Protection\\*.exe",
            "?:\\Windows\\System32\\igfxtray.exe",
            "?:\\$WINDOWS.~BT\\Sources\\SetupCore.exe",
            "?:\\Windows\\System32\\pacjsworker.exe",
            "?:\\Windows\\System32\\MoUsoCoreWorker.exe",
            "?:\\Windows\\System32\\conhost.exe",
            "?:\\Windows\\System32\\LocationNotificationWindows.exe",
            "?:\\Windows\\System32\\MRT.exe",
            "?:\\Windows\\twain_32\\Brimc16a\\Common\\TwDsUiLaunch.exe",
            "?:\\Windows\\Microsoft.NET\\Framework64\\*\\csc.exe",
            "?:\\Users\\*\\AppData\\Local\\JetBrains\\Toolbox\\apps\\datagrip\\ch-0\\203.5981.102\\bin\\datagrip64.exe",
            "?:\\Windows\\cybercnsagent\\osqueryi.exe") and
 not (process.name : "sqlservr.exe" and file.path : "?:\\Users\\svc_*") and
 not (process.name : ("MicrosoftEdgeUpdate.exe", "Teams.exe") and
      process.code_signature.subject_name : "Microsoft Corporation" and process.code_signature.trusted == true) and
 not (process.code_signature.subject_name : ("ESET, spol. s r.o.", "Intel(R) pGFX", "ForensiT Limited", "Johannes Schindelin") and
      process.code_signature.trusted == true) and
 not (process.name : "r-LiteCollector.exe" and process.code_signature.status : "errorCode_endpoint*")

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
event.actioneq
  • open corpus 49 (elastic 49)
field:"EventType" kind:eq value:"open"
file.pathwildcard
  • ?:\USERS\*\APPDATA\*\MICROSOFT\PROTECT\S-1-12-1-*\*
  • ?:\USERS\*\APPDATA\*\MICROSOFT\PROTECT\S-1-5-21*\*
  • ?:\WINDOWS\SYSTEM32\MICROSOFT\PROTECT\S-1-5-18\USER\*
field:"TargetFilename" kind:wildcard
process.executablewildcard
  • C:\* corpus 16 (elastic 16)
  • \Device\Mup\* corpus 8 (elastic 8)
field:"Image" kind:wildcard
user.idwildcard
  • S-1-12-* corpus 21 (elastic 21)
  • S-1-5-21* corpus 21 (elastic 21)
field:"user.id" kind:wildcard

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
file.pathstarts_with?:\Users\svc_excludes:file.path field:"file.path" value:"?:\Users\svc_"
process.nameeqsqlservr.exeexcludes:process.name field:"process.name" value:"sqlservr.exe"
process.code_signature.statusstarts_witherrorCode_endpointexcludes:process.code_signature.status field:"process.code_signature.status" value:"errorCode_endpoint"
process.nameeqr-LiteCollector.exeexcludes:process.name field:"process.name" value:"r-LiteCollector.exe"
process.code_signature.subject_nameeqESET, spol. s r.o., Intel(R) pGFX, ForensiT Limited, Johannes Schindelinexcludes:process.code_signature.subject_name
process.code_signature.trustedeqtrueexcludes:process.code_signature.trusted field:"process.code_signature.trusted" value:"true"
process.code_signature.subject_nameeqMicrosoft Corporationexcludes:process.code_signature.subject_name field:"process.code_signature.subject_name" value:"Microsoft Corporation"
process.nameeqMicrosoftEdgeUpdate.exe, Teams.exeexcludes:process.name field:"process.name" value:"MicrosoftEdgeUpdate.exe" field:"process.name" value:"Teams.exe"
file.nameeqdesktop.ini, exclude, .fdignore, .rgignore, .ignore, .gitignoreexcludes:file.name
process.executablewildcard?:\Program Files\*, ?:\Program Files (x86)\*, ?:\Windows\System32\lsass.exe, ?:\Windows\System32\svchost.exe, ?:\Windows\System32\Robocopy.exe, System, ?:\Windows\ccmcache\*.exe, ?:\WINDOWS\CCM\*.exe, ?:\Windows\SysWOW64\prevhost.exe, ?:\Windows\System32\prevhost.exe, ?:\Veritas\NetBackup\bin\bpbkar32.exe, ?:\Windows\System32\taskhostw.exe, ?:\Windows\System32\taskhost.exe, ?:\Windows\System32\sdiagnhost.exe, ?:\Windows\System32\wbem\WmiPrvSE.exe, ?:\$WINDOWS.~BT\Sources\setuphost.exe, ?:\Windows\explorer.exe, ?:\Windows\System32\sppsvc.exe, ?:\Windows\System32\backgroundTaskHost.exe, ?:\Windows\System32\dllhost.exe, ?:\Windows\WID\Binn\sqlservr.exe, ?:\Windows\System32\SearchProtocolHost.exe, ?:\ProgramData\Microsoft\Windows Defender Advanced Threat Protection\*.exe, ?:\ProgramData\Microsoft\Windows Defender\Platform\*.exe, ?:\ProgramData\Microsoft\Windows Defender Advanced Threat Protection\Platform\*.exe, ?:\Program Files\Windows Defender Advanced Threat Protection\*.exe, ?:\Windows\System32\igfxtray.exe, ?:\$WINDOWS.~BT\Sources\SetupCore.exe, ?:\Windows\System32\pacjsworker.exe, ?:\Windows\System32\MoUsoCoreWorker.exe, ?:\Windows\System32\conhost.exe, ?:\Windows\System32\LocationNotificationWindows.exe, ?:\Windows\System32\MRT.exe, ?:\Windows\twain_32\Brimc16a\Common\TwDsUiLaunch.exe, ?:\Windows\Microsoft.NET\Framework64\*\csc.exe, ?:\Users\*\AppData\Local\JetBrains\Toolbox\apps\datagrip\ch-0\203.5981.102\bin\datagrip64.exe, ?:\Windows\cybercnsagent\osqueryi.exeexcludes:process.executable

Potential Execution via WinRAR Exploitation

#
Source
github.com/elastic/protections-artifacts

Identifies suspicious child processes of the WinRAR process. This may indicate the successful exploitation of the WinRAR vulnerability CVE-2023-38831.

MITRE ATT&CK Coverage

Rule Body

[rule]
description = """
Identifies suspicious child processes of the WinRAR process. This may indicate the successful exploitation of the WinRAR
vulnerability CVE-2023-38831.
"""
id = "1eb1c26f-c360-4fd5-a549-6149e16d8e96"
license = "Elastic License v2"
name = "Potential Execution via WinRAR Exploitation"
os_list = ["windows"]
reference = [
    "https://www.group-ib.com/blog/cve-2023-38831-winrar-zero-day/",
    "https://github.com/b1tg/CVE-2023-38831-winrar-exploit/tree/main",
]
version = "1.0.5"

query = '''
process where event.action == "start" and
(
 (process.parent.name : "WinRAR.exe" and
  process.args : "?:\\Users\\*\\AppData\\Local\\Temp\\Rar$*" and
  (process.args : ("* .exe", "* .cmd", "* .bat", "* .vbs", "* .js", "* .scr", "* .com", "* .wsh", "* .hta", "* .pif", "* .cpl") or
   process.args : (".exe ", ".cmd ", ".bat ", ".vbs ", ".js ", ".scr ", ".com ", ".wsh ", ".hta ", ".pif ", ".cpl"))) or

  descendant of [process where event.action == "start" and process.parent.name : "WinRAR.exe" and
                  process.args : "?:\\Users\\*\\AppData\\Local\\Temp\\Rar$*" and
                  (process.args : ("* .exe", "* .cmd", "* .bat", "* .vbs", "* .js", "* .scr", "* .com", "* .wsh", "* .hta", "* .pif", "* .cpl") or
                   process.args : (".exe ", ".cmd ", ".bat ", ".vbs ", ".js ", ".scr ", ".com ", ".wsh ", ".hta ", ".pif ", ".cpl "))]
 ) and
 not (process.executable : "?:\\Program Files*\\Microsoft\\Edge\\Application\\*.exe" and
      process.parent.executable : "?:\\Program Files*\\Microsoft\\Edge\\Application\\msedge.exe") and
 not (process.executable : "?:\\Windows\\System32\\conhost.exe" and process.args : "0xffffffff")
'''

min_endpoint_version = "7.16.0"
[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0

[[optional_actions]]
action = "rollback"
field = "process.entity_id"
state = 0

[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1566"
name = "Phishing"
reference = "https://attack.mitre.org/techniques/T1566/"
[[threat.technique.subtechnique]]
id = "T1566.001"
name = "Spearphishing Attachment"
reference = "https://attack.mitre.org/techniques/T1566/001/"



[threat.tactic]
id = "TA0001"
name = "Initial Access"
reference = "https://attack.mitre.org/tactics/TA0001/"
[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1203"
name = "Exploitation for Client Execution"
reference = "https://attack.mitre.org/techniques/T1203/"


[threat.tactic]
id = "TA0002"
name = "Execution"
reference = "https://attack.mitre.org/tactics/TA0002/"

[internal]
min_endpoint_version = "7.16.0"

Stages and Predicates

Stage 1: process

process where event.action == "start" and
(
 (process.parent.name : "WinRAR.exe" and
  process.args : "?:\\Users\\*\\AppData\\Local\\Temp\\Rar$*" and
  (process.args : ("* .exe", "* .cmd", "* .bat", "* .vbs", "* .js", "* .scr", "* .com", "* .wsh", "* .hta", "* .pif", "* .cpl") or
   process.args : (".exe ", ".cmd ", ".bat ", ".vbs ", ".js ", ".scr ", ".com ", ".wsh ", ".hta ", ".pif ", ".cpl"))) or

  descendant of [process where event.action == "start" and process.parent.name : "WinRAR.exe" and
                  process.args : "?:\\Users\\*\\AppData\\Local\\Temp\\Rar$*" and
                  (process.args : ("* .exe", "* .cmd", "* .bat", "* .vbs", "* .js", "* .scr", "* .com", "* .wsh", "* .hta", "* .pif", "* .cpl") or
                   process.args : (".exe ", ".cmd ", ".bat ", ".vbs ", ".js ", ".scr ", ".com ", ".wsh ", ".hta ", ".pif ", ".cpl "))]
 ) and
 not (process.executable : "?:\\Program Files*\\Microsoft\\Edge\\Application\\*.exe" and
      process.parent.executable : "?:\\Program Files*\\Microsoft\\Edge\\Application\\msedge.exe") and
 not (process.executable : "?:\\Windows\\System32\\conhost.exe" and process.args : "0xffffffff")

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
event.actioneq
  • start corpus 388 (elastic 388)
field:"EventType" kind:eq value:"start"
process.argswildcard
  • * .bat
  • * .cmd
  • * .com
  • * .cpl
  • * .exe
  • * .hta
  • * .js
  • * .pif
  • * .scr
  • * .vbs
  • * .wsh
  • .bat
  • .cmd
  • .com
  • .cpl
  • .exe
  • .hta
  • .js
  • .pif
  • .scr
  • .vbs
  • .wsh
  • ?:\Users\*\AppData\Local\Temp\Rar$* corpus 2 (elastic 2)
field:"process.args" kind:wildcard
process.parent.namewildcard
  • WinRAR.exe corpus 15 (elastic 14, splunk 1)
field:"parent_process_basename" kind:wildcard value:"WinRAR.exe"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process.argseq0xffffffffexcludes:process.args field:"process.args" value:"0xffffffff"
process.executableeq?:\Windows\System32\conhost.exeexcludes:process.executable field:"process.executable" value:"?:\Windows\System32\conhost.exe"
process.executablewildcard?:\Program Files*\Microsoft\Edge\Application\*.exeexcludes:process.executable field:"process.executable" value:"?:\Program Files*\Microsoft\Edge\Application\*.exe"
process.parent.executablewildcard?:\Program Files*\Microsoft\Edge\Application\msedge.exeexcludes:process.parent.executable field:"process.parent.executable" value:"?:\Program Files*\Microsoft\Edge\Application\msedge.exe"

Potential Remote Desktop Shadowing Activity

#
Status
production
Severity
high
Time window
9m
Author
Elastic
Source
github.com/elastic/detection-rules

Identifies the modification of the Remote Desktop Protocol (RDP) Shadow registry or the execution of processes indicative of an active RDP shadowing session. An adversary may abuse the RDP Shadowing feature to spy on or control other users active RDP sessions.

MITRE ATT&CK Coverage

Rule Body

[metadata]
creation_date = "2021/04/12"
integration = ["endpoint", "windows", "m365_defender", "sentinel_one_cloud_funnel"]
maturity = "production"
updated_date = "2026/05/03"

[rule]
author = ["Elastic"]
description = """
Identifies the modification of the Remote Desktop Protocol (RDP) Shadow registry or the execution of processes
indicative of an active RDP shadowing session. An adversary may abuse the RDP Shadowing feature to spy on or control
other users active RDP sessions.
"""
from = "now-9m"
index = [
    "logs-endpoint.events.process-*",
    "logs-endpoint.events.registry-*",
    "winlogbeat-*",
    "logs-windows.sysmon_operational-*",
    "endgame-*",
    "logs-m365_defender.event-*",
    "logs-sentinel_one_cloud_funnel.*",
]
language = "eql"
license = "Elastic License v2"
name = "Potential Remote Desktop Shadowing Activity"
references = [
    "https://blog.bitsadmin.com/spying-on-users-using-rdp-shadowing",
    "https://swarm.ptsecurity.com/remote-desktop-services-shadowing/",
]
risk_score = 73
rule_id = "c57f8579-e2a5-4804-847f-f2732edc5156"
severity = "high"
tags = [
    "Domain: Endpoint",
    "OS: Windows",
    "Use Case: Threat Detection",
    "Tactic: Lateral Movement",
    "Data Source: Elastic Endgame",
    "Data Source: Elastic Defend",
    "Data Source: Sysmon",
    "Data Source: Microsoft Defender XDR",
    "Data Source: SentinelOne",
    "Resources: Investigation Guide",
]
timestamp_override = "event.ingested"
type = "eql"

query = '''
/* Identifies the modification of RDP Shadow registry or
  the execution of processes indicative of active shadow RDP session */

any where host.os.type == "windows" and
(
  (event.category == "registry" and event.type == "change" and
    registry.value : "Shadow" and
    registry.path : (
      "*\\Software\\Policies\\Microsoft\\Windows NT\\Terminal Services\\Shadow"
    ) and
    registry.data.strings : ("1", "0x00000001", "2", "0x00000002", "3", "0x00000003", "4", "0x00000004")

  ) or
  (event.category == "process" and event.type == "start" and
    (
      (process.name : ("RdpSaUacHelper.exe", "RdpSaProxy.exe") and process.parent.name : "svchost.exe") or
      (?process.pe.original_file_name : "mstsc.exe" and process.args : "/shadow:*")
    )
  )
)
'''

note = """## Triage and analysis

### Investigating Potential Remote Desktop Shadowing Activity

#### Possible investigation steps

- Which RDP shadowing path fired?
  - Focus: `event.category`, `process.name`, `process.command_line`, `registry.path`, `registry.data.strings`.
  - Implication: escalate faster for active "mstsc.exe /shadow" use or a `Shadow` policy value that removes consent; lower suspicion only when alert-local evidence matches recognized helpdesk, training, or policy-setting activity with consent retained.
- Do process identity and lineage fit RDP shadowing components?
  - Focus: `process.executable`, `process.pe.original_file_name`, `process.code_signature.subject_name`, `process.code_signature.trusted`, `process.parent.command_line`.
  - Hint: for registry alerts, recover same-process starts for lineage or command-line detail. $investigate_0
  - Implication: escalate when "mstsc.exe", "RdpSaUacHelper.exe", or "RdpSaProxy.exe" runs from a user-writable path, has an unexpected signer, or has a parent inconsistent with Remote Desktop Services or a support launcher. A trusted Microsoft binary confirms identity, not authorization.
- If the `Shadow` registry value fired, did the new setting remove consent or allow control?
  - Focus: `registry.path`, `registry.data.strings` (decimal or hex: `1`/`0x00000001` = full control with consent, `2`/`0x00000002` = full control without consent, `3`/`0x00000003` = view only with consent, `4`/`0x00000004` = view only without consent), and `process.executable`.
  - Implication: escalate when `registry.data.strings` is `2`/`0x00000002` (full control, no consent) or `4`/`0x00000004` (view, no consent) because these allow silent shadowing; treat `1`/`0x00000001` or `3`/`0x00000003` as weaker setup evidence because the user is prompted, unless active shadowing or unexplained lineage appears.
- If a process event fired, does it show active session shadowing?
  - Focus: `process.name`, `process.command_line`, `process.parent.name`, `process.parent.executable`.
  - Hint: if `process.command_line` is truncated or normalized, verify "/shadow", "/control", and "/noConsentPrompt" boundaries with `process.args` before lowering suspicion.
  - Implication: escalate when "mstsc.exe" includes "/shadow" with "/control" or "/noConsentPrompt". Treat "RdpSaUacHelper.exe" or "RdpSaProxy.exe" under a service host as active target-side shadowing that escalates when paired with no-consent/control, unexplained lineage, or unrecognized user-host context; a plain "mstsc.exe" launch without shadowing arguments is not enough.
- Does user, host, and session context fit recognized support or training?
  - Focus: `user.id`, `user.name`, `user.domain`, `host.id`, `process.Ext.session_info.logon_type`.
  - Implication: escalate when `user.id` targets an unusual workstation, privileged session, or host with no matching shadow-support pattern; lower suspicion only when user-host pairing, session type, and branch evidence match the same recognized workflow.
- Did the same actor prepare, persist, or extend the host-side shadowing activity?
  - Focus: `user.id`, `process.entity_id`, `process.command_line`, `registry.path`, `registry.data.strings`.
  - Hint: start with recovered same-process events; expand to same-host process and registry events only when local capability or context remains suspicious. $investigate_1
  - Implication: escalate when the same user or lineage enumerates sessions, prepares alternate-token launch, changes Terminal Services or RDP state, launches admin tooling, or persists shadow settings; absent process or registry evidence narrows the case but does not clear the alert.
- If local findings stay suspicious or unresolved, do related alerts expand scope?
  - Focus: related alerts for the same `user.id` and `host.id`, especially remote-access, credential, remote-service, and persistence alerts.
  - Hint: review same-user alerts when local branch and capability questions remain suspicious. $investigate_2
  - Hint: review same-host alerts when host preparation or follow-on activity remains unresolved. $investigate_3
  - Implication: broaden scope when related alerts show the same user or host in remote-access, credential, or persistence activity; keep scope narrow only when local evidence fits a recognized workflow and related alerts do not contradict it.

- Using branch, capability, identity, lineage, user-host fit, host-side activity, and related alerts, escalate unauthorized no-consent/control shadowing or stealthy policy relaxation; close only when evidence binds to one recognized support, training, or policy workflow with no contradictions; if mixed or incomplete, preserve process and registry artifacts and escalate.

### False positive analysis

- Helpdesk support, training labs, and supervised administration can legitimately use "mstsc.exe /shadow" or target-side "RdpSa*" helpers. Confirm `process.command_line`, `process.name`, `process.parent.name`, `user.id`, `host.id`, and any `Shadow` value align with the same authorized workflow, without contradictory `process.command_line` or `registry.path` evidence. Without ticketing or support rosters, require telemetry-only recurrence of the same command pattern, user-host pairing, consent mode, and quiet follow-on profile before closing as benign.
- Group Policy or endpoint management tooling can legitimately change `Shadow`. Confirm stable `process.executable`, `process.code_signature.subject_name`, `process.parent.command_line`, exact `registry.path`, and resulting `registry.data.strings` match the host class. Without change records or GPO inventories, require quiet recurrence of the same process and registry pattern for the same management scope before closing.
- Before creating an exception, anchor it on the minimum confirmed workflow: `event.category`, exact `process.command_line` or `registry.path`, `registry.data.strings`, `user.id`, and `host.id`. Avoid exceptions on `process.name`, `registry.value`, or `Shadow` alone.

### Response and remediation

- If confirmed benign, reverse temporary containment and document the exact `event.category`, `process.command_line` or `registry.path`, `registry.data.strings`, `user.id`, and `host.id` that proved the support, training, or policy workflow. Create an exception only after the same narrow pattern recurs.
- If suspicious but unconfirmed, preserve a case export with the process tree, `process.entity_id`, `process.command_line`, `process.parent.command_line`, `registry.path`, `registry.value`, `registry.data.strings`, affected `user.id`, affected `host.id`, and surrounding preparation or follow-on evidence before changing host state.
- Apply reversible containment next: restore the `Shadow` policy to the pre-change value, disable shadowing with `0`, require consent with `1` or `3`, or restrict the involved account on the affected `host.id`. Escalate to host isolation only when shadowing is part of broader session abuse and the host role can tolerate isolation.
- If confirmed malicious, isolate the host when feasible, then terminate active "mstsc.exe" or "RdpSa*" shadowing processes after recording their process identifiers and command lines. Revert unauthorized `Shadow` and related Terminal Services or RDP shadow permission changes after preservation.
- Scope other hosts and users tied to the same `user.id`, `process.command_line`, `registry.path`, or `registry.data.strings` before removing artifacts or resetting access.
- Remove malicious helper scripts or tooling found during scoping, revert unauthorized RDP service or policy changes, and reset credentials that may have been exposed in the shadowed session.
- Post-incident hardening: keep `Shadow` at the least permissive accepted setting, restrict who can shadow sessions, review RDP-Tcp shadow permissions, and retain process and registry telemetry needed to distinguish support use from no-consent shadowing."""

setup = """## Setup

This rule is designed for data generated by [Elastic Defend](https://www.elastic.co/security/endpoint-security), which provides native endpoint detection and response, along with event enrichments designed to work with our detection rules.

Setup instructions: https://ela.st/install-elastic-defend

### Additional data sources

This rule also supports the following third-party data sources. For setup instructions, refer to the links below:

- [Microsoft Defender XDR](https://ela.st/m365-defender)
- [SentinelOne Cloud Funnel](https://ela.st/sentinel-one-cloud-funnel)
- [Sysmon Event ID 1 - Process Creation](https://ela.st/sysmon-event-1-setup)
- [Sysmon Registry Events](https://ela.st/sysmon-event-reg-setup)
"""

[rule.investigation_fields]
field_names = [
    "@timestamp",
    "event.category",
    "host.id",
    "user.id",
    "process.entity_id",
    "process.pid",
    "process.executable",
    "process.command_line",
    "process.args",
    "process.parent.name",
    "process.pe.original_file_name",
    "process.code_signature.trusted",
    "registry.path",
    "registry.value",
    "registry.data.strings",
]

[transform]

[[transform.investigate]]
label = "Process events for the same process"
description = ""
providers = [
  [
    { excluded = false, field = "event.category", queryType = "phrase", value = "process", valueType = "string" },
    { excluded = false, field = "host.id", queryType = "phrase", value = "{{host.id}}", valueType = "string" },
    { excluded = false, field = "process.entity_id", queryType = "phrase", value = "{{process.entity_id}}", valueType = "string" }
  ],
  [
    { excluded = false, field = "event.category", queryType = "phrase", value = "process", valueType = "string" },
    { excluded = false, field = "host.id", queryType = "phrase", value = "{{host.id}}", valueType = "string" },
    { excluded = false, field = "process.pid", queryType = "phrase", value = "{{process.pid}}", valueType = "string" }
  ]
]
relativeFrom = "now-1h"
relativeTo = "now"

[[transform.investigate]]
label = "Registry events on the host near the alert"
description = ""
providers = [
  [
    { excluded = false, field = "event.category", queryType = "phrase", value = "registry", valueType = "string" },
    { excluded = false, field = "host.id", queryType = "phrase", value = "{{host.id}}", valueType = "string" }
  ]
]
relativeFrom = "now-1h"
relativeTo = "now"

[[transform.investigate]]
label = "Alerts associated with the user"
description = ""
providers = [
  [
    { excluded = false, field = "event.kind", queryType = "phrase", value = "signal", valueType = "string" },
    { excluded = false, field = "user.id", queryType = "phrase", value = "{{user.id}}", valueType = "string" }
  ]
]
relativeFrom = "now-48h/h"
relativeTo = "now"

[[transform.investigate]]
label = "Alerts associated with the host"
description = ""
providers = [
  [
    { excluded = false, field = "event.kind", queryType = "phrase", value = "signal", valueType = "string" },
    { excluded = false, field = "host.id", queryType = "phrase", value = "{{host.id}}", valueType = "string" }
  ]
]
relativeFrom = "now-48h/h"
relativeTo = "now"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1021"
name = "Remote Services"
reference = "https://attack.mitre.org/techniques/T1021/"

[[rule.threat.technique.subtechnique]]
id = "T1021.001"
name = "Remote Desktop Protocol"
reference = "https://attack.mitre.org/techniques/T1021/001/"

[[rule.threat.technique]]
id = "T1563"
name = "Remote Service Session Hijacking"
reference = "https://attack.mitre.org/techniques/T1563/"

[[rule.threat.technique.subtechnique]]
id = "T1563.002"
name = "RDP Hijacking"
reference = "https://attack.mitre.org/techniques/T1563/002/"

[rule.threat.tactic]
id = "TA0008"
name = "Lateral Movement"
reference = "https://attack.mitre.org/tactics/TA0008/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1113"
name = "Screen Capture"
reference = "https://attack.mitre.org/techniques/T1113/"

[rule.threat.tactic]
id = "TA0009"
name = "Collection"
reference = "https://attack.mitre.org/tactics/TA0009/"

Stages and Predicates

Stage 1: any

/* Identifies the modification of RDP Shadow registry or
  the execution of processes indicative of active shadow RDP session */

any where host.os.type == "windows" and
(
  (event.category == "registry" and event.type == "change" and
    registry.value : "Shadow" and
    registry.path : (
      "*\\Software\\Policies\\Microsoft\\Windows NT\\Terminal Services\\Shadow"
    ) and
    registry.data.strings : ("1", "0x00000001", "2", "0x00000002", "3", "0x00000003", "4", "0x00000004")

  ) or
  (event.category == "process" and event.type == "start" and
    (
      (process.name : ("RdpSaUacHelper.exe", "RdpSaProxy.exe") and process.parent.name : "svchost.exe") or
      (?process.pe.original_file_name : "mstsc.exe" and process.args : "/shadow:*")
    )
  )
)

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
event.categoryeq
  • process corpus 38 (elastic 38)
  • registry corpus 7 (elastic 7)
field:"event.category" kind:eq
event.typeeq
  • change corpus 89 (elastic 89)
  • start corpus 1036 (elastic 1036)
field:"event.type" kind:eq
process.argswildcard
  • /shadow:*
field:"process.args" kind:wildcard value:"/shadow:*"
process.namewildcard
  • RdpSaProxy.exe corpus 2 (elastic 2)
  • RdpSaUacHelper.exe corpus 2 (elastic 2)
field:"process_basename" kind:wildcard
process.parent.namewildcard
  • svchost.exe corpus 15 (elastic 10, splunk 5)
field:"parent_process_basename" kind:wildcard value:"svchost.exe"
process.pe.original_file_namewildcard
  • mstsc.exe corpus 5 (sigma 4, elastic 1)
field:"OriginalFileName" kind:wildcard value:"mstsc.exe"
registry.data.stringswildcard
  • 0x00000001 corpus 61 (splunk 52, elastic 9)
  • 0x00000002 corpus 4 (elastic 2, splunk 2)
  • 0x00000003
  • 0x00000004 corpus 4 (elastic 2, splunk 2)
  • 1 corpus 16 (elastic 14, splunk 2)
  • 2 corpus 3 (elastic 2, sigma 1)
  • 3 corpus 2 (elastic 2)
  • 4 corpus 6 (elastic 6)
field:"Details" kind:wildcard
registry.pathwildcard
  • *\Software\Policies\Microsoft\Windows NT\Terminal Services\Shadow
field:"TargetObject" kind:wildcard value:"*\Software\Policies\Microsoft\Windows NT\Terminal Services\Shadow"
registry.valuewildcard
  • Shadow
field:"registry_value_name" kind:wildcard value:"Shadow"

Remote Memory Write to Trusted Target Process

#
Source
github.com/elastic/protections-artifacts

Identifies attempts to write or modify protection to the address space of a remote trusted target process and by an unsigned or untrusted final user module. This behavior is consistent with remote code injection attacks.

MITRE ATT&CK Coverage

TacticTechniques
Stealth

Rule Body

[rule]
description = """
Identifies attempts to write or modify protection to the address space of a remote trusted target process and by an
unsigned or untrusted final user module. This behavior is consistent with remote code injection attacks.
"""
id = "5c6c166c-a894-4263-918a-c7632014a486"
license = "Elastic License v2"
name = "Remote Memory Write to Trusted Target Process"
os_list = ["windows"]
version = "1.0.14"

query = '''
api where process.Ext.api.name == "WriteProcessMemory" and

 process.executable != null and Target.process.executable != null and

 process.Ext.api.behaviors == "cross-process" and

 Target.process.executable != process.executable and not process.Ext.api.summary like "*Unknown*" and

 Target.process.executable : ("?:\\Windows\\*", "?:\\Program Files*") and

 /* WPM triggers multiple times at process creation */
 not (_arraysearch(process.thread.Ext.call_stack, $entry, $entry.symbol_info like ("*\\kernelbase.dll!CreateProcess*", "*\\kernelbase.dll+0x*"))
      and process.Ext.api.summary like ("*PEB*", "*PEB32*",  "*ProcessStartupInfo*")) and

 not _arraysearch(process.thread.Ext.call_stack, $entry, $entry.symbol_info like "c:\\windows\\system32\\ntdll.dll!Ldr*") and 

 not (process.Ext.api.summary like ("*PEB*", "*PEB32*",  "*ProcessStartupInfo*") and
      process.thread.Ext.call_stack_summary like "ntdll.dll|*Unknown*") and

 /* excluding trusted code signature */
 process.thread.Ext.call_stack_final_user_module.code_signature != null and
 not _arraysearch(process.thread.Ext.call_stack_final_user_module.code_signature, $entry, $entry.trusted == true) and

not (process.name : "rundll32.exe" and process.Ext.api.parameters.size <= 140 and
      _arraysearch(process.thread.Ext.call_stack_final_user_module.code_signature, $entry, $entry.subject_name == "Barco N.V." and $entry.status in ("errorTimeStamp", "errorUntrustedRoot"))) and

 not (process.executable : ("\\\\?\\Volume{*}\\*.exe", "\\\\?\\Volume{*}\\*.exe") and process.thread.Ext.call_stack_final_user_module.path like "?:\\*\\docker\\*\\windows\\*.dll") and

 not process.thread.Ext.call_stack_final_user_module.name in ("Unknown", "Undetermined", "Kernel") and

 not (Target.process.executable : "C:\\Windows\\SysWOW64\\explorer.exe" and process.Ext.api.parameters.size < 3200 and
      process.Ext.api.metadata.target_address_name == "Unbacked") and

 /* excluding multiple unsigned third party modules from programfiles */
  not process.thread.Ext.call_stack_final_user_module.path like
                             ("?:\\windows\\assembly\\nativeimages_*",
                              "?:\\windows\\winsxs\\*.dll",
                              "?:\\program files\\*",
                              "?:\\program files (x86)\\*",
                              "c:\\windows\\apppatch\\ummon.dll",
                              "c:\\windows\\apppatch\\apppatch64\\ummon.dll",
                              "c:\\windows\\system32\\ctiuser.dll",
                              "c:\\windows\\syswow64\\ctiuser.dll",
                              "c:\\windows\\system32\\hpzipm12.dll",
                              "c:\\windows\\system32\\lsasrv.dll",
                              "c:\\windows\\syswow64\\cwbunpls.dll",
                              "c:\\windows\\system32\\shsvcs.dll",
                              "c:\\windows\\system32\\sxssrv.dll",
                              "c:\\windows\\syswow64\\pgpce.dll", 
                              "c:\\windows\\system32\\hmpalert.dll", 
                              "c:\\windows\\system32\\cloudap.dll") and
  not process.thread.Ext.call_stack_final_user_module.protection_provenance in ("mfehcthe.dll", "system.core.ni.dll") and
  not process.thread.Ext.call_stack_final_user_module.protection_provenance_path like ("?:\\program files\\*", "?:\\program files (x86)\\*", "c:\\windows\\assembly\\nativeimages_*") and
  not (process.thread.Ext.call_stack_final_user_module.name == "mscordbi.dll" and
       process.executable : "C:\\Program Files\\Microsoft Visual Studio\\*\\Common?\\IDE\\devenv.exe") and
  not (process.parent.executable : "C:\\Program Files (x86)\\InstallShield Installation Information\\*\\setup.exe" and
       Target.process.executable : "C:\\Windows\\SysWOW64\\explorer.exe") and
  not (process.executable : "C:\\Program Files\\Microsoft Visual Studio\\*\\link.exe" and
       process.parent.executable : "C:\\Program Files\\Microsoft Visual Studio\\*\\MSBuild\\*\\Tracker.exe") and
  not process.thread.Ext.call_stack_final_user_module.hash.sha256 in
                                  ("27fe00d32f773a95e6d50986e5e7499917f66ce881e46054c77652ef4bdf3512",
                                   "a59e039e1520b74254a454bf48c2bceeafe7bd7ac6e5886baa482a52f86a29bf",
                                   "f01bb9aba3f9daf4d8f5551a3b753d8011e16072a1103cf5303d617a9f866424",
                                   "16184cf6f54d6ac4eb0a31c0e9ee8ae775bae6dfdc632e283e832f3e89de595d",
                                   "c983d11ad519a851aca2d37739110b7913819bea1ddf2cc3ec69efe3ed3b609f",
                                   "c3cd2439a6175ce28192904e72b14523b02559d8083a710b5e82aee400626d1a",
                                   "7396f943823494d2ec5f2260329daa2d35b1764f01cdefd95f84ae320986a8f3",
                                   "efd03f2525e69cdc30b5736af74d9485728b8a94d5624da87f1431b3706980ab",
                                   "8eb0721092af3131a940f1e23bc2871e09362980e0b71a7ed7dab6e8accd1f30",
                                   "6edb20df25d1cf0fd1b27052f2604a05db1d7ca5a3f074e7bacc229e28d17667",
                                   "67435999749d9e6908a4029321c0c6f9e915135e98e01a7e499a1c55a960bc68",
                                   "914299dd77f4322c99f62c37df1317ea3424d9a747d4635d10c1d3f003f6abd4",
                                   "51b63860fd996d6d5b1753ba6bb7f3a4303f13187fbfecc96ba2b6bae52a7410",
                                   "0255b5bf7ad66aa090be145f0ad41a0f4e33409ff5c2970081fccd863c720779",
                                   "925a5cd982933bae1b271e1aaaa887ab469397701cd299f4397ddd8af5a351f9",
                                   "9cb1208f1747963dc57e8bf8a8fe82b3aaa856caae3d151b6a6b97b23369f5a6",
                                   "681303f5b5688075b5b504819d8b3c343c78e3240a3bccf371e03228970ffb10",
                                   "30b59303bec45b020b4878b2d33d63bd719d89820456a7ee0a920178efe089f4",
                                   "8ee5bd6fea98577bd29c15055e96ec17c62ca415f4a5d26065b25a922b19d3b1",
                                   "57854d83b50ff0a23d47c077d6da875874ea78f88f28168d8e99ffbf9f1c3153",
                                   "c4788275a5ed2c1576e69b59e6e267ce573450ff07e54b799ec4c4edef40b502",
                                   "a4637935f895de601850c6868d952977a84076a7b1719d0deb519f1fc0871be4",
                                   "a99ac2554c1e392ffe3cd53f7f72f76638948533795fc04f7e15454c386b7eec",
                                   "b031da6137f9442a6cc9f4b4546b4057b666726cb7c9224c4ca857a60f2ec1e1",
                                   "586d8eeaec3a439978836a512bf2f5a987cbe2ba72e5bb10322d04cd65fe8d09",
                                   "ebdc2c2cedd5e549ba8d5e3f474d29204e1cf073e2b26e75f60bb429d2b5a088",
                                   "80eb757f729a943ff0919df1eb980b80f8419f76648407834d95c76adfd21624",
                                   "e71eb30f24c82bc4fa1c645eecbe343f5a44526043fc3a13047183dac5f212f3",
                                   "c46f9f3c710ff2baabea480670220e0328e7bcc2aa3c598c3f982728e0b5652d",
                                   "7f1ab7572a89534366172df3ae5f0182aab1ae3ef992b684a84c5c1a10e8315f",
                                   "d7624e57820ccd1bae7881e08af40bc3522971278018fdfbe0ca98302292165c",
                                   "e0f11ad44d1c1e11f9308f9aaee4d8bcac86ff6e0b4a41d1e75879f6cfd56049",
                                   "2266a567ba921d1c2661258cd5b31150274cb781ac01413c34a471557123ba65",
                                   "1f2e936a57994e16b457f249a64af4786877f7beaab003fb521a20e45031f408",
                                   "e8eaf74988082b8c8222dabed68218069c8eb4e93acd3619a776bc28d39e5ce5",
                                   "39fdb47a5f349e06bbb7dc1cedcc81a051d1dffe373956871325f8327e858afa",
                                   "f7af5eac1d34a2ddc619dd0c3172ec28334b8d79efc1f8ad758124b7e5aae0d5",
                                   "8f3d19065d0d1295bbfbf7591aa02af3a5dc70fde74bac670c18ccd8f7306008",
                                   "d6b771bedda261bcfe9dd1d1402b7d33b5cd2764cd53d941957e32920cfbeb19",
                                   "3e02857de5a59331e1f7fc7e1ddf5ae58e8680d298bb44b49bd316e0b3a1f024",
                                   "954b4385cf4faecfbf9cd04e01c059eb09113a78ee727149b63a65b495a28a6c",
                                   "8851b734602eb00da5b1cfc1e40d38f1cb32e0add2df257ff9d7dbd520b4d5da",
                                   "b2d86212afab00e7b9bf19b7931277130b653c9258ac419a7a24d749471ea5ac",
                                   "5231df995d71991ee4108937bb12e4d3f344a96fb0c4cd82c14e18061d6c4730",
                                   "4daef5be9503c580697b36b0b60a702c109e23840c0632ca00ef4a233603018e",
                                   "fd788a077e026905f1565e0d2a65dfc6c55699c098a59879d6b0b3f3b8459ae8",
                                   "dc641636d5d782b31d29ce823e951d1a2164c86ee06bf2f65a841360fb7af356",
                                   "fb4a05ce7d50721c71f66c37e0ab7e52cd46034a2e394940b3f60c9c2afb079a",
                                   "862a7e8c68f05b91ecf3a43ac5b60c6f57ee50fa98ad1b539480d541628f5c2e",
                                   "44c87532cbb511c369b38a105fc5a84b1d89dba9dfdd5a62c311d6176fe93201",
                                   "465aade5769d4cae2ca1f365ca634440a0444ca0ce319171c140c362d12859c4",
                                   "d615af8e012426c8847c750a0838159d6c41385d2e50388cea28a97999b81614",
                                   "9c63bfc10af9e801f0a009cb5e3c3c097d5eae8ee00351e2bcaa672ead352df4",
                                   "8bca3967254a38d6789c90afe136e34e96b5840b3fc77826dcf3c73b44016ea2",
                                   "dc2d5b2d59a18cd4e749d2cd709e4ada3751ef59d188a8bbab1bbd7562f2d609",
                                   "759f7e4d46e10d3de2fad228994ae8bb142ff171082d175b5d233895efa047be",
                                   "bea84d6541a56c63c570d7b637d18b4de3348c6f8b96b536002da1e7c268879f",
                                   "bc66341f3d2cd4d5216612869731a9f653fa4d75b429ee944a0802ae9457367f",
                                   "5497ff34548a2a0c948024e0d4f21005c18f82ed01246ee98dbb33c0389670c8",
                                   "ebbc8af232a86e870ecf0cbb3f6c3dc79e740c14e907437bab449e2a1e098ed3",
                                   "f3cb863c2a8f16a5f1a4ec5a4d7036f7a0b444cbd4f52226c0d463154e8d5428",
                                   "646c951524f1fab3aaa70a4cff9469ab658a2a0bdeea4e88aa18072c54c83430",
                                   "c79d56dacc8e28b662dcc5fe922453d225441bfa73656942beb205bf4ad20066",
                                   "d0735ca28e1f806da75e83a8405ed431d991c7476bc79c8be6c7b27ccce0ac31",
                                   "175184977cf02e59af9674a24a2f2b0d8278bf886f9f7e05ef8878b5364dc3bb",
                                   "7214d926419fe847a4795a74f9b73209990e4927bb5b56128cf30703be68cde7",
                                   "f7c78dba07128af325d8da99138ebf78be163ecfb5da5b01fa6b65b96efecef1",
                                   "5bcb5bd390665792c5e597bcc569caa9bfb942ef7946014eb60dcef0fcf586a6",
                                   "07d6c3a19a8e3e243e9545a41dd30a9ee1e9ad79cdd6d446c229d689e5ab574a",
                                   "3d171205aec848f93b721891806ff86b36ba639923067f6e5dabc4cf500f5831",
                                   "7b55a781fef86de1dd56f8956b5160d74de10c9c9179e7f5b38331eb4eefd9af",
                                   "593384d6a5d77c75426c0fe7d93663d24e9797548dd52ff8d60f9c25ac0b70f9",
                                   "67fffdf1b96050f8eca6e844cb23fcee2ef54f85fbfb7786ad9d6d3c39d84415",
                                   "e3fdcd2b4c5215e74b0cabe91ce7fe2800cbf8e2a28157342960bca61bbd6b5d",
                                   "bd6843726688bd7253a42180bf95671ad5b0f9e787adb4f13250f484abd9eae4",
                                   "4f1f25bb19905c34bf75436d32c48df96afd9872c0f5fc5ab45e31f9783e1ace",
                                   "0d6ff0e37139ee86d2991d2b8389f36316778ddb6e44a6d6c727e2d4b87693a5",
                                   "6e54f990149523e9b25c4dd804986f55bdbf846ba1261f8a0ba285cdfabe0bab",
                                   "2c8483ea06618e3c501678e4b7bd77f2e1c068cfa88c0f168abffa5f78b328ea",
                                   "03e03d5726da2ca346a0130cf01b7fa4af46b5f8b9370d1cf63ddde1c72dd6d2",
                                   "0d6ff0e37139ee86d2991d2b8389f36316778ddb6e44a6d6c727e2d4b87693a5",
                                   "494ee86d2a538f23fcfbab1507612637b4af2b97166ed1e3b5f86da74506bca4",
                                   "341f3841335bf2e4e2d2fe39672c591fbc819b0b64b654fc198000234fb8052b",
                                   "9840c97b35afb77418d541ef2f1b5da93c0d7d9632c334ec7444ceadeb0f9fa8",
                                   "27f6d804c989ddae14c94768240c639e14fc94bac4a56156c4f1925682004f89",
                                   "ddcbecf2cd2cd4904cf21e3db40c6a918df0ed3b258473fc5d6e2688dee72696",
                                   "4e4b9bcef90731eb9b1306610fc89ba31296a5875ff5ba628f7271130aa61280",
                                   "35e1443640e39922f5488cba77b10fd97a58c65e0c4d2a0dcdd16a276c3677e1",
                                   "b152de9afc373bba831dc9c1b137668462ae6d46ccd46815f2ffcc7f1bfc7056",
                                   "c9b456c3722c60e680e8bbf3a8c9aad55bbea6af0f8de7340e4573b23b1272b6",
                                   "472232ca821b5c2ef562ab07f53638bc2cc82eae84cea13fbe674d6022b6481c",
                                   "cd4aa919f346bee759d4aded15c57901026307446546f8c296fa706e2e109095",
                                   "e3a6a3337494667a6cfd7578e9a6c6b5f17f4cac82ae9a98d56cd4c2ae701542",
                                   "0884f057877298b3dd93f3ffd749692820f7e8df52f907480484dab5000048f4",
                                   "7291b1c32671f5416ea33d1f14ca6a36dc77e166a12e6a3868ba68b9ebfdc3d3",
                                   "00bf4e4083d79196e54b39e2d957b25b50807c922d3cc09f5661215536895f4b",
                                   "fdef73d692e2e181075bf43a05cd7ebe551f6b1be31f4d471ff709f83a549612",
                                   "6eed2886728608f1b3f4a54a7a7d338ef1b1669f6f53a5d38bcd352f0ec755c9",
                                   "9840c97b35afb77418d541ef2f1b5da93c0d7d9632c334ec7444ceadeb0f9fa8",
                                   "418a7dc57d5ac225d7f012fe90a1668a797fde56c9add6c3aad841ab0c1e2bc1",
                                   "42215642c3c1ec4c578b9c03cbe8cd93cdf20abe33687473da2d25d5f5efe0a9",
                                   "1dfc0c4f5442dcff2082d9258254b6861c27001aada055d960844561e699655b",
                                   "e09a338081b83a42e97b60311d9af749baaedb226b155d9e7bd658de1c5a349d",
                                   "1fa7ef783a81ed730bd40540e0aec4c1b42ba7eef52ddb28311f2086580db766",
                                   "1f8a5ff26f722b380754d794ad4b8d9edf69361e18ea0a2a03ed58d61e91849c",
                                   "c5d10c310306c223b66ebf1595db00d581d4eff1a0615d4d309cd9160f85a008",
                                   "538837e2f9bdb764d6ec799c89348bd483d51e72b3f91b6bc5e30a1bdcae24bf",
                                   "b0fda4dd268633f34e75e03fb0c79ed9512b5fb4ecf7b85989e2b7744f7b7974",
                                   "722cb3292042a573a1f56a535d1986fd8496261ba68e6d60a32599701df617c7",
                                   "615ac4399eed0a26e5cd9bba4e7dcf661400fb0546dce067523fe275351d3b04",
                                   "c750bdf07966a69d1423dda5deb3413d312e319c9dd1193f354eb48310208370",
                                   "d0a62a67891bbd4eb263d328e5bf6da080bcd7d16c3b1d73e563a48263062c5a",
                                   "cd0e1ca821e92ae426cbd30daf44ae3580ec4070c734b2d411376a5e6a874e97",
                                   "ccae2a12091763da594e0ceb83e3aa438bccf2449b2dc91c916232ba2117ae22",
                                   "16bbdb339173d25b4332b377da96e80809aabfe6739cf35d5e70484f08cfdc42",
                                   "d355b62cc7dc5b8f3ee5e95a8ddddc818f6f84c5a16799d78b1cb3d786e2bb80",
                                   "8094af5ee310714caebccaeee7769ffb08048503ba478b879edfef5f1a24fefe",
                                   "fe04a6ca7c35330dd0adf681aaf85ce9f6342a027c74776ea09e30517e02acd1",
                                   "379952ec8113b3692872ffb9d07c242968ee1edfac9b3b888496c1480033be91",
                                   "4ab37b0f9c5fe3505e1ecfe0764aaa04838cf81f9e0a402425e057f7a251e621",
                                   "ab7ba2df709c5ff7ee16a1038deaf1d795977b035a1ba08cc6d32ea9ff87bd80",
                                   "a6967e7a3c2251812dd6b3fa0265fb7b61aadc568f562a98c50c345908c6e827",
                                   "68a9b8395bc4593deff311046193ef71444767359622538c848363ddb1afb4c0",
                                   "c982aa3d9e2bce5a6faec7a767f58ba6a622f07e7af6ca8abee4eb6b12492574",
                                   "06990109b285c72e65d9f3f803738ee874a4dc9d505f384eee93b7bb6a8cf9b8",
                                   "98c2ddea9b192883eae55567908722a981a1bed1f55ef0b4bacc984530c85292",
                                   "7dc65ca4c511808d59ebf73eb8810cc3e6e62ed7229ac53bd1cce0e6d8f9b60f",
                                   "bb1e5c4b390f31630fa87da5ee2ce326811f3566c58c16b2a68c9cff9c269fb7",
                                   "9344363df85bc76135431e64f3be606355a8c33d6ea9918573b53500537a1f2b",
                                   "809ff63ca16058e93474ada89f45f832aeac705b032004745fd06fe15b4942c3",
                                   "771af46d1e8f21d303cdd81c91206986c40e1671b092e039cea3a7f3d250492a",
                                   "a3800ebd1797b54aded5134cc9b93df3051b1aaa74a619c4a5223d5a1979dce1",
                                   "c729c4b5a6ad8d247acd4b0d32d5a5999647461ee5f565c618b26d339caebbca",
                                   "17aad91089b18cd97d7ddadbe9873cfde18bf3cb998623a8dfd3aa85006ce736",
                                   "e2f9e698b01ea5e525396ddb86d5dbfcf85f6f19d6e9b8e4f1d75cbcd0da626d",
                                   "237e9b49a376436896837ad26bcf3fc7776ec382395bdd99ccf9bc844fe16326",
                                   "426ed7db4bbf0dcc03ce2f27ca844147547a429399e4def018492a0b828775ca",
                                   "b946e5cce23efb43520850c4d24cd03177e62f959341a99d01fdefa17864aad9",
                                   "6ecdd9b65df1281b3df79594064eecec8be0a0f3769caf7ea65031947d9546fb",
                                   "da8a30160ab0fe450cc42aad45999e22ea848ac9a98814d420c4da884e733e22",
                                   "c0106d2c7f43ffb28532537cdfdb0085d2f0de1e595736fd4e62a68670bb15ae",
                                   "0ec1018ec231baee086a680d535847d478dc843adcafcf007f143d6c905637be",
                                   "552bee0c0d9af1399022451accd3fd527fe865428658482196ecf45432f7a235",
                                   "e44286422a2e26d4813dc78e2215a0dd1a074d0fca4c12eb19f532338f714d2b",
                                   "135766eefef4af765ad7f2fcd0b4f72c0d9e8d1364c21a508c0ce66dae294f20",
                                   "0a48fd481cc5901b6a1608b58e55823d77cef5bd2897392f201a450af301292e",
                                   "21d741e2c5089776a535587cd5fcd933b51054e16bf8e50855e74e68b3790228",
                                   "11d174e1e922a8e644bdd2b5287879445cc6ff0117ef553d5ce6390f1bb49cb5",
                                   "69a56fd6a22193044336b1ee6548efcc992ab3e51f617d772a32f5e12cdef998",
                                   "d1c43b02455df6ed98a5c1fe1ac16284706ed4bd76a784c332dd6b2bec90183f",
                                   "ff31fa811f9c07cc7fdaa68c9e8bca3a7b4fdf6e0a079a58175ea58ba139c7ae",
                                   "25fbc88c7c967266f041ae4d47c2eae0b96086f9e440cca10729103aee7ef6cd",
                                   "af3d6298a8cd7293479f77eab032478e766dae44749489b9568c9fa50ce70890",
                                   "ba2616674f60ba0b977900bed95dbfb9fad2ad6084cbf90f831fc06c1bfb2f23",
                                   "12296a09402575cf107cf0c8b87a31716de1f56896f512aab6e6e86e13247350",
                                   "11d87cac25f6d438db6c6dfec631f97fa5f6ad98e7d99fa50ac1479706efb3b5",
                                   "37cf45f320b9bc4ca198bd93ac1f7882756d82f491809ea4f8907c69cfe1c9ae",
                                   "b2c5905e7e7da322d7be5b2a5552c37345f678b9f69c14c630a1bd1186455c1f",
                                   "176d01497ed5abfedd82db3889a0f8f60a8e254fe841d95cda94de20e0dd4b42",
                                   "250c5f755d35a56189c7d557f1ea3b2827f26ff83c563df8a6cedb0114777fc0",
                                   "f3553d5c7a36f67eb9934cc372ded8c2d592ae671ebd4297b0fbfd1cedad4205",
                                   "0740759a6e479b0ff718e00c6f2d5f3c67db2ac31c787d2caa7e683588c23a03",
                                   "4e0421b9849e2f873399832c44c1e858eef3dc37ac2ccd6dcb340ad35dfab63a", 
                                   "cb7ab3788d10940df874acd97b1821bbb5ee4a91f3eec11982bb5bf7a3c96443", 
                                   "5b6929aaaa7bd05bcaa5baa7ce8c4243804d6989f1c97ca44726ed124b49e9bb") and
  not (process.executable : "C:\\Program Files (x86)\\Microsoft Visual Studio*\\bin\\lib.exe" and
       Target.process.executable : "C:\\Program Files (x86)\\Microsoft Visual Studio*.exe" and process.thread.Ext.call_stack_final_user_module.name == "qt5xml.dll")
'''

min_endpoint_version = "8.14.2"
[[actions]]
action = "kill_process"
field = "Target.process.entity_id"
state = 0
tree = true

[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0
tree = true

[[optional_actions]]
action = "rollback"
field = "process.entity_id"
state = 0

[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1055"
name = "Process Injection"
reference = "https://attack.mitre.org/techniques/T1055/"


[threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"

[internal]
min_endpoint_version = "8.14.2"

Stages and Predicates

Stage 1: api

api where process.Ext.api.name == "WriteProcessMemory" and
 process.executable != null and Target.process.executable != null and
 process.Ext.api.behaviors == "cross-process" and
 Target.process.executable != process.executable and not process.Ext.api.summary like "*Unknown*" and
 Target.process.executable : ("?:\\Windows\\*", "?:\\Program Files*") and
 not (_arraysearch(process.thread.Ext.call_stack, $entry, $entry.symbol_info like ("*\\kernelbase.dll!CreateProcess*", "*\\kernelbase.dll+0x*"))
      and process.Ext.api.summary like ("*PEB*", "*PEB32*",  "*ProcessStartupInfo*")) and
 not _arraysearch(process.thread.Ext.call_stack, $entry, $entry.symbol_info like "c:\\windows\\system32\\ntdll.dll!Ldr*") and
 not (process.Ext.api.summary like ("*PEB*", "*PEB32*",  "*ProcessStartupInfo*") and
      process.thread.Ext.call_stack_summary like "ntdll.dll|*Unknown*") and
 process.thread.Ext.call_stack_final_user_module.code_signature != null and
 not _arraysearch(process.thread.Ext.call_stack_final_user_module.code_signature, $entry, $entry.trusted == true) and
not (process.name : "rundll32.exe" and process.Ext.api.parameters.size <= 140 and
      _arraysearch(process.thread.Ext.call_stack_final_user_module.code_signature, $entry, $entry.subject_name == "Barco N.V." and $entry.status in ("errorTimeStamp", "errorUntrustedRoot"))) and
 not (process.executable : ("\\\\?\\Volume{*}\\*.exe", "\\\\?\\Volume{*}\\*.exe") and process.thread.Ext.call_stack_final_user_module.path like "?:\\*\\docker\\*\\windows\\*.dll") and
 not process.thread.Ext.call_stack_final_user_module.name in ("Unknown", "Undetermined", "Kernel") and
 not (Target.process.executable : "C:\\Windows\\SysWOW64\\explorer.exe" and process.Ext.api.parameters.size < 3200 and
      process.Ext.api.metadata.target_address_name == "Unbacked") and
  not process.thread.Ext.call_stack_final_user_module.path like
                             ("?:\\windows\\assembly\\nativeimages_*",
                              "?:\\windows\\winsxs\\*.dll",
                              "?:\\program files\\*",
                              "?:\\program files (x86)\\*",
                              "c:\\windows\\apppatch\\ummon.dll",
                              "c:\\windows\\apppatch\\apppatch64\\ummon.dll",
                              "c:\\windows\\system32\\ctiuser.dll",
                              "c:\\windows\\syswow64\\ctiuser.dll",
                              "c:\\windows\\system32\\hpzipm12.dll",
                              "c:\\windows\\system32\\lsasrv.dll",
                              "c:\\windows\\syswow64\\cwbunpls.dll",
                              "c:\\windows\\system32\\shsvcs.dll",
                              "c:\\windows\\system32\\sxssrv.dll",
                              "c:\\windows\\syswow64\\pgpce.dll",
                              "c:\\windows\\system32\\hmpalert.dll",
                              "c:\\windows\\system32\\cloudap.dll") and
  not process.thread.Ext.call_stack_final_user_module.protection_provenance in ("mfehcthe.dll", "system.core.ni.dll") and
  not process.thread.Ext.call_stack_final_user_module.protection_provenance_path like ("?:\\program files\\*", "?:\\program files (x86)\\*", "c:\\windows\\assembly\\nativeimages_*") and
  not (process.thread.Ext.call_stack_final_user_module.name == "mscordbi.dll" and
       process.executable : "C:\\Program Files\\Microsoft Visual Studio\\*\\Common?\\IDE\\devenv.exe") and
  not (process.parent.executable : "C:\\Program Files (x86)\\InstallShield Installation Information\\*\\setup.exe" and
       Target.process.executable : "C:\\Windows\\SysWOW64\\explorer.exe") and
  not (process.executable : "C:\\Program Files\\Microsoft Visual Studio\\*\\link.exe" and
       process.parent.executable : "C:\\Program Files\\Microsoft Visual Studio\\*\\MSBuild\\*\\Tracker.exe") and
  not process.thread.Ext.call_stack_final_user_module.hash.sha256 in
                                  ("27fe00d32f773a95e6d50986e5e7499917f66ce881e46054c77652ef4bdf3512",
                                   "a59e039e1520b74254a454bf48c2bceeafe7bd7ac6e5886baa482a52f86a29bf",
                                   "f01bb9aba3f9daf4d8f5551a3b753d8011e16072a1103cf5303d617a9f866424",
                                   "16184cf6f54d6ac4eb0a31c0e9ee8ae775bae6dfdc632e283e832f3e89de595d",
                                   "c983d11ad519a851aca2d37739110b7913819bea1ddf2cc3ec69efe3ed3b609f",
                                   "c3cd2439a6175ce28192904e72b14523b02559d8083a710b5e82aee400626d1a",
                                   "7396f943823494d2ec5f2260329daa2d35b1764f01cdefd95f84ae320986a8f3",
                                   "efd03f2525e69cdc30b5736af74d9485728b8a94d5624da87f1431b3706980ab",
                                   "8eb0721092af3131a940f1e23bc2871e09362980e0b71a7ed7dab6e8accd1f30",
                                   "6edb20df25d1cf0fd1b27052f2604a05db1d7ca5a3f074e7bacc229e28d17667",
                                   "67435999749d9e6908a4029321c0c6f9e915135e98e01a7e499a1c55a960bc68",
                                   "914299dd77f4322c99f62c37df1317ea3424d9a747d4635d10c1d3f003f6abd4",
                                   "51b63860fd996d6d5b1753ba6bb7f3a4303f13187fbfecc96ba2b6bae52a7410",
                                   "0255b5bf7ad66aa090be145f0ad41a0f4e33409ff5c2970081fccd863c720779",
                                   "925a5cd982933bae1b271e1aaaa887ab469397701cd299f4397ddd8af5a351f9",
                                   "9cb1208f1747963dc57e8bf8a8fe82b3aaa856caae3d151b6a6b97b23369f5a6",
                                   "681303f5b5688075b5b504819d8b3c343c78e3240a3bccf371e03228970ffb10",
                                   "30b59303bec45b020b4878b2d33d63bd719d89820456a7ee0a920178efe089f4",
                                   "8ee5bd6fea98577bd29c15055e96ec17c62ca415f4a5d26065b25a922b19d3b1",
                                   "57854d83b50ff0a23d47c077d6da875874ea78f88f28168d8e99ffbf9f1c3153",
                                   "c4788275a5ed2c1576e69b59e6e267ce573450ff07e54b799ec4c4edef40b502",
                                   "a4637935f895de601850c6868d952977a84076a7b1719d0deb519f1fc0871be4",
                                   "a99ac2554c1e392ffe3cd53f7f72f76638948533795fc04f7e15454c386b7eec",
                                   "b031da6137f9442a6cc9f4b4546b4057b666726cb7c9224c4ca857a60f2ec1e1",
                                   "586d8eeaec3a439978836a512bf2f5a987cbe2ba72e5bb10322d04cd65fe8d09",
                                   "ebdc2c2cedd5e549ba8d5e3f474d29204e1cf073e2b26e75f60bb429d2b5a088",
                                   "80eb757f729a943ff0919df1eb980b80f8419f76648407834d95c76adfd21624",
                                   "e71eb30f24c82bc4fa1c645eecbe343f5a44526043fc3a13047183dac5f212f3",
                                   "c46f9f3c710ff2baabea480670220e0328e7bcc2aa3c598c3f982728e0b5652d",
                                   "7f1ab7572a89534366172df3ae5f0182aab1ae3ef992b684a84c5c1a10e8315f",
                                   "d7624e57820ccd1bae7881e08af40bc3522971278018fdfbe0ca98302292165c",
                                   "e0f11ad44d1c1e11f9308f9aaee4d8bcac86ff6e0b4a41d1e75879f6cfd56049",
                                   "2266a567ba921d1c2661258cd5b31150274cb781ac01413c34a471557123ba65",
                                   "1f2e936a57994e16b457f249a64af4786877f7beaab003fb521a20e45031f408",
                                   "e8eaf74988082b8c8222dabed68218069c8eb4e93acd3619a776bc28d39e5ce5",
                                   "39fdb47a5f349e06bbb7dc1cedcc81a051d1dffe373956871325f8327e858afa",
                                   "f7af5eac1d34a2ddc619dd0c3172ec28334b8d79efc1f8ad758124b7e5aae0d5",
                                   "8f3d19065d0d1295bbfbf7591aa02af3a5dc70fde74bac670c18ccd8f7306008",
                                   "d6b771bedda261bcfe9dd1d1402b7d33b5cd2764cd53d941957e32920cfbeb19",
                                   "3e02857de5a59331e1f7fc7e1ddf5ae58e8680d298bb44b49bd316e0b3a1f024",
                                   "954b4385cf4faecfbf9cd04e01c059eb09113a78ee727149b63a65b495a28a6c",
                                   "8851b734602eb00da5b1cfc1e40d38f1cb32e0add2df257ff9d7dbd520b4d5da",
                                   "b2d86212afab00e7b9bf19b7931277130b653c9258ac419a7a24d749471ea5ac",
                                   "5231df995d71991ee4108937bb12e4d3f344a96fb0c4cd82c14e18061d6c4730",
                                   "4daef5be9503c580697b36b0b60a702c109e23840c0632ca00ef4a233603018e",
                                   "fd788a077e026905f1565e0d2a65dfc6c55699c098a59879d6b0b3f3b8459ae8",
                                   "dc641636d5d782b31d29ce823e951d1a2164c86ee06bf2f65a841360fb7af356",
                                   "fb4a05ce7d50721c71f66c37e0ab7e52cd46034a2e394940b3f60c9c2afb079a",
                                   "862a7e8c68f05b91ecf3a43ac5b60c6f57ee50fa98ad1b539480d541628f5c2e",
                                   "44c87532cbb511c369b38a105fc5a84b1d89dba9dfdd5a62c311d6176fe93201",
                                   "465aade5769d4cae2ca1f365ca634440a0444ca0ce319171c140c362d12859c4",
                                   "d615af8e012426c8847c750a0838159d6c41385d2e50388cea28a97999b81614",
                                   "9c63bfc10af9e801f0a009cb5e3c3c097d5eae8ee00351e2bcaa672ead352df4",
                                   "8bca3967254a38d6789c90afe136e34e96b5840b3fc77826dcf3c73b44016ea2",
                                   "dc2d5b2d59a18cd4e749d2cd709e4ada3751ef59d188a8bbab1bbd7562f2d609",
                                   "759f7e4d46e10d3de2fad228994ae8bb142ff171082d175b5d233895efa047be",
                                   "bea84d6541a56c63c570d7b637d18b4de3348c6f8b96b536002da1e7c268879f",
                                   "bc66341f3d2cd4d5216612869731a9f653fa4d75b429ee944a0802ae9457367f",
                                   "5497ff34548a2a0c948024e0d4f21005c18f82ed01246ee98dbb33c0389670c8",
                                   "ebbc8af232a86e870ecf0cbb3f6c3dc79e740c14e907437bab449e2a1e098ed3",
                                   "f3cb863c2a8f16a5f1a4ec5a4d7036f7a0b444cbd4f52226c0d463154e8d5428",
                                   "646c951524f1fab3aaa70a4cff9469ab658a2a0bdeea4e88aa18072c54c83430",
                                   "c79d56dacc8e28b662dcc5fe922453d225441bfa73656942beb205bf4ad20066",
                                   "d0735ca28e1f806da75e83a8405ed431d991c7476bc79c8be6c7b27ccce0ac31",
                                   "175184977cf02e59af9674a24a2f2b0d8278bf886f9f7e05ef8878b5364dc3bb",
                                   "7214d926419fe847a4795a74f9b73209990e4927bb5b56128cf30703be68cde7",
                                   "f7c78dba07128af325d8da99138ebf78be163ecfb5da5b01fa6b65b96efecef1",
                                   "5bcb5bd390665792c5e597bcc569caa9bfb942ef7946014eb60dcef0fcf586a6",
                                   "07d6c3a19a8e3e243e9545a41dd30a9ee1e9ad79cdd6d446c229d689e5ab574a",
                                   "3d171205aec848f93b721891806ff86b36ba639923067f6e5dabc4cf500f5831",
                                   "7b55a781fef86de1dd56f8956b5160d74de10c9c9179e7f5b38331eb4eefd9af",
                                   "593384d6a5d77c75426c0fe7d93663d24e9797548dd52ff8d60f9c25ac0b70f9",
                                   "67fffdf1b96050f8eca6e844cb23fcee2ef54f85fbfb7786ad9d6d3c39d84415",
                                   "e3fdcd2b4c5215e74b0cabe91ce7fe2800cbf8e2a28157342960bca61bbd6b5d",
                                   "bd6843726688bd7253a42180bf95671ad5b0f9e787adb4f13250f484abd9eae4",
                                   "4f1f25bb19905c34bf75436d32c48df96afd9872c0f5fc5ab45e31f9783e1ace",
                                   "0d6ff0e37139ee86d2991d2b8389f36316778ddb6e44a6d6c727e2d4b87693a5",
                                   "6e54f990149523e9b25c4dd804986f55bdbf846ba1261f8a0ba285cdfabe0bab",
                                   "2c8483ea06618e3c501678e4b7bd77f2e1c068cfa88c0f168abffa5f78b328ea",
                                   "03e03d5726da2ca346a0130cf01b7fa4af46b5f8b9370d1cf63ddde1c72dd6d2",
                                   "0d6ff0e37139ee86d2991d2b8389f36316778ddb6e44a6d6c727e2d4b87693a5",
                                   "494ee86d2a538f23fcfbab1507612637b4af2b97166ed1e3b5f86da74506bca4",
                                   "341f3841335bf2e4e2d2fe39672c591fbc819b0b64b654fc198000234fb8052b",
                                   "9840c97b35afb77418d541ef2f1b5da93c0d7d9632c334ec7444ceadeb0f9fa8",
                                   "27f6d804c989ddae14c94768240c639e14fc94bac4a56156c4f1925682004f89",
                                   "ddcbecf2cd2cd4904cf21e3db40c6a918df0ed3b258473fc5d6e2688dee72696",
                                   "4e4b9bcef90731eb9b1306610fc89ba31296a5875ff5ba628f7271130aa61280",
                                   "35e1443640e39922f5488cba77b10fd97a58c65e0c4d2a0dcdd16a276c3677e1",
                                   "b152de9afc373bba831dc9c1b137668462ae6d46ccd46815f2ffcc7f1bfc7056",
                                   "c9b456c3722c60e680e8bbf3a8c9aad55bbea6af0f8de7340e4573b23b1272b6",
                                   "472232ca821b5c2ef562ab07f53638bc2cc82eae84cea13fbe674d6022b6481c",
                                   "cd4aa919f346bee759d4aded15c57901026307446546f8c296fa706e2e109095",
                                   "e3a6a3337494667a6cfd7578e9a6c6b5f17f4cac82ae9a98d56cd4c2ae701542",
                                   "0884f057877298b3dd93f3ffd749692820f7e8df52f907480484dab5000048f4",
                                   "7291b1c32671f5416ea33d1f14ca6a36dc77e166a12e6a3868ba68b9ebfdc3d3",
                                   "00bf4e4083d79196e54b39e2d957b25b50807c922d3cc09f5661215536895f4b",
                                   "fdef73d692e2e181075bf43a05cd7ebe551f6b1be31f4d471ff709f83a549612",
                                   "6eed2886728608f1b3f4a54a7a7d338ef1b1669f6f53a5d38bcd352f0ec755c9",
                                   "9840c97b35afb77418d541ef2f1b5da93c0d7d9632c334ec7444ceadeb0f9fa8",
                                   "418a7dc57d5ac225d7f012fe90a1668a797fde56c9add6c3aad841ab0c1e2bc1",
                                   "42215642c3c1ec4c578b9c03cbe8cd93cdf20abe33687473da2d25d5f5efe0a9",
                                   "1dfc0c4f5442dcff2082d9258254b6861c27001aada055d960844561e699655b",
                                   "e09a338081b83a42e97b60311d9af749baaedb226b155d9e7bd658de1c5a349d",
                                   "1fa7ef783a81ed730bd40540e0aec4c1b42ba7eef52ddb28311f2086580db766",
                                   "1f8a5ff26f722b380754d794ad4b8d9edf69361e18ea0a2a03ed58d61e91849c",
                                   "c5d10c310306c223b66ebf1595db00d581d4eff1a0615d4d309cd9160f85a008",
                                   "538837e2f9bdb764d6ec799c89348bd483d51e72b3f91b6bc5e30a1bdcae24bf",
                                   "b0fda4dd268633f34e75e03fb0c79ed9512b5fb4ecf7b85989e2b7744f7b7974",
                                   "722cb3292042a573a1f56a535d1986fd8496261ba68e6d60a32599701df617c7",
                                   "615ac4399eed0a26e5cd9bba4e7dcf661400fb0546dce067523fe275351d3b04",
                                   "c750bdf07966a69d1423dda5deb3413d312e319c9dd1193f354eb48310208370",
                                   "d0a62a67891bbd4eb263d328e5bf6da080bcd7d16c3b1d73e563a48263062c5a",
                                   "cd0e1ca821e92ae426cbd30daf44ae3580ec4070c734b2d411376a5e6a874e97",
                                   "ccae2a12091763da594e0ceb83e3aa438bccf2449b2dc91c916232ba2117ae22",
                                   "16bbdb339173d25b4332b377da96e80809aabfe6739cf35d5e70484f08cfdc42",
                                   "d355b62cc7dc5b8f3ee5e95a8ddddc818f6f84c5a16799d78b1cb3d786e2bb80",
                                   "8094af5ee310714caebccaeee7769ffb08048503ba478b879edfef5f1a24fefe",
                                   "fe04a6ca7c35330dd0adf681aaf85ce9f6342a027c74776ea09e30517e02acd1",
                                   "379952ec8113b3692872ffb9d07c242968ee1edfac9b3b888496c1480033be91",
                                   "4ab37b0f9c5fe3505e1ecfe0764aaa04838cf81f9e0a402425e057f7a251e621",
                                   "ab7ba2df709c5ff7ee16a1038deaf1d795977b035a1ba08cc6d32ea9ff87bd80",
                                   "a6967e7a3c2251812dd6b3fa0265fb7b61aadc568f562a98c50c345908c6e827",
                                   "68a9b8395bc4593deff311046193ef71444767359622538c848363ddb1afb4c0",
                                   "c982aa3d9e2bce5a6faec7a767f58ba6a622f07e7af6ca8abee4eb6b12492574",
                                   "06990109b285c72e65d9f3f803738ee874a4dc9d505f384eee93b7bb6a8cf9b8",
                                   "98c2ddea9b192883eae55567908722a981a1bed1f55ef0b4bacc984530c85292",
                                   "7dc65ca4c511808d59ebf73eb8810cc3e6e62ed7229ac53bd1cce0e6d8f9b60f",
                                   "bb1e5c4b390f31630fa87da5ee2ce326811f3566c58c16b2a68c9cff9c269fb7",
                                   "9344363df85bc76135431e64f3be606355a8c33d6ea9918573b53500537a1f2b",
                                   "809ff63ca16058e93474ada89f45f832aeac705b032004745fd06fe15b4942c3",
                                   "771af46d1e8f21d303cdd81c91206986c40e1671b092e039cea3a7f3d250492a",
                                   "a3800ebd1797b54aded5134cc9b93df3051b1aaa74a619c4a5223d5a1979dce1",
                                   "c729c4b5a6ad8d247acd4b0d32d5a5999647461ee5f565c618b26d339caebbca",
                                   "17aad91089b18cd97d7ddadbe9873cfde18bf3cb998623a8dfd3aa85006ce736",
                                   "e2f9e698b01ea5e525396ddb86d5dbfcf85f6f19d6e9b8e4f1d75cbcd0da626d",
                                   "237e9b49a376436896837ad26bcf3fc7776ec382395bdd99ccf9bc844fe16326",
                                   "426ed7db4bbf0dcc03ce2f27ca844147547a429399e4def018492a0b828775ca",
                                   "b946e5cce23efb43520850c4d24cd03177e62f959341a99d01fdefa17864aad9",
                                   "6ecdd9b65df1281b3df79594064eecec8be0a0f3769caf7ea65031947d9546fb",
                                   "da8a30160ab0fe450cc42aad45999e22ea848ac9a98814d420c4da884e733e22",
                                   "c0106d2c7f43ffb28532537cdfdb0085d2f0de1e595736fd4e62a68670bb15ae",
                                   "0ec1018ec231baee086a680d535847d478dc843adcafcf007f143d6c905637be",
                                   "552bee0c0d9af1399022451accd3fd527fe865428658482196ecf45432f7a235",
                                   "e44286422a2e26d4813dc78e2215a0dd1a074d0fca4c12eb19f532338f714d2b",
                                   "135766eefef4af765ad7f2fcd0b4f72c0d9e8d1364c21a508c0ce66dae294f20",
                                   "0a48fd481cc5901b6a1608b58e55823d77cef5bd2897392f201a450af301292e",
                                   "21d741e2c5089776a535587cd5fcd933b51054e16bf8e50855e74e68b3790228",
                                   "11d174e1e922a8e644bdd2b5287879445cc6ff0117ef553d5ce6390f1bb49cb5",
                                   "69a56fd6a22193044336b1ee6548efcc992ab3e51f617d772a32f5e12cdef998",
                                   "d1c43b02455df6ed98a5c1fe1ac16284706ed4bd76a784c332dd6b2bec90183f",
                                   "ff31fa811f9c07cc7fdaa68c9e8bca3a7b4fdf6e0a079a58175ea58ba139c7ae",
                                   "25fbc88c7c967266f041ae4d47c2eae0b96086f9e440cca10729103aee7ef6cd",
                                   "af3d6298a8cd7293479f77eab032478e766dae44749489b9568c9fa50ce70890",
                                   "ba2616674f60ba0b977900bed95dbfb9fad2ad6084cbf90f831fc06c1bfb2f23",
                                   "12296a09402575cf107cf0c8b87a31716de1f56896f512aab6e6e86e13247350",
                                   "11d87cac25f6d438db6c6dfec631f97fa5f6ad98e7d99fa50ac1479706efb3b5",
                                   "37cf45f320b9bc4ca198bd93ac1f7882756d82f491809ea4f8907c69cfe1c9ae",
                                   "b2c5905e7e7da322d7be5b2a5552c37345f678b9f69c14c630a1bd1186455c1f",
                                   "176d01497ed5abfedd82db3889a0f8f60a8e254fe841d95cda94de20e0dd4b42",
                                   "250c5f755d35a56189c7d557f1ea3b2827f26ff83c563df8a6cedb0114777fc0",
                                   "f3553d5c7a36f67eb9934cc372ded8c2d592ae671ebd4297b0fbfd1cedad4205",
                                   "0740759a6e479b0ff718e00c6f2d5f3c67db2ac31c787d2caa7e683588c23a03",
                                   "4e0421b9849e2f873399832c44c1e858eef3dc37ac2ccd6dcb340ad35dfab63a",
                                   "cb7ab3788d10940df874acd97b1821bbb5ee4a91f3eec11982bb5bf7a3c96443",
                                   "5b6929aaaa7bd05bcaa5baa7ce8c4243804d6989f1c97ca44726ed124b49e9bb") and
  not (process.executable : "C:\\Program Files (x86)\\Microsoft Visual Studio*\\bin\\lib.exe" and
       Target.process.executable : "C:\\Program Files (x86)\\Microsoft Visual Studio*.exe" and process.thread.Ext.call_stack_final_user_module.name == "qt5xml.dll")

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process.thread.Ext.call_stack_final_user_module.code_signaturearray_any(no value, null check)excludes:process.thread.Ext.call_stack_final_user_module.code_signature
process.Ext.api.parameters.sizele140excludes:process.Ext.api.parameters.size field:"process.Ext.api.parameters.size" value:"140"
process.nameeqrundll32.exeexcludes:process.name field:"process.name" value:"rundll32.exe"
process.thread.Ext.call_stackarray_any(no value, null check)excludes:process.thread.Ext.call_stack
process.Ext.api.summarymatchPEB, PEB32, ProcessStartupInfoexcludes:process.Ext.api.summary field:"process.Ext.api.summary" value:"PEB" field:"process.Ext.api.summary" value:"PEB32" field:"process.Ext.api.summary" value:"ProcessStartupInfo"
Target.process.executableeqC:\Windows\SysWOW64\explorer.exeexcludes:Target.process.executable field:"Target.process.executable" value:"C:\Windows\SysWOW64\explorer.exe"
process.Ext.api.metadata.target_address_nameeqUnbackedexcludes:process.Ext.api.metadata.target_address_name field:"process.Ext.api.metadata.target_address_name" value:"Unbacked"
process.Ext.api.parameters.sizelt3200excludes:process.Ext.api.parameters.size field:"process.Ext.api.parameters.size" value:"3200"
process.parent.executablewildcardC:\Program Files (x86)\InstallShield Installation Information\*\setup.exeexcludes:process.parent.executable field:"process.parent.executable" value:"C:\Program Files (x86)\InstallShield Installation Information\*\setup.exe"
Target.process.executablewildcardC:\Program Files (x86)\Microsoft Visual Studio*.exeexcludes:Target.process.executable field:"Target.process.executable" value:"C:\Program Files (x86)\Microsoft Visual Studio*.exe"
process.executablewildcardC:\Program Files (x86)\Microsoft Visual Studio*\bin\lib.exeexcludes:process.executable field:"process.executable" value:"C:\Program Files (x86)\Microsoft Visual Studio*\bin\lib.exe"
process.thread.Ext.call_stack_final_user_module.nameeqqt5xml.dllexcludes:process.thread.Ext.call_stack_final_user_module.name field:"process.thread.Ext.call_stack_final_user_module.name" value:"qt5xml.dll"
process.thread.Ext.call_stack_summarywildcardntdll.dll|*Unknown*excludes:process.thread.Ext.call_stack_summary field:"process.thread.Ext.call_stack_summary" value:"ntdll.dll|*Unknown*"
process.executablewildcardC:\Program Files\Microsoft Visual Studio\*\Common?\IDE\devenv.exeexcludes:process.executable field:"process.executable" value:"C:\Program Files\Microsoft Visual Studio\*\Common?\IDE\devenv.exe"
process.thread.Ext.call_stack_final_user_module.nameeqmscordbi.dllexcludes:process.thread.Ext.call_stack_final_user_module.name field:"process.thread.Ext.call_stack_final_user_module.name" value:"mscordbi.dll"
process.executablewildcardC:\Program Files\Microsoft Visual Studio\*\link.exeexcludes:process.executable field:"process.executable" value:"C:\Program Files\Microsoft Visual Studio\*\link.exe"
process.parent.executablewildcardC:\Program Files\Microsoft Visual Studio\*\MSBuild\*\Tracker.exeexcludes:process.parent.executable field:"process.parent.executable" value:"C:\Program Files\Microsoft Visual Studio\*\MSBuild\*\Tracker.exe"
process.executablewildcard\\?\Volume{*}\*.exe, \\?\Volume{*}\*.exeexcludes:process.executable field:"process.executable" value:"\\?\Volume{*}\*.exe" field:"process.executable" value:"\\?\Volume{*}\*.exe"
process.thread.Ext.call_stack_final_user_module.pathwildcard?:\*\docker\*\windows\*.dllexcludes:process.thread.Ext.call_stack_final_user_module.path field:"process.thread.Ext.call_stack_final_user_module.path" value:"?:\*\docker\*\windows\*.dll"
process.Ext.api.summarymatchUnknownexcludes:process.Ext.api.summary field:"process.Ext.api.summary" value:"Unknown"
process.thread.Ext.call_stack_final_user_module.hash.sha256in00bf4e4083d79196e54b39e2d957b25b50807c922d3cc09f5661215536895f4b, 0255b5bf7ad66aa090be145f0ad41a0f4e33409ff5c2970081fccd863c720779, 03e03d5726da2ca346a0130cf01b7fa4af46b5f8b9370d1cf63ddde1c72dd6d2, 06990109b285c72e65d9f3f803738ee874a4dc9d505f384eee93b7bb6a8cf9b8, 0740759a6e479b0ff718e00c6f2d5f3c67db2ac31c787d2caa7e683588c23a03, 07d6c3a19a8e3e243e9545a41dd30a9ee1e9ad79cdd6d446c229d689e5ab574a, 0884f057877298b3dd93f3ffd749692820f7e8df52f907480484dab5000048f4, 0a48fd481cc5901b6a1608b58e55823d77cef5bd2897392f201a450af301292e, 0d6ff0e37139ee86d2991d2b8389f36316778ddb6e44a6d6c727e2d4b87693a5, 0ec1018ec231baee086a680d535847d478dc843adcafcf007f143d6c905637be, 11d174e1e922a8e644bdd2b5287879445cc6ff0117ef553d5ce6390f1bb49cb5, 11d87cac25f6d438db6c6dfec631f97fa5f6ad98e7d99fa50ac1479706efb3b5, 12296a09402575cf107cf0c8b87a31716de1f56896f512aab6e6e86e13247350, 135766eefef4af765ad7f2fcd0b4f72c0d9e8d1364c21a508c0ce66dae294f20, 16184cf6f54d6ac4eb0a31c0e9ee8ae775bae6dfdc632e283e832f3e89de595d, 16bbdb339173d25b4332b377da96e80809aabfe6739cf35d5e70484f08cfdc42, 175184977cf02e59af9674a24a2f2b0d8278bf886f9f7e05ef8878b5364dc3bb, 176d01497ed5abfedd82db3889a0f8f60a8e254fe841d95cda94de20e0dd4b42, 17aad91089b18cd97d7ddadbe9873cfde18bf3cb998623a8dfd3aa85006ce736, 1dfc0c4f5442dcff2082d9258254b6861c27001aada055d960844561e699655b, 1f2e936a57994e16b457f249a64af4786877f7beaab003fb521a20e45031f408, 1f8a5ff26f722b380754d794ad4b8d9edf69361e18ea0a2a03ed58d61e91849c, 1fa7ef783a81ed730bd40540e0aec4c1b42ba7eef52ddb28311f2086580db766, 21d741e2c5089776a535587cd5fcd933b51054e16bf8e50855e74e68b3790228, 2266a567ba921d1c2661258cd5b31150274cb781ac01413c34a471557123ba65, 237e9b49a376436896837ad26bcf3fc7776ec382395bdd99ccf9bc844fe16326, 250c5f755d35a56189c7d557f1ea3b2827f26ff83c563df8a6cedb0114777fc0, 25fbc88c7c967266f041ae4d47c2eae0b96086f9e440cca10729103aee7ef6cd, 27f6d804c989ddae14c94768240c639e14fc94bac4a56156c4f1925682004f89, 27fe00d32f773a95e6d50986e5e7499917f66ce881e46054c77652ef4bdf3512, 2c8483ea06618e3c501678e4b7bd77f2e1c068cfa88c0f168abffa5f78b328ea, 30b59303bec45b020b4878b2d33d63bd719d89820456a7ee0a920178efe089f4, 341f3841335bf2e4e2d2fe39672c591fbc819b0b64b654fc198000234fb8052b, 35e1443640e39922f5488cba77b10fd97a58c65e0c4d2a0dcdd16a276c3677e1, 379952ec8113b3692872ffb9d07c242968ee1edfac9b3b888496c1480033be91, 37cf45f320b9bc4ca198bd93ac1f7882756d82f491809ea4f8907c69cfe1c9ae, 39fdb47a5f349e06bbb7dc1cedcc81a051d1dffe373956871325f8327e858afa, 3d171205aec848f93b721891806ff86b36ba639923067f6e5dabc4cf500f5831, 3e02857de5a59331e1f7fc7e1ddf5ae58e8680d298bb44b49bd316e0b3a1f024, 418a7dc57d5ac225d7f012fe90a1668a797fde56c9add6c3aad841ab0c1e2bc1, 42215642c3c1ec4c578b9c03cbe8cd93cdf20abe33687473da2d25d5f5efe0a9, 426ed7db4bbf0dcc03ce2f27ca844147547a429399e4def018492a0b828775ca, 44c87532cbb511c369b38a105fc5a84b1d89dba9dfdd5a62c311d6176fe93201, 465aade5769d4cae2ca1f365ca634440a0444ca0ce319171c140c362d12859c4, 472232ca821b5c2ef562ab07f53638bc2cc82eae84cea13fbe674d6022b6481c, 494ee86d2a538f23fcfbab1507612637b4af2b97166ed1e3b5f86da74506bca4, 4ab37b0f9c5fe3505e1ecfe0764aaa04838cf81f9e0a402425e057f7a251e621, 4daef5be9503c580697b36b0b60a702c109e23840c0632ca00ef4a233603018e, 4e0421b9849e2f873399832c44c1e858eef3dc37ac2ccd6dcb340ad35dfab63a, 4e4b9bcef90731eb9b1306610fc89ba31296a5875ff5ba628f7271130aa61280, 4f1f25bb19905c34bf75436d32c48df96afd9872c0f5fc5ab45e31f9783e1ace, 51b63860fd996d6d5b1753ba6bb7f3a4303f13187fbfecc96ba2b6bae52a7410, 5231df995d71991ee4108937bb12e4d3f344a96fb0c4cd82c14e18061d6c4730, 538837e2f9bdb764d6ec799c89348bd483d51e72b3f91b6bc5e30a1bdcae24bf, 5497ff34548a2a0c948024e0d4f21005c18f82ed01246ee98dbb33c0389670c8, 552bee0c0d9af1399022451accd3fd527fe865428658482196ecf45432f7a235, 57854d83b50ff0a23d47c077d6da875874ea78f88f28168d8e99ffbf9f1c3153, 586d8eeaec3a439978836a512bf2f5a987cbe2ba72e5bb10322d04cd65fe8d09, 593384d6a5d77c75426c0fe7d93663d24e9797548dd52ff8d60f9c25ac0b70f9, 5b6929aaaa7bd05bcaa5baa7ce8c4243804d6989f1c97ca44726ed124b49e9bb, 5bcb5bd390665792c5e597bcc569caa9bfb942ef7946014eb60dcef0fcf586a6, 615ac4399eed0a26e5cd9bba4e7dcf661400fb0546dce067523fe275351d3b04, 646c951524f1fab3aaa70a4cff9469ab658a2a0bdeea4e88aa18072c54c83430, 67435999749d9e6908a4029321c0c6f9e915135e98e01a7e499a1c55a960bc68, 67fffdf1b96050f8eca6e844cb23fcee2ef54f85fbfb7786ad9d6d3c39d84415, 681303f5b5688075b5b504819d8b3c343c78e3240a3bccf371e03228970ffb10, 68a9b8395bc4593deff311046193ef71444767359622538c848363ddb1afb4c0, 69a56fd6a22193044336b1ee6548efcc992ab3e51f617d772a32f5e12cdef998, 6e54f990149523e9b25c4dd804986f55bdbf846ba1261f8a0ba285cdfabe0bab, 6ecdd9b65df1281b3df79594064eecec8be0a0f3769caf7ea65031947d9546fb, 6edb20df25d1cf0fd1b27052f2604a05db1d7ca5a3f074e7bacc229e28d17667, 6eed2886728608f1b3f4a54a7a7d338ef1b1669f6f53a5d38bcd352f0ec755c9, 7214d926419fe847a4795a74f9b73209990e4927bb5b56128cf30703be68cde7, 722cb3292042a573a1f56a535d1986fd8496261ba68e6d60a32599701df617c7, 7291b1c32671f5416ea33d1f14ca6a36dc77e166a12e6a3868ba68b9ebfdc3d3, 7396f943823494d2ec5f2260329daa2d35b1764f01cdefd95f84ae320986a8f3, 759f7e4d46e10d3de2fad228994ae8bb142ff171082d175b5d233895efa047be, 771af46d1e8f21d303cdd81c91206986c40e1671b092e039cea3a7f3d250492a, 7b55a781fef86de1dd56f8956b5160d74de10c9c9179e7f5b38331eb4eefd9af, 7dc65ca4c511808d59ebf73eb8810cc3e6e62ed7229ac53bd1cce0e6d8f9b60f, 7f1ab7572a89534366172df3ae5f0182aab1ae3ef992b684a84c5c1a10e8315f, 8094af5ee310714caebccaeee7769ffb08048503ba478b879edfef5f1a24fefe, 809ff63ca16058e93474ada89f45f832aeac705b032004745fd06fe15b4942c3, 80eb757f729a943ff0919df1eb980b80f8419f76648407834d95c76adfd21624, 862a7e8c68f05b91ecf3a43ac5b60c6f57ee50fa98ad1b539480d541628f5c2e, 8851b734602eb00da5b1cfc1e40d38f1cb32e0add2df257ff9d7dbd520b4d5da, 8bca3967254a38d6789c90afe136e34e96b5840b3fc77826dcf3c73b44016ea2, 8eb0721092af3131a940f1e23bc2871e09362980e0b71a7ed7dab6e8accd1f30, 8ee5bd6fea98577bd29c15055e96ec17c62ca415f4a5d26065b25a922b19d3b1, 8f3d19065d0d1295bbfbf7591aa02af3a5dc70fde74bac670c18ccd8f7306008, 914299dd77f4322c99f62c37df1317ea3424d9a747d4635d10c1d3f003f6abd4, 925a5cd982933bae1b271e1aaaa887ab469397701cd299f4397ddd8af5a351f9, 9344363df85bc76135431e64f3be606355a8c33d6ea9918573b53500537a1f2b, 954b4385cf4faecfbf9cd04e01c059eb09113a78ee727149b63a65b495a28a6c, 9840c97b35afb77418d541ef2f1b5da93c0d7d9632c334ec7444ceadeb0f9fa8, 98c2ddea9b192883eae55567908722a981a1bed1f55ef0b4bacc984530c85292, 9c63bfc10af9e801f0a009cb5e3c3c097d5eae8ee00351e2bcaa672ead352df4, 9cb1208f1747963dc57e8bf8a8fe82b3aaa856caae3d151b6a6b97b23369f5a6, a3800ebd1797b54aded5134cc9b93df3051b1aaa74a619c4a5223d5a1979dce1, a4637935f895de601850c6868d952977a84076a7b1719d0deb519f1fc0871be4, a59e039e1520b74254a454bf48c2bceeafe7bd7ac6e5886baa482a52f86a29bf, a6967e7a3c2251812dd6b3fa0265fb7b61aadc568f562a98c50c345908c6e827, a99ac2554c1e392ffe3cd53f7f72f76638948533795fc04f7e15454c386b7eec, ab7ba2df709c5ff7ee16a1038deaf1d795977b035a1ba08cc6d32ea9ff87bd80, af3d6298a8cd7293479f77eab032478e766dae44749489b9568c9fa50ce70890, b031da6137f9442a6cc9f4b4546b4057b666726cb7c9224c4ca857a60f2ec1e1, b0fda4dd268633f34e75e03fb0c79ed9512b5fb4ecf7b85989e2b7744f7b7974, b152de9afc373bba831dc9c1b137668462ae6d46ccd46815f2ffcc7f1bfc7056, b2c5905e7e7da322d7be5b2a5552c37345f678b9f69c14c630a1bd1186455c1f, b2d86212afab00e7b9bf19b7931277130b653c9258ac419a7a24d749471ea5ac, b946e5cce23efb43520850c4d24cd03177e62f959341a99d01fdefa17864aad9, ba2616674f60ba0b977900bed95dbfb9fad2ad6084cbf90f831fc06c1bfb2f23, bb1e5c4b390f31630fa87da5ee2ce326811f3566c58c16b2a68c9cff9c269fb7, bc66341f3d2cd4d5216612869731a9f653fa4d75b429ee944a0802ae9457367f, bd6843726688bd7253a42180bf95671ad5b0f9e787adb4f13250f484abd9eae4, bea84d6541a56c63c570d7b637d18b4de3348c6f8b96b536002da1e7c268879f, c0106d2c7f43ffb28532537cdfdb0085d2f0de1e595736fd4e62a68670bb15ae, c3cd2439a6175ce28192904e72b14523b02559d8083a710b5e82aee400626d1a, c46f9f3c710ff2baabea480670220e0328e7bcc2aa3c598c3f982728e0b5652d, c4788275a5ed2c1576e69b59e6e267ce573450ff07e54b799ec4c4edef40b502, c5d10c310306c223b66ebf1595db00d581d4eff1a0615d4d309cd9160f85a008, c729c4b5a6ad8d247acd4b0d32d5a5999647461ee5f565c618b26d339caebbca, c750bdf07966a69d1423dda5deb3413d312e319c9dd1193f354eb48310208370, c79d56dacc8e28b662dcc5fe922453d225441bfa73656942beb205bf4ad20066, c982aa3d9e2bce5a6faec7a767f58ba6a622f07e7af6ca8abee4eb6b12492574, c983d11ad519a851aca2d37739110b7913819bea1ddf2cc3ec69efe3ed3b609f, c9b456c3722c60e680e8bbf3a8c9aad55bbea6af0f8de7340e4573b23b1272b6, cb7ab3788d10940df874acd97b1821bbb5ee4a91f3eec11982bb5bf7a3c96443, ccae2a12091763da594e0ceb83e3aa438bccf2449b2dc91c916232ba2117ae22, cd0e1ca821e92ae426cbd30daf44ae3580ec4070c734b2d411376a5e6a874e97, cd4aa919f346bee759d4aded15c57901026307446546f8c296fa706e2e109095, d0735ca28e1f806da75e83a8405ed431d991c7476bc79c8be6c7b27ccce0ac31, d0a62a67891bbd4eb263d328e5bf6da080bcd7d16c3b1d73e563a48263062c5a, d1c43b02455df6ed98a5c1fe1ac16284706ed4bd76a784c332dd6b2bec90183f, d355b62cc7dc5b8f3ee5e95a8ddddc818f6f84c5a16799d78b1cb3d786e2bb80, d615af8e012426c8847c750a0838159d6c41385d2e50388cea28a97999b81614, d6b771bedda261bcfe9dd1d1402b7d33b5cd2764cd53d941957e32920cfbeb19, d7624e57820ccd1bae7881e08af40bc3522971278018fdfbe0ca98302292165c, da8a30160ab0fe450cc42aad45999e22ea848ac9a98814d420c4da884e733e22, dc2d5b2d59a18cd4e749d2cd709e4ada3751ef59d188a8bbab1bbd7562f2d609, dc641636d5d782b31d29ce823e951d1a2164c86ee06bf2f65a841360fb7af356, ddcbecf2cd2cd4904cf21e3db40c6a918df0ed3b258473fc5d6e2688dee72696, e09a338081b83a42e97b60311d9af749baaedb226b155d9e7bd658de1c5a349d, e0f11ad44d1c1e11f9308f9aaee4d8bcac86ff6e0b4a41d1e75879f6cfd56049, e2f9e698b01ea5e525396ddb86d5dbfcf85f6f19d6e9b8e4f1d75cbcd0da626d, e3a6a3337494667a6cfd7578e9a6c6b5f17f4cac82ae9a98d56cd4c2ae701542, e3fdcd2b4c5215e74b0cabe91ce7fe2800cbf8e2a28157342960bca61bbd6b5d, e44286422a2e26d4813dc78e2215a0dd1a074d0fca4c12eb19f532338f714d2b, e71eb30f24c82bc4fa1c645eecbe343f5a44526043fc3a13047183dac5f212f3, e8eaf74988082b8c8222dabed68218069c8eb4e93acd3619a776bc28d39e5ce5, ebbc8af232a86e870ecf0cbb3f6c3dc79e740c14e907437bab449e2a1e098ed3, ebdc2c2cedd5e549ba8d5e3f474d29204e1cf073e2b26e75f60bb429d2b5a088, efd03f2525e69cdc30b5736af74d9485728b8a94d5624da87f1431b3706980ab, f01bb9aba3f9daf4d8f5551a3b753d8011e16072a1103cf5303d617a9f866424, f3553d5c7a36f67eb9934cc372ded8c2d592ae671ebd4297b0fbfd1cedad4205, f3cb863c2a8f16a5f1a4ec5a4d7036f7a0b444cbd4f52226c0d463154e8d5428, f7af5eac1d34a2ddc619dd0c3172ec28334b8d79efc1f8ad758124b7e5aae0d5, f7c78dba07128af325d8da99138ebf78be163ecfb5da5b01fa6b65b96efecef1, fb4a05ce7d50721c71f66c37e0ab7e52cd46034a2e394940b3f60c9c2afb079a, fd788a077e026905f1565e0d2a65dfc6c55699c098a59879d6b0b3f3b8459ae8, fdef73d692e2e181075bf43a05cd7ebe551f6b1be31f4d471ff709f83a549612, fe04a6ca7c35330dd0adf681aaf85ce9f6342a027c74776ea09e30517e02acd1, ff31fa811f9c07cc7fdaa68c9e8bca3a7b4fdf6e0a079a58175ea58ba139c7aeexcludes:process.thread.Ext.call_stack_final_user_module.hash.sha256
process.thread.Ext.call_stack_final_user_module.nameinKernel, Undetermined, Unknownexcludes:process.thread.Ext.call_stack_final_user_module.name field:"process.thread.Ext.call_stack_final_user_module.name" value:"Kernel" field:"process.thread.Ext.call_stack_final_user_module.name" value:"Undetermined" field:"process.thread.Ext.call_stack_final_user_module.name" value:"Unknown"
process.thread.Ext.call_stack_final_user_module.pathwildcard?:\windows\assembly\nativeimages_*, ?:\windows\winsxs\*.dll, ?:\program files\*, ?:\program files (x86)\*, c:\windows\apppatch\ummon.dll, c:\windows\apppatch\apppatch64\ummon.dll, c:\windows\system32\ctiuser.dll, c:\windows\syswow64\ctiuser.dll, c:\windows\system32\hpzipm12.dll, c:\windows\system32\lsasrv.dll, c:\windows\syswow64\cwbunpls.dll, c:\windows\system32\shsvcs.dll, c:\windows\system32\sxssrv.dll, c:\windows\syswow64\pgpce.dll, c:\windows\system32\hmpalert.dll, c:\windows\system32\cloudap.dllexcludes:process.thread.Ext.call_stack_final_user_module.path
process.thread.Ext.call_stack_final_user_module.protection_provenanceinmfehcthe.dll, system.core.ni.dllexcludes:process.thread.Ext.call_stack_final_user_module.protection_provenance field:"process.thread.Ext.call_stack_final_user_module.protection_provenance" value:"mfehcthe.dll" field:"process.thread.Ext.call_stack_final_user_module.protection_provenance" value:"system.core.ni.dll"
process.thread.Ext.call_stack_final_user_module.protection_provenance_pathstarts_with?:\program files\, ?:\program files (x86)\, c:\windows\assembly\nativeimages_excludes:process.thread.Ext.call_stack_final_user_module.protection_provenance_path field:"process.thread.Ext.call_stack_final_user_module.protection_provenance_path" value:"?:\program files\" field:"process.thread.Ext.call_stack_final_user_module.protection_provenance_path" value:"?:\program files (x86)\" field:"process.thread.Ext.call_stack_final_user_module.protection_provenance_path" value:"c:\windows\assembly\nativeimages_"

Security Account Manager (SAM) File Access

#
Source
github.com/elastic/protections-artifacts

Identifies access to the Security Account Manager (SAM) database file, which adversaries can use to recover password hashes for local accounts.

MITRE ATT&CK Coverage

Rule Body

[rule]
description = """
Identifies access to the Security Account Manager (SAM) database file, which adversaries can use to recover password
hashes for local accounts.
"""
id = "dc27190a-688b-4f9b-88f0-1f13deccd67f"
license = "Elastic License v2"
name = "Security Account Manager (SAM) File Access"
os_list = ["windows"]
reference = [
    "https://adsecurity.org/?page_id=1821",
    "https://github.com/gentilkiwi/mimikatz/wiki/module-~-lsadump",
]
version = "1.0.37"

query = '''
file where event.action == "open" and 
 file.path : 
      ("?:\\WINDOWS\\SYSTEM32\\CONFIG\\SAM", 
       "\\??\\GLOBALROOT\\Device\\HarddiskVolumeShadowCopy*\\WINDOWS\\SYSTEM32\\CONFIG\\SAM",  
       "\\Device\\HarddiskVolume*\\WINDOWS\\SYSTEM32\\CONFIG\\SAM") and
 user.id != null and process.executable : "?:\\*" and not process.pid == 4 and
 not process.executable :
             ("?:\\Windows\\System32\\svchost.exe",
              "?:\\Program Files (x86)\\*",
              "?:\\Program Files\\*",
              "?:\\Windows\\System32\\wuauclt.exe",
              "?:\\$WINDOWS.~BT\\Sources\\SetupHost.exe",
              "?:\\Windows\\System32\\vmwp.exe",
              "?:\\Windows\\System32\\Dism.exe",
              "?:\\Windows\\System32\\wbengine.exe",
              "?:\\Windows\\System32\\mmc.exe",
              "?:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\*.exe",
              "?:\\Windows\\System32\\sppsvc.exe",
              "?:\\Windows\\System32\\backgroundTaskHost.exe",
              "?:\\Windows\\System32\\lsass.exe",
              "?:\\Windows\\System32\\SearchProtocolHost.exe",
              "?:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\*.exe",
              "?:\\ProgramData\\Microsoft\\Windows Defender Advanced Threat Protection\\Platform\\*.exe",
              "?:\\Program Files\\Windows Defender Advanced Threat Protection\\*.exe",
              "?:\\Program Files\\Microsoft Monitoring Agent\\Agent\\*.exe",
              "?:\\Windows\\System32\\SrTasks.exe",
              "?:\\Windows\\System32\\rstrui.exe",
              "?:\\Windows\\System32\\RecoveryDrive.exe", 
              "?:\\Windows\\System32\\MRT.exe", 
              "?:\\rsyncd\\bin\\rsync.exe", 
              "?:\\PCBP\\wbps.exe", 
              "?:\\Windows\\System32\\Robocopy.exe",
              "D:\\PROGRAMS\\Commvault\\ContentStore\\Base\\CLBackup.exe") and
 /* mounted OS install */
 not file.path : "?:\\?*\\Windows\\System32\\*" and 
 
 not (process.code_signature.subject_name :
         ("ESET, spol. s r.o.", "Commvault Systems, Inc.", "Eric R. Zimmerman", "EFOLDER, INC.", "Absolute Software Corp.",
          "EFOLDER, INC.", "International Business Machines Corporation") and
      process.code_signature.trusted == true) and 
 
 /* 8.6+ logs also failed access attempt which generate some noise */
 not event.outcome == "failure"
'''

min_endpoint_version = "8.0.0"
optional_actions = []
[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0

[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1003"
name = "OS Credential Dumping"
reference = "https://attack.mitre.org/techniques/T1003/"
[[threat.technique.subtechnique]]
id = "T1003.002"
name = "Security Account Manager"
reference = "https://attack.mitre.org/techniques/T1003/002/"



[threat.tactic]
id = "TA0006"
name = "Credential Access"
reference = "https://attack.mitre.org/tactics/TA0006/"

[internal]
min_endpoint_version = "8.0.0"

Stages and Predicates

Stage 1: file

file where event.action == "open" and
 file.path :
      ("?:\\WINDOWS\\SYSTEM32\\CONFIG\\SAM",
       "\\??\\GLOBALROOT\\Device\\HarddiskVolumeShadowCopy*\\WINDOWS\\SYSTEM32\\CONFIG\\SAM",
       "\\Device\\HarddiskVolume*\\WINDOWS\\SYSTEM32\\CONFIG\\SAM") and
 user.id != null and process.executable : "?:\\*" and not process.pid == 4 and
 not process.executable :
             ("?:\\Windows\\System32\\svchost.exe",
              "?:\\Program Files (x86)\\*",
              "?:\\Program Files\\*",
              "?:\\Windows\\System32\\wuauclt.exe",
              "?:\\$WINDOWS.~BT\\Sources\\SetupHost.exe",
              "?:\\Windows\\System32\\vmwp.exe",
              "?:\\Windows\\System32\\Dism.exe",
              "?:\\Windows\\System32\\wbengine.exe",
              "?:\\Windows\\System32\\mmc.exe",
              "?:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\*.exe",
              "?:\\Windows\\System32\\sppsvc.exe",
              "?:\\Windows\\System32\\backgroundTaskHost.exe",
              "?:\\Windows\\System32\\lsass.exe",
              "?:\\Windows\\System32\\SearchProtocolHost.exe",
              "?:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\*.exe",
              "?:\\ProgramData\\Microsoft\\Windows Defender Advanced Threat Protection\\Platform\\*.exe",
              "?:\\Program Files\\Windows Defender Advanced Threat Protection\\*.exe",
              "?:\\Program Files\\Microsoft Monitoring Agent\\Agent\\*.exe",
              "?:\\Windows\\System32\\SrTasks.exe",
              "?:\\Windows\\System32\\rstrui.exe",
              "?:\\Windows\\System32\\RecoveryDrive.exe",
              "?:\\Windows\\System32\\MRT.exe",
              "?:\\rsyncd\\bin\\rsync.exe",
              "?:\\PCBP\\wbps.exe",
              "?:\\Windows\\System32\\Robocopy.exe",
              "D:\\PROGRAMS\\Commvault\\ContentStore\\Base\\CLBackup.exe") and
 not file.path : "?:\\?*\\Windows\\System32\\*" and
 not (process.code_signature.subject_name :
         ("ESET, spol. s r.o.", "Commvault Systems, Inc.", "Eric R. Zimmerman", "EFOLDER, INC.", "Absolute Software Corp.",
          "EFOLDER, INC.", "International Business Machines Corporation") and
      process.code_signature.trusted == true) and
 not event.outcome == "failure"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
event.actioneq
  • open corpus 49 (elastic 49)
field:"EventType" kind:eq value:"open"
file.pathwildcard
  • ?:\WINDOWS\SYSTEM32\CONFIG\SAM
  • \??\GLOBALROOT\Device\HarddiskVolumeShadowCopy*\WINDOWS\SYSTEM32\CONFIG\SAM
  • \Device\HarddiskVolume*\WINDOWS\SYSTEM32\CONFIG\SAM
field:"TargetFilename" kind:wildcard
process.executablewildcard
  • ?:\* corpus 18 (elastic 18)
field:"Image" kind:wildcard value:"?:\*"
user.idis_not_null
  • (no value, null check)
field:"user.id" kind:is_not_null

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process.code_signature.subject_nameeqESET, spol. s r.o., Commvault Systems, Inc., Eric R. Zimmerman, EFOLDER, INC., Absolute Software Corp., EFOLDER, INC., International Business Machines Corporationexcludes:process.code_signature.subject_name
process.code_signature.trustedeqtrueexcludes:process.code_signature.trusted field:"process.code_signature.trusted" value:"true"
event.outcomeeqfailureexcludes:event.outcome field:"event.outcome" value:"failure"
file.pathwildcard?:\?*\Windows\System32\*excludes:file.path field:"file.path" value:"?:\?*\Windows\System32\*"
process.executablewildcard?:\Windows\System32\svchost.exe, ?:\Program Files (x86)\*, ?:\Program Files\*, ?:\Windows\System32\wuauclt.exe, ?:\$WINDOWS.~BT\Sources\SetupHost.exe, ?:\Windows\System32\vmwp.exe, ?:\Windows\System32\Dism.exe, ?:\Windows\System32\wbengine.exe, ?:\Windows\System32\mmc.exe, ?:\ProgramData\Microsoft\Windows Defender\Platform\*.exe, ?:\Windows\System32\sppsvc.exe, ?:\Windows\System32\backgroundTaskHost.exe, ?:\Windows\System32\lsass.exe, ?:\Windows\System32\SearchProtocolHost.exe, ?:\ProgramData\Microsoft\Windows Defender\Platform\*.exe, ?:\ProgramData\Microsoft\Windows Defender Advanced Threat Protection\Platform\*.exe, ?:\Program Files\Windows Defender Advanced Threat Protection\*.exe, ?:\Program Files\Microsoft Monitoring Agent\Agent\*.exe, ?:\Windows\System32\SrTasks.exe, ?:\Windows\System32\rstrui.exe, ?:\Windows\System32\RecoveryDrive.exe, ?:\Windows\System32\MRT.exe, ?:\rsyncd\bin\rsync.exe, ?:\PCBP\wbps.exe, ?:\Windows\System32\Robocopy.exe, D:\PROGRAMS\Commvault\ContentStore\Base\CLBackup.exeexcludes:process.executable
process.pideq4excludes:process.pid field:"process.pid" value:"4"

Suspicious NetSupport Execution

#
Time window
1m
Sequence by
process.entity_id
Source
github.com/elastic/protections-artifacts

Identifies a suspicious execution of NetSupport remote access software from non-default paths, issuing a DNS query to a non-standard NetSupport domain.

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

Rule Body

[rule]
description = """
Identifies a suspicious execution of NetSupport remote access software from non-default paths, issuing a DNS query to a
non-standard NetSupport domain.
"""
id = "ad53a366-161a-4fa7-a75a-cc00658a767f"
license = "Elastic License v2"
name = "Suspicious NetSupport Execution"
os_list = ["windows"]
reference = ["https://www.netsupportsoftware.com/"]
version = "1.0.29"

query = '''
sequence by process.entity_id with maxspan=1m
 [process where process.pe.original_file_name : "client32.exe" and
  process.code_signature.subject_name : "NetSupport Ltd" and
  not process.executable : ("?:\\Program Files\\NetSupport*.exe", "?:\\Program Files (x86)\\NetSupport*.exe") and
  not process.parent.executable : ("?:\\Program Files\\NetSupport*.exe", "?:\\Program Files (x86)\\NetSupport*.exe")]
 [dns where not dns.question.name : "*.netsupportsoftware.com"]
'''

min_endpoint_version = "7.15.0"
[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0

[[optional_actions]]
action = "rollback"
field = "process.entity_id"
state = 0

[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1219"
name = "Remote Access Tools"
reference = "https://attack.mitre.org/techniques/T1219/"


[threat.tactic]
id = "TA0011"
name = "Command and Control"
reference = "https://attack.mitre.org/tactics/TA0011/"

[internal]
min_endpoint_version = "7.15.0"

Stages and Predicates

Ordered sequence: each step below must occur in order within 1m, correlated by process.entity_id.

Stage 1: process

[process where process.pe.original_file_name : "client32.exe" and
  process.code_signature.subject_name : "NetSupport Ltd" and
  not process.executable : ("?:\\Program Files\\NetSupport*.exe", "?:\\Program Files (x86)\\NetSupport*.exe") and
  not process.parent.executable : ("?:\\Program Files\\NetSupport*.exe", "?:\\Program Files (x86)\\NetSupport*.exe")]

Stage 2: dns

[dns where not dns.question.name : "*.netsupportsoftware.com"]

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

Suspicious PDF Reader Child Process

#
Status
production
Severity
low
Time window
9m
Author
Elastic
Source
github.com/elastic/detection-rules

Identifies suspicious child processes of PDF reader applications. These child processes are often launched via exploitation of PDF applications or social engineering.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

[metadata]
creation_date = "2020/03/30"
integration = ["endpoint", "windows", "system", "m365_defender", "sentinel_one_cloud_funnel", "crowdstrike"]
maturity = "production"
updated_date = "2026/05/04"

[rule]
author = ["Elastic"]
description = """
Identifies suspicious child processes of PDF reader applications. These child processes are often launched via
exploitation of PDF applications or social engineering.
"""
from = "now-9m"
index = [
    "endgame-*",
    "logs-crowdstrike.fdr*",
    "logs-endpoint.events.process-*",
    "logs-m365_defender.event-*",
    "logs-sentinel_one_cloud_funnel.*",
    "logs-system.security*",
    "logs-windows.forwarded*",
    "logs-windows.sysmon_operational-*",
    "winlogbeat-*",
]
language = "eql"
license = "Elastic License v2"
name = "Suspicious PDF Reader Child Process"
note = """## Triage and analysis

### Investigating Suspicious PDF Reader Child Process

PDF is a common file type used in corporate environments and most machines have software to handle these files. This creates a vector where attackers can exploit the engines and technology behind this class of software for initial access or privilege escalation.

This rule looks for commonly abused built-in utilities spawned by a PDF reader process, which is likely a malicious behavior.

#### Possible investigation steps

- Investigate the process execution chain (parent process tree) for unknown processes. Examine their executable files for prevalence, whether they are located in expected locations, and if they are signed with valid digital signatures.
- Investigate other alerts associated with the user/host during the past 48 hours.
- Retrieve PDF documents received and opened by the user that could cause this behavior. Common locations include, but are not limited to, the Downloads and Document folders and the folder configured at the email client.
- Determine if the collected files are malicious:
  - Use a private sandboxed malware analysis system to perform analysis.
    - Observe and collect information about the following activities:
      - Attempts to contact external domains and addresses.
      - File and registry access, modification, and creation activities.
      - Service creation and launch activities.
      - Scheduled task creation.
  - Use the PowerShell `Get-FileHash` cmdlet to get the files' SHA-256 hash values.
    - Search for the existence and reputation of the hashes in resources like VirusTotal, Hybrid-Analysis, CISCO Talos, Any.run, etc.


### False positive analysis

- This activity is unlikely to happen legitimately. Benign true positives (B-TPs) can be added as exceptions if necessary.

### Response and remediation

- Initiate the incident response process based on the outcome of the triage.
- Isolate the involved host to prevent further post-compromise behavior.
- Investigate credential exposure on systems compromised or used by the attacker to ensure all compromised accounts are identified. Reset passwords for these accounts and other potentially compromised credentials, such as email, business systems, and web services.
- If the triage identified malware, search the environment for additional compromised hosts.
  - Implement temporary network rules, procedures, and segmentation to contain the malware.
  - Stop suspicious processes.
  - Immediately block the identified indicators of compromise (IoCs).
  - Inspect the affected systems for additional malware backdoors like reverse shells, reverse proxies, or droppers that attackers could use to reinfect the system.
- Remove and block malicious artifacts identified during triage.
- Run a full antimalware scan. This may reveal additional artifacts left in the system, persistence mechanisms, and malware components.
- Determine the initial vector abused by the attacker and take action to prevent reinfection through the same vector.
  - If the malicious file was delivered via phishing:
    - Block the email sender from sending future emails.
    - Block the malicious web pages.
    - Remove emails from the sender from mailboxes.
    - Consider improvements to the security awareness program.
- Using the incident response data, update logging and audit policies to improve the mean time to detect (MTTD) and the mean time to respond (MTTR).
"""

setup = """## Setup

This rule is designed for data generated by [Elastic Defend](https://www.elastic.co/security/endpoint-security), which provides native endpoint detection and response, along with event enrichments designed to work with our detection rules.

Setup instructions: https://ela.st/install-elastic-defend

### Additional data sources

This rule also supports the following third-party data sources. For setup instructions, refer to the links below:

- [CrowdStrike](https://ela.st/crowdstrike-integration)
- [Microsoft Defender XDR](https://ela.st/m365-defender)
- [SentinelOne Cloud Funnel](https://ela.st/sentinel-one-cloud-funnel)
- [Sysmon Event ID 1 - Process Creation](https://ela.st/sysmon-event-1-setup)
- [Windows Process Creation Logs](https://ela.st/audit-process-creation)
"""

risk_score = 21
rule_id = "53a26770-9cbd-40c5-8b57-61d01a325e14"
severity = "low"
tags = [
    "Domain: Endpoint",
    "OS: Windows",
    "Use Case: Threat Detection",
    "Tactic: Execution",
    "Tactic: Initial Access",
    "Resources: Investigation Guide",
    "Data Source: Elastic Endgame",
    "Data Source: Elastic Defend",
    "Data Source: Windows Security Event Logs",
    "Data Source: Microsoft Defender XDR",
    "Data Source: Sysmon",
    "Data Source: SentinelOne",
    "Data Source: Crowdstrike",
]
timestamp_override = "event.ingested"
type = "eql"

query = '''
process where host.os.type == "windows" and event.type == "start" and
  process.parent.name : ("AcroRd32.exe",
                         "Acrobat.exe",
                         "FoxitPhantomPDF.exe",
                         "FoxitReader.exe") and
  process.name : ("arp.exe", "dsquery.exe", "dsget.exe", "gpresult.exe", "hostname.exe", "ipconfig.exe", "nbtstat.exe",
                  "net.exe", "net1.exe", "netsh.exe", "netstat.exe", "nltest.exe", "ping.exe", "qprocess.exe",
                  "quser.exe", "qwinsta.exe", "reg.exe", "sc.exe", "systeminfo.exe", "tasklist.exe", "tracert.exe",
                  "whoami.exe", "bginfo.exe", "cdb.exe", "cmstp.exe", "csi.exe", "dnx.exe", "fsi.exe", "ieexec.exe",
                  "iexpress.exe", "installutil.exe", "Microsoft.Workflow.Compiler.exe", "msbuild.exe", "mshta.exe",
                  "msxsl.exe", "odbcconf.exe", "rcsi.exe", "regsvr32.exe", "xwizard.exe", "atbroker.exe",
                  "forfiles.exe", "schtasks.exe", "regasm.exe", "regsvcs.exe", "cmd.exe", "cscript.exe",
                  "powershell.exe", "pwsh.exe", "wmic.exe", "wscript.exe", "bitsadmin.exe", "certutil.exe", "ftp.exe")
'''


[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1203"
name = "Exploitation for Client Execution"
reference = "https://attack.mitre.org/techniques/T1203/"

[[rule.threat.technique]]
id = "T1204"
name = "User Execution"
reference = "https://attack.mitre.org/techniques/T1204/"

[[rule.threat.technique.subtechnique]]
id = "T1204.002"
name = "Malicious File"
reference = "https://attack.mitre.org/techniques/T1204/002/"

[rule.threat.tactic]
id = "TA0002"
name = "Execution"
reference = "https://attack.mitre.org/tactics/TA0002/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1566"
name = "Phishing"
reference = "https://attack.mitre.org/techniques/T1566/"

[[rule.threat.technique.subtechnique]]
id = "T1566.001"
name = "Spearphishing Attachment"
reference = "https://attack.mitre.org/techniques/T1566/001/"

[rule.threat.tactic]
id = "TA0001"
name = "Initial Access"
reference = "https://attack.mitre.org/tactics/TA0001/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1218"
name = "System Binary Proxy Execution"
reference = "https://attack.mitre.org/techniques/T1218/"

[[rule.threat.technique.subtechnique]]
id = "T1218.003"
name = "CMSTP"
reference = "https://attack.mitre.org/techniques/T1218/003/"

[[rule.threat.technique.subtechnique]]
id = "T1218.004"
name = "InstallUtil"
reference = "https://attack.mitre.org/techniques/T1218/004/"

[[rule.threat.technique.subtechnique]]
id = "T1218.005"
name = "Mshta"
reference = "https://attack.mitre.org/techniques/T1218/005/"

[[rule.threat.technique.subtechnique]]
id = "T1218.008"
name = "Odbcconf"
reference = "https://attack.mitre.org/techniques/T1218/008/"

[[rule.threat.technique.subtechnique]]
id = "T1218.009"
name = "Regsvcs/Regasm"
reference = "https://attack.mitre.org/techniques/T1218/009/"

[[rule.threat.technique.subtechnique]]
id = "T1218.010"
name = "Regsvr32"
reference = "https://attack.mitre.org/techniques/T1218/010/"

[rule.threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1016"
name = "System Network Configuration Discovery"
reference = "https://attack.mitre.org/techniques/T1016/"

[[rule.threat.technique.subtechnique]]
id = "T1016.001"
name = "Internet Connection Discovery"
reference = "https://attack.mitre.org/techniques/T1016/001/"

[[rule.threat.technique]]
id = "T1033"
name = "System Owner/User Discovery"
reference = "https://attack.mitre.org/techniques/T1033/"

[[rule.threat.technique]]
id = "T1057"
name = "Process Discovery"
reference = "https://attack.mitre.org/techniques/T1057/"

[[rule.threat.technique]]
id = "T1082"
name = "System Information Discovery"
reference = "https://attack.mitre.org/techniques/T1082/"

[rule.threat.tactic]
id = "TA0007"
name = "Discovery"
reference = "https://attack.mitre.org/tactics/TA0007/"

Stages and Predicates

Stage 1: process

process where host.os.type == "windows" and event.type == "start" and
  process.parent.name : ("AcroRd32.exe",
                         "Acrobat.exe",
                         "FoxitPhantomPDF.exe",
                         "FoxitReader.exe") and
  process.name : ("arp.exe", "dsquery.exe", "dsget.exe", "gpresult.exe", "hostname.exe", "ipconfig.exe", "nbtstat.exe",
                  "net.exe", "net1.exe", "netsh.exe", "netstat.exe", "nltest.exe", "ping.exe", "qprocess.exe",
                  "quser.exe", "qwinsta.exe", "reg.exe", "sc.exe", "systeminfo.exe", "tasklist.exe", "tracert.exe",
                  "whoami.exe", "bginfo.exe", "cdb.exe", "cmstp.exe", "csi.exe", "dnx.exe", "fsi.exe", "ieexec.exe",
                  "iexpress.exe", "installutil.exe", "Microsoft.Workflow.Compiler.exe", "msbuild.exe", "mshta.exe",
                  "msxsl.exe", "odbcconf.exe", "rcsi.exe", "regsvr32.exe", "xwizard.exe", "atbroker.exe",
                  "forfiles.exe", "schtasks.exe", "regasm.exe", "regsvcs.exe", "cmd.exe", "cscript.exe",
                  "powershell.exe", "pwsh.exe", "wmic.exe", "wscript.exe", "bitsadmin.exe", "certutil.exe", "ftp.exe")

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
event.typeeq
  • start corpus 1036 (elastic 1036)
field:"event.type" kind:eq value:"start"
process.namewildcard
  • Microsoft.Workflow.Compiler.exe corpus 12 (elastic 11, splunk 1)
  • arp.exe corpus 10 (elastic 8, splunk 1, kusto 1)
  • atbroker.exe corpus 6 (elastic 6)
  • bginfo.exe corpus 6 (elastic 6)
  • bitsadmin.exe corpus 25 (elastic 22, splunk 2, kusto 1)
  • cdb.exe corpus 8 (elastic 8)
  • certutil.exe corpus 45 (elastic 39, splunk 6)
  • cmd.exe corpus 122 (elastic 93, splunk 29)
  • cmstp.exe corpus 25 (elastic 25)
  • cscript.exe corpus 68 (elastic 66, splunk 2)
  • csi.exe corpus 6 (elastic 6)
  • dnx.exe corpus 6 (elastic 6)
  • dsget.exe corpus 8 (elastic 8)
  • dsquery.exe corpus 12 (elastic 8, splunk 4)
  • forfiles.exe corpus 7 (elastic 6, splunk 1)
  • fsi.exe corpus 6 (elastic 6)
  • ftp.exe corpus 5 (elastic 5)
  • gpresult.exe corpus 7 (elastic 7)
  • hostname.exe corpus 7 (elastic 7)
  • ieexec.exe corpus 10 (elastic 10)
  • iexpress.exe corpus 9 (elastic 9)
  • installutil.exe corpus 36 (elastic 32, splunk 4)
  • ipconfig.exe corpus 11 (elastic 10, splunk 1)
  • msbuild.exe corpus 39 (elastic 36, splunk 3)
  • mshta.exe corpus 84 (elastic 80, splunk 4)
  • msxsl.exe corpus 22 (elastic 22)
  • nbtstat.exe corpus 9 (elastic 9)
  • net.exe corpus 30 (elastic 27, splunk 2, kusto 1)
  • net1.exe corpus 40 (elastic 21, splunk 19)
  • netsh.exe corpus 21 (elastic 14, splunk 7)
  • netstat.exe corpus 10 (elastic 8, splunk 1, kusto 1)
  • nltest.exe corpus 12 (elastic 10, splunk 2)
  • odbcconf.exe corpus 14 (elastic 11, splunk 3)
  • ping.exe corpus 12 (elastic 8, splunk 2, kusto 2)
  • powershell.exe corpus 187 (elastic 140, splunk 44, kusto 3)
  • pwsh.exe corpus 78 (elastic 49, splunk 29)
  • qprocess.exe corpus 8 (elastic 8)
  • quser.exe corpus 10 (elastic 9, splunk 1)
  • qwinsta.exe corpus 9 (elastic 8, splunk 1)
  • rcsi.exe corpus 6 (elastic 6)
  • reg.exe corpus 28 (elastic 18, splunk 9, kusto 1)
  • regasm.exe corpus 25 (elastic 24, splunk 1)
  • regsvcs.exe corpus 22 (elastic 21, splunk 1)
  • regsvr32.exe corpus 74 (elastic 69, splunk 5)
  • sc.exe corpus 32 (elastic 17, splunk 15)
  • schtasks.exe corpus 30 (elastic 19, splunk 11)
  • systeminfo.exe corpus 10 (elastic 10)
  • tasklist.exe corpus 11 (elastic 11)
  • tracert.exe corpus 6 (elastic 6)
  • whoami.exe corpus 14 (elastic 11, splunk 2, kusto 1)
  • wmic.exe corpus 66 (elastic 39, splunk 27)
  • wscript.exe corpus 84 (elastic 82, splunk 1, kusto 1)
  • xwizard.exe corpus 16 (elastic 16)
field:"process_basename" kind:wildcard
process.parent.namewildcard
  • AcroRd32.exe corpus 3 (elastic 3)
  • Acrobat.exe
  • FoxitPhantomPDF.exe corpus 3 (elastic 3)
  • FoxitReader.exe corpus 3 (elastic 3)
field:"parent_process_basename" kind:wildcard

System Utility Execution from Unbacked Memory

#
Source
github.com/elastic/protections-artifacts

Identifies execution of common Windows system utilities (reg, schtasks, sc, PowerShell, or cmd) where the parent process is unsigned or untrusted, runs from a user-writable location, and the creating thread call stack ends in unbacked memory. This may indicate process injection or shellcode invoking built-in tools for persistence or defense evasion.

MITRE ATT&CK Coverage

Rule Body

[rule]
description = """
Identifies execution of common Windows system utilities (reg, schtasks, sc, PowerShell, or cmd) where the parent process
is unsigned or untrusted, runs from a user-writable location, and the creating thread call stack ends in unbacked
memory. This may indicate process injection or shellcode invoking built-in tools for persistence or defense evasion.
"""
id = "f4a8c2e1-6b3d-4f9a-8e2c-1d5a7b9e0f43"
license = "Elastic License v2"
name = "System Utility Execution from Unbacked Memory"
os_list = ["windows"]
reference = [
    "https://www.elastic.co/security-labs/upping-the-ante-detecting-in-memory-threats-with-kernel-call-stacks",
]
version = "1.0.1"

query = '''
process where event.action == "start" and process.name : ("reg.exe", "schtasks.exe", "sc.exe", "powershell.exe", "cmd.exe") and
 (process.parent.code_signature.exists == false or process.parent.code_signature.trusted == false) and
 process.parent.thread.Ext.call_stack_summary in 
                                ("ntdll.dll|Unbacked", 
                                 "ntdll.dll|kernelbase.dll|Unbacked", 
                                 "ntdll.dll|kernelbase.dll|kernel32.dll|Unbacked", 
                                 "ntdll.dll|wow64.dll|wow64cpu.dll|wow64.dll|ntdll.dll|kernelbase.dll|Unbacked",  
                                 "ntdll.dll|wow64.dll|wow64cpu.dll|wow64.dll|ntdll.dll|kernelbase.dll|kernel32.dll|Unbacked", 
                                 "ntdll.dll|wow64.dll|wow64cpu.dll|wow64.dll|ntdll.dll|kernelbase.dll|Unbacked|kernel32.dll|ntdll.dll") and
 process.parent.executable : ("?:\\Users\\*", "?:\\ProgramData\\*") and 
 not (process.parent.executable : ("?:\\ProgramData\\CentraStage*.exe", "?:\\ProgramData\\NinjaRMMAgent\\*.exe") and 
      process.parent.thread.Ext.call_stack_summary == "ntdll.dll|kernelbase.dll|kernel32.dll|Unbacked")
'''

min_endpoint_version = "8.10.0"
optional_actions = []
[[actions]]
action = "kill_process"
field = "process.parent.entity_id"
state = 0
tree = true

[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1059"
name = "Command and Scripting Interpreter"
reference = "https://attack.mitre.org/techniques/T1059/"


[threat.tactic]
id = "TA0002"
name = "Execution"
reference = "https://attack.mitre.org/tactics/TA0002/"
[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1055"
name = "Process Injection"
reference = "https://attack.mitre.org/techniques/T1055/"


[threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"

[internal]
min_endpoint_version = "8.10.0"

Stages and Predicates

Stage 1: process

process where event.action == "start" and process.name : ("reg.exe", "schtasks.exe", "sc.exe", "powershell.exe", "cmd.exe") and
 (process.parent.code_signature.exists == false or process.parent.code_signature.trusted == false) and
 process.parent.thread.Ext.call_stack_summary in 
                                ("ntdll.dll|Unbacked", 
                                 "ntdll.dll|kernelbase.dll|Unbacked", 
                                 "ntdll.dll|kernelbase.dll|kernel32.dll|Unbacked", 
                                 "ntdll.dll|wow64.dll|wow64cpu.dll|wow64.dll|ntdll.dll|kernelbase.dll|Unbacked",  
                                 "ntdll.dll|wow64.dll|wow64cpu.dll|wow64.dll|ntdll.dll|kernelbase.dll|kernel32.dll|Unbacked", 
                                 "ntdll.dll|wow64.dll|wow64cpu.dll|wow64.dll|ntdll.dll|kernelbase.dll|Unbacked|kernel32.dll|ntdll.dll") and
 process.parent.executable : ("?:\\Users\\*", "?:\\ProgramData\\*") and 
 not (process.parent.executable : ("?:\\ProgramData\\CentraStage*.exe", "?:\\ProgramData\\NinjaRMMAgent\\*.exe") and 
      process.parent.thread.Ext.call_stack_summary == "ntdll.dll|kernelbase.dll|kernel32.dll|Unbacked")

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
event.actioneq
  • start corpus 388 (elastic 388)
field:"EventType" kind:eq value:"start"
process.namewildcard
  • cmd.exe corpus 122 (elastic 93, splunk 29)
  • powershell.exe corpus 187 (elastic 140, splunk 44, kusto 3)
  • reg.exe corpus 28 (elastic 18, splunk 9, kusto 1)
  • sc.exe corpus 32 (elastic 17, splunk 15)
  • schtasks.exe corpus 30 (elastic 19, splunk 11)
field:"process_basename" kind:wildcard
process.parent.code_signature.existseq
  • false transforms: boolean corpus 25 (elastic 25)
field:"process.parent.code_signature.exists" kind:eq value:"false"
process.parent.code_signature.trustedeq
  • false transforms: boolean corpus 26 (elastic 26)
field:"process.parent.code_signature.trusted" kind:eq value:"false"
process.parent.executablewildcard
  • ?:\ProgramData\* corpus 2 (elastic 2)
  • ?:\Users\* corpus 2 (elastic 2)
field:"ParentImage" kind:wildcard
process.parent.thread.Ext.call_stack_summaryin
  • ntdll.dll|Unbacked
  • ntdll.dll|kernelbase.dll|Unbacked
  • ntdll.dll|kernelbase.dll|kernel32.dll|Unbacked
  • ntdll.dll|wow64.dll|wow64cpu.dll|wow64.dll|ntdll.dll|kernelbase.dll|Unbacked
  • ntdll.dll|wow64.dll|wow64cpu.dll|wow64.dll|ntdll.dll|kernelbase.dll|Unbacked|kernel32.dll|ntdll.dll
  • ntdll.dll|wow64.dll|wow64cpu.dll|wow64.dll|ntdll.dll|kernelbase.dll|kernel32.dll|Unbacked
field:"process.parent.thread.Ext.call_stack_summary" kind:in

Exclusions

The rule actively suppresses these predicates.

Unsigned File Execution via Network Logon

#
Source
github.com/elastic/protections-artifacts

Identifies the execution of a recently created file that is unsigned or untrusted and from a remote network logon. This may indicate lateral movement via remote services.

MITRE ATT&CK Coverage

Rule Body

[rule]
description = """
Identifies the execution of a recently created file that is unsigned or untrusted and from a remote network logon. This
may indicate lateral movement via remote services.
"""
id = "642b43ad-67bf-476b-9581-a434535395f2"
license = "Elastic License v2"
name = "Unsigned File Execution via Network Logon"
os_list = ["windows"]
version = "1.0.27"

query = '''
process where event.action == "start" and
 process.Ext.relative_file_creation_time <= 600 and
 process.Ext.session_info.logon_type == "Network" and
 process.Ext.session_info.relative_logon_time <= 5 and
 (process.code_signature.exists == false or process.code_signature.trusted == false) and
 not process.pe.imphash in ("106bf7f7567dfeec85f3670da6d1c029", "6e7f9a29f2c85394521a08b9f31f6275") and
 not process.hash.sha256 in
                ("f1d3489e0af0c498103df0433cee9f36f5d28d34dfe94aac510f7d32d0da5495",
                 "d57875f09a33cda2dc1030a4f82405f1de56b5536b6b87329323dfb2042b5e1c",
                 "31f692eaa4a205f52235f43ee69b23c6789b45ed11e5a831e9b9b460c3985867",
                 "8d9b5190aace52a1db1ac73a65ee9999c329157c8e88f61a772433323d6b7a4a", 
                 "fc18fbb2b4e54c25ea3fdcdd9682735a636dd61127da451a2c19fd7e8d154285", 
                 "1cf0f867dec12c8a6c5caceeec86222e5c9af19a162c2ace0a33b2f5468e0c2a", 
                 "9f2181f0bb4e411702856555cb2005e0775338b444fd4ec46a48bf189ad30b61", 
                 "2eab645570d72158a6fa793dd461f3db21ca256321d61238808cb2b31c29aae0",
                 "fc41e0c5941b69a28a751c8429fd377db2f4a3553c2141e4e5edc510ef71a3f0",
                 "6a377f345bc9b5551a1d3126c4ebc4c259f59a63a511bdbe36f3a9a6902c1054",
                 "16881253329482b8a0032888f78fd2cb9e2215da2fe2f69630d5fd0b16dabc91",
                 "294751675ed1c48230d78fcf23c0bbcef66f376f125e1770467870f65c5b22e6",
                 "076079608e56236409e5638ad617c8284d9fc1194c858c5dea6ff65e964e6979",
                 "d092825db8bef574796fc863d6023d36abe37de6a2c4518162eaf1f47889960b",
                 "b4abd97f03f0c8c4de84f91315bbc5610fd51b926941eb39625ed27667d558e9",
                 "95aa3007399d1b9116ea8d1e1a6e76945f0d9c4ba73ef5021c4995728cef5722",
                 "9c86d5f9a7a50a37d46a93b851dc1ca4a473134aafd9a0db654f8e3c100e54b6",
                 "39adf69d9a231bd572f1c70a510c40b54939e8edd31511ce7100a579592634f4",
                 "b7e0698740f3ddca92a093e19d1c41db4fe46cb6cd748ca7ca0d4af9949f3273",
                 "b6c85a7c7134cc2748069ea6339af553ce8c4ef28b5807b64209009ae0e85c20",
                 "d8b3c7eaa1e0b2788ee65ce9be002b875f8b128c7df2ea7b4f9f8b2eb6ff4c65",
                 "7b5b071975a394a2d4ef2192cfd2cebe3b732b05134663274204885a198caa7f",
                 "dfe85716d2bca3047b8eff311583de17ec2bef35cbaedff72a7802c185c32ba6",
                 "8560aaad29f8310b4a743b445b9a930a40b52d0be77ce0c845a657db5c6a5d84") and
 not (process.pe.original_file_name == "Source.DBVersionControl.dll" and
      process.parent.executable : "C:\\Program Files\\PowerShell\\7\\pwsh.exe") and
 not (process.code_signature.subject_name == "LLC Breakthrough Technologies" and process.code_signature.status == "errorExpired") and
 not (process.executable : ("C:\\ProgramData\\chocolatey\\bin\\wacs.exe", "C:\\tools\\win-acme\\wacs.exe") and
      process.args : "--certificatestore" and process.parent.name : ("wacs.exe", "powershell.exe")) and
 not process.executable : "C:\\Program Files\\Mozilla Firefox\\uninstall\\uninstaller.exe"
'''

min_endpoint_version = "8.6.0"
optional_actions = []
[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0

[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1021"
name = "Remote Services"
reference = "https://attack.mitre.org/techniques/T1021/"
[[threat.technique.subtechnique]]
id = "T1021.002"
name = "SMB/Windows Admin Shares"
reference = "https://attack.mitre.org/techniques/T1021/002/"



[threat.tactic]
id = "TA0008"
name = "Lateral Movement"
reference = "https://attack.mitre.org/tactics/TA0008/"

[internal]
min_endpoint_version = "8.6.0"

Stages and Predicates

Stage 1: process

process where event.action == "start" and
 process.Ext.relative_file_creation_time <= 600 and
 process.Ext.session_info.logon_type == "Network" and
 process.Ext.session_info.relative_logon_time <= 5 and
 (process.code_signature.exists == false or process.code_signature.trusted == false) and
 not process.pe.imphash in ("106bf7f7567dfeec85f3670da6d1c029", "6e7f9a29f2c85394521a08b9f31f6275") and
 not process.hash.sha256 in
                ("f1d3489e0af0c498103df0433cee9f36f5d28d34dfe94aac510f7d32d0da5495",
                 "d57875f09a33cda2dc1030a4f82405f1de56b5536b6b87329323dfb2042b5e1c",
                 "31f692eaa4a205f52235f43ee69b23c6789b45ed11e5a831e9b9b460c3985867",
                 "8d9b5190aace52a1db1ac73a65ee9999c329157c8e88f61a772433323d6b7a4a", 
                 "fc18fbb2b4e54c25ea3fdcdd9682735a636dd61127da451a2c19fd7e8d154285", 
                 "1cf0f867dec12c8a6c5caceeec86222e5c9af19a162c2ace0a33b2f5468e0c2a", 
                 "9f2181f0bb4e411702856555cb2005e0775338b444fd4ec46a48bf189ad30b61", 
                 "2eab645570d72158a6fa793dd461f3db21ca256321d61238808cb2b31c29aae0",
                 "fc41e0c5941b69a28a751c8429fd377db2f4a3553c2141e4e5edc510ef71a3f0",
                 "6a377f345bc9b5551a1d3126c4ebc4c259f59a63a511bdbe36f3a9a6902c1054",
                 "16881253329482b8a0032888f78fd2cb9e2215da2fe2f69630d5fd0b16dabc91",
                 "294751675ed1c48230d78fcf23c0bbcef66f376f125e1770467870f65c5b22e6",
                 "076079608e56236409e5638ad617c8284d9fc1194c858c5dea6ff65e964e6979",
                 "d092825db8bef574796fc863d6023d36abe37de6a2c4518162eaf1f47889960b",
                 "b4abd97f03f0c8c4de84f91315bbc5610fd51b926941eb39625ed27667d558e9",
                 "95aa3007399d1b9116ea8d1e1a6e76945f0d9c4ba73ef5021c4995728cef5722",
                 "9c86d5f9a7a50a37d46a93b851dc1ca4a473134aafd9a0db654f8e3c100e54b6",
                 "39adf69d9a231bd572f1c70a510c40b54939e8edd31511ce7100a579592634f4",
                 "b7e0698740f3ddca92a093e19d1c41db4fe46cb6cd748ca7ca0d4af9949f3273",
                 "b6c85a7c7134cc2748069ea6339af553ce8c4ef28b5807b64209009ae0e85c20",
                 "d8b3c7eaa1e0b2788ee65ce9be002b875f8b128c7df2ea7b4f9f8b2eb6ff4c65",
                 "7b5b071975a394a2d4ef2192cfd2cebe3b732b05134663274204885a198caa7f",
                 "dfe85716d2bca3047b8eff311583de17ec2bef35cbaedff72a7802c185c32ba6",
                 "8560aaad29f8310b4a743b445b9a930a40b52d0be77ce0c845a657db5c6a5d84") and
 not (process.pe.original_file_name == "Source.DBVersionControl.dll" and
      process.parent.executable : "C:\\Program Files\\PowerShell\\7\\pwsh.exe") and
 not (process.code_signature.subject_name == "LLC Breakthrough Technologies" and process.code_signature.status == "errorExpired") and
 not (process.executable : ("C:\\ProgramData\\chocolatey\\bin\\wacs.exe", "C:\\tools\\win-acme\\wacs.exe") and
      process.args : "--certificatestore" and process.parent.name : ("wacs.exe", "powershell.exe")) and
 not process.executable : "C:\\Program Files\\Mozilla Firefox\\uninstall\\uninstaller.exe"

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process.argseq--certificatestoreexcludes:process.args field:"process.args" value:"--certificatestore"
process.executableeqC:\ProgramData\chocolatey\bin\wacs.exe, C:\tools\win-acme\wacs.exeexcludes:process.executable field:"process.executable" value:"C:\ProgramData\chocolatey\bin\wacs.exe" field:"process.executable" value:"C:\tools\win-acme\wacs.exe"
process.parent.nameeqwacs.exe, powershell.exeexcludes:process.parent.name field:"process.parent.name" value:"wacs.exe" field:"process.parent.name" value:"powershell.exe"
process.code_signature.statuseqerrorExpiredexcludes:process.code_signature.status field:"process.code_signature.status" value:"errorExpired"
process.code_signature.subject_nameeqLLC Breakthrough Technologiesexcludes:process.code_signature.subject_name field:"process.code_signature.subject_name" value:"LLC Breakthrough Technologies"
process.parent.executableeqC:\Program Files\PowerShell\7\pwsh.exeexcludes:process.parent.executable field:"process.parent.executable" value:"C:\Program Files\PowerShell\7\pwsh.exe"
process.pe.original_file_nameeqSource.DBVersionControl.dllexcludes:process.pe.original_file_name field:"process.pe.original_file_name" value:"Source.DBVersionControl.dll"
process.executableeqC:\Program Files\Mozilla Firefox\uninstall\uninstaller.exeexcludes:process.executable field:"process.executable" value:"C:\Program Files\Mozilla Firefox\uninstall\uninstaller.exe"
process.hash.sha256in076079608e56236409e5638ad617c8284d9fc1194c858c5dea6ff65e964e6979, 16881253329482b8a0032888f78fd2cb9e2215da2fe2f69630d5fd0b16dabc91, 1cf0f867dec12c8a6c5caceeec86222e5c9af19a162c2ace0a33b2f5468e0c2a, 294751675ed1c48230d78fcf23c0bbcef66f376f125e1770467870f65c5b22e6, 2eab645570d72158a6fa793dd461f3db21ca256321d61238808cb2b31c29aae0, 31f692eaa4a205f52235f43ee69b23c6789b45ed11e5a831e9b9b460c3985867, 39adf69d9a231bd572f1c70a510c40b54939e8edd31511ce7100a579592634f4, 6a377f345bc9b5551a1d3126c4ebc4c259f59a63a511bdbe36f3a9a6902c1054, 7b5b071975a394a2d4ef2192cfd2cebe3b732b05134663274204885a198caa7f, 8560aaad29f8310b4a743b445b9a930a40b52d0be77ce0c845a657db5c6a5d84, 8d9b5190aace52a1db1ac73a65ee9999c329157c8e88f61a772433323d6b7a4a, 95aa3007399d1b9116ea8d1e1a6e76945f0d9c4ba73ef5021c4995728cef5722, 9c86d5f9a7a50a37d46a93b851dc1ca4a473134aafd9a0db654f8e3c100e54b6, 9f2181f0bb4e411702856555cb2005e0775338b444fd4ec46a48bf189ad30b61, b4abd97f03f0c8c4de84f91315bbc5610fd51b926941eb39625ed27667d558e9, b6c85a7c7134cc2748069ea6339af553ce8c4ef28b5807b64209009ae0e85c20, b7e0698740f3ddca92a093e19d1c41db4fe46cb6cd748ca7ca0d4af9949f3273, d092825db8bef574796fc863d6023d36abe37de6a2c4518162eaf1f47889960b, d57875f09a33cda2dc1030a4f82405f1de56b5536b6b87329323dfb2042b5e1c, d8b3c7eaa1e0b2788ee65ce9be002b875f8b128c7df2ea7b4f9f8b2eb6ff4c65, dfe85716d2bca3047b8eff311583de17ec2bef35cbaedff72a7802c185c32ba6, f1d3489e0af0c498103df0433cee9f36f5d28d34dfe94aac510f7d32d0da5495, fc18fbb2b4e54c25ea3fdcdd9682735a636dd61127da451a2c19fd7e8d154285, fc41e0c5941b69a28a751c8429fd377db2f4a3553c2141e4e5edc510ef71a3f0excludes:process.hash.sha256
process.pe.imphashin106bf7f7567dfeec85f3670da6d1c029, 6e7f9a29f2c85394521a08b9f31f6275excludes:process.pe.imphash field:"process.pe.imphash" value:"106bf7f7567dfeec85f3670da6d1c029" field:"process.pe.imphash" value:"6e7f9a29f2c85394521a08b9f31f6275"

Unusual File Creation by Web Server

#
Status
production
Kind
building block (feeds higher-level correlation rules; not a standalone alert)
Severity
low
Time window
61m
Group by
file.path, process.executable
Author
Elastic
Source
github.com/elastic/detection-rules

This rule detects unusual file creations from a web server parent process. Adversaries may attempt to create files from a web server parent process to establish persistence, execute malicious scripts, or exfiltrate data. ES|QL rules have limited fields available in its alert documents. Make sure to review the original documents to aid in the investigation of this alert.

MITRE ATT&CK Coverage

Rule Body

[metadata]
bypass_bbr_timing = true
creation_date = "2025/03/06"
integration = ["endpoint"]
maturity = "production"
updated_date = "2026/03/24"

[rule]
author = ["Elastic"]
building_block_type = "default"
description = """
This rule detects unusual file creations from a web server parent process. Adversaries may attempt to create files from
a web server parent process to establish persistence, execute malicious scripts, or exfiltrate data. ES|QL rules have
limited fields available in its alert documents. Make sure to review the original documents to aid in the investigation
of this alert.
"""
from = "now-61m"
interval = "1h"
language = "esql"
license = "Elastic License v2"
name = "Unusual File Creation by Web Server"
risk_score = 21
rule_id = "894b7cc9-040b-427c-aca5-36b40d3667bf"
setup = """## Setup

This rule requires data coming in from Elastic Defend.

### Elastic Defend Integration Setup
Elastic Defend is integrated into the Elastic Agent using Fleet. Upon configuration, the integration allows the Elastic Agent to monitor events on your host and send data to the Elastic Security app.

#### Prerequisite Requirements:
- Fleet is required for Elastic Defend.
- To configure Fleet Server refer to the [documentation](https://www.elastic.co/guide/en/fleet/current/fleet-server.html).

#### The following steps should be executed in order to add the Elastic Defend integration on a Linux System:
- Go to the Kibana home page and click "Add integrations".
- In the query bar, search for "Elastic Defend" and select the integration to see more details about it.
- Click "Add Elastic Defend".
- Configure the integration name and optionally add a description.
- Select the type of environment you want to protect, either "Traditional Endpoints" or "Cloud Workloads".
- Select a configuration preset. Each preset comes with different default settings for Elastic Agent, you can further customize these later by configuring the Elastic Defend integration policy. [Helper guide](https://www.elastic.co/guide/en/security/current/configure-endpoint-integration-policy.html).
- We suggest selecting "Complete EDR (Endpoint Detection and Response)" as a configuration setting, that provides "All events; all preventions"
- Enter a name for the agent policy in "New agent policy name". If other agent policies already exist, you can click the "Existing hosts" tab and select an existing policy instead.
For more details on Elastic Agent configuration settings, refer to the [helper guide](https://www.elastic.co/guide/en/fleet/8.10/agent-policy.html).
- Click "Save and Continue".
- To complete the integration, select "Add Elastic Agent to your hosts" and continue to the next section to install the Elastic Agent on your hosts.
For more details on Elastic Defend refer to the [helper guide](https://www.elastic.co/guide/en/security/current/install-endpoint.html).
"""
severity = "low"
tags = [
    "Domain: Endpoint",
    "OS: Linux",
    "Use Case: Threat Detection",
    "Tactic: Persistence",
    "Tactic: Execution",
    "Tactic: Command and Control",
    "Data Source: Elastic Defend",
    "Rule Type: BBR",
]
timestamp_override = "event.ingested"
type = "esql"

query = '''
from logs-endpoint.events.file-* metadata _id, _index, _version

// Ensure event.action values in a list are expanded
| mv_expand event.action 

| where
    host.os.type == "linux" and
    event.action == "creation" and (
        process.name in (
            "apache", "nginx", "apache2", "httpd", "lighttpd", "caddy", "mongrel_rails", "gunicorn",
            "uwsgi", "openresty", "cherokee", "h2o", "resin", "puma", "unicorn", "traefik", "tornado", "hypercorn",
            "daphne", "twistd", "yaws", "webfsd", "httpd.worker", "flask", "rails", "mongrel", "php-cgi",
            "php-fcgi", "php-cgi.cagefs", "catalina.sh", "hiawatha", "lswsctrl"
        ) or
        process.name like "php-fpm*" or
        user.name in ("apache", "www-data", "httpd", "nginx", "lighttpd", "tomcat", "tomcat8", "tomcat9") or
        user.id in ("33", "498", "48")
      )

| keep
    @timestamp,
    _id,
    _index,
    _version,
    host.os.type,
    event.action,
    user.name,
    user.id,
    process.name,
    process.executable,
    file.path,
    agent.id,
    host.name,
    event.dataset,
    data_stream.namespace

| stats
    Esql.event_count = count(),
    Esql.agent_id_count_distinct = count_distinct(agent.id),
    Esql.host_name_values = values(host.name),
    Esql.agent_id_values = values(agent.id),
    Esql.event_dataset_values = values(event.dataset),
    Esql.data_stream_namespace_values = values(data_stream.namespace)

  by process.executable, file.path

| where
    Esql.agent_id_count_distinct == 1 and
    Esql.event_count < 5
'''

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1505"
name = "Server Software Component"
reference = "https://attack.mitre.org/techniques/T1505/"

[[rule.threat.technique.subtechnique]]
id = "T1505.003"
name = "Web Shell"
reference = "https://attack.mitre.org/techniques/T1505/003/"

[rule.threat.tactic]
id = "TA0003"
name = "Persistence"
reference = "https://attack.mitre.org/tactics/TA0003/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1059"
name = "Command and Scripting Interpreter"
reference = "https://attack.mitre.org/techniques/T1059/"

[[rule.threat.technique.subtechnique]]
id = "T1059.004"
name = "Unix Shell"
reference = "https://attack.mitre.org/techniques/T1059/004/"

[rule.threat.tactic]
id = "TA0002"
name = "Execution"
reference = "https://attack.mitre.org/tactics/TA0002/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1071"
name = "Application Layer Protocol"
reference = "https://attack.mitre.org/techniques/T1071/"

[rule.threat.tactic]
id = "TA0011"
name = "Command and Control"
reference = "https://attack.mitre.org/tactics/TA0011/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1190"
name = "Exploit Public-Facing Application"
reference = "https://attack.mitre.org/techniques/T1190/"

[rule.threat.tactic]
id = "TA0001"
name = "Initial Access"
reference = "https://attack.mitre.org/tactics/TA0001/"

Stages and Predicates

Stage 1: from

from logs-endpoint.events.file-* metadata _id, _index, _version

Stage 2: mv_expand

| mv_expand event.action

Stage 3: where

| where
    host.os.type == "linux" and
    event.action == "creation" and (
        process.name in (
            "apache", "nginx", "apache2", "httpd", "lighttpd", "caddy", "mongrel_rails", "gunicorn",
            "uwsgi", "openresty", "cherokee", "h2o", "resin", "puma", "unicorn", "traefik", "tornado", "hypercorn",
            "daphne", "twistd", "yaws", "webfsd", "httpd.worker", "flask", "rails", "mongrel", "php-cgi",
            "php-fcgi", "php-cgi.cagefs", "catalina.sh", "hiawatha", "lswsctrl"
        ) or
        process.name like "php-fpm*" or
        user.name in ("apache", "www-data", "httpd", "nginx", "lighttpd", "tomcat", "tomcat8", "tomcat9") or
        user.id in ("33", "498", "48")
      )

Stage 4: keep

| keep
    @timestamp,
    _id,
    _index,
    _version,
    host.os.type,
    event.action,
    user.name,
    user.id,
    process.name,
    process.executable,
    file.path,
    agent.id,
    host.name,
    event.dataset,
    data_stream.namespace

Stage 5: stats

| stats
    Esql.event_count = count(),
    Esql.agent_id_count_distinct = count_distinct(agent.id),
    Esql.host_name_values = values(host.name),
    Esql.agent_id_values = values(agent.id),
    Esql.event_dataset_values = values(event.dataset),
    Esql.data_stream_namespace_values = values(data_stream.namespace)

  by process.executable, file.path

Stage 6: where

| where
    Esql.agent_id_count_distinct == 1 and
    Esql.event_count < 5

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Esql.agent_id_count_distincteq
  • 1
field:"Esql.agent_id_count_distinct" kind:eq value:"1"
Esql.event_countlt
  • 5
field:"Esql.event_count" kind:lt value:"5"
event.actioneq
  • creation
field:"EventType" kind:eq value:"creation"
process.namein
  • apache
  • apache2
  • caddy
  • catalina.sh
  • cherokee
  • daphne
  • flask
  • gunicorn
  • h2o
  • hiawatha
  • httpd
  • httpd.worker
  • hypercorn
  • lighttpd
  • lswsctrl
  • mongrel
  • mongrel_rails
  • nginx
  • openresty
  • php-cgi
  • php-cgi.cagefs
  • php-fcgi
  • puma
  • rails
  • resin
  • tornado
  • traefik
  • twistd
  • unicorn
  • uwsgi
  • webfsd
  • yaws
field:"process_basename" kind:in
process.namewildcard
  • php-fpm*
field:"process_basename" kind:wildcard value:"php-fpm*"
user.idin
  • 33
  • 48
  • 498
field:"user.id" kind:in
user.namein
  • apache
  • httpd
  • lighttpd
  • nginx
  • tomcat
  • tomcat8
  • tomcat9
  • www-data
field:"user" kind:in

Output Fields

These fields are emitted when the rule matches.

FieldSource
Esql.event_countSTATS Esql.event_count = count()
Esql.agent_id_count_distinctSTATS Esql.agent_id_count_distinct = count_distinct(agent.id)
Esql.host_name_valuesSTATS Esql.host_name_values = values(host.name)
Esql.agent_id_valuesSTATS Esql.agent_id_values = values(agent.id)
Esql.event_dataset_valuesSTATS Esql.event_dataset_values = values(event.dataset)
Esql.data_stream_namespace_valuesSTATS Esql.data_stream_namespace_values = values(data_stream.namespace)
process.executableSTATS BY
file.pathSTATS BY

Unusual Remote File Creation

#
Status
production
Severity
low
Time window
9m
Group by
host.id, process.executable
Author
Elastic
Source
github.com/elastic/detection-rules

This rule leverages the new_terms rule type to detect file creation via a commonly used file transfer service while excluding typical remote file creation activity. This behavior is often linked to lateral movement, potentially indicating an attacker attempting to move within a network.

MITRE ATT&CK Coverage

Rule Body

[metadata]
creation_date = "2025/02/20"
integration = ["endpoint"]
maturity = "production"
updated_date = "2026/03/24"

[rule]
author = ["Elastic"]
description = """
This rule leverages the new_terms rule type to detect file creation via a commonly used file
transfer service while excluding typical remote file creation activity. This behavior is
often linked to lateral movement, potentially indicating an attacker attempting to move
within a network.
"""
from = "now-9m"
index = ["logs-endpoint.events.file*", "auditbeat-*"]
language = "kuery"
license = "Elastic License v2"
name = "Unusual Remote File Creation"
note = """ ## Triage and analysis

> **Disclaimer**:
> This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs.

### Investigating Unusual Remote File Creation

Remote file creation tools like SCP, FTP, and SFTP are essential for transferring files across networks, often used in legitimate administrative tasks. However, adversaries can exploit these services to move laterally within a network, creating files in unauthorized locations. The detection rule identifies suspicious file creation activities by monitoring specific processes and excluding typical paths, thus highlighting potential lateral movement attempts by attackers.

### Possible investigation steps

- Review the alert details to identify the specific process name (e.g., scp, ftp, sftp) involved in the file creation event.
- Examine the file path where the file was created to determine if it is an unusual or unauthorized location, considering the exclusion of typical paths like /dev/ptmx, /run/*, or /var/run/*.
- Check the user account associated with the process to verify if it is a legitimate user or if there are signs of compromised credentials.
- Investigate the source and destination IP addresses involved in the file transfer to identify any suspicious or unexpected network connections.
- Analyze recent activity on the host to identify any other unusual or unauthorized actions that may indicate lateral movement or further compromise.
- Correlate this event with other alerts or logs to determine if it is part of a broader attack pattern or campaign within the network.

### False positive analysis

- Administrative file transfers: Legitimate administrative tasks often involve transferring files using SCP, FTP, or SFTP. To manage this, create exceptions for known administrative accounts or specific IP addresses that regularly perform these tasks.
- Automated backup processes: Scheduled backups may use tools like rsync or sftp-server to create files remotely. Identify and exclude these processes by specifying the paths or scripts involved in the backup operations.
- System updates and patches: Some system updates might involve remote file creation in non-standard directories. Monitor update schedules and exclude these activities by correlating them with known update events.
- Development and testing environments: Developers may use remote file transfer services to deploy or test applications. Establish a baseline of typical development activities and exclude these from alerts by defining specific user accounts or project directories.
- Third-party integrations: Some third-party applications might require remote file creation as part of their functionality. Document these integrations and exclude their associated processes or file paths from triggering alerts.

### Response and remediation

- Isolate the affected host immediately to prevent further lateral movement within the network. This can be done by removing the host from the network or applying network segmentation controls.
- Terminate any suspicious processes identified in the alert, such as scp, ftp, sftp, vsftpd, sftp-server, or sync, to stop unauthorized file transfers.
- Conduct a thorough review of the file paths and files created to determine if any sensitive data has been compromised or if any malicious files have been introduced.
- Restore any unauthorized or malicious file changes from known good backups to ensure system integrity.
- Update and patch the affected systems to close any vulnerabilities that may have been exploited by the attacker.
- Implement stricter access controls and authentication mechanisms for remote file transfer services to prevent unauthorized use.
- Escalate the incident to the security operations center (SOC) or incident response team for further investigation and to determine if additional systems have been compromised.
"""
risk_score = 21
rule_id = "ed3fedc3-dd10-45a5-a485-34a8b48cea46"
setup = """## Setup

This rule requires data coming in from one of the following integrations:
- Elastic Defend
- Auditbeat

### Elastic Defend Integration Setup
Elastic Defend is integrated into the Elastic Agent using Fleet. Upon configuration, the integration allows the Elastic Agent to monitor events on your host and send data to the Elastic Security app.

#### Prerequisite Requirements:
- Fleet is required for Elastic Defend.
- To configure Fleet Server refer to the [documentation](https://www.elastic.co/guide/en/fleet/current/fleet-server.html).

#### The following steps should be executed in order to add the Elastic Defend integration on a Linux System:
- Go to the Kibana home page and click "Add integrations".
- In the query bar, search for "Elastic Defend" and select the integration to see more details about it.
- Click "Add Elastic Defend".
- Configure the integration name and optionally add a description.
- Select the type of environment you want to protect, either "Traditional Endpoints" or "Cloud Workloads".
- Select a configuration preset. Each preset comes with different default settings for Elastic Agent, you can further customize these later by configuring the Elastic Defend integration policy. [Helper guide](https://www.elastic.co/guide/en/security/current/configure-endpoint-integration-policy.html).
- We suggest selecting "Complete EDR (Endpoint Detection and Response)" as a configuration setting, that provides "All events; all preventions"
- Enter a name for the agent policy in "New agent policy name". If other agent policies already exist, you can click the "Existing hosts" tab and select an existing policy instead.
For more details on Elastic Agent configuration settings, refer to the [helper guide](https://www.elastic.co/guide/en/fleet/8.10/agent-policy.html).
- Click "Save and Continue".
- To complete the integration, select "Add Elastic Agent to your hosts" and continue to the next section to install the Elastic Agent on your hosts.
For more details on Elastic Defend refer to the [helper guide](https://www.elastic.co/guide/en/security/current/install-endpoint.html).

### Auditbeat Setup
Auditbeat is a lightweight shipper that you can install on your servers to audit the activities of users and processes on your systems. For example, you can use Auditbeat to collect and centralize audit events from the Linux Audit Framework. You can also use Auditbeat to detect changes to critical files, like binaries and configuration files, and identify potential security policy violations.

#### The following steps should be executed in order to add the Auditbeat on a Linux System:
- Elastic provides repositories available for APT and YUM-based distributions. Note that we provide binary packages, but no source packages.
- To install the APT and YUM repositories follow the setup instructions in this [helper guide](https://www.elastic.co/guide/en/beats/auditbeat/current/setup-repositories.html).
- To run Auditbeat on Docker follow the setup instructions in the [helper guide](https://www.elastic.co/guide/en/beats/auditbeat/current/running-on-docker.html).
- To run Auditbeat on Kubernetes follow the setup instructions in the [helper guide](https://www.elastic.co/guide/en/beats/auditbeat/current/running-on-kubernetes.html).
- For complete “Setup and Run Auditbeat” information refer to the [helper guide](https://www.elastic.co/guide/en/beats/auditbeat/current/setting-up-and-running.html).
"""
severity = "low"
tags = [
    "Domain: Endpoint",
    "OS: Linux",
    "Use Case: Threat Detection",
    "Tactic: Lateral Movement",
    "Data Source: Elastic Defend",
    "Resources: Investigation Guide",
]
timestamp_override = "event.ingested"
type = "new_terms"
query = '''
event.category:file and host.os.type:linux and event.action:creation and
process.name:(scp or ftp or sftp or vsftpd or sftp-server or sync) and
not (
  file.path:(
    /dev/ptmx or /run/* or /var/run/* or /home/*/.ansible/*AnsiballZ_*.py or /home/*/.ansible/tmp/ansible-tmp* or
    /root/.ansible/*AnsiballZ_*.py or /tmp/ansible-chief/ansible-tmp*AnsiballZ_*.py or
    /tmp/newroot/home/*/.ansible/tmp/ansible-tmp*AnsiballZ_*.py or /tmp/.ansible/tmp/ansible-tmp*AnsiballZ_*.py or
    /tmp/ansible-tmp-*/AnsiballZ_*.py or /tmp/.ansible/ansible-tmp-*AnsiballZ_*.py or /var/tmp/ansible-tmp-* or
    /tmp/.ansible/ansible-tmp-*/.source or /root/.ansible/tmp/ansible-tmp-*/.source
  ) or
  file.extension:(filepart or yaml or new or rpm or deb)
)
'''
[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1021"
name = "Remote Services"
reference = "https://attack.mitre.org/techniques/T1021/"

[[rule.threat.technique.subtechnique]]
id = "T1021.004"
name = "SSH"
reference = "https://attack.mitre.org/techniques/T1021/004/"

[[rule.threat.technique]]
id = "T1570"
name = "Lateral Tool Transfer"
reference = "https://attack.mitre.org/techniques/T1570/"

[rule.threat.tactic]
id = "TA0008"
name = "Lateral Movement"
reference = "https://attack.mitre.org/tactics/TA0008/"

[[rule.threat]]
framework = "MITRE ATT&CK"

[[rule.threat.technique]]
id = "T1105"
name = "Ingress Tool Transfer"
reference = "https://attack.mitre.org/techniques/T1105/"

[rule.threat.tactic]
id = "TA0011"
name = "Command and Control"
reference = "https://attack.mitre.org/tactics/TA0011/"
[rule.new_terms]
field = "new_terms_fields"
value = ["process.executable", "host.id"]

[[rule.new_terms.history_window_start]]
field = "history_window_start"
value = "now-5d"

Stages and Predicates

Stage 1: new_terms

event.category:file and host.os.type:linux and event.action:creation and
process.name:(scp or ftp or sftp or vsftpd or sftp-server or sync) and
not (
  file.path:(
    /dev/ptmx or /run.ansible.ansible/tmp/ansible-tmp* or
    /root/.ansible/*AnsiballZ_*.py or /tmp/ansible-chief/ansible-tmp*AnsiballZ_*.py or
    /tmp/newroot/home/*/.ansible/tmp/ansible-tmp*AnsiballZ_*.py or /tmp/.ansible/tmp/ansible-tmp*AnsiballZ_*.py or
    /tmp/ansible-tmp-*/AnsiballZ_*.py or /tmp/.ansible/ansible-tmp-*AnsiballZ_*.py or /var/tmp/ansible-tmp-* or
    /tmp/.ansible/ansible-tmp-*/.source or /root/.ansible/tmp/ansible-tmp-*/.source
  ) or
  file.extension:(filepart or yaml or new or rpm or deb)
)

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
file.extensionindeb, filepart, new, rpm, yamlexcludes:file.extension
file.patheq/dev/ptmxexcludes:file.path field:"file.path" value:"/dev/ptmx"
file.pathstarts_with/run/excludes:file.path field:"file.path" value:"/run/"
file.pathstarts_with/var/run/excludes:file.path field:"file.path" value:"/var/run/"
file.pathstarts_with/var/tmp/ansible-tmp-excludes:file.path field:"file.path" value:"/var/tmp/ansible-tmp-"
file.pathwildcard/home/*/.ansible/*AnsiballZ_*.pyexcludes:file.path field:"file.path" value:"/home/*/.ansible/*AnsiballZ_*.py"
file.pathwildcard/home/*/.ansible/tmp/ansible-tmp*excludes:file.path field:"file.path" value:"/home/*/.ansible/tmp/ansible-tmp*"
file.pathwildcard/root/.ansible/*AnsiballZ_*.pyexcludes:file.path field:"file.path" value:"/root/.ansible/*AnsiballZ_*.py"
file.pathwildcard/root/.ansible/tmp/ansible-tmp-*/.sourceexcludes:file.path field:"file.path" value:"/root/.ansible/tmp/ansible-tmp-*/.source"
file.pathwildcard/tmp/.ansible/ansible-tmp-*/.sourceexcludes:file.path field:"file.path" value:"/tmp/.ansible/ansible-tmp-*/.source"
file.pathwildcard/tmp/.ansible/ansible-tmp-*AnsiballZ_*.pyexcludes:file.path field:"file.path" value:"/tmp/.ansible/ansible-tmp-*AnsiballZ_*.py"
file.pathwildcard/tmp/.ansible/tmp/ansible-tmp*AnsiballZ_*.pyexcludes:file.path field:"file.path" value:"/tmp/.ansible/tmp/ansible-tmp*AnsiballZ_*.py"
file.pathwildcard/tmp/ansible-chief/ansible-tmp*AnsiballZ_*.pyexcludes:file.path field:"file.path" value:"/tmp/ansible-chief/ansible-tmp*AnsiballZ_*.py"
file.pathwildcard/tmp/ansible-tmp-*/AnsiballZ_*.pyexcludes:file.path field:"file.path" value:"/tmp/ansible-tmp-*/AnsiballZ_*.py"
file.pathwildcard/tmp/newroot/home/*/.ansible/tmp/ansible-tmp*AnsiballZ_*.pyexcludes:file.path field:"file.path" value:"/tmp/newroot/home/*/.ansible/tmp/ansible-tmp*AnsiballZ_*.py"

Volume Muted via Osascript

#
Source
github.com/elastic/protections-artifacts

Detects the use of Osascript to mute the system volume. A new stealer named 'Banshee' was seen doing this in order to prevent security notifications from possibly being noticed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

[rule]
description = """
Detects the use of Osascript to mute the system volume. A new stealer named 'Banshee' was seen doing this in order to
prevent security notifications from possibly being noticed.
"""
id = "6948957d-2988-47a7-b7d8-2dec8bfe172b"
license = "Elastic License v2"
name = "Volume Muted via Osascript"
os_list = ["macos"]
version = "1.0.4"

query = '''
process where event.type == "start" and event.action == "exec" and process.name == "osascript" and 
 process.args == "-e" and process.command_line like~ "*set volume with output muted*"
'''

min_endpoint_version = "8.11.0"
optional_actions = []
[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0

[[actions]]
action = "kill_process"
field = "process.parent.entity_id"
state = 0

[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1059"
name = "Command and Scripting Interpreter"
reference = "https://attack.mitre.org/techniques/T1059/"
[[threat.technique.subtechnique]]
id = "T1059.002"
name = "AppleScript"
reference = "https://attack.mitre.org/techniques/T1059/002/"



[threat.tactic]
id = "TA0002"
name = "Execution"
reference = "https://attack.mitre.org/tactics/TA0002/"

[internal]
min_endpoint_version = "8.11.0"

Stages and Predicates

Stage 1: process

process where event.type == "start" and event.action == "exec" and process.name == "osascript" and 
 process.args == "-e" and process.command_line like~ "*set volume with output muted*"

Indicators

These rows show field, operator, and value matches.

Windows Script Executed From a Suspicious Path

#
Time window
5m
Source
github.com/elastic/protections-artifacts

Identifies execution of a Windows script from downloads or desktop folders followed by spawning a child process or performing an outgoing network connection to the internet.

MITRE ATT&CK Coverage

Rule Body

[rule]
description = """
Identifies execution of a Windows script from downloads or desktop folders followed by spawning a child process or
performing an outgoing network connection to the internet.
"""
id = "21066b21-0555-45df-b090-d4051d2d88bd"
license = "Elastic License v2"
name = "Windows Script Executed From a Suspicious Path"
os_list = ["windows"]
version = "1.0.3"

query = '''
sequence with maxspan=5m
 [process where event.action == "start" and
  process.name in~ ("wscript.exe", "mshta.exe") and
  process.args : ("?:\\Users\\*\\Downloads\\*", "?:\\Users\\*\\Desktop\\*", "?:\\Users\\*\\Documents\\*")] as event0
 [any where

    /* script utility perform an egress connection to the internet */
   (event.category == "network" and event.action in ("disconnect_received", "connection_attempted") and
    process.name in~ ("wscript.exe", "mshta.exe", "hh.exe", "mmc.exe") and
    process.entity_id == event0.process.entity_id and
    not cidrmatch(destination.ip, "10.0.0.0/8", "127.0.0.0/8", "169.254.0.0/16", "172.16.0.0/12", "192.0.0.0/24",
       "192.0.0.0/29", "192.0.0.8/32", "192.0.0.9/32", "192.0.0.10/32", "192.0.0.170/32", "192.0.0.171/32",
       "192.0.2.0/24", "192.31.196.0/24", "192.52.193.0/24", "192.88.99.0/24", "224.0.0.0/4", "192.168.0.0/16",
       "100.64.0.0/10", "192.175.48.0/24","198.18.0.0/15", "198.51.100.0/24", "203.0.113.0/24", "240.0.0.0/4", "::1",
       "FE80::/10", "FF00::/8")) or

   /* script utility spawn a child process */
   (event.category == "process" and event.action == "start" and process.parent.name : "explorer.exe" and
    process.parent.name in~ ("wscript.exe", "mshta.exe") and process.parent.entity_id == event0.process.entity_id)
  ]
'''

min_endpoint_version = "8.4.0"
[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0
tree = true

[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 1
tree = true

[[optional_actions]]
action = "rollback"
field = "process.entity_id"
state = 0

[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1059"
name = "Command and Scripting Interpreter"
reference = "https://attack.mitre.org/techniques/T1059/"
[[threat.technique.subtechnique]]
id = "T1059.005"
name = "Visual Basic"
reference = "https://attack.mitre.org/techniques/T1059/005/"

[[threat.technique.subtechnique]]
id = "T1059.007"
name = "JavaScript"
reference = "https://attack.mitre.org/techniques/T1059/007/"



[threat.tactic]
id = "TA0002"
name = "Execution"
reference = "https://attack.mitre.org/tactics/TA0002/"
[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1218"
name = "System Binary Proxy Execution"
reference = "https://attack.mitre.org/techniques/T1218/"
[[threat.technique.subtechnique]]
id = "T1218.005"
name = "Mshta"
reference = "https://attack.mitre.org/techniques/T1218/005/"



[threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"

[internal]
min_endpoint_version = "8.4.0"

Stages and Predicates

Stage 1: process

[process where event.action == "start" and
  process.name in~ ("wscript.exe", "mshta.exe") and
  process.args : ("?:\\Users\\*\\Downloads\\*", "?:\\Users\\*\\Desktop\\*", "?:\\Users\\*\\Documents\\*")] as event0

Stage 2: any

[any where
   (event.category == "network" and event.action in ("disconnect_received", "connection_attempted") and
    process.name in~ ("wscript.exe", "mshta.exe", "hh.exe", "mmc.exe") and
    process.entity_id == event0.process.entity_id and
    not cidrmatch(destination.ip, "10.0.0.0/8", "127.0.0.0/8", "169.254.0.0/16", "172.16.0.0/12", "192.0.0.0/24",
       "192.0.0.0/29", "192.0.0.8/32", "192.0.0.9/32", "192.0.0.10/32", "192.0.0.170/32", "192.0.0.171/32",
       "192.0.2.0/24", "192.31.196.0/24", "192.52.193.0/24", "192.88.99.0/24", "224.0.0.0/4", "192.168.0.0/16",
       "100.64.0.0/10", "192.175.48.0/24","198.18.0.0/15", "198.51.100.0/24", "203.0.113.0/24", "240.0.0.0/4", "::1",
       "FE80::/10", "FF00::/8")) or
   (event.category == "process" and event.action == "start" and process.parent.name : "explorer.exe" and
    process.parent.name in~ ("wscript.exe", "mshta.exe") and process.parent.entity_id == event0.process.entity_id)
  ]

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
event.actioneq
  • start corpus 388 (elastic 388)
field:"EventType" kind:eq value:"start"
event.actionin
  • connection_attempted corpus 24 (elastic 24)
  • disconnect_received corpus 11 (elastic 11)
field:"EventType" kind:in
event.categoryeq
  • network corpus 9 (elastic 9)
  • process corpus 38 (elastic 38)
field:"event.category" kind:eq
process.argswildcard
  • ?:\Users\*\Desktop\*
  • ?:\Users\*\Documents\*
  • ?:\Users\*\Downloads\* corpus 2 (elastic 2)
field:"process.args" kind:wildcard
process.entity_ideq
  • event0.process.entity_id (field reference)
field:"process_guid" kind:eq value:"event0.process.entity_id"
process.namein
  • hh.exe corpus 8 (splunk 5, elastic 3)
  • mmc.exe corpus 8 (splunk 5, elastic 3)
  • mshta.exe corpus 27 (splunk 15, elastic 12)
  • wscript.exe corpus 28 (elastic 14, splunk 14)
field:"process_basename" kind:in
process.parent.entity_ideq
  • event0.process.entity_id (field reference)
field:"parent_process_guid" kind:eq value:"event0.process.entity_id"
process.parent.namein
  • mshta.exe corpus 4 (elastic 4)
  • wscript.exe corpus 6 (elastic 4, splunk 2)
field:"parent_process_basename" kind:in
process.parent.namewildcard
  • explorer.exe corpus 50 (elastic 50)
field:"parent_process_basename" kind:wildcard value:"explorer.exe"

Back to all Elastic rules