Detection rules › Splunk
Splunk rules: 1h
AWS Bedrock Claude Possible Prompt Injection
#This search surfaces AWS Bedrock Claude prompts containing phrases commonly associated with prompt injection or jailbreak attempts, such as instruction overrides, persona switching, or requests to ignore prior guidance. These strings are not inherently malicious on their own - many of them (for example "act as", "you must", or "new persona") appear routinely in legitimate system prompts, few-shot examples, and role-play or creative-writing use cases. This is a hunting search rather than an anomaly detection because the base rate of benign matches is high; use it to pivot into the surrounding conversation and look for corroborating signals such as the phrase appearing mid-conversation rather than in an expected system/few-shot prompt, the user attempting to override guardrails or safety instructions rather than set a benign persona, instructions that follow the injected phrase requesting privilege escalation, data exfiltration, or access to restricted tools/resources, repeated or iterative attempts from the same user/role after being refused, and injected phrases originating from untrusted input (e.g., retrieved documents or tool output) rather than the human user turn.
Known False Positives
- These phrases have a high benign base rate. Terms like "act as", "you must", "from now on", and "new persona" are commonly found in legitimate system prompts and few-shot examples used to steer model behavior, as well as in role-play or creative writing requests from users. A match on its own is not evidence of an attack; review the surrounding conversation, the message role (system vs. user vs. tool output), and whether the phrase is followed by a request to bypass safety controls or access sensitive data/tools before treating a hit as suspicious.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Privilege Escalation | |
| Stealth |
Rule Body
name: AWS Bedrock Claude Possible Prompt Injection
id: 9e162548-3e9a-4a74-9eb5-34ee28350f07
version: 1
creation_date: '2026-07-06'
modification_date: '2026-07-06'
author: Rod Soto
status: production
type: Hunting
description: This search surfaces AWS Bedrock Claude prompts containing phrases commonly associated with prompt injection or jailbreak attempts, such as instruction overrides, persona switching, or requests to ignore prior guidance. These strings are not inherently malicious on their own - many of them (for example "act as", "you must", or "new persona") appear routinely in legitimate system prompts, few-shot examples, and role-play or creative-writing use cases. This is a hunting search rather than an anomaly detection because the base rate of benign matches is high; use it to pivot into the surrounding conversation and look for corroborating signals such as the phrase appearing mid-conversation rather than in an expected system/few-shot prompt, the user attempting to override guardrails or safety instructions rather than set a benign persona, instructions that follow the injected phrase requesting privilege escalation, data exfiltration, or access to restricted tools/resources, repeated or iterative attempts from the same user/role after being refused, and injected phrases originating from untrusted input (e.g., retrieved documents or tool output) rather than the human user turn.
data_source:
- AWS Bedrock Claude
search: |-
`aws_bedrock_claude`
| rename "identity.arn" AS user_arn, "input.inputBodyJson.messages{}.content{}.text" AS prompt_mv
| eval prompt_text = mvjoin(prompt_mv, " || ")
| where isnotnull(prompt_text) AND isnotnull(user_arn)
| rex field=user_arn "(?:assumed-role/[^/]+|user)/(?<user>[^\"/]+)$"
| eval s_override = if(match(prompt_text,"(?i)\b(ignore|disregard|forget)\b.{0,30}\b(previous|above|prior|all|your|the)\s*(instructions?|prompts?|rules?|context)"),1,0)
| eval s_jailbreak = if(match(prompt_text,"(?i)\b(jailbreak|jailbroken|\bDAN\b mode|do anything now|developer mode|unrestricted mode|no (filters|restrictions|guardrails))\b"),1,0)
| eval s_probe = if(match(prompt_text,"(?i)(reveal|repeat|print|show|output).{0,20}(system prompt|your instructions|initial (prompt|instructions)|the (text|words) above)"),1,0)
| eval s_persona = if(match(prompt_text,"(?i)\b(you are now|new persona|pretend (to be|you are)|roleplay as|act as (if you|an unrestricted))\b"),1,0)
| eval s_weak = if(match(prompt_text,"(?i)\b(you must|from now on|act as|override|new rules|hypothetically)\b"),1,0)
| eval signal_count = s_override+s_jailbreak+s_probe+s_persona+s_weak
| where s_override=1 OR s_jailbreak=1 OR s_probe=1 OR signal_count >= 2
| table _time, user, user_arn, modelId, prompt_text, host
| sort - _time
| `aws_bedrock_claude_possible_prompt_injection_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: These phrases have a high benign base rate. Terms like "act as", "you must", "from now on", and "new persona" are commonly found in legitimate system prompts and few-shot examples used to steer model behavior, as well as in role-play or creative writing requests from users. A match on its own is not evidence of an attack; review the surrounding conversation, the message role (system vs. user vs. tool output), and whether the phrase is followed by a request to bypass safety controls or access sensitive data/tools before treating a hit as suspicious.
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
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: rename
| rename "identity.arn" AS user_arn, "input.inputBodyJson.messages{}.content{}.text" AS prompt_mv
Stage 3: eval
| eval prompt_text = mvjoin(prompt_mv, " || ")
Stage 4: where
| where isnotnull(prompt_text) AND isnotnull(user_arn)
Stage 5: rex
| rex field=user_arn "(?:assumed-role/[^/]+|user)/(?<user>[^\"/]+)$"
Stage 6: eval
| eval
s_override = if(
match(
prompt_text,
"(?i)\b(ignore|disregard|forget)\b.{0,30}\b(previous|above|prior|all|your|the)\s*(instructions?|prompts?|rules?|context)"
),
1,
0
)
s_override =match(prompt_text, "(?i)\b(ignore|disregard|forget)\b.{0,30}\b(previous|above|prior|all|your|the)\s*(instructions?|prompts?|rules?|context)")10Stage 7: eval
| eval
s_jailbreak = if(
match(
prompt_text,
"(?i)\b(jailbreak|jailbroken|\bDAN\b mode|do anything now|developer mode|unrestricted mode|no (filters|restrictions|guardrails))\b"
),
1,
0
)
s_jailbreak =match(prompt_text, "(?i)\b(jailbreak|jailbroken|\bDAN\b mode|do anything now|developer mode|unrestricted mode|no (filters|restrictions|guardrails))\b")10Stage 8: eval
| eval
s_probe = if(
match(
prompt_text,
"(?i)(reveal|repeat|print|show|output).{0,20}(system prompt|your instructions|initial (prompt|instructions)|the (text|words) above)"
),
1,
0
)
s_probe =match(prompt_text, "(?i)(reveal|repeat|print|show|output).{0,20}(system prompt|your instructions|initial (prompt|instructions)|the (text|words) above)")10Stage 9: eval
| eval
s_persona = if(
match(
prompt_text,
"(?i)\b(you are now|new persona|pretend (to be|you are)|roleplay as|act as (if you|an unrestricted))\b"
),
1,
0
)
s_persona =match(prompt_text, "(?i)\b(you are now|new persona|pretend (to be|you are)|roleplay as|act as (if you|an unrestricted))\b")10Stage 10: eval
| eval
s_weak = if(
match(prompt_text,"(?i)\b(you must|from now on|act as|override|new rules|hypothetically)\b"),
1,
0
)
s_weak =match(prompt_text, "(?i)\b(you must|from now on|act as|override|new rules|hypothetically)\b")10Stage 11: eval
| eval signal_count = s_override+s_jailbreak+s_probe+s_persona+s_weak
Stage 12: where
| where s_override=1 OR s_jailbreak=1 OR s_probe=1 OR signal_count >= 2
Stage 13: table
| table _time, user, user_arn, modelId, prompt_text, host
Stage 14: sort
| sort - _time
Stage 15: search
| `aws_bedrock_claude_possible_prompt_injection_filter`
Indicators
These rows show field, operator, and value matches.
Cisco Isovalent - Non Allowlisted Image Use
#The following analytic detects use of container images that fall outside an approved allowlist, leveraging Cisco Isovalent/Tetragon runtime telemetry (image name and workload identity). Adversaries commonly introduce untrusted or newly published images to deploy tooling, establish persistence, or abuse supply‑chain trust. This behavior may indicate image pulls from unauthorized registries, execution of unvetted software, or a drift from established deployment baselines. Extra scrutiny is warranted for namespaces and workloads that normally source images from restricted registries, and for pods that suddenly begin running images outside expected prefixes. Maintain an environment‑specific allowlist via the macro cisco_isovalent_allowed_images (for example, allow trusted registries/prefixes such as ImageName="gcr.io/org/", "registry.local/", or "myco/*") and keep it updated as new baseline images are introduced. This analytic alerts on images NOT matching the allowlist.
Known False Positives
- New legitimate images during rollouts or blue/green deployments may appear until the allowlist is updated. Coordinate with platform/DevOps teams to synchronize allowlist changes.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Execution |
Rule Body
name: Cisco Isovalent - Non Allowlisted Image Use
id: 9f2b7b1d-6c2f-4f2d-9a8b-8a1d7c5f2e11
version: 5
creation_date: '2026-01-05'
modification_date: '2026-05-13'
author: Bhavin Patel, Splunk
status: production
type: Anomaly
description: |
The following analytic detects use of container images that fall outside an approved
allowlist, leveraging Cisco Isovalent/Tetragon runtime telemetry (image name and
workload identity). Adversaries commonly introduce untrusted or newly published
images to deploy tooling, establish persistence, or abuse supply‑chain trust. This
behavior may indicate image pulls from unauthorized registries, execution of
unvetted software, or a drift from established deployment baselines. Extra scrutiny
is warranted for namespaces and workloads that normally source images from restricted
registries, and for pods that suddenly begin running images outside expected
prefixes.
Maintain an environment‑specific allowlist via the macro `cisco_isovalent_allowed_images`
(for example, allow trusted registries/prefixes such as ImageName="gcr.io/org/*",
"registry.local/*", or "myco/*") and keep it updated as new baseline images are
introduced. This analytic alerts on images NOT matching the allowlist.
data_source:
- Cisco Isovalent Process Exec
search: |
`cisco_isovalent_process_exec` pod_name!=""
| search NOT `cisco_isovalent_allowed_images`
| stats count
min(_time) as firstTime
max(_time) as lastTime
by pod_image_name pod_namespace pod_name process_name cluster_name
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `cisco_isovalent___non_allowlisted_image_use_filter`
how_to_implement: The detection is based on process execution data generated by Cisco Isovalent Runtime Security. Ensure that Isovalent Runtime Security is deployed and configured in your Kubernetes environment to emit process_exec events. Configure the Cisco Security Cloud TA to collect these logs via HTTP Event Collector (HEC) and normalize them into the Splunk Common Information Model. This integration ensures that all relevant pod, container, and process activity is captured for monitoring and detection of suspicious behavior. Create and maintain an environment‑specific macro named`cisco_isovalent_allowed_images` that returns true for approved images, for example:(ImageName="gcr.io/org/app:*" OR ImageName="registry.local/*" OR ImageName="myco/*"). The search alerts on images NOT matching that allowlist. Tune by namespace or team as needed.
known_false_positives: New legitimate images during rollouts or blue/green deployments may appear until the allowlist is updated. Coordinate with platform/DevOps teams to synchronize allowlist changes.
references:
- https://dev.to/thenjdevopsguy/attacking-a-kubernetes-cluster-enter-red-team-mode-2onj
- https://www.reddit.com/r/kubernetes/comments/l6e5yr/one_of_our_kubernetes_containers_was_compromised/
intermediate_findings:
entities:
- field: pod_name
type: system
score: 20
message: Non Allowlisted image [$pod_image_name$] used by pod [$pod_name$] in the cluster [$cluster_name$]
threat_objects:
- field: process_name
type: process_name
analytic_story:
- Cisco Isovalent Suspicious Activity
asset_type: Kubernetes
mitre_attack_id:
- T1204.003
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: network
Stages and Predicates
Stage 1: search
`cisco_isovalent_process_exec` pod_name!=""
Stage 2: search
| search NOT `cisco_isovalent_allowed_images`
Stage 3: stats
| stats count
min(_time) as firstTime
max(_time) as lastTime
by pod_image_name pod_namespace pod_name process_name cluster_name
Stage 4: search
| `security_content_ctime(firstTime)`
Stage 5: search
| `security_content_ctime(lastTime)`
Stage 6: search
| `cisco_isovalent___non_allowlisted_image_use_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sourcetype | eq |
| field:"sourcetype" kind:eq value:"cisco:isovalent:processExec" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
pod_image_name | in | docker.io/grafana/grafana:12.0.1, docker.io/library/ubuntu:22.04, quay.io/isovalent-dev/tetragon-ci*, quay.io/isovalent/hubble-export-fluentd*, quay.io/isovalent/tetragon-ci* | excludes:pod_image_name |
Conhost.exe Kernel call (Windows Event Log)
#conhost. exe ForceV1 asks for information directly from the kernel space, conhost connects to the console application. Usecase Identifies potentially suspicious Conhost execution paired with additional processes
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Execution | |
| Stealth |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
id: '5541.5782'
title: Conhost.exe Kernel call
description: 'conhost. exe ForceV1 asks for information directly from the kernel space,
conhost connects to the console application. Usecase Identifies potentially suspicious
Conhost execution paired with additional processes. - Software Association: Trojan.Killdisk/HermeticWiper,
Snatch'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
"<EventID>4688<" OR Type=Process) NOT (TERM(usoclient.exe) OR TERM(devicecensus.exe)
OR TERM(ProgramData) OR "Program Files" OR "wmiprvse.exe") | regex process="^\S+\s"
| table _time, host, user, process, process_*, parent_*, signature_id | bin span=1s
| stats values(*) as * by _time, host | regex process="conhost.exe 0xffffffff -ForceV1"|
where mvcount(process)>1 '
techniques:
- defense-evasion:indirect command execution
- execution:command and scripting interpreter
- defense-evasion:exploitation for defense evasion
technique_id:
- T1202
- T1059
- T1211
data_category:
- Windows event logs
references:
- https://medium.com/@clermont1050/covid-19-cyber-infection-c615ead7c29
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) NOT (TERM(usoclient.exe) OR TERM(devicecensus.exe) OR TERM(ProgramData) OR "Program Files" OR "wmiprvse.exe")
Stage 2: regex
| regex process="^\S+\s"
Stage 3: table
| table _time, host, user, process, process_*, parent_*, signature_id
Stage 4: bucket
| bin span=1s
Stage 5: stats
| stats values(*) as * by _time, host
Stage 6: regex
| regex process="conhost.exe 0xffffffff -ForceV1"
Stage 7: where
| where mvcount(process)>1
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"4688" |
process | regex_match |
| field:"CommandLine" kind:regex_match |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>4688<" |
Detect RTLO In File Name
#The following analytic identifies the use of the right-to-left override (RTLO) character in file names. It leverages data from the Endpoint.Filesystem datamodel, specifically focusing on file creation events and file names containing the RTLO character (U+202E). This activity is significant because adversaries use RTLO to disguise malicious files as benign by reversing the text that follows the character. If confirmed malicious, this technique can deceive users and security tools, leading to the execution of harmful files and potential system compromise.
Known False Positives
- Implementation in regions that use right to left in native language.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Stealth |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 11: FileCreate |
Rule Body
name: Detect RTLO In File Name
id: 468b7e11-d362-43b8-b6ec-7a2d3b246678
version: 13
creation_date: '2023-05-01'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: TTP
description: |
The following analytic identifies the use of the right-to-left override
(RTLO) character in file names. It leverages data from the Endpoint.Filesystem datamodel,
specifically focusing on file creation events and file names containing the RTLO
character (U+202E). This activity is significant because adversaries use RTLO to
disguise malicious files as benign by reversing the text that follows the character.
If confirmed malicious, this technique can deceive users and security tools, leading
to the execution of harmful files and potential system compromise.
data_source:
- Sysmon EventID 11
search: |
| tstats `security_content_summariesonly`
count min(_time) as firstTime
max(_time) as lastTime
values(Filesystem.file_create_time) as file_create_time
from datamodel=Endpoint.Filesystem where Filesystem.file_name!=unknown
by Filesystem.action Filesystem.dest Filesystem.file_access_time
Filesystem.file_create_time Filesystem.file_hash Filesystem.file_modify_time
Filesystem.file_name Filesystem.file_path Filesystem.file_acl
Filesystem.file_size Filesystem.process_guid Filesystem.process_id
Filesystem.user Filesystem.vendor_product
| `drop_dm_object_name(Filesystem)`
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| regex file_name = "\\x{202E}"
| rex field=file_name "(?<RTLO_file_1>.+)(?<RTLO_exist_file>\\x{202E})(?<RTLO_file_2>.+)"
| eval file_name_with_RTLO=file_name
| eval file_name=RTLO_file_1.RTLO_file_2
| fields - RTLO*
| `detect_rtlo_in_file_name_filter`
how_to_implement: |
To successfully implement this search you need to be ingesting information
on process that includes the full command line of the process being launched on
your endpoints into the `Endpoint` datamodel in the `Processes` node. In addition,
confirm the latest CIM App 4.20 or higher is installed and the latest TA for the
endpoint product.
known_false_positives: |
Implementation in regions that use right to left in native language.
references:
- https://attack.mitre.org/techniques/T1036/002/
- https://resources.infosecinstitute.com/topic/spoof-using-right-to-left-override-rtlo-technique-2/
- https://www.trendmicro.com/en_us/research/17/f/following-trail-blacktech-cyber-espionage-campaigns.html
finding:
title: Suspicious RTLO detected in $file_name$ on endpoint $dest$ by user $user$.
entity:
field: user
type: user
score: 50
intermediate_findings:
entities:
- field: dest
type: system
score: 50
message: Suspicious RTLO detected in $file_name$ on endpoint $dest$ by user $user$.
threat_objects:
- field: file_name
type: file_name
analytic_story:
- Spearphishing Attachments
asset_type: Endpoint
mitre_attack_id:
- T1036.002
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: tstats
| tstats `security_content_summariesonly`
count min(_time) as firstTime
max(_time) as lastTime
values(Filesystem.file_create_time) as file_create_time
from datamodel=Endpoint.Filesystem where Filesystem.file_name!=unknown
by Filesystem.action Filesystem.dest Filesystem.file_access_time
Filesystem.file_create_time Filesystem.file_hash Filesystem.file_modify_time
Filesystem.file_name Filesystem.file_path Filesystem.file_acl
Filesystem.file_size Filesystem.process_guid Filesystem.process_id
Filesystem.user Filesystem.vendor_product
Stage 2: search
| `drop_dm_object_name(Filesystem)`
Stage 3: search
| `security_content_ctime(firstTime)`
Stage 4: search
| `security_content_ctime(lastTime)`
Stage 5: regex
| regex file_name = "\\x{202E}"
Stage 6: rex
| rex field=file_name "(?<RTLO_file_1>.+)(?<RTLO_exist_file>\\x{202E})(?<RTLO_file_2>.+)"
Stage 7: eval
| eval file_name_with_RTLO=file_name
Stage 8: eval
| eval file_name=RTLO_file_1.RTLO_file_2
Stage 9: fields
| fields - RTLO*
Stage 10: search
| `detect_rtlo_in_file_name_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Filesystem.file_name | ne |
| field:"file_name" kind:ne value:"unknown" |
file_name | regex_match |
| field:"file_name" kind:regex_match value:"\x{202E}" |
Domain Controller Enumeration via nltest (Windows Event Log)
#Adversaries may attempt to get a listing of other systems by IP address, hostname, or other logical identifier on a network that may be used for Lateral Movement from the current system. Functionality could exist within remote access tools to enable this, but utilities available on the operating system could also be used such as Nltest. Adversaries may look for details about the network configuration and settings, such as IP and/or MAC addresses, of systems they access or through information discovery of remote systems. Several operating system administration utilities exist that can be used to gather this information. Examples include Arp, ipconfig/ifconfig, nbtstat, and route. This use case detects nltest executions with options dclist or dsgetdc.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Discovery |
References
- https://attack.mitre.org/techniques/T1016/
- https://attack.mitre.org/techniques/T1018/
- https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_nltest_recon.yml
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1018/T1018.md#atomic-test-3---remote-system-discovery---nltest
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
id: '33360.59025'
title: Domain Controller Enumeration via nltest
description: Adversaries may attempt to get a listing of other systems by IP address,
hostname, or other logical identifier on a network that may be used for Lateral
Movement from the current system. Functionality could exist within remote access
tools to enable this, but utilities available on the operating system could also
be used such as Nltest. Adversaries may look for details about the network configuration
and settings, such as IP and/or MAC addresses, of systems they access or through
information discovery of remote systems. Several operating system administration
utilities exist that can be used to gather this information. Examples include Arp,
ipconfig/ifconfig, nbtstat, and route. This use case detects nltest executions with
options dclist or dsgetdc.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
"<EventID>4688<" OR Type=Process) TERM(nltest) (TERM(dclist) OR TERM(dsgetdc)) |
table _time, host, user, process, process_*, parent_* | bin span=1s | stats values(*)
as * by _time, host '
techniques:
- discovery:system network configuration discovery
- discovery:remote system discovery
technique_id:
- T1016
- T1018
data_category:
- Process command-line parameters
- Windows event logs
references:
- https://attack.mitre.org/techniques/T1016/
- https://attack.mitre.org/techniques/T1018/
- https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_nltest_recon.yml
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1018/T1018.md#atomic-test-3---remote-system-discovery---nltest
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) TERM(nltest) (TERM(dclist) OR TERM(dsgetdc))
Stage 2: table
| table _time, host, user, process, process_*, parent_*
Stage 3: bucket
| bin span=1s
Stage 4: stats
| stats values(*) as * by _time, host
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"4688" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>4688<" |
| 1 | nltest |
| 1 | dclist |
| 1 | dsgetdc |
GitHub Enterprise Remove Organization
#The following analytic detects when a user removes an organization from GitHub Enterprise. The detection monitors GitHub Enterprise audit logs for organization deletion events, which could indicate unauthorized removal of critical business resources. For a SOC, identifying organization removals is crucial as it may signal account compromise, insider threats, or malicious attempts to disrupt business operations by deleting entire organizational structures. The impact could be severe, potentially resulting in loss of source code, repositories, team structures, access controls, and other critical organizational assets. This disruption could halt development workflows, cause data loss, and require significant effort to restore from backups if available. Additionally, unauthorized organization removal could be part of a larger attack campaign aimed at destroying or compromising enterprise assets.
Known False Positives
- No false positives have been identified at this time.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Initial Access | |
| Impact |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| GitHub | Audit log action business.remove_organization: Organization removed from enterprise |
Rules Detecting the Same Action
These rules filter on the same operation.
Rule Body
name: GitHub Enterprise Remove Organization
id: 94cb89aa-aec1-4585-91b1-affcdacf357e
version: 7
creation_date: '2025-01-15'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: Anomaly
description: The following analytic detects when a user removes an organization from GitHub Enterprise. The detection monitors GitHub Enterprise audit logs for organization deletion events, which could indicate unauthorized removal of critical business resources. For a SOC, identifying organization removals is crucial as it may signal account compromise, insider threats, or malicious attempts to disrupt business operations by deleting entire organizational structures. The impact could be severe, potentially resulting in loss of source code, repositories, team structures, access controls, and other critical organizational assets. This disruption could halt development workflows, cause data loss, and require significant effort to restore from backups if available. Additionally, unauthorized organization removal could be part of a larger attack campaign aimed at destroying or compromising enterprise assets.
data_source:
- GitHub Enterprise Audit Logs
search: |-
`github_enterprise` action=business.remove_organization
| fillnull
| stats count min(_time) as firstTime max(_time) as lastTime
BY actor, actor_id, actor_is_bot,
actor_location.country_code, business, business_id,
org, org_id, user_agent,
action
| eval user=actor
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `github_enterprise_remove_organization_filter`
how_to_implement: You must ingest GitHub Enterprise logs using Audit log streaming as described in this documentation https://docs.github.com/en/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise#setting-up-streaming-to-splunk using a Splunk HTTP Event Collector.
known_false_positives: No false positives have been identified at this time.
references:
- https://www.googlecloudcommunity.com/gc/Community-Blog/Monitoring-for-Suspicious-GitHub-Activity-with-Google-Security/ba-p/763610
- https://docs.github.com/en/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise#setting-up-streaming-to-splunk
intermediate_findings:
entities:
- field: user
type: user
score: 20
message: $user$ removed an organization from GitHub Enterprise
threat_objects:
- field: user_agent
type: http_user_agent
analytic_story:
- GitHub Malicious Activity
asset_type: GitHub
mitre_attack_id:
- T1485
- T1195
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: cloud
security_domain: network
Stages and Predicates
Stage 1: search
`github_enterprise` action=business.remove_organization
Stage 2: fillnull
| fillnull
Stage 3: stats
| stats count min(_time) as firstTime max(_time) as lastTime
BY actor, actor_id, actor_is_bot,
actor_location.country_code, business, business_id,
org, org_id, user_agent,
action
Stage 4: eval
| eval user=actor
Stage 5: search
| `security_content_ctime(firstTime)`
Stage 6: search
| `security_content_ctime(lastTime)`
Stage 7: search
| `github_enterprise_remove_organization_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
action | eq |
| field:"action" kind:eq value:"business.remove_organization" |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"httpevent" |
IcedID Discovery Commands (Sysmon)
#IcedID may automatically run several initial discovery commands that provided environmental information about the host, network, and domain. This use case looks for a combination of those commands commonly seen after IcedID is executed
MITRE ATT&CK Coverage
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
Rule Body
id: '12911.18538'
title: IcedID Discovery Commands
description: IcedID may automatically run several initial discovery commands that
provided environmental information about the host, network, and domain. This use
case looks for a combination of those commands commonly seen after IcedID is executed.
- Living Off the Land Binary and Scripts (LOLBAS) (LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
("net.exe" OR "net1.exe" OR "ipconfig" OR "ipconfig.exe" OR "nltest" OR "nltest.exe"
OR "systeminfo" OR "systeminfo.exe") | table _time, host, user process, process_*,
signature_id, parent_* | bin span=60s | stats values(*) as * by _time, host | where
match(process_name, "(?i)systeminfo.exe") and match(process_name, "(?i)net1?.exe")
and match(process_name, "(?i)nltest.exe") and match(process_name, "(?i)ipconfig.exe") '
techniques:
- discovery:permission groups discovery:domain groups
- discovery:network share discovery
- discovery:account discovery
- discovery:system information discovery
- collection:automated collection
technique_id:
- T1069.002
- T1135
- T1087
- T1082
- T1119
data_category:
- Windows Sysmon
references:
- https://thedfirreport.com/2022/04/25/quantum-ransomware/
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") ("net.exe" OR "net1.exe" OR "ipconfig" OR "ipconfig.exe" OR "nltest" OR "nltest.exe" OR "systeminfo" OR "systeminfo.exe")
Stage 2: table
| table _time, host, user process, process_*, signature_id, parent_*
Stage 3: bucket
| bin span=60s
Stage 4: stats
| stats values(*) as * by _time, host
Stage 5: where
| where match(process_name, "(?i)systeminfo.exe") and match(process_name, "(?i)net1?.exe")
and match(process_name, "(?i)nltest.exe") and match(process_name, "(?i)ipconfig.exe")
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"1" |
process_name | regex_match |
| field:"process_name" kind:regex_match |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>1<" |
| 1 | "net.exe" |
| 1 | "net1.exe" |
| 1 | "ipconfig" |
| 1 | "ipconfig.exe" |
| 1 | "nltest" |
| 1 | "nltest.exe" |
| 1 | "systeminfo" |
| 1 | "systeminfo.exe" |
Kubernetes Anomalous Inbound Network Activity from Process
#The following analytic identifies anomalous inbound network traffic volumes from processes within containerized workloads. It leverages Network Performance Monitoring metrics collected via an OTEL collector and pulled from Splunk Observability Cloud. The detection compares recent metrics (tcp.bytes, tcp.new_sockets, tcp.packets, udp.bytes, udp.packets) over the last hour with the average over the past 30 days. This activity is significant as it may indicate unauthorized data reception, potential breaches, vulnerability exploitation, or malware propagation. If confirmed malicious, it could lead to command and control installation, data integrity damage, container escape, and further environment compromise.
Known False Positives
- No false positives have been identified at this time.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Execution |
Rule Body
name: Kubernetes Anomalous Inbound Network Activity from Process
id: 10442d8b-0701-4c25-911d-d67b906e713c
version: 9
creation_date: '2024-01-30'
modification_date: '2026-05-13'
author: Matthew Moore, Splunk
status: experimental
type: Anomaly
description: The following analytic identifies anomalous inbound network traffic volumes from processes within containerized workloads. It leverages Network Performance Monitoring metrics collected via an OTEL collector and pulled from Splunk Observability Cloud. The detection compares recent metrics (tcp.bytes, tcp.new_sockets, tcp.packets, udp.bytes, udp.packets) over the last hour with the average over the past 30 days. This activity is significant as it may indicate unauthorized data reception, potential breaches, vulnerability exploitation, or malware propagation. If confirmed malicious, it could lead to command and control installation, data integrity damage, container escape, and further environment compromise.
data_source: []
search: "| mstats avg(tcp.*) as tcp.* avg(udp.*) as udp.* where `kubernetes_metrics` AND earliest=-1h by k8s.cluster.name dest.workload.name dest.process.name span=10s | eval key='dest.workload.name' + \":\" + 'dest.process.name' | join type=left key [ mstats avg(tcp.*) as avg_tcp.* avg(udp.*) as avg_udp.* stdev(tcp.*) as stdev_tcp.* avg(udp.*) as stdev_udp.* where `kubernetes_metrics` AND earliest=-30d latest=-1h by dest.workload.name dest.process.name | eval key='dest.workload.name' + \":\" + 'dest.process.name' ] | eval anomalies = \"\" | foreach stdev_* [ eval anomalies =if( '<<MATCHSTR>>' > ('avg_<<MATCHSTR>>' + 3 * 'stdev_<<MATCHSTR>>'), anomalies + \"<<MATCHSTR>> higher than average by \" + tostring(round(('<<MATCHSTR>>' - 'avg_<<MATCHSTR>>')/'stdev_<<MATCHSTR>>' ,2)) + \" Standard Deviations. <<MATCHSTR>>=\" + tostring('<<MATCHSTR>>') + \" avg_<<MATCHSTR>>=\" + tostring('avg_<<MATCHSTR>>') + \" 'stdev_<<MATCHSTR>>'=\" + tostring('stdev_<<MATCHSTR>>') + \", \" , anomalies) ] | fillnull | eval anomalies = split(replace(anomalies, \",\\s$$$$\", \"\") ,\", \") | where anomalies!=\"\" | stats count(anomalies) as count values(anomalies) as anomalies by k8s.cluster.name dest.workload.name dest.process.name | where count > 5 | rename k8s.cluster.name as host | `kubernetes_anomalous_inbound_network_activity_from_process_filter`"
how_to_implement: "To gather NPM metrics the Open Telemetry to the Kubernetes Cluster and enable Network Performance Monitoring according to instructions found in Splunk Docs https://help.splunk.com/en/splunk-observability-cloud/monitor-infrastructure/network-explorer/set-up-network-explorer-in-kubernetes#network-explorer-setup In order to access those metrics from within Splunk Enterprise and ES, the Splunk Infrastructure Monitoring add-on must be installed and configured on a Splunk Search Head. Once installed, first configure the add-on with your O11y Cloud Org ID and Access Token. Lastly set up the add-on to ingest metrics from O11y cloud using the following settings, and any other settings left at default:\n* Name sim_npm_metrics_to_metrics_index\n * Metric Resolution 10000"
known_false_positives: No false positives have been identified at this time.
references:
- https://github.com/signalfx/splunk-otel-collector-chart
intermediate_findings:
entities:
- field: host
type: system
score: 20
message: Kubernetes Anomalous Inbound Network Activity from Process in kubernetes cluster $host$
analytic_story:
- Abnormal Kubernetes Behavior using Splunk Infrastructure Monitoring
asset_type: Kubernetes
mitre_attack_id:
- T1204
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: cloud
security_domain: network
Stages and Predicates
Stage 1: search
| mstats avg(tcp.*) as tcp.* avg(udp.*) as udp.* where `kubernetes_metrics` AND earliest=-1h by k8s.cluster.name dest.workload.name dest.process.name span=10s
Stage 2: eval
| eval key='dest.workload.name' + ":" + 'dest.process.name'
Stage 3: join
| join type=left key
[ mstats avg(tcp.*) as avg_tcp.* avg(udp.*) as avg_udp.* stdev(tcp.*) as stdev_tcp.* avg(udp.*) as stdev_udp.* where `kubernetes_metrics` AND earliest=-30d latest=-1h by dest.workload.name dest.process.name | eval key='dest.workload.name' + ":" + 'dest.process.name' ]
Stage 4: eval
| eval anomalies = ""
Stage 5: search
| foreach stdev_*
[
eval
anomalies =if(
'<<MATCHSTR>>' > ('avg_<<MATCHSTR>>' + 3 * 'stdev_<<MATCHSTR>>'),
anomalies + "<<MATCHSTR>> higher than average by " + tostring(
round(('<<MATCHSTR>>' - 'avg_<<MATCHSTR>>')/'stdev_<<MATCHSTR>>' ,2)
) + " Standard Deviations. <<MATCHSTR>>=" + tostring('<<MATCHSTR>>') + " avg_<<MATCHSTR>>=" + tostring(
'avg_<<MATCHSTR>>'
) + " 'stdev_<<MATCHSTR>>'=" + tostring('stdev_<<MATCHSTR>>') + ", ",
anomalies
)
]
Stage 6: fillnull
| fillnull
Stage 7: eval
| eval anomalies = split(replace(anomalies, ",\s$$$$", "") ,", ")
Stage 8: where
| where anomalies!=""
Stage 9: stats
| stats
count(anomalies) as count
values(anomalies) as anomalies
by k8s.cluster.name dest.workload.name dest.process.name
Stage 10: where
| where count > 5
Stage 11: rename
| rename k8s.cluster.name as host
Stage 12: search
| `kubernetes_anomalous_inbound_network_activity_from_process_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
count | gt |
| field:"count" kind:gt value:"5" |
span | eq |
| field:"span" kind:eq value:"10s" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | mstats |
| 1 | avg |
| 1 | tcp.* |
| 1 | as |
| 1 | tcp.* |
| 1 | avg |
| 1 | udp.* |
| 1 | as |
| 1 | udp.* |
| 1 | where |
| 1 | by |
| 1 | dest.process.name |
| 1 | k8s.cluster.name |
| 1 | dest.workload.name |
| 5 | foreach |
| 5 | stdev_* |
Linux Auditd Doas Conf File Creation
#The following analytic detects the creation of the doas.conf file on a Linux host. This file is used by the doas utility to allow standard users to perform tasks as root, similar to sudo. The detection leverages Linux Auditd data, focusing on the creation of the doas.conf file. This activity is significant because it can indicate an attempt to gain elevated privileges, potentially by an adversary. If confirmed malicious, this could allow an attacker to execute commands with root commands with root privileges, leading to full system compromise.
Known False Positives
- Administrator or network operator can execute this command. Please update the filter macros to remove false positives.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Privilege Escalation |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| Linux | auditd PATH record: Filename path information |
| Linux | auditd CWD record: Current working directory |
Rule Body
name: Linux Auditd Doas Conf File Creation
id: 61059783-574b-40d2-ac2f-69b898afd6b4
version: 11
creation_date: '2024-08-09'
modification_date: '2026-05-13'
author: Teoderick Contreras, Nasreddine Bencherchali, Splunk
status: production
type: TTP
description: |
The following analytic detects the creation of the doas.conf file on a Linux host.
This file is used by the doas utility to allow standard users to perform tasks as root, similar to sudo.
The detection leverages Linux Auditd data, focusing on the creation of the doas.conf file.
This activity is significant because it can indicate an attempt to gain elevated privileges, potentially by an adversary. If confirmed malicious, this could allow an attacker to execute commands with root commands with root privileges, leading to full system compromise.
data_source:
- Linux Auditd Path
- Linux Auditd Cwd
search: |
`linux_auditd`
(
(type=PATH nametype="CREATE")
OR
type=CWD
)
| rex "msg=audit\([^)]*:(?<audit_id>\d+)\)"
| stats
values(type) as types
values(name) as names
values(nametype) as nametype
values(cwd) as cwd_list
values(_time) as event_times
by audit_id host
| eval current_working_directory = coalesce(mvindex(cwd_list, 0), "N/A")
| eval candidate_paths = mvmap(names, if(match(names, "^/"), names, current_working_directory + "/" + names))
| eval matched_paths = mvfilter(match(candidate_paths, "/etc/doas.conf.*"))
| eval match_count = mvcount(matched_paths)
| eval reconstructed_path = mvindex(matched_paths, 0)
| eval e_time = mvindex(event_times, 0)
| where match_count > 0
| rename host as dest
| stats count min(e_time) as firstTime max(e_time) as lastTime
values(nametype) as nametype
by current_working_directory
reconstructed_path
match_count
dest
audit_id
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| table nametype current_working_directory reconstructed_path dest audit_id match_count firstTime lastTime
| `linux_auditd_doas_conf_file_creation_filter`
how_to_implement: |
To implement this detection, the process begins by ingesting auditd
data, that consist SYSCALL, TYPE, EXECVE and PROCTITLE events, which captures command-line
executions and process details on Unix/Linux systems. These logs should be ingested
and processed using Splunk Add-on for Unix and Linux (https://splunkbase.splunk.com/app/833),
which is essential for correctly parsing and categorizing the data. The next step
involves normalizing the field names to match the field names set by the Splunk
Common Information Model (CIM) to ensure consistency across different data sources
and enhance the efficiency of data modeling and make sure the type=CWD record type is activate in your auditd configuration.
This approach enables effective monitoring and detection of linux endpoints where auditd is deployed.
known_false_positives: |
Administrator or network operator can execute this command.
Please update the filter macros to remove false positives.
references:
- https://wiki.gentoo.org/wiki/Doas
- https://www.makeuseof.com/how-to-install-and-use-doas/
finding:
title: A $reconstructed_path$ file was created on host - [$dest$]
entity:
field: dest
type: system
score: 50
analytic_story:
- Linux Privilege Escalation
- Linux Persistence Techniques
- Compromised Linux Host
asset_type: Endpoint
mitre_attack_id:
- T1548.003
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: search
`linux_auditd`
(
(type=PATH nametype="CREATE")
OR
type=CWD
)
Stage 2: rex
| rex "msg=audit\([^)]*:(?<audit_id>\d+)\)"
Stage 3: stats
| stats
values(type) as types
values(name) as names
values(nametype) as nametype
values(cwd) as cwd_list
values(_time) as event_times
by audit_id host
Stage 4: eval
| eval current_working_directory = coalesce(mvindex(cwd_list, 0), "N/A")
Stage 5: eval
| eval
candidate_paths = mvmap(
names,
if(match(names, "^/"), names, current_working_directory + "/" + names)
)
Stage 6: eval
| eval matched_paths = mvfilter(match(candidate_paths, "/etc/doas.conf.*"))
Stage 7: eval
| eval match_count = mvcount(matched_paths)
Stage 8: eval
| eval reconstructed_path = mvindex(matched_paths, 0)
Stage 9: eval
| eval e_time = mvindex(event_times, 0)
Stage 10: where
| where match_count > 0
Stage 11: rename
| rename host as dest
Stage 12: stats
| stats count min(e_time) as firstTime max(e_time) as lastTime
values(nametype) as nametype
by current_working_directory
reconstructed_path
match_count
dest
audit_id
Stage 13: search
| `security_content_ctime(firstTime)`
Stage 14: search
| `security_content_ctime(lastTime)`
Stage 15: table
| table nametype current_working_directory reconstructed_path dest audit_id match_count firstTime
lastTime
Stage 16: search
| `linux_auditd_doas_conf_file_creation_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
match_count | gt |
| field:"match_count" kind:gt value:"0" |
nametype | eq |
| field:"nametype" kind:eq value:"CREATE" |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"auditd" |
type | eq |
| field:"type" kind:eq |
Linux Docker Root Directory Mount
#This detection identifies Docker containers that mount the host's root directory into the container filesystem. Mounting the entire host root directory into a container effectively grants the container visibility and potential write access to all files on the host system. If the container is running as root or with elevated capabilities (e.g., --privileged), the risk is significantly increased.
Known False Positives
- False positives are present based on automated tooling or system administrative usage. Filter as needed.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Privilege Escalation |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| Linux | Event ID 1: Process Create |
Rule Body
name: Linux Docker Root Directory Mount
id: aa049566-f76a-43b9-908c-3c27e079fd43
version: 4
creation_date: '2026-03-10'
modification_date: '2026-05-13'
author: Gowthamaraj Rajendran, Splunk, Emil Elsetrønning
status: production
type: TTP
description: |
This detection identifies Docker containers that mount the host's root directory into the container filesystem.
Mounting the entire host root directory into a container effectively grants the container visibility and potential write access to all files on the host system.
If the container is running as root or with elevated capabilities (e.g., --privileged), the risk is significantly increased.
data_source:
- Sysmon for Linux EventID 1
search: |-
| tstats `security_content_summariesonly`
count min(_time) as firstTime
max(_time) as lastTime
from datamodel=Endpoint.Processes where
Processes.process_name=docker*
Processes.process IN (
"* -v *",
"* --volume *"
)
Processes.process="* /:/*"
by Processes.action Processes.dest Processes.original_file_name
Processes.parent_process Processes.parent_process_exec
Processes.parent_process_guid Processes.parent_process_id
Processes.parent_process_name Processes.parent_process_path
Processes.process Processes.process_exec Processes.process_guid
Processes.process_hash Processes.process_id
Processes.process_integrity_level Processes.process_name
Processes.process_path Processes.user Processes.user_id Processes.vendor_product
| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `linux_docker_root_directory_mount_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 are present based on automated tooling or system administrative usage. Filter as needed.
references:
- https://docs.docker.com/engine/storage/volumes/
- https://gtfobins.github.io/gtfobins/docker/
finding:
title: An instance of $process_name$ spawned by $user$ on endpoint $dest$, tried to mount the root directory via the command $process$
entity:
field: user
type: user
score: 50
intermediate_findings:
entities:
- field: dest
type: system
score: 50
message: An instance of $process_name$ spawned by $user$ on endpoint $dest$, tried to mount the root directory via the command $process$
threat_objects:
- field: process
type: process
analytic_story:
- Linux Privilege Escalation
- Linux Living Off The Land
asset_type: Endpoint
mitre_attack_id:
- T1611
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=docker*
Processes.process IN (
"* -v *",
"* --volume *"
)
Processes.process="* /:/*"
by Processes.action Processes.dest Processes.original_file_name
Processes.parent_process Processes.parent_process_exec
Processes.parent_process_guid Processes.parent_process_id
Processes.parent_process_name Processes.parent_process_path
Processes.process Processes.process_exec Processes.process_guid
Processes.process_hash Processes.process_id
Processes.process_integrity_level Processes.process_name
Processes.process_path Processes.user Processes.user_id Processes.vendor_product
Stage 2: search
| `drop_dm_object_name(Processes)`
Stage 3: search
| `security_content_ctime(firstTime)`
Stage 4: search
| `security_content_ctime(lastTime)`
Stage 5: search
| `linux_docker_root_directory_mount_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Processes.process | eq |
| field:"CommandLine" kind:eq value:"* /:/*" |
Processes.process | in |
| field:"CommandLine" kind:in |
Processes.process_name | eq |
| field:"process_basename" kind:eq value:"docker*" |
Okta Multiple Failed MFA Requests For User
#The following analytic identifies multiple failed multi-factor authentication (MFA) requests for a single user within an Okta tenant. It triggers when more than 10 MFA attempts fail within 5 minutes, using Okta event logs to detect this pattern. This activity is significant as it may indicate an adversary attempting to bypass MFA by bombarding the user with repeated authentication requests, a technique used by threat actors like Lapsus and APT29. If confirmed malicious, this could lead to unauthorized access, potentially compromising sensitive information and systems.
Known False Positives
- Multiple Failed MFA requests may also be a sign of authentication or application issues. Filter as needed and monitor for any unusual activity.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Credential Access |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| Okta | System Log event type user.authentication.auth_via_mfa: User authenticated via MFA |
Rules Detecting the Same Action
These rules filter on the same operation.
- First Occurrence of Okta User Session Started via Proxy (Elastic)
- MFA Fatigue (OKTA) (Kusto)
- Okta AiTM Phishing Attempt Blocked by FastPass (Panther)
- Okta Authentication Failed During MFA Challenge (Splunk)
- Okta Fast Pass phishing Detection (Kusto)
- Okta FastPass Phishing Detection (Sigma)
- Okta FastPass Phishing Detection (Elastic)
- Okta MFA Bruteforce Attack (YARA-L)
Rule Body
name: Okta Multiple Failed MFA Requests For User
id: 826dbaae-a1e6-4c8c-b384-d16898956e73
version: 12
creation_date: '2024-04-17'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: Anomaly
description: The following analytic identifies multiple failed multi-factor authentication (MFA) requests for a single user within an Okta tenant. It triggers when more than 10 MFA attempts fail within 5 minutes, using Okta event logs to detect this pattern. This activity is significant as it may indicate an adversary attempting to bypass MFA by bombarding the user with repeated authentication requests, a technique used by threat actors like Lapsus and APT29. If confirmed malicious, this could lead to unauthorized access, potentially compromising sensitive information and systems.
data_source:
- Okta
search: |-
`okta` eventType=user.authentication.auth_via_mfa outcome.result=FAILURE debugContext.debugData.factor!=PASSWORD_AS_FACTOR
| bucket _time span=5m
| stats count min(_time) as firstTime max(_time) as lastTime values(displayMessage) values(src_ip) as src_ip values(debugContext.debugData.factor) values(dest) as dest
BY _time src_user
| where count >= 10
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `okta_multiple_failed_mfa_requests_for_user_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: Multiple Failed MFA requests may also be a sign of authentication or application issues. Filter as needed and monitor for any unusual activity.
references:
- https://attack.mitre.org/techniques/T1621/
intermediate_findings:
entities:
- field: src_user
type: user
score: 20
message: Multiple failed MFA requests for user $src_user$ from IP Address - $src_ip$
threat_objects:
- field: src_ip
type: ip_address
analytic_story:
- Okta Account Takeover
- Scattered Lapsus$ Hunters
asset_type: Okta Tenant
mitre_attack_id:
- T1621
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: application
security_domain: identity
Stages and Predicates
Stage 1: search
`okta` eventType=user.authentication.auth_via_mfa outcome.result=FAILURE
debugContext.debugData.factor!=PASSWORD_AS_FACTOR
Stage 2: bucket
| bucket _time span=5m
Stage 3: stats
| stats
count
min(_time) as firstTime
max(_time) as lastTime
values(displayMessage)
values(src_ip) as src_ip
values(debugContext.debugData.factor)
values(dest) as dest
BY _time src_user
Stage 4: where
| where count >= 10
Stage 5: search
| `security_content_ctime(firstTime)`
Stage 6: search
| `security_content_ctime(lastTime)`
Stage 7: search
| `okta_multiple_failed_mfa_requests_for_user_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
count | ge |
| field:"count" kind:ge value:"10" |
debugContext.debugData.factor | ne |
| field:"debugContext.debugData.factor" kind:ne value:"PASSWORD_AS_FACTOR" |
eventType | eq |
| field:"eventType" kind:eq value:"user.authentication.auth_via_mfa" |
outcome.result | eq |
| field:"outcome.result" kind:eq value:"FAILURE" |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"OktaIM2:log" |
Ollama Abnormal Network Connectivity
#Detects abnormal network activity and connectivity issues in Ollama including non-localhost API access attempts and warning-level network errors such as DNS lookup failures, TCP connection issues, or host resolution problems that may indicate network-based attacks, unauthorized access attempts, or infrastructure reconnaissance activity.
Known False Positives
- Legitimate remote access from authorized users or applications connecting from non-localhost addresses, temporary network infrastructure issues causing DNS resolution failures, firewall or network configuration changes resulting in connection timeouts, cloud-hosted Ollama instances receiving valid external API requests, or intermittent connectivity problems during network maintenance may trigger this detection during normal operations.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Command & Control |
Rule Body
name: Ollama Abnormal Network Connectivity
id: 19ec30ad-faa2-496a-a6a9-f2e5f778fbdb
version: 5
creation_date: '2025-10-13'
modification_date: '2026-05-13'
author: Rod Soto
status: experimental
type: Anomaly
description: Detects abnormal network activity and connectivity issues in Ollama including non-localhost API access attempts and warning-level network errors such as DNS lookup failures, TCP connection issues, or host resolution problems that may indicate network-based attacks, unauthorized access attempts, or infrastructure reconnaissance activity.
data_source:
- Ollama Server
search: |-
`ollama_server` level=WARN (msg="*failed*" OR msg="*dial tcp*" OR msg="*lookup*" OR msg="*no such host*" OR msg="*connection*" OR msg="*network*" OR msg="*timeout*" OR msg="*unreachable*" OR msg="*refused*")
| eval src=coalesce(src, src_ip, "N/A")
| stats count as incidents, values(src) as src, values(msg) as warning_messages, latest(_time) as last_incident
BY host
| eval last_incident=strftime(last_incident, "%Y-%m-%d %H:%M:%S")
| eval severity="medium"
| eval attack_type="Abnormal Network Connectivity"
| stats count
BY last_incident, host, incidents,
src, warning_messages, severity,
attack_type
| `ollama_abnormal_network_connectivity_filter`
how_to_implement: 'Ingest Ollama logs via Splunk TA-ollama add-on by configuring file monitoring inputs pointed to your Ollama server log directories (sourcetype: ollama:server), or enable HTTP Event Collector (HEC) for real-time API telemetry and prompt analytics (sourcetypes: ollama:api, ollama:prompts). CIM compatibility using the Web datamodel for standardized security detections.'
known_false_positives: Legitimate remote access from authorized users or applications connecting from non-localhost addresses, temporary network infrastructure issues causing DNS resolution failures, firewall or network configuration changes resulting in connection timeouts, cloud-hosted Ollama instances receiving valid external API requests, or intermittent connectivity problems during network maintenance may trigger this detection during normal operations.
references:
- https://github.com/rosplk/ta-ollama
intermediate_findings:
entities:
- field: host
type: system
score: 20
message: 'Abnormal network activity detected on $host$ with $incidents$ incidents from $src$. Investigation needed for network errors: $warning_messages$.'
threat_objects:
- field: src
type: system
analytic_story:
- Suspicious Ollama Activities
asset_type: Web Application
mitre_attack_id:
- T1571
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: application
security_domain: endpoint
Stages and Predicates
Stage 1: search
`ollama_server` level=WARN (msg="*failed*" OR msg="*dial tcp*" OR msg="*lookup*" OR msg="*no such host*" OR msg="*connection*" OR msg="*network*" OR msg="*timeout*" OR msg="*unreachable*" OR msg="*refused*")
Stage 2: eval
| eval src=coalesce(src, src_ip, "N/A")
Stage 3: stats
| stats
count as incidents,
values(src) as src,
values(msg) as warning_messages,
latest(_time) as last_incident
BY host
Stage 4: eval
| eval last_incident=strftime(last_incident, "%Y-%m-%d %H:%M:%S")
Stage 5: eval
| eval severity="medium"
Stage 6: eval
| eval attack_type="Abnormal Network Connectivity"
Stage 7: stats
| stats count
BY last_incident, host, incidents,
src, warning_messages, severity,
attack_type
Stage 8: search
| `ollama_abnormal_network_connectivity_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
level | eq |
| field:"level" kind:eq value:"WARN" |
msg | eq |
| field:"msg" kind:eq |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"ollama:server" |
Remote Admin Tools (PowerShell)
#PsExec, RemCom, PaExec, and CsExec are administrative command-line utilities that allow remote command execution
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Execution | |
| Lateral Movement |
References
Telemetry Coverage
Rule Body
id: '5343.5759'
title: 'Remote Admin Tools '
description: 'PsExec, RemCom, PaExec, and CsExec are administrative command-line utilities
that allow remote command execution Threat Actor Association: Antlion, DarkSide,
BlackMatter, APT29/Nobelium, APT31, Carbanak, FIN6, FIN7, FIN8, FIN12, Fox Kitten,
GoldenJackal, Hello Kitty / Five Hands, MalKamak, Muddled Libra, OilRig, Traveling
Spider, UNC2596, Vice Society, Wizard Spider - Software Association: ALPHV/BlackCat,
AvosLocker, BianLian, Blackbyte, Blacksuit, Black Basta, Conti, Cuba, GhostShell,
Lockbit, Play, Prometheus/Spook, Prestige, PYSA/Mespinoza, Quantum, Rhysida, Royal,
Vice Society - Atomics T1021.002 Test#3'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` "\\\\" ("EventCode=4104"
OR "<EventID>4104<")| regex process="(?i)((\.exe(\")?(\s+|\s+\/c)\s+)|(psexec.{1,}))|(\"{1,})?\x5c\x5c.{2,}"|
table _time, host, user process, parent_process, parent_process_id, parent_process_name,
process_id, process_name, signature_id | bin span=1s | stats values(*) as * by _time,
host '
techniques:
- execution:system services:service execution
- lateral-movement:remote services
- execution:command and scripting interpreter:windows command shell
- lateral-movement:lateral tool transfer
technique_id:
- T1569.002
- T1021
- T1059.003
- T1570
data_category:
- PowerShell logs
references:
- https://redcanary.com/blog/threat-hunting-psexec-lateral-movement/
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_powershell` "\\\\" ("EventCode=4104" OR "<EventID>4104<")
Stage 2: regex
| regex process="(?i)((\.exe(\")?(\s+|\s+\/c)\s+)|(psexec.{1,}))|(\"{1,})?\x5c\x5c.{2,}"
Stage 3: table
| table _time, host, user process, parent_process, parent_process_id, parent_process_name,
process_id, process_name, signature_id
Stage 4: bucket
| bin span=1s
Stage 5: stats
| stats values(*) as * by _time, host
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
process | regex_match |
| field:"CommandLine" kind:regex_match |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "\\\\" |
| 1 | "EventCode=4104" |
| 1 | "<EventID>4104<" |
Scheduled Task with Potential SSH Tunnel - Windows (Windows Event Log)
#Threat actors have been observed using scheduled tasks to create reverse SSH tunnels to facilitate persistence on a compromised machine as reported by DFIR. This use case detects scheduled tasks created with commands indicating potential SSH tunnels. The regex filtering matches on the patterns <user>@<IP address> and <port number>:<IP Address> :<port number>
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Execution | |
| Persistence | |
| Privilege Escalation | |
| Command & Control |
References
Telemetry Coverage
Rule Body
id: '25326.46988'
title: Scheduled Task with Potential SSH Tunnel - Windows
description: Threat actors have been observed using scheduled tasks to create reverse
SSH tunnels to facilitate persistence on a compromised machine as reported by DFIR.
This use case detects scheduled tasks created with commands indicating potential
SSH tunnels. The regex filtering matches on the patterns <user>@<IP address> and
<port number>:<IP Address> :<port number>. Living Off the Land Binary and Scripts
(LOLBAS) (LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4698) OR
"<EventID>4698<") OR (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process)
"@" "/create" ("-L" OR "-R" OR "-N" OR "-D" OR "-C" OR "IdentitiesOnly=yes" OR "StrictHostKeyChecking=no"
OR "ssh") | where ((match(TaskContent, "\w+@\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
and match(TaskContent, "\d{1,5}:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}") and
match(TaskContent, "-L|-R|-N|-D|-C|IdentitiesOnly=yes|StrictHostKeyChecking=no|ssh"))
OR (match(process, "\w+@\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") and match(process,
"\d{1,5}:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}") and match(process, "(?i)\-(L|R|N|D|C)|IdentitiesOnly=yes|StrictHostKeyChecking=no|ssh")))
| table _time, host, user, process, process_*, parent_process_name, parent_process_*,
signature_id | bin span=1s | stats values(*) as * by _time, host '
techniques:
- execution:scheduled task/job
- command-and-control:protocol tunneling
technique_id:
- T1053
- T1572
data_category:
- Process command-line parameters
- Windows event logs
references:
- https://thedfirreport.com/2023/10/30/netsupport-intrusion-results-in-domain-compromise/
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4698) OR "<EventID>4698<") OR (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) "@" "/create" ("-L" OR "-R" OR "-N" OR "-D" OR "-C" OR "IdentitiesOnly=yes" OR "StrictHostKeyChecking=no" OR "ssh")
Stage 2: where
| where (
(
match(TaskContent, "\w+@\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
and match(TaskContent, "\d{1,5}:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}")
and match(TaskContent, "-L|-R|-N|-D|-C|IdentitiesOnly=yes|StrictHostKeyChecking=no|ssh")
)
OR (
match(process, "\w+@\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
and match(process, "\d{1,5}:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}")
and match(process, "(?i)\-(L|R|N|D|C)|IdentitiesOnly=yes|StrictHostKeyChecking=no|ssh")
)
)
Stage 3: table
| table _time, host, user, process, process_*, parent_process_name, parent_process_*, signature_id
Stage 4: bucket
| bin span=1s
Stage 5: stats
| stats values(*) as * by _time, host
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq |
TaskContent | regex_match |
| field:"TaskContent" kind:regex_match |
process | regex_match |
| field:"CommandLine" kind:regex_match |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>4698<" |
| 1 | "<EventID>4688<" |
| 1 | "@" |
| 1 | "/create" |
| 1 | "-L" |
| 1 | "-R" |
| 1 | "-N" |
| 1 | "-D" |
| 1 | "-C" |
| 1 | "IdentitiesOnly=yes" |
| 1 | "StrictHostKeyChecking=no" |
| 1 | "ssh" |
Shadow Copy Created (Windows Event Log)
#Shadow Copy (also known as Volume Snapshot Service, Volume Shadow Copy Service or VSS) is a technology included in Microsoft Windows that can create backup copies or snapshots of computer files or volumes, even when they are in use. Adversaries have used this service to create copies of locked files such as ntds.dit
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Credential Access |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| VSSAudit | Event ID 8222 |
Rule Body
id: '6148.6668'
title: Shadow Copy Created
description: 'Shadow Copy (also known as Volume Snapshot Service, Volume Shadow Copy
Service or VSS) is a technology included in Microsoft Windows that can create backup
copies or snapshots of computer files or volumes, even when they are in use. Adversaries
have used this service to create copies of locked files such as ntds.dit. -- Threat
Actor Association: Lazarus, Mustang Panda (aka. Stately Taurus//Earth Preta/BRONZE
PRESIDENT/TA416/RedDelta), Volt Typhoon -- Software Association: PYSA/Mespinoza
-- Atomics T1003.003Test #1 Atomics T1003.003 Test #3 Atomics T1003.003 Test #4
Atomics T1003.003 Test #5 Atomics T1003.003 Test #6 Atomics T1003.003 Test #7'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=8222) OR
"<EventID>8222<") "Shadow copy has been created" | rex field=_raw (?<ioc>"(?i)Shadow
copy has been created")| eval user=User_name, process_name=Process_image_name |
table _time, host, user, signature_id, signature, process, process_*, parent_*,
ioc | bin span=1s | stats values(*) as * by _time, host '
techniques:
- credential-access:os credential dumping:ntds
technique_id:
- T1003.003
data_category:
- Windows event logs
references:
- https://dfironthemountain.wordpress.com/2018/12/06/locked-file-access-using-esentutl-exe/
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=8222) OR "<EventID>8222<") "Shadow copy has been created"
Stage 2: rex
| rex field=_raw (?<ioc>"(?i)Shadow copy has been created")
Stage 3: eval
| eval user=User_name, process_name=Process_image_name
Stage 4: table
| table _time, host, user, signature_id, signature, process, process_*, parent_*, ioc
Stage 5: bucket
| bin span=1s
Stage 6: stats
| stats values(*) as * by _time, host
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"8222" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>8222<" |
| 1 | "Shadow copy has been created" |
ssh.exe Execution (Windows Event Log)
#ssh.exe is a legitimate SSH client included in Windows systems,providing secure shell access to remote servers. Due to its availability and capabilities, it can be exploited by attackers for covert communication, remote command execution, or tunneling, making it a potential tool for living-off-the-land attacks. This use case detects executions of ssh.exe
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Stealth | |
| Command & Control |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
id: '25328.46989'
title: ssh.exe Execution
description: 'ssh.exe is a legitimate SSH client included in Windows systems,providing
secure shell access to remote servers. Due to its availability and capabilities,
it can be exploited by attackers for covert communication, remote command execution,
or tunneling, making it a potential tool for living-off-the-land attacks. This use
case detects executions of ssh.exe. -- Threat Actor Association: APT28 (aka.Fancy
Bear, Fighting Ursa, Forest Blizzard, Pawn Storm, TA422, STRONTIUM) -- Living Off
the Land Binary and Scripts (LOLBAS) (LOLBIN)'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
"<EventID>4688<" OR Type=Process) TERM(ssh) OR "ssh.exe" | where match(process_name,
"(?i)^ssh\.exe")| table _time, host, user, process, process_*, parent_process_*
| bin span=1s | stats values(*) as * by _time, host '
techniques:
- defense-evasion:indirect command execution
- command-and-control:protocol tunneling
technique_id:
- T1202
- T1572
data_category:
- Windows event logs
references:
- https://lolbas-project.github.io/lolbas/Binaries/Ssh/
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) TERM(ssh) OR "ssh.exe"
Stage 2: where
| where match(process_name, "(?i)^ssh\.exe")
Stage 3: table
| table _time, host, user, process, process_*, parent_process_*
Stage 4: bucket
| bin span=1s
Stage 5: stats
| stats values(*) as * by _time, host
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"4688" |
process_name | regex_match |
| field:"process_name" kind:regex_match value:"(?i)^ssh.exe" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>4688<" |
| 1 | ssh |
| 1 | "ssh.exe" |
Stored Credentials from Web Browsers - Windows (PowerShell)
#Adversaries may acquire credentials from web browsers by reading files specific to the target browser. Web browsers commonly save credentials such as website usernames and passwords so that they do not need to be entered manually in the future. Web browsers typically store the credentials in an encrypted format within a credential store; however, methods exist to extract plaintext credentials from web browsers. After acquiring credentials from web browsers, adversaries may attempt to recycle the credentials across different systems and/or accounts in order to expand access. This can result in significantly furthering an adversary's objective in cases where credentials gained from web browsers overlap with privileged accounts (e.g. domain administrator). This use case detects attempts to enumerate or access files containing stored credentials from web browsers on Windows endpoints
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Credential Access |
References
Telemetry Coverage
Rule Body
id: '14942.22051'
title: Stored Credentials from Web Browsers - Windows
description: 'Adversaries may acquire credentials from web browsers by reading files
specific to the target browser. Web browsers commonly save credentials such as website
usernames and passwords so that they do not need to be entered manually in the future.
Web browsers typically store the credentials in an encrypted format within a credential
store; however, methods exist to extract plaintext credentials from web browsers.
After acquiring credentials from web browsers, adversaries may attempt to recycle
the credentials across different systems and/or accounts in order to expand access.
This can result in significantly furthering an adversary''s objective in cases where
credentials gained from web browsers overlap with privileged accounts (e.g. domain
administrator). This use case detects attempts to enumerate or access files containing
stored credentials from web browsers on Windows endpoints. -- Threat Actor Association:
Earth Estries, Scattered Spider (aka. Muddled Libra, Scatter Swine, Starfraud, UNC3944)
-- Atomic T1555.003 Test #4 Atomic T1555.003 Test #5 Atomic T1555.003 Test #6 Atomic
T1555.003 Test #7'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_powershell` (TERM(EventCode=4103) OR
"<EventID>4103<" OR TERM(EventCode=4104) OR "<EventID>4104<") (TERM(Copy-Item) OR
TERM(copy) OR TERM(xcopy) OR TERM(cp) OR TERM(cpi) OR TERM(robocopy)) AND ("Chrome"
OR "Opera" OR "Firefox" OR "Edge") | regex process="(?i)(Copy\-Item|copy|xcopy|[^\-]cp|[^\-]cpi|robocopy)\s+.+?((\x5cGoogle\x5cChrome\x5cUser\sData\x5cDefault\x5cLogin\s)|(\x5cOpera.+Login\s)|(\x5cFirefox\x5cProfiles)|(\x5cEdge\x5cUser\sData\x5c))"
| table _time, host, user signature_id, process, process_* | bin span=1s | stats
values(*) as * by _time, host '
techniques:
- credential-access:credentials from password stores:credentials from web browsers
technique_id:
- T1555.003
data_category:
- PowerShell logs
references:
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1555.003/T1555.003.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<") (TERM(Copy-Item) OR TERM(copy) OR TERM(xcopy) OR TERM(cp) OR TERM(cpi) OR TERM(robocopy)) AND ("Chrome" OR "Opera" OR "Firefox" OR "Edge")
Stage 2: regex
| regex
process="(?i)(Copy\-Item|copy|xcopy|[^\-]cp|[^\-]cpi|robocopy)\s+.+?((\x5cGoogle\x5cChrome\x5cUser\sData\x5cDefault\x5cLogin\s)|(\x5cOpera.+Login\s)|(\x5cFirefox\x5cProfiles)|(\x5cEdge\x5cUser\sData\x5c))"
Stage 3: table
| table _time, host, user signature_id, process, process_*
Stage 4: bucket
| bin span=1s
Stage 5: stats
| stats values(*) as * by _time, host
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq |
process | regex_match |
| field:"CommandLine" kind:regex_match value:"(?i)(Copy\-Item|copy|xcopy|[^\-]cp|[^\-]cpi|robocopy)\s+.+?((\x5cGoogle\x5cChrome\x5cUser\sData\x5cDefault\x5cLogin\s)|(\x5cOpera.+Login\s)|(\x5cFirefox\x5cProfiles)|(\x5cEdge\x5cUser\sData\x5c))" |
Search Terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>4103<" |
| 1 | "<EventID>4104<" |
| 1 | "Copy-Item" |
| 1 | copy |
| 1 | xcopy |
| 1 | cp |
| 1 | cpi |
| 1 | robocopy |
| 1 | "Chrome" |
| 1 | "Opera" |
| 1 | "Firefox" |
| 1 | "Edge" |
Unknown Process Using The Kerberos Protocol
#The following analytic identifies a non-lsass.exe process making an outbound connection on port 88, which is typically used by the Kerberos authentication protocol. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process and network traffic logs. This activity is significant because, under normal circumstances, only the lsass.exe process should interact with the Kerberos Distribution Center. If confirmed malicious, this behavior could indicate an adversary attempting to abuse the Kerberos protocol, potentially leading to unauthorized access or lateral movement within the network.
Known False Positives
- Custom applications may leverage the Kerberos protocol. Filter as needed.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Lateral Movement |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
| Sysmon | Event ID 3: Network connection |
Rule Body
name: Unknown Process Using The Kerberos Protocol
id: c91a0852-9fbb-11ec-af44-acde48001122
version: 12
creation_date: '2022-03-10'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic identifies a non-lsass.exe process making an outbound connection on port 88, which is typically used by the Kerberos authentication protocol. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process and network traffic logs. This activity is significant because, under normal circumstances, only the lsass.exe process should interact with the Kerberos Distribution Center. If confirmed malicious, this behavior could indicate an adversary attempting to abuse the Kerberos protocol, potentially leading to unauthorized access or lateral movement within the network.
data_source:
- Sysmon EventID 1 AND Sysmon EventID 3
search: |-
| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Processes
WHERE Processes.process_name!=lsass.exe
BY _time 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)`
| join process_id dest [
| tstats `security_content_summariesonly` count FROM datamodel=Network_Traffic.All_Traffic
WHERE All_Traffic.dest_port = 88
BY All_Traffic.action All_Traffic.app All_Traffic.bytes
All_Traffic.bytes_in All_Traffic.bytes_out All_Traffic.dest
All_Traffic.dest_ip All_Traffic.dest_port All_Traffic.dvc
All_Traffic.protocol All_Traffic.protocol_version All_Traffic.src
All_Traffic.src_ip All_Traffic.src_port All_Traffic.transport
All_Traffic.user All_Traffic.vendor_product All_Traffic.direction
All_Traffic.process_id
| `drop_dm_object_name(All_Traffic)`
| rename src as dest ]
| table _time dest parent_process_name process_name process_path process process_id dest_port
| `unknown_process_using_the_kerberos_protocol_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: Custom applications may leverage the Kerberos protocol. Filter as needed.
references:
- https://stealthbits.com/blog/how-to-detect-overpass-the-hash-attacks/
- https://www.thehacker.recipes/ad/movement/kerberos/ptk
finding:
title: Unknown process $process_name$ using the kerberos protocol detected on host $dest$
entity:
field: dest
type: system
score: 50
analytic_story:
- Active Directory Kerberos Attacks
- BlackSuit Ransomware
asset_type: Endpoint
mitre_attack_id:
- T1550
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: tstats
| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Processes
WHERE Processes.process_name!=lsass.exe
BY _time 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: join
| join process_id dest [
| tstats `security_content_summariesonly` count FROM datamodel=Network_Traffic.All_Traffic
WHERE All_Traffic.dest_port = 88
BY All_Traffic.action All_Traffic.app All_Traffic.bytes
All_Traffic.bytes_in All_Traffic.bytes_out All_Traffic.dest
All_Traffic.dest_ip All_Traffic.dest_port All_Traffic.dvc
All_Traffic.protocol All_Traffic.protocol_version All_Traffic.src
All_Traffic.src_ip All_Traffic.src_port All_Traffic.transport
All_Traffic.user All_Traffic.vendor_product All_Traffic.direction
All_Traffic.process_id
| `drop_dm_object_name(All_Traffic)`
| rename src as dest ]
Stage 6: table
| table _time dest parent_process_name process_name process_path process process_id dest_port
Stage 7: search
| `unknown_process_using_the_kerberos_protocol_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
All_Traffic.dest_port | eq |
| field:"DestinationPort" kind:eq value:"88" |
Processes.process_name | ne |
| field:"process_basename" kind:ne value:"lsass.exe" |
Windows EventLog Recon Activity Using Log Query Utilities
#This analytic detects EventLog reconnaissance activity using utilities such as wevtutil.exe, wmic.exe, PowerShell cmdlets like Get-WinEvent, or WMI queries targeting Win32_NTLogEvent. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names and command-line arguments. These tools are often used by adversaries to extract usernames, IP addresses, session data, and event information for credential access or situational awareness during lateral movement. While these utilities are legitimate, execution with specific arguments or targeting sensitive logs like Security, PowerShell, or specific EventIDs (e.g., 4624, 4778) can indicate malicious intent. If confirmed malicious, this behavior could allow an attacker to extract sensitive info and potentially have leveraged access or move laterally.
Known False Positives
- System administrators or monitoring tools may legitimately use these utilities to gather logs for troubleshooting or auditing. Filter known admin behavior or monitoring solutions as needed.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Discovery |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
name: Windows EventLog Recon Activity Using Log Query Utilities
id: dc167f8b-3f9d-4460-9c98-8b6e703fd628
version: 7
creation_date: '2025-04-24'
modification_date: '2026-05-13'
author: Nasreddine Bencherchali, Splunk
status: production
type: Anomaly
description: |
This analytic detects EventLog reconnaissance activity using utilities such as `wevtutil.exe`, `wmic.exe`, PowerShell cmdlets like `Get-WinEvent`, or WMI queries targeting `Win32_NTLogEvent`. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on process names and command-line arguments. These tools are often used by adversaries to extract usernames, IP addresses, session data, and event information for credential access or situational awareness during lateral movement. While these utilities are legitimate, execution with specific arguments or targeting sensitive logs like `Security`, `PowerShell`, or specific EventIDs (e.g., 4624, 4778) can indicate malicious intent. If confirmed malicious, this behavior could allow an attacker to extract sensitive info and potentially have leveraged access or move laterally.
data_source:
- Sysmon EventID 1
- Windows Event Log Security 4688
- CrowdStrike ProcessRollup2
search: |
| tstats `security_content_summariesonly` values(Processes.process) as process
min(_time) as firstTime max(_time) as lastTime
from datamodel=Endpoint.Processes
where (
(
(
Processes.process_name IN ("powershell.exe", "pwsh.exe", "powershell_ise.exe")
OR
Processes.original_file_name IN ("PowerShell.EXE", "pwsh.dll", "powershell_ise.EXE")
)
Processes.process IN ("*Get-WinEvent*", "*Get-EventLog*", "*EventLogQuery*", "*.ReadEvent(*")
)
OR
(
(
Processes.process_name = wevtutil.exe
OR
Processes.original_file_name = wevtutil.exe
)
Processes.process IN ("* qe *", "* query-events *")
)
OR
(
(
Processes.process_name = wmic.exe
OR
Processes.original_file_name = wmic.exe
)
Processes.process IN ("*ntevent*")
)
OR
(
Processes.process="*Win32_NTLogEvent*"
Processes.process="*EventCode*"
)
OR
(
Processes.process IN ("*PsLogList*", "*Eventquery*")
)
)
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_eventlog_recon_activity_using_log_query_utilities_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: |
System administrators or monitoring tools may legitimately use these utilities to gather logs for troubleshooting or auditing. Filter known admin behavior or monitoring solutions as needed.
references:
- http://blog.talosintelligence.com/2022/09/lazarus-three-rats.html
- https://thedfirreport.com/2023/10/30/netsupport-intrusion-results-in-domain-compromise/
- https://www.cisa.gov/news-events/cybersecurity-advisories/aa23-144a
- https://www.group-ib.com/blog/apt41-world-tour-2021/
- https://labs.withsecure.com/content/dam/labs/docs/f-secureLABS-tlp-white-lazarus-threat-intel-report2.pdf
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.diagnostics/get-winevent
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-eventlog
- https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/wevtutil
intermediate_findings:
entities:
- field: dest
type: system
score: 20
message: Suspicious log query $process$ command was run on $dest$ by $user$
- field: user
type: user
score: 20
message: Suspicious log query $process$ command was run on $dest$ by $user$
analytic_story:
- Windows Discovery Techniques
- BlankGrabber Stealer
asset_type: Endpoint
mitre_attack_id:
- T1654
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
min(_time) as firstTime
max(_time) as lastTime
from datamodel=Endpoint.Processes
where (
(
(
Processes.process_name IN ("powershell.exe", "pwsh.exe", "powershell_ise.exe")
OR Processes.original_file_name IN (
"PowerShell.EXE",
"pwsh.dll",
"powershell_ise.EXE"
)
)
Processes.process IN (
"*Get-WinEvent*",
"*Get-EventLog*",
"*EventLogQuery*",
"*.ReadEvent(*"
)
)
OR (
(
Processes.process_name = wevtutil.exe
OR Processes.original_file_name = wevtutil.exe
)
Processes.process IN ("* qe *", "* query-events *")
)
OR (
(
Processes.process_name = wmic.exe
OR Processes.original_file_name = wmic.exe
)
Processes.process IN ("*ntevent*")
)
OR (
Processes.process="*Win32_NTLogEvent*"
Processes.process="*EventCode*"
)
OR (
Processes.process IN ("*PsLogList*", "*Eventquery*")
)
)
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_eventlog_recon_activity_using_log_query_utilities_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Processes.original_file_name | eq |
| field:"OriginalFileName" kind:eq |
Processes.original_file_name | in |
| field:"OriginalFileName" kind:in |
Processes.process | eq |
| field:"CommandLine" kind:eq |
Processes.process | in |
| field:"CommandLine" kind:in |
Processes.process_name | eq |
| field:"process_basename" kind:eq |
Processes.process_name | in |
| field:"process_basename" kind:in |
Windows Impair Defense Change Win Defender Health Check Intervals
#The following analytic detects modifications to the Windows registry that change the health check interval of Windows Defender. It leverages data from the Endpoint datamodel, specifically monitoring changes to the "ServiceKeepAlive" registry path with a value of "0x00000001". This activity is significant because altering Windows Defender settings can impair its ability to perform timely health checks, potentially leaving the system vulnerable. If confirmed malicious, this could allow an attacker to disable or delay security scans, increasing the risk of undetected malware or other malicious activities.
Known False Positives
- It is unusual to turn this feature off a Windows system since it is a default security control, although it is not rare for some policies to disable it. Although no false positives have been identified, use the provided filter macro to tune the search.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Defense Impairment |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 13: RegistryEvent (Value Set) |
Rule Body
name: Windows Impair Defense Change Win Defender Health Check Intervals
id: 5211c260-820e-4366-b983-84bbfb5c263a
version: 11
creation_date: '2024-01-30'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects modifications to the Windows registry that change the health check interval of Windows Defender. It leverages data from the Endpoint datamodel, specifically monitoring changes to the "ServiceKeepAlive" registry path with a value of "0x00000001". This activity is significant because altering Windows Defender settings can impair its ability to perform timely health checks, potentially leaving the system vulnerable. If confirmed malicious, this could allow an attacker to disable or delay security scans, increasing the risk of undetected malware or other malicious activities.
data_source:
- Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path= "*\\Windows Defender\\ServiceKeepAlive" Registry.registry_value_data="0x00000001" by Registry.action Registry.dest Registry.process_guid Registry.process_id Registry.registry_hive Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.registry_value_name Registry.registry_value_type Registry.status Registry.user Registry.vendor_product | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_impair_defense_change_win_defender_health_check_intervals_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Registry` node.
known_false_positives: It is unusual to turn this feature off a Windows system since it is a default security control, although it is not rare for some policies to disable it. Although no false positives have been identified, use the provided filter macro to tune the search.
references:
- https://x.com/malmoeb/status/1742604217989415386?s=20
- https://github.com/undergroundwires/privacy.sexy
finding:
title: change in the health check interval of Windows Defender on $dest$.
entity:
field: dest
type: system
score: 50
analytic_story:
- Windows Defense Evasion Tactics
- Windows Registry Abuse
asset_type: Endpoint
mitre_attack_id:
- T1685
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: tstats
| tstats `security_content_summariesonly`
count
min(_time) as firstTime
max(_time) as lastTime
FROM datamodel=Endpoint.Registry
where Registry.registry_path= "*\\Windows Defender\\ServiceKeepAlive"
Registry.registry_value_data="0x00000001"
by
Registry.action
Registry.dest
Registry.process_guid
Registry.process_id
Registry.registry_hive
Registry.registry_path
Registry.registry_key_name
Registry.registry_value_data
Registry.registry_value_name
Registry.registry_value_type
Registry.status
Registry.user
Registry.vendor_product
Stage 2: search
| `drop_dm_object_name(Registry)`
Stage 3: search
| `security_content_ctime(firstTime)`
Stage 4: search
| `security_content_ctime(lastTime)`
Stage 5: search
| `windows_impair_defense_change_win_defender_health_check_intervals_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Registry.registry_path | eq |
| field:"registry_path" kind:eq value:"*\Windows Defender\ServiceKeepAlive" |
Registry.registry_value_data | eq |
| field:"Details" kind:eq value:"0x00000001" |
Windows Modify Registry ProxyServer
#The following analytic detects modifications to the Windows registry key for setting up a proxy server. It leverages data from the Endpoint.Registry datamodel, focusing on changes to the "Internet Settings\ProxyServer" registry path. This activity is significant as it can indicate malware or adversaries configuring a proxy to facilitate unauthorized communication with Command and Control (C2) servers. If confirmed malicious, this could allow attackers to establish persistent, covert channels for data exfiltration or further exploitation of the compromised host.
Known False Positives
- Administrators may enable or disable this feature that may cause some false positive, however is not common. Filter as needed.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Persistence | |
| Defense Impairment |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 13: RegistryEvent (Value Set) |
Rule Body
name: Windows Modify Registry ProxyServer
id: 12bdaa0b-3c59-4489-aae1-bff6d67746ef
version: 11
creation_date: '2023-12-06'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic detects modifications to the Windows registry key for setting up a proxy server. It leverages data from the Endpoint.Registry datamodel, focusing on changes to the "Internet Settings\\ProxyServer" registry path. This activity is significant as it can indicate malware or adversaries configuring a proxy to facilitate unauthorized communication with Command and Control (C2) servers. If confirmed malicious, this could allow attackers to establish persistent, covert channels for data exfiltration or further exploitation of the compromised host.
data_source:
- Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = "*\\Internet Settings\\ProxyServer" by Registry.action Registry.dest Registry.process_guid Registry.process_id Registry.registry_hive Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.registry_value_name Registry.registry_value_type Registry.status Registry.user Registry.vendor_product | `drop_dm_object_name(Registry)` | where isnotnull(registry_value_data) | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_modify_registry_proxyserver_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Registry` node. Also make sure that this registry was included in your config files ex. sysmon config to be monitored.
known_false_positives: Administrators may enable or disable this feature that may cause some false positive, however is not common. Filter as needed.
references:
- https://malpedia.caad.fkie.fraunhofer.de/details/win.darkgate
intermediate_findings:
entities:
- field: dest
type: system
score: 20
message: the registry settings was modified to setup proxy server on $dest$.
analytic_story:
- DarkGate Malware
asset_type: Endpoint
mitre_attack_id:
- T1112
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: tstats
| tstats `security_content_summariesonly`
count
min(_time) as firstTime
max(_time) as lastTime
from datamodel=Endpoint.Registry
where Registry.registry_path = "*\\Internet Settings\\ProxyServer"
by
Registry.action
Registry.dest
Registry.process_guid
Registry.process_id
Registry.registry_hive
Registry.registry_path
Registry.registry_key_name
Registry.registry_value_data
Registry.registry_value_name
Registry.registry_value_type
Registry.status
Registry.user
Registry.vendor_product
Stage 2: search
| `drop_dm_object_name(Registry)`
Stage 3: where
| where isnotnull(registry_value_data)
Stage 4: search
| `security_content_ctime(firstTime)`
Stage 5: search
| `security_content_ctime(lastTime)`
Stage 6: search
| `windows_modify_registry_proxyserver_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Registry.registry_path | eq |
| field:"registry_path" kind:eq value:"*\Internet Settings\ProxyServer" |
registry_value_data | is_not_null | field:"Details" kind:is_not_null |
Windows MSHTA Writing to World Writable Path
#The following analytic identifies instances of mshta.exe writing files to world-writable directories. It leverages Sysmon EventCode 11 logs to detect file write operations by mshta.exe to directories like C:\Windows\Tasks and C:\Windows\Temp. This activity is significant as it often indicates an attempt to establish persistence or execute malicious code, deviating from the utility's legitimate use. If confirmed malicious, this behavior could lead to the execution of multi-stage payloads, potentially resulting in full system compromise and unauthorized access to sensitive information.
Known False Positives
- False positives may occur if legitimate processes are writing to world-writable directories. It is recommended to investigate the context of the file write operation to determine if it is malicious or not. Modify the search to include additional known good paths for `mshta.exe` to reduce false positives.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Stealth |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 11: FileCreate |
Rule Body
name: Windows MSHTA Writing to World Writable Path
id: efbcf8ee-bc75-47f1-8985-a5c638c4faf0
version: 11
creation_date: '2024-04-04'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic identifies instances of `mshta.exe` writing files to world-writable directories. It leverages Sysmon EventCode 11 logs to detect file write operations by `mshta.exe` to directories like `C:\Windows\Tasks` and `C:\Windows\Temp`. This activity is significant as it often indicates an attempt to establish persistence or execute malicious code, deviating from the utility's legitimate use. If confirmed malicious, this behavior could lead to the execution of multi-stage payloads, potentially resulting in full system compromise and unauthorized access to sensitive information.
data_source:
- Sysmon EventID 11
search: |
`sysmon`
EventCode=11
(
Image="*\\mshta.exe"
OR
OriginalFileName="mshta.exe"
)
TargetFilename IN (
"*\\Windows\\PLA\\Reports\\*",
"*\\Windows\\PLA\\Rules\\*",
"*\\Windows\\PLA\\Templates\\*",
"*\\Windows\\Registration\\CRMLog\\*",
"*\\Windows\\System32\\Com\\dmp\\*",
"*\\Windows\\System32\\LogFiles\\WMI\\*",
"*\\Windows\\System32\\Microsoft\\Crypto\\RSA\\MachineKeys\\*",
"*\\Windows\\System32\\spool\\drivers\\color\\*",
"*\\Windows\\System32\\spool\\PRINTERS\\*",
"*\\Windows\\System32\\spool\\SERVERS\\*",
"*\\Windows\\System32\\Tasks\\*",
"*\\Windows\\SysWOW64\\Com\\dmp\\*",
"*\\Windows\\SysWOW64\\Tasks\\*",
"*\\Windows\\Tasks\\*",
"*\\Windows\\Temp\\*",
"*\\Windows\\tracing\\*"
)
| stats count min(_time) as firstTime max(_time) as lastTime by action dest file_name
file_path process_guid process_id user user_id vendor_product Image TargetFilename
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `windows_mshta_writing_to_world_writable_path_filter`
how_to_implement: The analytic is designed to be run against Sysmon event logs collected from endpoints. The analytic requires the Sysmon event logs to be ingested into Splunk. The search focuses on EventCode 11 where the Image is `mshta.exe` and the TargetFilename is within world-writable directories such as `C:\Windows\Tasks`, `C:\Windows\Temp`, and others. The detection is designed to catch the initial file write operation by `mshta.exe` to these locations, which is indicative of an attempt to establish persistence or execute malicious code. The analytic can be modified to include additional world-writable directories as needed.
known_false_positives: False positives may occur if legitimate processes are writing to world-writable directories. It is recommended to investigate the context of the file write operation to determine if it is malicious or not. Modify the search to include additional known good paths for `mshta.exe` to reduce false positives.
references:
- https://www.mandiant.com/resources/blog/apt29-wineloader-german-political-parties
- https://www.zscaler.com/blogs/security-research/european-diplomats-targeted-spikedwine-wineloader
finding:
title: An instance of $Image$ writing to $TargetFilename$ was detected on $dest$.
entity:
field: dest
type: system
score: 50
threat_objects:
- field: Image
type: file_name
analytic_story:
- APT29 Diplomatic Deceptions with WINELOADER
- Suspicious MSHTA Activity
- XWorm
threat_group:
- APT29
- Cozy Bear
- Midnight Blizzard
asset_type: Endpoint
mitre_attack_id:
- T1218.005
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: search
`sysmon`
EventCode=11
(
Image="*\\mshta.exe"
OR
OriginalFileName="mshta.exe"
)
TargetFilename IN (
"*\\Windows\\PLA\\Reports\\*",
"*\\Windows\\PLA\\Rules\\*",
"*\\Windows\\PLA\\Templates\\*",
"*\\Windows\\Registration\\CRMLog\\*",
"*\\Windows\\System32\\Com\\dmp\\*",
"*\\Windows\\System32\\LogFiles\\WMI\\*",
"*\\Windows\\System32\\Microsoft\\Crypto\\RSA\\MachineKeys\\*",
"*\\Windows\\System32\\spool\\drivers\\color\\*",
"*\\Windows\\System32\\spool\\PRINTERS\\*",
"*\\Windows\\System32\\spool\\SERVERS\\*",
"*\\Windows\\System32\\Tasks\\*",
"*\\Windows\\SysWOW64\\Com\\dmp\\*",
"*\\Windows\\SysWOW64\\Tasks\\*",
"*\\Windows\\Tasks\\*",
"*\\Windows\\Temp\\*",
"*\\Windows\\tracing\\*"
)
Stage 2: stats
| stats count min(_time) as firstTime max(_time) as lastTime by action dest file_name
file_path process_guid process_id user user_id vendor_product Image TargetFilename
Stage 3: search
| `security_content_ctime(firstTime)`
Stage 4: search
| `security_content_ctime(lastTime)`
Stage 5: search
| `windows_mshta_writing_to_world_writable_path_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"11" |
Image | eq |
| field:"Image" kind:eq value:"*\mshta.exe" |
OriginalFileName | eq |
| field:"OriginalFileName" kind:eq value:"mshta.exe" |
TargetFilename | in |
| field:"TargetFilename" kind:in |
Windows Suspicious Child Process Spawned From WebServer
#The following analytic identifies the execution of suspicious processes typically associated with WebShell activity on web servers. It detects when processes like cmd.exe, powershell.exe, or bash.exe are spawned by web server processes such as w3wp.exe or nginx.exe. This behavior is significant as it may indicate an adversary exploiting a web application vulnerability to install a WebShell, providing persistent access and command execution capabilities. If confirmed malicious, this activity could allow attackers to maintain control over the compromised server, execute arbitrary commands, and potentially escalate privileges or exfiltrate sensitive data.
Known False Positives
- Legitimate OS functions called by vendor applications, baseline the environment and filter before enabling. Recommend throttle by dest/process_name
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Persistence |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
name: Windows Suspicious Child Process Spawned From WebServer
id: 2d4470ef-7158-4b47-b68b-1f7f16382156
version: 12
creation_date: '2023-04-12'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: Anomaly
description: The following analytic identifies the execution of suspicious processes typically associated with WebShell activity on web servers. It detects when processes like `cmd.exe`, `powershell.exe`, or `bash.exe` are spawned by web server processes such as `w3wp.exe` or `nginx.exe`. This behavior is significant as it may indicate an adversary exploiting a web application vulnerability to install a WebShell, providing persistent access and command execution capabilities. If confirmed malicious, this activity could allow attackers to maintain control over the compromised server, execute arbitrary commands, and potentially escalate privileges or exfiltrate sensitive data.
data_source:
- Sysmon EventID 1
- Windows Event Log Security 4688
- CrowdStrike ProcessRollup2
search: |-
| tstats `security_content_summariesonly` count max(_time) as lastTime, min(_time) as firstTime FROM datamodel=Endpoint.Processes
WHERE (
Processes.process_name IN ("arp.exe","at.exe","bash.exe","bitsadmin.exe","certutil.exe","cmd.exe","cscript.exe", "dsget.exe","dsquery.exe","find.exe","findstr.exe","fsutil.exe","hostname.exe","ipconfig.exe","ksh.exe","nbstat.exe", "net.exe","net1.exe","netdom.exe","netsh.exe","netstat.exe","nltest.exe","nslookup.exe","ntdsutil.exe","pathping.exe", "ping.exe","powershell.exe","pwsh.exe","qprocess.exe","query.exe","qwinsta.exe","reg.exe","rundll32.exe","sc.exe", "scrcons.exe","schtasks.exe","sh.exe","systeminfo.exe","tasklist.exe","tracert.exe","ver.exe","vssadmin.exe", "wevtutil.exe","whoami.exe","wmic.exe","wscript.exe","wusa.exe","zsh.exe")
AND
Processes.parent_process_name IN ("w3wp.exe", "http*.exe", "nginx*.exe", "php*.exe", "php-cgi*.exe","tomcat*.exe")
)
BY Processes.action Processes.dest Processes.original_file_name
Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
Processes.process Processes.process_exec Processes.process_guid
Processes.process_hash Processes.process_id Processes.process_integrity_level
Processes.process_name Processes.process_path Processes.user
Processes.user_id Processes.vendor_product
| `drop_dm_object_name("Processes")`
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `windows_suspicious_child_process_spawned_from_webserver_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 OS functions called by vendor applications, baseline the environment and filter before enabling. Recommend throttle by dest/process_name
references:
- https://attack.mitre.org/techniques/T1505/003/
- https://github.com/nsacyber/Mitigating-Web-Shells
- https://www.hackingarticles.in/multiple-ways-to-exploit-tomcat-manager/
intermediate_findings:
entities:
- field: user
type: user
score: 10
message: Webshell Exploit Behavior - $parent_process_name$ spawned $process_name$ on $dest$.
- field: dest
type: system
score: 10
message: Webshell Exploit Behavior - $parent_process_name$ spawned $process_name$ on $dest$.
threat_objects:
- field: process_name
type: process_name
analytic_story:
- Flax Typhoon
- BlackByte Ransomware
- CISA AA22-257A
- HAFNIUM Group
- CISA AA22-264A
- ProxyShell
- SysAid On-Prem Software CVE-2023-47246 Vulnerability
- ProxyNotShell
- Medusa Ransomware
- WS FTP Server Critical Vulnerabilities
- Compromised Windows Host
- Citrix ShareFile RCE CVE-2023-24489
- Microsoft SharePoint Vulnerabilities
- GhostRedirector IIS Module and Rungan Backdoor
- Microsoft WSUS CVE-2025-59287
asset_type: Endpoint
mitre_attack_id:
- T1505.003
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: tstats
| tstats `security_content_summariesonly`
count
max(_time) as lastTime,
min(_time) as firstTime
FROM datamodel=Endpoint.Processes
WHERE (
Processes.process_name IN (
"arp.exe",
"at.exe",
"bash.exe",
"bitsadmin.exe",
"certutil.exe",
"cmd.exe",
"cscript.exe",
"dsget.exe",
"dsquery.exe",
"find.exe",
"findstr.exe",
"fsutil.exe",
"hostname.exe",
"ipconfig.exe",
"ksh.exe",
"nbstat.exe",
"net.exe",
"net1.exe",
"netdom.exe",
"netsh.exe",
"netstat.exe",
"nltest.exe",
"nslookup.exe",
"ntdsutil.exe",
"pathping.exe",
"ping.exe",
"powershell.exe",
"pwsh.exe",
"qprocess.exe",
"query.exe",
"qwinsta.exe",
"reg.exe",
"rundll32.exe",
"sc.exe",
"scrcons.exe",
"schtasks.exe",
"sh.exe",
"systeminfo.exe",
"tasklist.exe",
"tracert.exe",
"ver.exe",
"vssadmin.exe",
"wevtutil.exe",
"whoami.exe",
"wmic.exe",
"wscript.exe",
"wusa.exe",
"zsh.exe"
)
AND Processes.parent_process_name IN (
"w3wp.exe",
"http*.exe",
"nginx*.exe",
"php*.exe",
"php-cgi*.exe",
"tomcat*.exe"
)
)
BY
Processes.action
Processes.dest
Processes.original_file_name
Processes.parent_process
Processes.parent_process_exec
Processes.parent_process_guid
Processes.parent_process_id
Processes.parent_process_name
Processes.parent_process_path
Processes.process
Processes.process_exec
Processes.process_guid
Processes.process_hash
Processes.process_id
Processes.process_integrity_level
Processes.process_name
Processes.process_path
Processes.user
Processes.user_id
Processes.vendor_product
Stage 2: search
| `drop_dm_object_name("Processes")`
Stage 3: search
| `security_content_ctime(firstTime)`
Stage 4: search
| `security_content_ctime(lastTime)`
Stage 5: search
| `windows_suspicious_child_process_spawned_from_webserver_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
Processes.parent_process_name | in |
| field:"parent_process_basename" kind:in |
Processes.process_name | in |
| field:"process_basename" kind:in |
XMRIG Driver Loaded
#The following analytic detects the installation of the XMRIG coinminer driver on a system. It identifies the loading of the WinRing0x64.sys driver, commonly associated with XMRIG, by analyzing Sysmon EventCode 6 logs for specific signatures and image loads. This activity is significant because XMRIG is an open-source CPU miner frequently exploited by adversaries to mine cryptocurrency illicitly. If confirmed malicious, this activity could lead to unauthorized resource consumption, degraded system performance, and potential financial loss due to unauthorized cryptocurrency mining.
Known False Positives
- False positives should be limited.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Persistence | |
| Privilege Escalation |
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 6: Driver loaded |
Rule Body
name: XMRIG Driver Loaded
id: 90080fa6-a8df-11eb-91e4-acde48001122
version: 10
creation_date: '2021-05-07'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects the installation of the XMRIG coinminer driver on a system. It identifies the loading of the `WinRing0x64.sys` driver, commonly associated with XMRIG, by analyzing Sysmon EventCode 6 logs for specific signatures and image loads. This activity is significant because XMRIG is an open-source CPU miner frequently exploited by adversaries to mine cryptocurrency illicitly. If confirmed malicious, this activity could lead to unauthorized resource consumption, degraded system performance, and potential financial loss due to unauthorized cryptocurrency mining.
data_source:
- Sysmon EventID 6
search: '`sysmon` EventCode=6 Signature="Noriyuki MIYAZAKI" OR ImageLoaded= "*\\WinRing0x64.sys" | stats min(_time) as firstTime max(_time) as lastTime count by ImageLoaded dest dvc process_hash process_path signature signature_id user_id vendor_product | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `xmrig_driver_loaded_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting logs with the driver loaded and Signature from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA.
known_false_positives: False positives should be limited.
references:
- https://www.trendmicro.com/vinfo/hk/threat-encyclopedia/malware/trojan.ps1.powtran.a/
finding:
title: A driver $ImageLoaded$ related to xmrig crytominer loaded in host $dest$
entity:
field: dest
type: system
score: 50
analytic_story:
- CISA AA22-320A
- Crypto Stealer
- XMRig
asset_type: Endpoint
mitre_attack_id:
- T1543.003
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: endpoint
security_domain: endpoint
Stages and Predicates
Stage 1: search
`sysmon` EventCode=6 Signature="Noriyuki MIYAZAKI" OR ImageLoaded= "*\\WinRing0x64.sys"
Stage 2: stats
| stats
min(_time) as firstTime
max(_time) as lastTime
count
by ImageLoaded dest dvc process_hash process_path signature signature_id user_id vendor_product
Stage 3: search
| `security_content_ctime(firstTime)`
Stage 4: search
| `security_content_ctime(lastTime)`
Stage 5: search
| `xmrig_driver_loaded_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"6" |
ImageLoaded | eq |
| field:"ImageLoaded" kind:eq value:"*\WinRing0x64.sys" |
Signature | eq |
| field:"Signature" kind:eq value:"Noriyuki MIYAZAKI" |