Detection rules › Splunk

Splunk rules: 35

ASL AWS Defense Evasion Impair Security Services

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

The following analytic detects the deletion of critical AWS Security Services configurations, such as CloudWatch alarms, GuardDuty detectors, and Web Application Firewall rules. It leverages Amazon Security Lake logs to identify specific API calls like "DeleteLogStream" and "DeleteDetector." This activity is significant because adversaries often use these actions to disable security monitoring and evade detection. If confirmed malicious, this could allow attackers to operate undetected, leading to potential data breaches, unauthorized access, and prolonged persistence within the AWS environment.

Known False Positives

  • While this search has no known false positives, it is possible that it is a legitimate admin activity. Please consider filtering out these noisy events using userAgent, user_arn field names.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: ASL AWS Defense Evasion Impair Security Services
id: 5029b681-0462-47b7-82e7-f7e3d37f5a2d
version: 11
creation_date: '2022-07-26'
modification_date: '2026-05-13'
author: Patrick Bareiss, Bhavin Patel, Gowthamaraj Rajendran, Splunk
status: production
type: Hunting
description: The following analytic detects the deletion of critical AWS Security Services configurations, such as CloudWatch alarms, GuardDuty detectors, and Web Application Firewall rules. It leverages Amazon Security Lake logs to identify specific API calls like "DeleteLogStream" and "DeleteDetector." This activity is significant because adversaries often use these actions to disable security monitoring and evade detection. If confirmed malicious, this could allow attackers to operate undetected, leading to potential data breaches, unauthorized access, and prolonged persistence within the AWS environment.
data_source:
    - ASL AWS CloudTrail
search: |-
    `amazon_security_lake` api.operation IN ("DeleteLogStream","DeleteDetector","DeleteIPSet","DeleteWebACL","DeleteRule","DeleteRuleGroup","DeleteLoggingConfiguration","DeleteAlarms")
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY actor.user.uid api.operation api.service.name
           http_request.user_agent src_endpoint.ip actor.user.account.uid
           cloud.provider cloud.region
      | rename actor.user.uid as user api.operation as action api.service.name as dest http_request.user_agent as user_agent src_endpoint.ip as src actor.user.account.uid as vendor_account cloud.provider as vendor_product cloud.region as vendor_region
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `asl_aws_defense_evasion_impair_security_services_filter`
how_to_implement: The detection is based on Amazon Security Lake events from Amazon Web Services (AWS), which is a centralized data lake that provides security-related data from AWS services. To use this detection, you must ingest CloudTrail logs from Amazon Security Lake into Splunk. To run this search, ensure that you ingest events using the latest version of Splunk Add-on for Amazon Web Services (https://splunkbase.splunk.com/app/1876) or the Federated Analytics App.
known_false_positives: While this search has no known false positives, it is possible that it is a legitimate admin activity. Please consider filtering out these noisy events using userAgent, user_arn field names.
references:
    - https://docs.aws.amazon.com/cli/latest/reference/guardduty/index.html
    - https://docs.aws.amazon.com/cli/latest/reference/waf/index.html
    - https://www.elastic.co/guide/en/security/current/prebuilt-rules.html
analytic_story:
    - AWS Defense Evasion
asset_type: AWS Account
mitre_attack_id:
    - T1685.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`amazon_security_lake` api.operation IN (
    "DeleteLogStream",
    "DeleteDetector",
    "DeleteIPSet",
    "DeleteWebACL",
    "DeleteRule",
    "DeleteRuleGroup",
    "DeleteLoggingConfiguration",
    "DeleteAlarms"
)

Stage 2: fillnull

| fillnull

Stage 3: stats

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

Stage 4: rename

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

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `asl_aws_defense_evasion_impair_security_services_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
api.operationin
  • DeleteAlarms
  • DeleteDetector
  • DeleteIPSet corpus 2 (splunk 2)
  • DeleteLogStream
  • DeleteLoggingConfiguration
  • DeleteRule corpus 2 (splunk 2)
  • DeleteRuleGroup corpus 2 (splunk 2)
  • DeleteWebACL corpus 2 (splunk 2)
field:"aws::eventName" kind:in
sourcetypeeq
  • aws:asl corpus 27 (splunk 27)
field:"sourcetype" kind:eq value:"aws:asl"

ASL AWS ECR Container Upload Unknown User

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

The following analytic detects unauthorized container uploads to AWS Elastic Container Service (ECR) by monitoring AWS CloudTrail events. It identifies instances where a new container is uploaded by a user not previously recognized as authorized. This detection is crucial for a SOC as it can indicate a potential compromise or misuse of AWS ECR, which could lead to unauthorized access to sensitive data or the deployment of malicious containers. By identifying and investigating these events, organizations can mitigate the risk of data breaches or other security incidents resulting from unauthorized container uploads. The impact of such an attack could be significant, compromising the integrity and security of the organization's cloud environment.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: ASL AWS ECR Container Upload Unknown User
id: 886a8f46-d7e2-4439-b9ba-aec238e31732
version: 12
creation_date: '2024-05-22'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: Anomaly
description: The following analytic detects unauthorized container uploads to AWS Elastic Container Service (ECR) by monitoring AWS CloudTrail events. It identifies instances where a new container is uploaded by a user not previously recognized as authorized. This detection is crucial for a SOC as it can indicate a potential compromise or misuse of AWS ECR, which could lead to unauthorized access to sensitive data or the deployment of malicious containers. By identifying and investigating these events, organizations can mitigate the risk of data breaches or other security incidents resulting from unauthorized container uploads. The impact of such an attack could be significant, compromising the integrity and security of the organization's cloud environment.
data_source:
    - ASL AWS CloudTrail
search: |-
    `amazon_security_lake` api.operation=PutImage NOT `aws_ecr_users_asl`
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY actor.user.uid api.operation api.service.name
           http_request.user_agent src_endpoint.ip actor.user.account.uid
           cloud.provider cloud.region
      | rename actor.user.uid as user api.operation as action api.service.name as dest http_request.user_agent as user_agent src_endpoint.ip as src actor.user.account.uid as vendor_account cloud.provider as vendor_product cloud.region as vendor_region
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `asl_aws_ecr_container_upload_unknown_user_filter`
how_to_implement: The detection is based on Amazon Security Lake events from Amazon Web Services (AWS), which is a centralized data lake that provides security-related data from AWS services. To use this detection, you must ingest CloudTrail logs from Amazon Security Lake into Splunk. To run this search, ensure that you ingest events using the latest version of Splunk Add-on for Amazon Web Services (https://splunkbase.splunk.com/app/1876) or the Federated Analytics App.
known_false_positives: No false positives have been identified at this time.
references:
    - https://attack.mitre.org/techniques/T1204/003/
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: Container uploaded from unknown user $user$
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - Dev Sec Ops
asset_type: AWS Account
mitre_attack_id:
    - T1204.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: network

Stages and Predicates

Stage 1: search

`amazon_security_lake` api.operation=PutImage NOT `aws_ecr_users_asl`

Stage 2: fillnull

| fillnull

Stage 3: stats

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

Stage 4: rename

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

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `asl_aws_ecr_container_upload_unknown_user_filter`

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
actor.user.nameeqadminexcludes:actor.user.name field:"actor.user.name" value:"admin"

AteraAgent Installation - Windows (Windows Event Log)

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

An adversary may use legitimate desktop support and remote access software to establish an interactive command and control channel to target systems within networks. These remote monitoring and management (RMM) tools, such as AteraAgent, are commonly used as legitimate technical support software and may be allowed by application control within a target environment. Remote access software may be installed and used post-compromise as an alternate communications channel for redundant access or as a way to establish an interactive remote desktop session with the target system. They may also be used as a component of malware to establish a reverse connection or back-connect to a service or adversary controlled system. This use case detects the installation of AteraAgent RMM.

MITRE ATT&CK Coverage

TacticTechniques
Command & Control

References

Telemetry Coverage

Rule Body

id: '29796.53836'
title: AteraAgent Installation - Windows
description: An adversary may use legitimate desktop support and remote access software
  to establish an interactive command and control channel to target systems within
  networks. These remote monitoring and management (RMM) tools, such as AteraAgent,
  are commonly used as legitimate technical support software and may be allowed by
  application control within a target environment. Remote access software may be installed
  and used post-compromise as an alternate communications channel for redundant access
  or as a way to establish an interactive remote desktop session with the target system.
  They may also be used as a component of malware to establish a reverse connection
  or back-connect to a service or adversary controlled system. This use case detects
  the installation of AteraAgent RMM.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` ((EventCode=1033) OR ">1033</EventID>")
  "MsiInstaller" "AteraAgent" | table _time, host, user, process_* | bin span=1s |
  stats values(*) as * by _time, host '
techniques:
- command-and-control:remote access software
technique_id: 
- T1219
data_category:
- Windows event logs
references:
- https://thedfirreport.com/2022/10/31/follina-exploit-leads-to-domain-compromise/
- https://www.cybereason.com/blog/threat-analysis-from-icedid-to-domain-compromise
- https://github.com/SigmaHQ/sigma/blob/04f72b9e78f196544f8f1331b4d9158df34d7ecf/rules/windows/builtin/application/win_software_atera_rmm_agent_install.yml
- https://www.proofpoint.com/us/blog/threat-insight/security-brief-ta450-uses-embedded-links-pdf-attachments-latest-campaign?utm_source=twitter&utm_medium=social_organic&utm_campaign=2024&utm_post_id=3c4043a3-313b-4b88-aca6-d74b47e16082
- https://www.atera.com/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` ((EventCode=1033) OR ">1033</EventID>") "MsiInstaller" "AteraAgent"

Stage 2: table

| table _time, host, user, process_*

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
1">1033</EventID>"
1"MsiInstaller"
1"AteraAgent"

AWS Bedrock Claude High Risk Filesystem and Exec Tool Invocation

#
Status
production
Severity
medium
Group by
modelId, region, user_session
Author
Rod Soto
Source
github.com/splunk/security_content

Detects identities invoking high-risk filesystem and execution tools via AWS Bedrock Claude. For each identity, monitors the usage of potentially dangerous commands and flags any anomalous activity that deviates from their historical baseline. This may indicate attempts to escalate privileges, exfiltrate data, or execute unauthorized commands.

Known False Positives

  • This detection may produce false positives for legitimate developer activity where authorized users invoke shell execution, file write, or network tools through Claude Code as part of normal software development, deployment automation, or infrastructure management workflows.

MITRE ATT&CK Coverage

TacticTechniques
Privilege Escalation
Stealth

Rule Body

name: AWS Bedrock Claude High Risk Filesystem and Exec Tool Invocation
id: 989b3702-1df3-4076-9e2f-8dcbcc2b4bef
version: 1
creation_date: '2026-07-06'
modification_date: '2026-07-06'
author: Rod Soto
status: production
type: Anomaly
description: Detects identities invoking high-risk filesystem and execution tools via AWS Bedrock Claude. For each identity, monitors the usage of potentially dangerous commands and flags any anomalous activity that deviates from their historical baseline. This may indicate attempts to escalate privileges, exfiltrate data, or execute unauthorized commands.
data_source:
    - AWS Bedrock Claude
search: |-
    `aws_bedrock_claude`
    | spath output="tool_called"       path="output.outputBodyJson{}.content_block.toolUse.name"
    | spath output="out_tokens_stream" path="output.outputBodyJson{}.usage.output_tokens"
    | where tool_called IN ("bash","curl","edit","write","webfetch","grep","read","read_file")
    | eval out_tokens    = coalesce(mvindex('out_tokens_stream', -1), 'output.outputTokenCount', 0)
    | eval in_tokens     = coalesce('input.inputTokenCount', 0)
    | eval user_session  = replace('identity.arn', ".*/", "")
    | eval identity_type = case(
        'identity.arn' LIKE "%botocore-session%", "automated",
        'identity.arn' LIKE "%assumed-role%",     "assumed_role",
        'identity.arn' LIKE "%user%",             "iam_user",
        true(),                                    "other")
    | stats
        count                  AS invocations,
        dc(tool_called)        AS unique_tools_used,
        sum(in_tokens)         AS total_input_tokens,
        sum(out_tokens)        AS total_output_tokens,
        values(tool_called)    AS tools_invoked,
        values('identity.arn') AS caller_list,
        values(identity_type)  AS identity_types,
        dc('identity.arn')     AS unique_callers,
        min(_time)             AS first_seen,
        max(_time)             AS last_seen
      BY modelId, region, user_session
    | eval tokens_per_call = round(total_output_tokens / invocations, 0)
    | eval first_seen = strftime(first_seen - 28800, "%Y-%m-%d %H:%M:%S")
    | eval last_seen  = strftime(last_seen  - 28800, "%Y-%m-%d %H:%M:%S")
    | eval user = user_session
    | eval severity = case(
        mvfind(tools_invoked, "bash") >= 0 AND mvfind(tools_invoked, "curl") >= 0, "critical",
        mvfind(tools_invoked, "bash") >= 0 AND mvfind(tools_invoked, "write") >= 0, "critical",
        mvfind(tools_invoked, "curl") >= 0 AND mvfind(tools_invoked, "edit") >= 0, "critical",
        mvfind(identity_types, "assumed_role") >= 0 AND mvfind(tools_invoked, "bash") >= 0, "critical",
        mvfind(tools_invoked, "bash") >= 0, "high",
        mvfind(tools_invoked, "curl") >= 0, "high",
        mvfind(tools_invoked, "edit") >= 0, "high",
        mvfind(tools_invoked, "write") >= 0, "high",
        mvfind(tools_invoked, "webfetch") >= 0, "high",
        unique_tools_used >= 3, "high",
        true(), "medium")
    | eval risk_reason = case(
        mvfind(tools_invoked, "bash") >= 0 AND mvfind(tools_invoked, "curl") >= 0, "bash and curl invoked together - possible download and execute chain",
        mvfind(tools_invoked, "bash") >= 0 AND mvfind(tools_invoked, "write") >= 0, "bash and write invoked together - possible execution and persistence chain",
        mvfind(tools_invoked, "curl") >= 0 AND mvfind(tools_invoked, "edit") >= 0, "curl and edit invoked together - possible remote content retrieval and file modification",
        mvfind(identity_types, "assumed_role") >= 0 AND mvfind(tools_invoked, "bash") >= 0, "Human identity invoking bash via AI model - direct shell execution risk",
        mvfind(tools_invoked, "bash") >= 0, "bash invoked via Bedrock Claude - shell execution through AI model",
        mvfind(tools_invoked, "curl") >= 0, "curl invoked via Bedrock Claude - network call through AI model",
        mvfind(tools_invoked, "edit") >= 0, "edit invoked via Bedrock Claude - file modification through AI model",
        mvfind(tools_invoked, "write") >= 0, "write invoked via Bedrock Claude - file write through AI model",
        mvfind(tools_invoked, "webfetch") >= 0, "webfetch invoked via Bedrock Claude - remote content retrieval through AI model",
        unique_tools_used >= 3, "Broad filesystem and execution tool set invoked via AI model - reconnaissance pattern",
        true(), "Filesystem tool invoked via Bedrock Claude")
    | where severity IN ("critical","high")
    | table severity, risk_reason, modelId, region, user,unique_tools_used, caller_list, identity_types, invocations, tools_invoked, total_input_tokens, total_output_tokens, tokens_per_call, first_seen, last_seen
    | sort -unique_tools_used, -invocations
    | `aws_bedrock_claude_high_risk_filesystem_and_exec_tool_invocation_filter`
how_to_implement: You must install and configure the Splunk Add-on for AWS (https://splunkbase.splunk.com/app/1876). Enable Amazon Bedrock model invocation logging in AWS so that Claude request/response payloads are delivered to S3 and/or CloudWatch Logs (see https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html for setup steps), then ingest those logs into Splunk via the AWS TA. Configure the `aws_bedrock_claude` macro to point to the index and sourcetype (`json_no_timestamp`) where these logs land.
known_false_positives: This detection may produce false positives for legitimate developer activity where authorized users invoke shell execution, file write, or network tools through Claude Code as part of normal software development, deployment automation, or infrastructure management workflows.
references:
    - https://aws.amazon.com/blogs/apn/unlocking-the-power-of-splunk-with-amazon-bedrock-an-agentic-ai-approach-to-build-customized-splunk-assistants-using-bedrock-agents/
    - https://help.splunk.com/en/splunk-observability-cloud/observability-for-ai/splunk-ai-infrastructure-monitoring/set-up-ai-infrastructure-monitoring/amazon-bedrock
    - https://research.splunk.com/stories/aws_bedrock_security/
    - https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 50
          message: Identity $user$ invoked high-risk filesystem and execution tools $tools_invoked$ via AWS Bedrock Claude with severity $severity$ and reason $risk_reason$.
analytic_story:
    - Suspicious AWS Bedrock Claude Activities
asset_type: Web Application
mitre_attack_id:
    - T1055
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`aws_bedrock_claude`

Stage 2: spath

| spath output="tool_called"       path="output.outputBodyJson{}.content_block.toolUse.name"

Stage 3: spath

| spath output="out_tokens_stream" path="output.outputBodyJson{}.usage.output_tokens"

Stage 4: where

| where tool_called IN ("bash","curl","edit","write","webfetch","grep","read","read_file")

Stage 5: eval

| eval out_tokens    = coalesce(mvindex('out_tokens_stream', -1), 'output.outputTokenCount', 0)

Stage 6: eval

| eval in_tokens     = coalesce('input.inputTokenCount', 0)

Stage 7: eval

| eval user_session  = replace('identity.arn', ".*/", "")

Stage 8: eval

| eval identity_type = case(
    'identity.arn' LIKE "%botocore-session%", "automated",
    'identity.arn' LIKE "%assumed-role%",     "assumed_role",
    'identity.arn' LIKE "%user%",             "iam_user",
    true(),                                    "other")
identity_type =
iflike('identity.arn', "%botocore-session%")"automated"
eliflike('identity.arn', "%assumed-role%")"assumed_role"
eliflike('identity.arn', "%user%")"iam_user"
else"other"

Stage 9: stats

| stats
    count                  AS invocations,
    dc(tool_called)        AS unique_tools_used,
    sum(in_tokens)         AS total_input_tokens,
    sum(out_tokens)        AS total_output_tokens,
    values(tool_called)    AS tools_invoked,
    values('identity.arn') AS caller_list,
    values(identity_type)  AS identity_types,
    dc('identity.arn')     AS unique_callers,
    min(_time)             AS first_seen,
    max(_time)             AS last_seen
  BY modelId, region, user_session

Stage 10: eval

| eval tokens_per_call = round(total_output_tokens / invocations, 0)

Stage 11: eval

| eval first_seen = strftime(first_seen - 28800, "%Y-%m-%d %H:%M:%S")

Stage 12: eval

| eval last_seen  = strftime(last_seen  - 28800, "%Y-%m-%d %H:%M:%S")

Stage 13: eval

| eval user = user_session

Stage 14: eval

| eval severity = case(
    mvfind(tools_invoked, "bash") >= 0 AND mvfind(tools_invoked, "curl") >= 0, "critical",
    mvfind(tools_invoked, "bash") >= 0 AND mvfind(tools_invoked, "write") >= 0, "critical",
    mvfind(tools_invoked, "curl") >= 0 AND mvfind(tools_invoked, "edit") >= 0, "critical",
    mvfind(identity_types, "assumed_role") >= 0 AND mvfind(tools_invoked, "bash") >= 0, "critical",
    mvfind(tools_invoked, "bash") >= 0, "high",
    mvfind(tools_invoked, "curl") >= 0, "high",
    mvfind(tools_invoked, "edit") >= 0, "high",
    mvfind(tools_invoked, "write") >= 0, "high",
    mvfind(tools_invoked, "webfetch") >= 0, "high",
    unique_tools_used >= 3, "high",
    true(), "medium")
severity =
if/* expr: (mvfind(tools_invoked, "bash") >= 0) */ /* expr: (mvfind(tools_invoked, "curl") >= 0) */"critical"
elif/* expr: (mvfind(tools_invoked, "bash") >= 0) */ /* expr: (mvfind(tools_invoked, "write") >= 0) */"critical"
elif/* expr: (mvfind(tools_invoked, "curl") >= 0) */ /* expr: (mvfind(tools_invoked, "edit") >= 0) */"critical"
elif/* expr: (mvfind(identity_types, "assumed_role") >= 0) */ /* expr: (mvfind(tools_invoked, "bash") >= 0) */"critical"
elif/* expr: (mvfind(tools_invoked, "bash") >= 0) */"high"
elif/* expr: (mvfind(tools_invoked, "curl") >= 0) */"high"
elif/* expr: (mvfind(tools_invoked, "edit") >= 0) */"high"
elif/* expr: (mvfind(tools_invoked, "write") >= 0) */"high"
elif/* expr: (mvfind(tools_invoked, "webfetch") >= 0) */"high"
elifunique_tools_used >= 3"high"
else"medium"

Stage 15: eval

| eval risk_reason = case(
    mvfind(tools_invoked, "bash") >= 0 AND mvfind(tools_invoked, "curl") >= 0,
    "bash and curl invoked together - possible download and execute chain",
    mvfind(tools_invoked, "bash") >= 0 AND mvfind(tools_invoked, "write") >= 0,
    "bash and write invoked together - possible execution and persistence chain",
    mvfind(tools_invoked, "curl") >= 0 AND mvfind(tools_invoked, "edit") >= 0,
    "curl and edit invoked together - possible remote content retrieval and file modification",
    mvfind(identity_types, "assumed_role") >= 0 AND mvfind(tools_invoked, "bash") >= 0,
    "Human identity invoking bash via AI model - direct shell execution risk",
    mvfind(tools_invoked, "bash") >= 0,
    "bash invoked via Bedrock Claude - shell execution through AI model",
    mvfind(tools_invoked, "curl") >= 0,
    "curl invoked via Bedrock Claude - network call through AI model",
    mvfind(tools_invoked, "edit") >= 0,
    "edit invoked via Bedrock Claude - file modification through AI model",
    mvfind(tools_invoked, "write") >= 0,
    "write invoked via Bedrock Claude - file write through AI model",
    mvfind(tools_invoked, "webfetch") >= 0,
    "webfetch invoked via Bedrock Claude - remote content retrieval through AI model",
    unique_tools_used >= 3,
    "Broad filesystem and execution tool set invoked via AI model - reconnaissance pattern",
    true(), "Filesystem tool invoked via Bedrock Claude"
)
risk_reason =
if/* expr: (mvfind(tools_invoked, "bash") >= 0) */ /* expr: (mvfind(tools_invoked, "curl") >= 0) */"bash and curl invoked together - possible download and execute chain"
elif/* expr: (mvfind(tools_invoked, "bash") >= 0) */ /* expr: (mvfind(tools_invoked, "write") >= 0) */"bash and write invoked together - possible execution and persistence chain"
elif/* expr: (mvfind(tools_invoked, "curl") >= 0) */ /* expr: (mvfind(tools_invoked, "edit") >= 0) */"curl and edit invoked together - possible remote content retrieval and file modification"
elif/* expr: (mvfind(identity_types, "assumed_role") >= 0) */ /* expr: (mvfind(tools_invoked, "bash") >= 0) */"Human identity invoking bash via AI model - direct shell execution risk"
elif/* expr: (mvfind(tools_invoked, "bash") >= 0) */"bash invoked via Bedrock Claude - shell execution through AI model"
elif/* expr: (mvfind(tools_invoked, "curl") >= 0) */"curl invoked via Bedrock Claude - network call through AI model"
elif/* expr: (mvfind(tools_invoked, "edit") >= 0) */"edit invoked via Bedrock Claude - file modification through AI model"
elif/* expr: (mvfind(tools_invoked, "write") >= 0) */"write invoked via Bedrock Claude - file write through AI model"
elif/* expr: (mvfind(tools_invoked, "webfetch") >= 0) */"webfetch invoked via Bedrock Claude - remote content retrieval through AI model"
elifunique_tools_used >= 3"Broad filesystem and execution tool set invoked via AI model - reconnaissance pattern"
else"Filesystem tool invoked via Bedrock Claude"

Stage 16: where

| where severity IN ("critical","high")

Stage 17: table

| table severity, risk_reason, modelId, region, user,unique_tools_used, caller_list, identity_types,
    invocations, tools_invoked, total_input_tokens, total_output_tokens, tokens_per_call,
    first_seen, last_seen

Stage 18: sort

| sort -unique_tools_used, -invocations

Stage 19: search

| `aws_bedrock_claude_high_risk_filesystem_and_exec_tool_invocation_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
severityin
  • critical
  • high
field:"severity" kind:in
sourcetypeeq
  • json_no_timestamp
field:"sourcetype" kind:eq value:"json_no_timestamp"
tool_calledin
  • bash
  • curl
  • edit
  • grep
  • read
  • read_file
  • webfetch
  • write
field:"tool_called" kind:in

Cisco ASA - Logging Filters Configuration Tampering

#
Status
production
Severity
low
Group by
host
Author
Nasreddine Bencherchali, Splunk
Source
github.com/splunk/security_content

This analytic detects tampering with logging filter configurations on Cisco ASA devices via CLI or ASDM. Adversaries may reduce logging levels or disable specific log categories to evade detection, hide their activities, or prevent security monitoring systems from capturing evidence of their actions. By lowering logging verbosity, attackers can operate with reduced visibility to security teams. The detection monitors for logging configuration commands (message ID 111008 or 111010) that modify logging destinations (asdm, console, history, mail, monitor, trap) without setting them to higher severity levels (5-notifications, 6-informational, 7-debugging), which may indicate an attempt to reduce logging verbosity. Investigate unauthorized logging configuration changes that reduce verbosity, especially changes performed by non-administrative accounts, during unusual hours, or without corresponding change management approval.

Known False Positives

  • Admins may modify logging levels during maintenance or troubleshooting to reduce log volume. Verify against change management tickets. Filter known admin accounts during maintenance windows.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Rule Body

name: Cisco ASA - Logging Filters Configuration Tampering
id: b87b48a8-6d1a-4280-9cf1-16a950dbf901
version: 6
creation_date: '2025-11-21'
modification_date: '2026-05-13'
author: Nasreddine Bencherchali, Splunk
status: production
type: Anomaly
description: |
    This analytic detects tampering with logging filter configurations on Cisco ASA devices via CLI or ASDM.
    Adversaries may reduce logging levels or disable specific log categories to evade detection, hide their activities, or prevent security monitoring systems from capturing evidence of their actions. By lowering logging verbosity, attackers can operate with reduced visibility to security teams.
    The detection monitors for logging configuration commands (message ID 111008 or 111010) that modify logging destinations (asdm, console, history, mail, monitor, trap) without setting them to higher severity levels (5-notifications, 6-informational, 7-debugging), which may indicate an attempt to reduce logging verbosity.
    Investigate unauthorized logging configuration changes that reduce verbosity, especially changes performed by non-administrative accounts, during unusual hours, or without corresponding change management approval.
data_source:
    - Cisco ASA Logs
search: |
    `cisco_asa`
    message_id IN (111008, 111010)
    command = "logging *"
    command IN (
      "*asdm*",
      "*console*",
      "*history*",
      "*mail*",
      "*monitor*",
      "*trap*"
    )
    NOT command IN (
      "*notifications*",
      "*informational*",
      "*debugging*",
      "* 5*",
      "* 6*",
      "* 7*"
    )
    | fillnull
    | stats count
            earliest(_time) as firstTime
            latest(_time) as lastTime
            values(user) as user
            values(action) as action
            values(message_id) as message_id
            values(command) as command
            values(src_ip) as src_ip
            values(process_name) as process_name
      by host
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `cisco_asa___logging_filters_configuration_tampering_filter`
how_to_implement: |
    This search requires Cisco ASA syslog data to be ingested into Splunk via the Cisco Security Cloud TA.
    To ensure this detection works effectively, configure your ASA and FTD devices to generate and forward message ID 111008 and 111010.
    If your logging level is set to 'Notifications' or higher, these messages should already be included, else we recommend setting an event list that keeps the severity level you are using and adding the message IDs 111008 and 111010.
    You can find specific instructions on how to set this up here : https://www.cisco.com/c/en/us/support/docs/security/pix-500-series-security-appliances/63884-config-asa-00.html.
    You can also change the severity level of the above message id's to the syslog level you have currently enabled using the logging message syslog_id level severity_level command in global configuration mode. For more information, see Change the Severity Level of a Syslog Message : https://www.cisco.com/c/en/us/td/docs/security/asa/asa922/configuration/general/asa-922-general-config/monitor-syslog.html#ID-2121-000006da
known_false_positives: |
    Admins may modify logging levels during maintenance or troubleshooting to reduce log volume. Verify against change management tickets.
    Filter known admin accounts during maintenance windows.
references:
    - https://www.cisco.com/c/en/us/td/docs/security/asa/asa-cli-reference/I-R/asa-command-ref-I-R/m_log-lz.html
intermediate_findings:
    entities:
        - field: host
          type: system
          score: 20
          message: User $user$ executed command $command$ to tamper with logging filter configuration on the Cisco ASA host $host$.
        - field: user
          type: user
          score: 20
          message: User $user$ executed command $command$ to tamper with logging filter configuration on the Cisco ASA host $host$.
threat_objects:
    - field: command
      type: process
analytic_story:
    - Suspicious Cisco Adaptive Security Appliance Activity
asset_type: Network
mitre_attack_id:
    - T1685
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: network

Stages and Predicates

Stage 1: search

`cisco_asa`
message_id IN (111008, 111010)
command = "logging *"
command IN (
  "*asdm*",
  "*console*",
  "*history*",
  "*mail*",
  "*monitor*",
  "*trap*"
)
NOT command IN (
  "*notifications*",
  "*informational*",
  "*debugging*",
  "* 5*",
  "* 6*",
  "* 7*"
)

Stage 2: fillnull

| fillnull

Stage 3: stats

| stats count
        earliest(_time) as firstTime
        latest(_time) as lastTime
        values(user) as user
        values(action) as action
        values(message_id) as message_id
        values(command) as command
        values(src_ip) as src_ip
        values(process_name) as process_name
  by host

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `cisco_asa___logging_filters_configuration_tampering_filter`

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
commandin* 5*, * 6*, * 7*, *debugging*, *informational*, *notifications*excludes:command

Cisco Secure Firewall - Wget or Curl Download

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

The following analytic detects outbound connections initiated by command-line tools such as curl or wget. It leverages Cisco Secure Firewall Threat Defense logs and identifies allowed connections (action=Allow) where either the EVE_Process or ClientApplication fields indicate use of these utilities. While curl and wget are legitimate tools commonly used for software updates and scripting, adversaries often abuse them to download payloads, retrieve additional tools, or establish staging infrastructure from compromised systems. If confirmed malicious, this behavior may indicate the download phase of an attack chain or a command-and-control utility retrieval.

Known False Positives

  • Developers, administrators, or automation tools may use `curl` or `wget` for legitimate purposes such as software installation, configuration scripts, or CI/CD tasks. Security tools or health monitoring scripts may also use these utilities to check service availability or download updates. Review the destination `url`, frequency, and process context to validate whether the download activity is authorized.

MITRE ATT&CK Coverage

Rule Body

name: Cisco Secure Firewall - Wget or Curl Download
id: 173a1cb9-1814-4128-a9dc-f29dade89957
version: 9
creation_date: '2025-04-03'
modification_date: '2026-05-13'
author: Nasreddine Bencherchali, Splunk
status: production
type: Anomaly
description: |
    The following analytic detects outbound connections initiated by command-line tools such as curl or wget. It leverages Cisco Secure Firewall Threat Defense logs and identifies allowed connections (action=Allow) where either the EVE_Process or ClientApplication fields indicate use of these utilities. While curl and wget are legitimate tools commonly used for software updates and scripting, adversaries often abuse them to download payloads, retrieve additional tools, or establish staging infrastructure from compromised systems. If confirmed malicious, this behavior may indicate the download phase of an attack chain or a command-and-control utility retrieval.
data_source:
    - Cisco Secure Firewall Threat Defense Connection Event
search: |
    `cisco_secure_firewall` EventType=ConnectionEvent action IN ("Trust", "Allow", "allowed") AND
    ( EVE_Process IN ("*curl*", "*wget*") OR ClientApplication IN ("cURL", "Wget") )
    | stats count min(_time) as firstTime max(_time) as lastTime
        Values(rule) as rule
        Values(url) as url
        Values(dest_port) as dest_port
        Values(ClientApplicationVersion) as ClientApplicationVersion
        Values(src_port) as src_port
        by src, dest, transport, EVE_Process, ClientApplication, action
    | table src src_port dest dest_port transport url EVE_Process ClientApplication ClientApplicationVersion rule firstTime lastTime
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `cisco_secure_firewall___wget_or_curl_download_filter`
how_to_implement: |
    This search requires Cisco Secure Firewall Threat Defense Logs, which
    includes the ConnectionEvent EventType. This search uses an input macro named `cisco_secure_firewall`.
    We strongly recommend that you specify your environment-specific configurations
    (index, source, sourcetype, etc.) for Cisco Secure Firewall Threat Defense logs. Replace the macro definition
    with configurations for your Splunk environment. The search also uses a post-filter
    macro designed to filter out known false positives.
    The logs are to be ingested using the Splunk Add-on for Cisco Security Cloud (https://splunkbase.splunk.com/app/7404).
    The access policy must also enable logging.
known_false_positives: |
    Developers, administrators, or automation tools may use `curl` or `wget` for legitimate purposes such as software installation, configuration scripts, or CI/CD tasks.
    Security tools or health monitoring scripts may also use these utilities to check service availability or download updates.
    Review the destination `url`, frequency, and process context to validate whether the download activity is authorized.
references:
    - https://www.cisco.com/c/en/us/td/docs/security/firepower/741/api/FQE/secure_firewall_estreamer_fqe_guide_740.pdf
intermediate_findings:
    entities:
        - field: src
          type: system
          score: 20
          message: The process $EVE_Process$ initiated an allowed connection to download content using a command-line utility ($ClientApplication$) from $url$. This behavior may indicate tool staging or payload retrieval via curl or wget.
threat_objects:
    - field: EVE_Process
      type: process_name
    - field: url
      type: url
analytic_story:
    - Cisco Secure Firewall Threat Defense Analytics
asset_type: Network
mitre_attack_id:
    - T1053.003
    - T1059
    - T1071.001
    - T1105
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: network
security_domain: network

Stages and Predicates

Stage 1: search

`cisco_secure_firewall` EventType=ConnectionEvent action IN ("Trust", "Allow", "allowed") AND
( EVE_Process IN ("*curl*", "*wget*") OR ClientApplication IN ("cURL", "Wget") )

Stage 2: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    Values(rule) as rule
    Values(url) as url
    Values(dest_port) as dest_port
    Values(ClientApplicationVersion) as ClientApplicationVersion
    Values(src_port) as src_port
    by src, dest, transport, EVE_Process, ClientApplication, action

Stage 3: table

| table src src_port dest dest_port transport url EVE_Process ClientApplication
    ClientApplicationVersion rule firstTime lastTime

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `cisco_secure_firewall___wget_or_curl_download_filter`

Indicators

These rows show field, operator, and value matches.

Command Line Utility Added to Accessibility Features (Windows Event Log)

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

Adversaries may establish persistence and/or elevate privileges by executing malicious content triggered by accessibility features. Windows contains accessibility features that may be launched with a key combination before a user has logged in (ex: when the user is on the Windows logon screen). An adversary can modify the way these programs are launched to get a command prompt or backdoor without logging in to the system. This use case detects registry modification commands or events adding cmd.exe or PowerShell/pwsh.exe to Accessibility Features registry keys.

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '31349.56233'
title: Command Line Utility Added to Accessibility Features
description: 'Adversaries may establish persistence and/or elevate privileges by executing
  malicious content triggered by accessibility features. Windows contains accessibility
  features that may be launched with a key combination before a user has logged in
  (ex: when the user is on the Windows logon screen). An adversary can modify the
  way these programs are launched to get a command prompt or backdoor without logging
  in to the system. This use case detects registry modification commands or events
  adding cmd.exe or PowerShell/pwsh.exe to Accessibility Features registry keys.'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4657) OR
  "<EventID>4657<") OR (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process))
  "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution" "Debugger"
  ("sethc.exe" OR "utilman.exe" OR "osk.exe" OR "Magnify.exe" OR "Narrator.exe" OR
  "DisplaySwitch.exe" OR "atbroker.exe" OR "HelpPane.exe") ("cmd.exe" OR "powershell.exe"
  OR "pwsh.exe") | where (match(signature_id, "4657") and match(ObjectValueName, "(?i)Debugger")
  and match(NewValue, "(?i)(cmd|pwsh|powershell)\.exe")) or (match(signature_id, "4688")
  and match(process, "(?i)Debugger.+\x5c(cmd|pwsh|powershell)\.exe"))| table _time,
  host, user, process, parent_process_name, signature_id, ObjectValueName, NewValue
  | bin span=1s | stats values(*) as * by _time, host '
techniques:
- execution:command and scripting interpreter
- persistence:event triggered execution:accessibility features
technique_id:
- T1059
- T1546.008
data_category:
- Process command-line parameters
- Windows event logs
- Windows Registry
references:
- https://attack.mitre.org/techniques/T1546/008/
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1546.008/T1546.008.md#atomic-test-1---attaches-command-prompt-as-a-debugger-to-a-list-of-target-processes
- https://www.trendmicro.com/vinfo/us/security/news/ransomware-spotlight/ransomware-spotlight-8base

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4657) OR "<EventID>4657<") OR (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process)) "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution" "Debugger" ("sethc.exe" OR "utilman.exe" OR "osk.exe" OR "Magnify.exe" OR "Narrator.exe" OR "DisplaySwitch.exe" OR "atbroker.exe" OR "HelpPane.exe") ("cmd.exe" OR "powershell.exe" OR "pwsh.exe")

Stage 2: where

| where (
    match(signature_id, "4657")
    and match(ObjectValueName, "(?i)Debugger")
    and match(NewValue, "(?i)(cmd|pwsh|powershell)\.exe")
) or (
    match(signature_id, "4688")
    and match(process, "(?i)Debugger.+\x5c(cmd|pwsh|powershell)\.exe")
)

Stage 3: table

| table _time, host, user, process, parent_process_name, signature_id, ObjectValueName, NewValue

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4657 corpus 14 (splunk 14)
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq
NewValueregex_match
  • (?i)(cmd|pwsh|powershell).exe
field:"Details" kind:regex_match value:"(?i)(cmd|pwsh|powershell).exe"
ObjectValueNameregex_match
  • (?i)Debugger
field:"ObjectValueName" kind:regex_match value:"(?i)Debugger"
processregex_match
  • (?i)Debugger.+\x5c(cmd|pwsh|powershell).exe corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)Debugger.+\x5c(cmd|pwsh|powershell).exe"
signature_idregex_match
  • 4657 corpus 2 (splunk 2)
  • 4688 corpus 8 (splunk 8)
field:"signature_id" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4657<"
1"<EventID>4688<"
1"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution"
1"Debugger"
1"sethc.exe"
1"utilman.exe"
1"osk.exe"
1"Magnify.exe"
1"Narrator.exe"
1"DisplaySwitch.exe"
1"atbroker.exe"
1"HelpPane.exe"
1"cmd.exe"
1"powershell.exe"
1"pwsh.exe"

ComputerDefaults UAC Bypass (PowerShell)

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

computerdefaults.exe is a legitimate Windows executable handling the Default Programs feature in Windows. This feature allows users to set default programs for specific tasks such as web browsing, email, and media playback. Threat actors may modify the registry to have computerdefaults.exe run arbitrary commands when executed, potentially leading to UAC bypass. This use case detects modifications to the registry key HKCU\Software\Classes\ms-settings\shell\open\command which is associated with computerdefaults.exe

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '32258.57389'
title: ComputerDefaults UAC Bypass
description: 'computerdefaults.exe is a legitimate Windows executable handling the
  Default Programs feature in Windows. This feature allows users to set default programs
  for specific tasks such as web browsing, email, and media playback. Threat actors
  may modify the registry to have computerdefaults.exe run arbitrary commands when
  executed, potentially leading to UAC bypass. This use case detects modifications
  to the registry key HKCU\Software\Classes\ms-settings\shell\open\command which is
  associated with computerdefaults.exe. Atomics T1548.002 Test #5 Living Off the Land
  Binary and Scripts (LOLBAS) (LOLBIN)'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4103) OR
  "<EventID>4103<" OR TERM(EventCode=4104) OR "<EventID>4104<") ("ADD" OR "Set-ItemProperty"
  OR "sp" OR "New-Item" OR "New-ItemProperty" OR "ni") "\\software\\classes\\ms-settings\\shell\\open\\command"
  "DelegateExecute" | table _time, host, user, process, process_*, parent_process_name
  | bin span=1s | stats values(*) as * by _time, host '
techniques:
- privilege-escalation:abuse elevation control mechanism:bypass user account control
technique_id:
- T1548.002
data_category:
- PowerShell logs
references:
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1548.002/T1548.002.md

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4103) OR "<EventID>4103<" OR TERM(EventCode=4104) OR "<EventID>4104<") ("ADD" OR "Set-ItemProperty" OR "sp" OR "New-Item" OR "New-ItemProperty" OR "ni") "\\software\\classes\\ms-settings\\shell\\open\\command" "DelegateExecute"

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Indicators

These rows show field, operator, and value matches.

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

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4103<"
1"<EventID>4104<"
1"ADD"
1"Set-ItemProperty"
1"sp"
1"New-Item"
1"New-ItemProperty"
1"ni"
1"\\software\\classes\\ms-settings\\shell\\open\\command"
1"DelegateExecute"

ESXi VM Exported via Remote Tool

#
Status
production
Severity
medium
Group by
Datastore, InitiatorIP, InitiatorTool, ToolVersion, VMPath, dest
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

This detection identifies the use of a remote tool to download virtual machine disk files from a datastore. The NFC protocol is used by management tools to transfer files to and from ESXi hosts, but it can also be abused by attackers or insiders to exfiltrate full virtual disk images

Known False Positives

  • Administrators may use this command when troubleshooting. Tune as needed.

MITRE ATT&CK Coverage

TacticTechniques
Collection

Rule Body

name: ESXi VM Exported via Remote Tool
id: 2e155547-aaac-49d3-b0ef-ceabc31fd364
version: 4
creation_date: '2025-07-11'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: TTP
description: This detection identifies the use of a remote tool to download virtual machine disk files from a datastore. The NFC protocol is used by management tools to transfer files to and from ESXi hosts, but it can also be abused by attackers or insiders to exfiltrate full virtual disk images
data_source:
    - VMWare ESXi Syslog
search: '`esxi_syslog` Message="*File download from path*" Message="*was initiated from*" | rex field=_raw "from path ''\[(?<Datastore>[^\]]+)\](?<VMPath>[^'']+)''" | rex field=_raw "initiated from ''(?<InitiatorTool>[^/]+)/(?<ToolVersion>[^@]+)@(?<InitiatorIP>\d{1,3}(?:\.\d{1,3}){3})''" | rex field=_raw "Z (?<dest>[\w\.]+)\s" | stats min(_time) as firstTime max(_time) as lastTime count by Datastore VMPath InitiatorTool ToolVersion InitiatorIP dest | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `esxi_vm_exported_via_remote_tool_filter`'
how_to_implement: This is based on syslog data generated by VMware ESXi hosts. To implement this search, you must configure your ESXi systems to forward syslog output to your Splunk deployment. These logs must be ingested with the appropriate Splunk Technology Add-on for VMware ESXi Logs, which provides field extractions and CIM compatibility.
known_false_positives: Administrators may use this command when troubleshooting. Tune as needed.
finding:
    title: VM downloaded from datastore on ESXi host $dest$.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - ESXi Post Compromise
    - Black Basta Ransomware
asset_type: Infrastructure
mitre_attack_id:
    - T1005
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`esxi_syslog` Message="*File download from path*" Message="*was initiated from*"

Stage 2: rex

| rex field=_raw "from path '\[(?<Datastore>[^\]]+)\](?<VMPath>[^']+)'"

Stage 3: rex

| rex field=_raw
    "initiated from '(?<InitiatorTool>[^/]+)/(?<ToolVersion>[^@]+)@(?<InitiatorIP>\d{1,3}(?:\.\d{1,3}){3})'"

Stage 4: rex

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

Stage 5: stats

| stats
    min(_time) as firstTime
    max(_time) as lastTime
    count
  by Datastore VMPath InitiatorTool ToolVersion InitiatorIP dest

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `esxi_vm_exported_via_remote_tool_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Messageeq
  • *File download from path*
  • *was initiated from*
field:"Message" kind:eq
sourcetypein
  • vmw-syslog corpus 23 (splunk 23)
  • vmware:esxlog* corpus 23 (splunk 23)
field:"sourcetype" kind:in

Go Run Execution

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

Malicious actors are beginning to turn to Golang as a malware language since it is not typically picked up by antivirus software. Although the language is about 10 years old, and is used by many legitimate programmers, there has not been as much activity with Golang malware. This use case looks for run executions by go.

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '6091.6541'
title: Go Run Execution
description: Malicious actors are beginning to turn to Golang as a malware language
  since it is not typically picked up by antivirus software. Although the language
  is about 10 years old, and is used by many legitimate programmers, there has not
  been as much activity with Golang malware. This use case looks for run executions
  by go.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_unix` (type=execve OR type=proctitle
  OR sourcetype=bash_history) TERM(GO) TERM(RUN) | rex field=_raw "(?i)proctitle\=(?<command_type>.+)"|
  eval process=mvappend(process, command_type)| fields - command_type | where isnotnull(process)
  | table _time, host, user process | bin span=1s | stats values(*) as * by _time,
  host '
techniques:
- execution:command and scripting interpreter
technique_id: 
- T1059
data_category:
- Process command-line parameters
references:
- https://www.f5.com/labs/articles/threat-intelligence/new-golang-malware-is-spreading-via-multiple-exploits-to-mine-mo

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_unix` (type=execve OR type=proctitle OR sourcetype=bash_history) TERM(GO) TERM(RUN)

Stage 2: rex

| rex field=_raw "(?i)proctitle\=(?<command_type>.+)"

Stage 3: eval

| eval process=mvappend(process, command_type)

Stage 4: fields

| fields - command_type

Stage 5: where

| where isnotnull(process)

Stage 6: table

| table _time, host, user process

Stage 7: bucket

| bin span=1s

Stage 8: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
processis_not_null
  • (no value, null check)
field:"CommandLine" kind:is_not_null
sourcetypeeq
  • bash_history corpus 6 (splunk 6)
field:"sourcetype" kind:eq value:"bash_history"
typeeq
  • execve corpus 37 (sigma 31, splunk 6)
  • proctitle corpus 6 (splunk 6)
field:"type" kind:eq

Search Terms

These SPL tokens match against raw event text.

StageTerm
1GO
1RUN

Known Process Injection Commands (Sysmon)

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

Adversaries may inject code into processes in order to evade process-based defenses as well as possibly elevate privileges. Process injection is a method of executing arbitrary code in the address space of a separate live process. Running code in the context of another process may allow access to the process's memory, system/network resources, and possibly elevated privileges. Execution via process injection may also evade detection from security products since the execution is masked under a legitimate process. This use case detects PowerShell commands associated with process injection.

MITRE ATT&CK Coverage

TacticTechniques
Privilege Escalation
Stealth

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '15997.24032'
title: Known Process Injection Commands
description: Adversaries may inject code into processes in order to evade process-based
  defenses as well as possibly elevate privileges. Process injection is a method of
  executing arbitrary code in the address space of a separate live process. Running
  code in the context of another process may allow access to the process's memory,
  system/network resources, and possibly elevated privileges. Execution via process
  injection may also evade detection from security products since the execution is
  masked under a legitimate process. This use case detects PowerShell commands associated
  with process injection.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
  ("VirtualAlloc" OR "VirtualAllocEx" OR "VirtualProtect" OR "LdrLoadDll" OR "LoadLibrary"
  OR "LoadLibraryA" OR "LoadLibraryEx" OR "GetProcAddress" OR "OpenProcess" OR "OpenProcessToken"
  OR "AdjustTokenPrivileges" OR "WriteProcessMemory" OR "CreateRemoteThread" OR "NtCreateThreadEx"
  OR "CreateThread" OR "QueueUserAPC" OR "SuspendThread" OR "ResumeThread" OR "GetDelegateForFunctionPointer")
  | table _time, host, user process, process_*, signature_id | bin span=1s | stats
  values(*) as * by _time, host '
techniques:
- privilege-escalation:process injection
technique_id: 
- T1055
data_category:
- Windows Sysmon
- Process command-line parameters
references: null

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") ("VirtualAlloc" OR "VirtualAllocEx" OR "VirtualProtect" OR "LdrLoadDll" OR "LoadLibrary" OR "LoadLibraryA" OR "LoadLibraryEx" OR "GetProcAddress" OR "OpenProcess" OR "OpenProcessToken" OR "AdjustTokenPrivileges" OR "WriteProcessMemory" OR "CreateRemoteThread" OR "NtCreateThreadEx" OR "CreateThread" OR "QueueUserAPC" OR "SuspendThread" OR "ResumeThread" OR "GetDelegateForFunctionPointer")

Stage 2: table

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

Stage 3: bucket

| bin span=1s

Stage 4: stats

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

Indicators

These rows show field, operator, and value matches.

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

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>1<"
1"VirtualAlloc"
1"VirtualAllocEx"
1"VirtualProtect"
1"LdrLoadDll"
1"LoadLibrary"
1"LoadLibraryA"
1"LoadLibraryEx"
1"GetProcAddress"
1"OpenProcess"
1"OpenProcessToken"
1"AdjustTokenPrivileges"
1"WriteProcessMemory"
1"CreateRemoteThread"
1"NtCreateThreadEx"
1"CreateThread"
1"QueueUserAPC"
1"SuspendThread"
1"ResumeThread"
1"GetDelegateForFunctionPointer"

O365 Compliance Content Search Started

#
Status
production
Severity
medium
Group by
ExchangeLocations, Query, aws::recipientAccountId, dest, signature, src, user, vendor_product
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic detects when a content search is initiated within the Office 365 Security and Compliance Center. It leverages the SearchCreated operation from the o365_management_activity logs under the SecurityComplianceCenter workload. This activity is significant as it may indicate an attempt to access sensitive organizational data, including emails and documents. If confirmed malicious, this could lead to unauthorized data access, potential data exfiltration, and compliance violations. Monitoring this behavior helps ensure the integrity and security of organizational data.

Known False Positives

  • Compliance content searches may be executed for legitimate purposes, filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

PlatformRecord / event type
Microsoft 365SearchCreated

Rule Body

name: O365 Compliance Content Search Started
id: f4cabbc7-c19a-4e41-8be5-98daeaccbb50
version: 12
creation_date: '2024-04-17'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects when a content search is initiated within the Office 365 Security and Compliance Center. It leverages the SearchCreated operation from the o365_management_activity logs under the SecurityComplianceCenter workload. This activity is significant as it may indicate an attempt to access sensitive organizational data, including emails and documents. If confirmed malicious, this could lead to unauthorized data access, potential data exfiltration, and compliance violations. Monitoring this behavior helps ensure the integrity and security of organizational data.
data_source: []
search: |-
    `o365_management_activity` Workload=SecurityComplianceCenter Operation=SearchCreated
      | rename user_id as user
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY signature dest user
           src vendor_account vendor_product
           ExchangeLocations Query
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `o365_compliance_content_search_started_filter`
how_to_implement: You must install the Splunk Microsoft Office 365 Add-on and ingest Office 365 management activity events.
known_false_positives: Compliance content searches may be executed for legitimate purposes, filter as needed.
references:
    - https://attack.mitre.org/techniques/T1114/002/
    - https://learn.microsoft.com/en-us/purview/ediscovery-content-search-overview
    - https://learn.microsoft.com/en-us/purview/ediscovery-keyword-queries-and-search-conditions
    - https://learn.microsoft.com/en-us/purview/ediscovery-search-for-activities-in-the-audit-log
finding:
    title: A new compliance content search was started by $user$
    entity:
        field: user
        type: user
        score: 50
analytic_story:
    - Office 365 Collection Techniques
asset_type: O365 Tenant
mitre_attack_id:
    - T1114.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: audit

Stages and Predicates

Stage 1: search

`o365_management_activity` Workload=SecurityComplianceCenter Operation=SearchCreated

Stage 2: rename

| rename user_id as user

Stage 3: fillnull

| fillnull

Stage 4: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY signature dest user
       src vendor_account vendor_product
       ExchangeLocations Query

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: search

| `o365_compliance_content_search_started_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Operationeq
  • SearchCreated
field:"Operation" kind:eq value:"SearchCreated"
Workloadeq
  • SecurityComplianceCenter corpus 8 (splunk 8)
field:"Workload" kind:eq value:"SecurityComplianceCenter"
sourcetypeeq
  • o365:management:activity corpus 80 (splunk 80)
field:"sourcetype" kind:eq value:"o365:management:activity"

Okta Mismatch Between Source and Response for Verify Push Request

#
Status
production
Severity
medium
Group by
"actor.alternateId", "authenticationContext.externalSessionId", "client.device", "client.ipAddress", "client.userAgent.rawUserAgent", "debugContext.debugData.behaviors", "debugContext.debugData.factor", "outcome.result", eventType, group_push_time
Author
John Murphy and Jordan Ruocco, Okta, Michael Haag, Bhavin Patel, Splunk
Source
github.com/splunk/security_content

The following analytic identifies discrepancies between the source and response events for Okta Verify Push requests, indicating potential suspicious behavior. It leverages Okta System Log events, specifically system.push.send_factor_verify_push and user.authentication.auth_via_mfa with the factor "OKTA_VERIFY_PUSH." The detection groups events by SessionID, calculates the ratio of successful sign-ins to push requests, and checks for session roaming and new device/IP usage. This activity is significant as it may indicate push spam or unauthorized access attempts. If confirmed malicious, attackers could bypass MFA, leading to unauthorized access to sensitive systems.

Known False Positives

  • False positives may be present based on organization size and configuration of Okta. Monitor, tune and filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: Okta Mismatch Between Source and Response for Verify Push Request
id: 8085b79b-9b85-4e67-ad63-351c9e9a5e9a
version: 11
creation_date: '2024-04-17'
modification_date: '2026-05-13'
author: John Murphy and Jordan Ruocco, Okta, Michael Haag, Bhavin Patel, Splunk
status: production
type: TTP
description: The following analytic identifies discrepancies between the source and response events for Okta Verify Push requests, indicating potential suspicious behavior. It leverages Okta System Log events, specifically `system.push.send_factor_verify_push` and `user.authentication.auth_via_mfa` with the factor "OKTA_VERIFY_PUSH." The detection groups events by SessionID, calculates the ratio of successful sign-ins to push requests, and checks for session roaming and new device/IP usage. This activity is significant as it may indicate push spam or unauthorized access attempts. If confirmed malicious, attackers could bypass MFA, leading to unauthorized access to sensitive systems.
data_source:
    - Okta
search: |-
    `okta` eventType IN (system.push.send_factor_verify_push) OR (eventType IN (user.authentication.auth_via_mfa) debugContext.debugData.factor="OKTA_VERIFY_PUSH")
      | eval groupby="authenticationContext.externalSessionId"
      | eval group_push_time=_time
      | bin span=2s group_push_time
      | fillnull value=NULL
      | stats min(_time) as _time
        BY authenticationContext.externalSessionId eventType debugContext.debugData.factor
           outcome.result actor.alternateId client.device
           client.ipAddress client.userAgent.rawUserAgent debugContext.debugData.behaviors
           group_push_time
      | iplocation client.ipAddress
      | fields - lat, lon, group_push_time
      | stats min(_time) as _time dc(client.ipAddress) as dc_ip sum(eval(if(eventType="system.push.send_factor_verify_push" AND $outcome.result$="SUCCESS", 1, 0))) as total_pushes sum(eval(if(eventType="user.authentication.auth_via_mfa" AND $outcome.result$="SUCCESS", 1, 0))) as total_successes sum(eval(if(eventType="user.authentication.auth_via_mfa" AND $outcome.result$="FAILURE", 1, 0))) as total_rejected sum(eval(if(eventType="system.push.send_factor_verify_push" AND $debugContext.debugData.behaviors$ LIKE "%New Device=POSITIVE%", 1, 0))) as suspect_device_from_source sum(eval(if(eventType="system.push.send_factor_verify_push" AND $debugContext.debugData.behaviors$ LIKE "%New IP=POSITIVE%", 1, 0))) as suspect_ip_from_source values(eval(if(eventType="system.push.send_factor_verify_push", $client.ipAddress$, ""))) as src values(eval(if(eventType="user.authentication.auth_via_mfa", $client.ipAddress$, ""))) as dest values(*) as *
        BY authenticationContext.externalSessionId
      | eval ratio = round(total_successes / total_pushes, 2)
      | search ((ratio < 0.5 AND total_pushes > 1) OR (total_rejected > 0)) AND dc_ip > 1 AND suspect_device_from_source > 0 AND suspect_ip_from_source > 0
      | rename actor.alternateId as user
      | `okta_mismatch_between_source_and_response_for_verify_push_request_filter`
how_to_implement: The analytic leverages Okta OktaIm2 logs to be ingested using the Splunk Add-on for Okta Identity Cloud (https://splunkbase.splunk.com/app/6553).
known_false_positives: False positives may be present based on organization size and configuration of Okta. Monitor, tune and filter as needed.
references:
    - https://attack.mitre.org/techniques/T1621
    - https://splunkbase.splunk.com/app/6553
finding:
    title: A mismatch between source and response for verifying a push request has occurred for $user$
    entity:
        field: user
        type: user
        score: 50
analytic_story:
    - Okta Account Takeover
    - Okta MFA Exhaustion
    - Scattered Lapsus$ Hunters
asset_type: Okta Tenant
mitre_attack_id:
    - T1621
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: access

Stages and Predicates

Stage 1: search

`okta` eventType IN (system.push.send_factor_verify_push) OR (
    eventType IN (user.authentication.auth_via_mfa)
    debugContext.debugData.factor="OKTA_VERIFY_PUSH"
)

Stage 2: eval

| eval groupby="authenticationContext.externalSessionId"

Stage 3: eval

| eval group_push_time=_time

Stage 4: bucket

| bin span=2s group_push_time

Stage 5: fillnull

| fillnull value=NULL

Stage 6: stats

| stats min(_time) as _time
    BY authenticationContext.externalSessionId eventType debugContext.debugData.factor
       outcome.result actor.alternateId client.device
       client.ipAddress client.userAgent.rawUserAgent debugContext.debugData.behaviors
       group_push_time

Stage 7: search

| iplocation client.ipAddress

Stage 8: fields

| fields - lat, lon, group_push_time

Stage 9: macro (not parsed)

| stats
    min(_time) as _time
    dc(client.ipAddress) as dc_ip
    sum(eval(if(eventType="system.push.send_factor_verify_push" AND $outcome.result$="SUCCESS", 1, 0))) as total_pushes
    sum(eval(if(eventType="user.authentication.auth_via_mfa" AND $outcome.result$="SUCCESS", 1, 0))) as total_successes
    sum(eval(if(eventType="user.authentication.auth_via_mfa" AND $outcome.result$="FAILURE", 1, 0))) as total_rejected
    sum(eval(if(eventType="system.push.send_factor_verify_push" AND $debugContext.debugData.behaviors$ LIKE "%New Device=POSITIVE%", 1, 0))) as suspect_device_from_source
    sum(eval(if(eventType="system.push.send_factor_verify_push" AND $debugContext.debugData.behaviors$ LIKE "%New IP=POSITIVE%", 1, 0))) as suspect_ip_from_source
    values(eval(if(eventType="system.push.send_factor_verify_push", $client.ipAddress$, ""))) as src
    values(eval(if(eventType="user.authentication.auth_via_mfa", $client.ipAddress$, ""))) as dest
    values(*) as *
  BY authenticationContext.externalSessionId

Stage 10: eval

| eval ratio = round(total_successes / total_pushes, 2)

Stage 11: search

| search ((ratio < 0.5 AND total_pushes > 1) OR (total_rejected > 0)) AND dc_ip > 1
    AND suspect_device_from_source > 0 AND suspect_ip_from_source > 0

Stage 12: rename

| rename actor.alternateId as user

Stage 13: search

| `okta_mismatch_between_source_and_response_for_verify_push_request_filter`

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
7iplocation
7client.ipAddress

PowerShell Downgrade (Windows Event Log)

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

Adversaries may downgrade or use a version of system features that may be outdated, vulnerable, and/or does not support updated security controls such as logging. For example, PowerShell versions 5+ includes Script Block Logging (SBL) which can record executed script content. However, adversaries may attempt to execute a previous version of PowerShell that does not support SBL with the intent to impair defenses while running malicious scripts that may have otherwise been detected. This use case detects attempts to execute PowerShell commands using a version earlier than 7

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '15846.23694'
title: PowerShell Downgrade
description: 'Adversaries may downgrade or use a version of system features that may
  be outdated, vulnerable, and/or does not support updated security controls such
  as logging. For example, PowerShell versions 5+ includes Script Block Logging (SBL)
  which can record executed script content. However, adversaries may attempt to execute
  a previous version of PowerShell that does not support SBL with the intent to impair
  defenses while running malicious scripts that may have otherwise been detected.
  This use case detects attempts to execute PowerShell commands using a version earlier
  than 7. -- Threat Actor Association: Earth Estries -- Atomics T1059.001 Test #12'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) TERM(-version) | regex process="(?i)powershell\.exe\s+-version\s+[123456]"
  | table _time, host, user process, process_*, signature_id | bin span=1s | stats
  values(*) as * by _time, host '
techniques:
- execution:command and scripting interpreter:powershell
- execution:command and scripting interpreter:windows command shell
technique_id:
- T1059.001
- T1059.003
data_category:
- Windows event logs
- Process command-line parameters
references:
- https://kurtroggen.wordpress.com/2017/05/17/powershell-security-powershell-downgrade-attacks/
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1059.001/T1059.001.md#atomic-test-12---powershell-downgrade-attack

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) TERM(-version)

Stage 2: regex

| regex process="(?i)powershell\.exe\s+-version\s+[123456]"

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
processregex_match
  • (?i)powershell.exe\s+-version\s+[123456] corpus 3 (splunk 3)
field:"CommandLine" kind:regex_match value:"(?i)powershell.exe\s+-version\s+[123456]"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"-version"

Remote .msi Installation (Windows Event Log)

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

Adversaries may abuse msiexec.exe to proxy execution of malicious payloads. Msiexec.exe is the command-line utility for the Windows Installer and is thus commonly associated with executing installation packages (.msi). The Msiexec.exe binary may also be digitally signed by Microsoft. This use case detects attempts to install .msi from remote locations

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '18093.30444'
title: Remote .msi Installation
description: 'Adversaries may abuse msiexec.exe to proxy execution of malicious payloads.
  Msiexec.exe is the command-line utility for the Windows Installer and is thus commonly
  associated with executing installation packages (.msi). The Msiexec.exe binary may
  also be digitally signed by Microsoft. This use case detects attempts to install
  .msi from remote locations. -- Threat Actor Association: APT-K-47/Mysterious Elephant
  -- Atomics T1218.007 Test #11'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) (TERM(/i) OR TERM(install)) ".msi") OR (TERM(EventCode=1040)
  OR TERM(EventCode=1042) OR "<EventID>1040<" OR "<EventID>1042<") "://" | where (match(process,
  "(?i)\w+tps?://\S+\.msi") and match(signature_id, "4688")) or (match(message, "(?i)\w+tps?://\S+\.msi")
  and match(signature_id, "1040|1042")) | table _time, host, user process, process_*,
  parent_* | bin span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:system binary proxy execution:msiexec
technique_id:
- T1218.007
data_category:
- Process command-line parameters
- Windows event logs
references:
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218.007/T1218.007.md#atomic-test-11---msiexecexe---execute-remote-msi-file

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) (TERM(/i) OR TERM(install)) ".msi") OR (TERM(EventCode=1040) OR TERM(EventCode=1042) OR "<EventID>1040<" OR "<EventID>1042<") "://"

Stage 2: where

| where (match(process, "(?i)\w+tps?://\S+\.msi") and match(signature_id, "4688")) or (
    match(message, "(?i)\w+tps?://\S+\.msi")
    and match(signature_id, "1040|1042")
)

Stage 3: table

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

Stage 4: bucket

| bin span=1s

Stage 5: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 1040 corpus 3 (splunk 3)
  • 1042 corpus 2 (splunk 2)
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq
messageregex_match
  • (?i)\w+tps?://\S+.msi corpus 2 (splunk 2)
field:"message" kind:regex_match value:"(?i)\w+tps?://\S+.msi"
processregex_match
  • (?i)\w+tps?://\S+.msi corpus 6 (splunk 6)
field:"CommandLine" kind:regex_match value:"(?i)\w+tps?://\S+.msi"
signature_idregex_match
    • 1040
    • 1042
    corpus 2 (splunk 2)
  • 4688 corpus 8 (splunk 8)
field:"signature_id" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"/i"
1install
1".msi"
1"<EventID>1040<"
1"<EventID>1042<"
1"://"

Schtasks scheduling job on remote system

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

The following analytic detects the use of 'schtasks.exe' to create a scheduled task on a remote system, indicating potential lateral movement or remote code execution. It leverages process data from Endpoint Detection and Response (EDR) agents, focusing on specific command-line arguments and flags. This activity is significant as it may signify an adversary's attempt to persist or execute code remotely. If confirmed malicious, this could allow attackers to maintain access, execute arbitrary commands, or further infiltrate the network, posing a severe security risk.

Known False Positives

  • While it is possible to have false positives, due to legitimate administrative tasks, these are usually limited and should still be validated and investigated as appropriate.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Schtasks scheduling job on remote system
id: 1297fb80-f42a-4b4a-9c8a-88c066237cf6
version: 20
creation_date: '2019-10-16'
modification_date: '2026-05-13'
author: David Dorsey, Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects the use of 'schtasks.exe' to create a scheduled task on a remote system, indicating potential lateral movement or remote code execution. It leverages process data from Endpoint Detection and Response (EDR) agents, focusing on specific command-line arguments and flags. This activity is significant as it may signify an adversary's attempt to persist or execute code remotely. If confirmed malicious, this could allow attackers to maintain access, execute arbitrary commands, or further infiltrate the network, posing a severe security risk.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE (
            Processes.process_name = schtasks.exe
            OR
            Processes.original_file_name=schtasks.exe
        )
        (Processes.process="*/create*" AND Processes.process="*/s *")
      BY Processes.action Processes.dest Processes.original_file_name
         Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
         Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
         Processes.process Processes.process_exec Processes.process_guid
         Processes.process_hash Processes.process_id Processes.process_integrity_level
         Processes.process_name Processes.process_path Processes.user
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `schtasks_scheduling_job_on_remote_system_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: While it is possible to have false positives, due to legitimate administrative tasks, these are usually limited and should still be validated and investigated as appropriate.
references: []
finding:
    title: A scheduled task process $process_name$ with remote job command-line $process$ on host $dest$ by $user$.
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: A scheduled task process $process_name$ with remote job command-line $process$ on host $dest$ by $user$.
threat_objects:
    - field: process_name
      type: process_name
analytic_story:
    - Scheduled Tasks
    - Phemedrone Stealer
    - Living Off The Land
    - Prestige Ransomware
    - Quasar RAT
    - RedLine Stealer
    - Active Directory Lateral Movement
    - NOBELIUM Group
    - Compromised Windows Host
asset_type: Endpoint
mitre_attack_id:
    - T1053.005
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE (
      Processes.process_name = schtasks.exe
      OR Processes.original_file_name=schtasks.exe
  )
    (Processes.process="*/create*" AND Processes.process="*/s *")
  BY
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `schtasks_scheduling_job_on_remote_system_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • schtasks.exe corpus 29 (sigma 18, elastic 7, splunk 4)
field:"OriginalFileName" kind:eq value:"schtasks.exe"
Processes.processeq
  • */create* corpus 8 (sigma 6, splunk 2)
  • */s * corpus 7 (sigma 6, splunk 1)
field:"CommandLine" kind:eq
Processes.process_nameeq
  • schtasks.exe corpus 30 (elastic 19, splunk 11)
field:"process_basename" kind:eq value:"schtasks.exe"

Sdelete Application Execution

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

The following analytic detects the execution of the sdelete.exe application, a Sysinternals tool often used by adversaries to securely delete files and remove forensic evidence from a targeted host. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process execution logs. Monitoring this activity is crucial as sdelete.exe is not commonly used in regular operations and its presence may indicate an attempt to cover malicious activities. If confirmed malicious, this could lead to the loss of critical forensic data, hindering incident response and investigation efforts.

Known False Positives

  • user may execute and use this application

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Sdelete Application Execution
id: 31702fc0-2682-11ec-85c3-acde48001122
version: 14
creation_date: '2021-10-06'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects the execution of the sdelete.exe application, a Sysinternals tool often used by adversaries to securely delete files and remove forensic evidence from a targeted host. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process execution logs. Monitoring this activity is crucial as sdelete.exe is not commonly used in regular operations and its presence may indicate an attempt to cover malicious activities. If confirmed malicious, this could lead to the loss of critical forensic data, hindering incident response and investigation efforts.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` values(Processes.process) as process values(Processes.parent_process) as parent_process values(Processes.process_id) as process_id count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE (
            Processes.process_name="sdelete.exe"
            OR
            Processes.original_file_name="sdelete.exe"
        )
      BY Processes.action Processes.dest Processes.original_file_name
         Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
         Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
         Processes.process Processes.process_exec Processes.process_guid
         Processes.process_hash Processes.process_id Processes.process_integrity_level
         Processes.process_name Processes.process_path Processes.user
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `sdelete_application_execution_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: user may execute and use this application
references:
    - https://app.any.run/tasks/956f50be-2c13-465a-ac00-6224c14c5f89/
finding:
    title: sdelete process $process_name$ executed on $dest$
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: sdelete process $process_name$ executed on $dest$
analytic_story:
    - Masquerading - Rename System Utilities
    - Scattered Spider
    - Void Manticore
asset_type: Endpoint
mitre_attack_id:
    - T1070.004
    - T1485
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    values(Processes.process) as process
    values(Processes.parent_process) as parent_process
    values(Processes.process_id) as process_id
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE (
      Processes.process_name="sdelete.exe"
      OR Processes.original_file_name="sdelete.exe"
  )
  BY
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `sdelete_application_execution_filter`

Indicators

These rows show field, operator, and value matches.

Suspicious Parent Process for spoolsv.exe (Windows Event Log)

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

This use case detects when the Windows print spooler process (spoolsv.exe) is executed as a child from an unexpected parent process. This can indicate process injection/hollowing, masquerading, or other suspicious activity. The expected parent process for spoolsv.exe is services.exe.

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '16165.24269'
title: Suspicious Parent Process for spoolsv.exe
description: This use case detects when the Windows print spooler process (spoolsv.exe)
  is executed as a child from an unexpected parent process. This can indicate process
  injection/hollowing, masquerading, or other suspicious activity. The expected parent
  process for spoolsv.exe is services.exe.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) "spoolsv.exe" | regex process_path="(?i)\x5csystem32\x5cspoolsv\.exe"|
  regex parent_process_name!="(?i)services\.exe|\%14\!S\!"| where isnotnull(parent_process_name)
  and not match(parent_process_name, "^-$") | table _time, host, user process, process_*,
  parent_process_name, parent_process_* | bin span=1s | stats values(*) as * by _time,
  host '
techniques:
- defense-evasion:masquerading:masquerade task or service
- defense-evasion:process injection
technique_id:
- T1036.004
- T1055
data_category:
- Windows event logs
references:
- https://andreafortuna.org/2017/06/15/standard-windows-processes-a-brief-reference/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) "spoolsv.exe"

Stage 2: regex

| regex process_path="(?i)\x5csystem32\x5cspoolsv\.exe"

Stage 3: regex

| regex parent_process_name!="(?i)services\.exe|\%14\!S\!"

Stage 4: where

| where isnotnull(parent_process_name) and not match(parent_process_name, "^-$")

Stage 5: table

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

Stage 6: bucket

| bin span=1s

Stage 7: stats

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

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
parent_process_nameis_not_null
  • (no value, null check)
field:"parent_process_name" kind:is_not_null
process_pathregex_match
  • (?i)\x5csystem32\x5cspoolsv.exe corpus 2 (splunk 2)
field:"process_name" kind:regex_match value:"(?i)\x5csystem32\x5cspoolsv.exe"

Exclusions

The rule actively suppresses these predicates.

Search Terms

These SPL tokens match against raw event text.

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

Windows Rasautou DLL Execution

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

The following analytic detects the execution of an arbitrary DLL by the Windows Remote Auto Dialer (rasautou.exe). This behavior is identified by analyzing process creation events where rasautou.exe is executed with specific command-line arguments. This activity is significant because it leverages a Living Off The Land Binary (LOLBin) to execute potentially malicious code, bypassing traditional security controls. If confirmed malicious, this technique could allow an attacker to execute arbitrary code, potentially leading to system compromise, privilege escalation, or persistent access within the environment.

Known False Positives

  • False positives will be limited to applications that require Rasautou.exe to load a DLL from disk. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Rasautou DLL Execution
id: 6f42b8be-8e96-11ec-ad5a-acde48001122
version: 15
creation_date: '2022-02-09'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic detects the execution of an arbitrary DLL by the Windows Remote Auto Dialer (rasautou.exe). This behavior is identified by analyzing process creation events where rasautou.exe is executed with specific command-line arguments. This activity is significant because it leverages a Living Off The Land Binary (LOLBin) to execute potentially malicious code, bypassing traditional security controls. If confirmed malicious, this technique could allow an attacker to execute arbitrary code, potentially leading to system compromise, privilege escalation, or persistent access within the environment.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.process_name=rasautou.exe Processes.process="* -d *"AND Processes.process="* -p *"
      BY Processes.action Processes.dest Processes.original_file_name
         Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
         Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
         Processes.process Processes.process_exec Processes.process_guid
         Processes.process_hash Processes.process_id Processes.process_integrity_level
         Processes.process_name Processes.process_path Processes.user
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_rasautou_dll_execution_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: False positives will be limited to applications that require Rasautou.exe to load a DLL from disk. Filter as needed.
references:
    - https://github.com/mandiant/DueDLLigence
    - https://github.com/MHaggis/notes/blob/master/utilities/Invoke-SPLDLLigence.ps1
    - https://gist.github.com/NickTyrer/c6043e4b302d5424f701f15baf136513
    - https://www.mandiant.com/resources/staying-hidden-on-the-endpoint-evading-detection-with-shellcode
finding:
    title: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ attempting to load a DLL in a suspicious manner.
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process_name
      type: process_name
analytic_story:
    - Compromised Windows Host
    - Windows Defense Evasion Tactics
    - Hellcat Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1055.001
    - T1218
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.process_name=rasautou.exe Processes.process="* -d *"AND Processes.process="* -p *"
  BY
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_rasautou_dll_execution_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • * -d * corpus 8 (sigma 7, splunk 1)
  • * -p * corpus 12 (sigma 8, splunk 4)
field:"CommandLine" kind:eq
Processes.process_nameeq
  • rasautou.exe corpus 2 (elastic 1, splunk 1)
field:"process_basename" kind:eq value:"rasautou.exe"

Windows TeamCity Payload Execution from Temp Directory

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

Detects the bundled TeamCity java executing a payload out of the temp directory. This activity can be associated with a malicious plugin installed by metasploit for remote code execution.

Known False Positives

  • Legitimate TeamCity operations or updates may occasionally run java processes from the temp directory. Review and filter based on verified TeamCity activity.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows TeamCity Payload Execution from Temp Directory
id: 937c59be-0975-4097-ae45-f07c894f9ff4
version: 2
creation_date: '2026-05-05'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: TTP
description: |-
    Detects the bundled TeamCity java executing a payload out of the temp directory.
    This activity can be associated with a malicious plugin installed by metasploit for remote code execution.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly`
      count min(_time) as firstTime
            max(_time) as lastTime

    from datamodel=Endpoint.Processes where

    Processes.process="*-classpath *"
    Processes.process="*:\\Windows\\TEMP\\~spawn*"
    Processes.process="*.tmp.dir *"
    Processes.process="*.Payload*"
    Processes.process="*TeamCity*"

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

    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_teamcity_payload_execution_from_temp_directory_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Legitimate TeamCity operations or updates may occasionally run java processes from the temp directory. Review and filter based on verified TeamCity activity.
references:
    - https://thehackernews.com/2024/03/critical-jetbrains-teamcity-on-premises.html
    - https://github.com/sfewer-r7/metasploit-framework/blob/CVE-2024-27198/modules/exploits/multi/http/jetbrains_teamcity_rce_cve_2024_27198.rb
    - https://www.rapid7.com/blog/post/2024/03/04/etr-cve-2024-27198-and-cve-2024-27199-jetbrains-teamcity-multiple-authentication-bypass-vulnerabilities-fixed/
finding:
    title: Potential suspicious TeamCity activity observed on $dest$ via $process$.
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: parent_process_name
      type: parent_process_name
    - field: process
      type: process
analytic_story:
    - JetBrains TeamCity Vulnerabilities
    - JetBrains TeamCity Unauthenticated RCE
asset_type: Endpoint
mitre_attack_id:
    - T1190
    - T1505.003
    - T1059
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

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

from datamodel=Endpoint.Processes where

Processes.process="*-classpath *"
Processes.process="*:\\Windows\\TEMP\\~spawn*"
Processes.process="*.tmp.dir *"
Processes.process="*.Payload*"
Processes.process="*TeamCity*"

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

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_teamcity_payload_execution_from_temp_directory_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processeq
  • *-classpath * corpus 2 (splunk 2)
  • *.Payload* corpus 2 (splunk 2)
  • *.tmp.dir *
  • *:\Windows\TEMP\~spawn*
  • *TeamCity*
field:"CommandLine" kind:eq

Back to all Splunk rules