Skip to content

Commit de5542c

Browse files
authored
Merge pull request #3481 from splunk/revert_prestats_optimization
Revert prestats optimization
2 parents 4c1dbbb + 08dac06 commit de5542c

22 files changed

+334
-673
lines changed

detections/endpoint/detect_outlook_exe_writing_a_zip_file.yml

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: Detect Outlook exe writing a zip file
22
id: a51bfe1a-94f0-4822-b1e4-16ae10145893
3-
version: 11
4-
date: '2025-02-10'
3+
version: 12
4+
date: '2025-04-22'
55
author: Bhavin Patel, Splunk
66
status: experimental
77
type: TTP
@@ -14,38 +14,21 @@ description: The following analytic identifies the execution of `outlook.exe` wr
1414
the security of the affected system and network.
1515
data_source:
1616
- Sysmon EventID 1 AND Sysmon EventID 11
17-
search: '| tstats prestats=t `security_content_summariesonly` count min(_time) as
18-
firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes where Processes.process_name=outlook.exe
19-
by Processes.action Processes.dest Processes.original_file_name Processes.parent_process
20-
Processes.parent_process_exec Processes.parent_process_guid Processes.parent_process_id
21-
Processes.parent_process_name Processes.parent_process_path Processes.process Processes.process_exec
22-
Processes.process_guid Processes.process_hash Processes.process_id Processes.process_integrity_level
23-
Processes.process_name Processes.process_path Processes.user Processes.user_id Processes.vendor_product
24-
| `drop_dm_object_name(Processes)` | tstats prestats=t append=t `security_content_summariesonly`
25-
count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem
17+
search: '| tstats `security_content_summariesonly` min(_time) as firstTime max(_time)
18+
as lastTime FROM datamodel=Endpoint.Processes where Processes.process_name=outlook.exe
19+
by _time span=5m Processes.parent_process_id Processes.process_id Processes.dest
20+
Processes.process_name Processes.parent_process_name Processes.user | `drop_dm_object_name(Processes)`
21+
| `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | rename
22+
process_id as malicious_id| rename parent_process_id as outlook_id| join malicious_id
23+
type=inner[| tstats `security_content_summariesonly` count values(Filesystem.file_path)
24+
as file_path values(Filesystem.file_name) as file_name FROM datamodel=Endpoint.Filesystem
2625
where (Filesystem.file_path=*.zip* OR Filesystem.file_name=*.lnk ) AND (Filesystem.file_path=C:\\Users*
27-
OR Filesystem.file_path=*Local\\Temp*) by Filesystem.action Filesystem.dest Filesystem.file_access_time
28-
Filesystem.file_create_time Filesystem.file_hash Filesystem.file_modify_time Filesystem.file_name
29-
Filesystem.file_path Filesystem.file_acl Filesystem.file_size Filesystem.process_guid
30-
Filesystem.process_id Filesystem.user Filesystem.vendor_product | `drop_dm_object_name(Filesystem)`
31-
| table action dest original_file_name parent_process parent_process_exec parent_process_guid
32-
parent_process_id parent_process_name parent_process_path process process_exec process_guid
33-
process_hash process_id process_integrity_level process_name process_path user user_id
34-
vendor_product file_access_time file_create_time file_hash file_modify_time file_name
35-
file_path file_acl file_size firstTime lastTime | stats values(action) as action
36-
values(parent_process) as parent_process values(dest) as dest values(original_file_name)
37-
as original_file_name values(parent_process) as parent_process values(parent_process_exec)
38-
as parent_process_exec values(parent_process_guid) as parent_process_guid values(parent_process_id)
39-
as parent_process_id values(parent_process_name) as parent_process_name values(parent_process_path)
40-
as parent_process_path values(process) as process values(process_exec) as process_exec
41-
values(process_hash) as process_hash values(process_id) as process_id values(process_integrity_level)
42-
as process_integrity_level values(process_name) as process_name values(process_path)
43-
as process_path values(user) as user values(user_id) as user_id values(vendor_product)
44-
as vendor_product values(file_access_time) as file_access_time values(file_create_time)
45-
as file_create_time values(file_hash) as file_hash values(file_modify_time) as file_modify_time
46-
values(file_name) as file_name values(file_path) as file_path values(file_acl) as
47-
file_acl values(file_size) as file_size by process_guid | where isnotnull(process)
48-
AND isnotnull(file_name) | `detect_outlook_exe_writing_a_zip_file_filter`'
26+
OR Filesystem.file_path=*Local\\Temp*) by _time span=5m Filesystem.process_id Filesystem.file_hash
27+
Filesystem.dest | `drop_dm_object_name(Filesystem)` | `security_content_ctime(firstTime)`
28+
| `security_content_ctime(lastTime)` | rename process_id as malicious_id| fields
29+
malicious_id outlook_id dest file_path file_name file_hash count file_id] | table
30+
firstTime lastTime user malicious_id outlook_id process_name parent_process_name
31+
file_name file_path | where file_name != "" | `detect_outlook_exe_writing_a_zip_file_filter`'
4932
how_to_implement: You must be ingesting data that records filesystem and process activity
5033
from your hosts to populate the Endpoint data model. This is typically populated
5134
via endpoint detection-and-response product, such as Carbon Black, or endpoint data

detections/endpoint/dllhost_with_no_command_line_arguments_with_network.yml

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,37 +15,16 @@ description: The following analytic detects instances of DLLHost.exe running wit
1515
network's security.
1616
data_source:
1717
- Sysmon EventID 1 AND Sysmon EventID 3
18-
search: '| tstats prestats=t `security_content_summariesonly` count FROM datamodel=Endpoint.Processes
19-
where Processes.process_name=dllhost.exe Processes.action!="blocked" by Processes.action
20-
Processes.dest Processes.original_file_name Processes.parent_process Processes.parent_process_exec
21-
Processes.parent_process_guid Processes.parent_process_id Processes.parent_process_name
22-
Processes.parent_process_path Processes.process Processes.process_exec Processes.process_guid
23-
Processes.process_hash Processes.process_id Processes.process_integrity_level Processes.process_name
24-
Processes.process_path Processes.user Processes.user_id Processes.vendor_product
25-
| `drop_dm_object_name(Processes)` | tstats prestats=t append=t `security_content_summariesonly`
26-
count min(_time) as firstTime max(_time) as lastTime from datamodel=Network_Traffic.All_Traffic
27-
where All_Traffic.dest_port != 0 by All_Traffic.action All_Traffic.app All_Traffic.dest
28-
All_Traffic.dest_ip All_Traffic.dest_port All_Traffic.direction All_Traffic.dvc
29-
All_Traffic.protocol All_Traffic.protocol_version All_Traffic.src All_Traffic.src_ip
30-
All_Traffic.src_port All_Traffic.transport All_Traffic.user All_Traffic.vendor_product
31-
All_Traffic.process_id | `drop_dm_object_name(All_Traffic)` | table action dest
32-
original_file_name parent_process parent_process_exec parent_process_guid parent_process_id
33-
parent_process_name parent_process_path process process_exec process_guid process_hash
34-
process_id process_integrity_level process_name process_path user user_id vendor_product
35-
app dest_ip dest_port direction dvc protocol protocol_version src src_ip src_port
36-
transport | stats values(action) as action values(dest) as dest values(original_file_name)
37-
as original_file_name values(parent_process) as parent_process values(parent_process_exec)
38-
as parent_process_exec values(parent_process_guid) as parent_process_guid values(parent_process_id)
39-
as parent_process_id values(parent_process_name) as parent_process_name values(parent_process_path)
40-
as parent_process_path values(process) as process values(process_exec) as process_exec
41-
values(process_hash) as process_hash values(process_guid) as process_guid values(process_integrity_level)
42-
as process_integrity_level values(process_name) as process_name values(process_path)
43-
as process_path values(user) as user values(user_id) as user_id values(vendor_product)
44-
as vendor_product values(app) as app values(dest_ip) as dest_ip values(dest_port)
45-
as dest_port values(direction) as direction values(dvc) as dvc values(protocol)
46-
as protocol values(protocol_version) as protocol_version values(src) as src values(src_ip)
47-
as src_ip values(src_port) as src_port values(transport) as transport by process_id
48-
| where isnotnull(process_name) AND isnotnull(dest_port) | `dllhost_with_no_command_line_arguments_with_network_filter`'
18+
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time)
19+
as lastTime FROM datamodel=Endpoint.Processes where Processes.process_name=dllhost.exe
20+
Processes.action!="blocked" by host _time span=1h Processes.process_id Processes.process_name
21+
Processes.dest Processes.process_path Processes.process Processes.parent_process_name
22+
Processes.parent_process | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)`
23+
| `security_content_ctime(lastTime)` | regex process="(?i)(dllhost\.exe.{0,4}$)"
24+
| rename dest as src | join host process_id [| tstats `security_content_summariesonly`
25+
count latest(All_Traffic.dest) as dest latest(All_Traffic.dest_ip) as dest_ip latest(All_Traffic.dest_port)
26+
as dest_port FROM datamodel=Network_Traffic.All_Traffic where All_Traffic.dest_port
27+
!= 0 by host All_Traffic.process_id | `drop_dm_object_name(All_Traffic)`] | `dllhost_with_no_command_line_arguments_with_network_filter`'
4928
how_to_implement: The detection is based on data that originates from Endpoint Detection
5029
and Response (EDR) agents. These agents are designed to provide security-related
5130
telemetry from the endpoints where the agent is installed. To implement this search,

detections/endpoint/gpupdate_with_no_command_line_arguments_with_network.yml

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: GPUpdate with no Command Line Arguments with Network
22
id: 2c853856-a140-11eb-a5b5-acde48001122
3-
version: 9
4-
date: '2024-12-10'
3+
version: 10
4+
date: '2025-04-22'
55
author: Michael Haag, Splunk
66
status: production
77
type: TTP
@@ -16,37 +16,24 @@ description: The following analytic detects the execution of gpupdate.exe withou
1616
leading to system compromise.
1717
data_source:
1818
- Sysmon EventID 1 AND Sysmon EventID 3
19-
search: '| tstats prestats=t `security_content_summariesonly` count FROM datamodel=Endpoint.Processes
20-
where Processes.process_name=gpupdate.exe by Processes.action Processes.dest Processes.original_file_name
21-
Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
22-
Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
23-
Processes.process Processes.process_exec Processes.process_guid Processes.process_hash
24-
Processes.process_id Processes.process_integrity_level Processes.process_name Processes.process_path
25-
Processes.user Processes.user_id Processes.vendor_product | `drop_dm_object_name(Processes)`
26-
| tstats prestats=t append=t `security_content_summariesonly` count min(_time) as
27-
firstTime max(_time) as lastTime from datamodel=Network_Traffic.All_Traffic where
28-
All_Traffic.dest_port != 0 by All_Traffic.action All_Traffic.app All_Traffic.dest
29-
All_Traffic.dest_ip All_Traffic.dest_port All_Traffic.direction All_Traffic.dvc
30-
All_Traffic.protocol All_Traffic.protocol_version All_Traffic.src All_Traffic.src_ip
31-
All_Traffic.src_port All_Traffic.transport All_Traffic.user All_Traffic.vendor_product
32-
All_Traffic.process_id | `drop_dm_object_name(All_Traffic)` | table action dest
33-
original_file_name parent_process parent_process_exec parent_process_guid parent_process_id
34-
parent_process_name parent_process_path process process_exec process_guid process_hash
35-
process_id process_integrity_level process_name process_path user user_id vendor_product
36-
app dest_ip dest_port direction dvc protocol protocol_version src src_ip src_port
37-
transport | stats values(action) as action values(dest) as dest values(original_file_name)
38-
as original_file_name values(parent_process) as parent_process values(parent_process_exec)
39-
as parent_process_exec values(parent_process_guid) as parent_process_guid values(parent_process_id)
40-
as parent_process_id values(parent_process_name) as parent_process_name values(parent_process_path)
41-
as parent_process_path values(process) as process values(process_exec) as process_exec
42-
values(process_hash) as process_hash values(process_guid) as process_guid values(process_integrity_level)
43-
as process_integrity_level values(process_name) as process_name values(process_path)
44-
as process_path values(user) as user values(user_id) as user_id values(vendor_product)
45-
as vendor_product values(app) as app values(dest_ip) as dest_ip values(dest_port)
46-
as dest_port values(direction) as direction values(dvc) as dvc values(protocol)
47-
as protocol values(protocol_version) as protocol_version values(src) as src values(src_ip)
48-
as src_ip values(src_port) as src_port values(transport) as transport by process_id
49-
| where isnotnull(process_name) AND isnotnull(dest_port) | `gpupdate_with_no_command_line_arguments_with_network_filter`'
19+
search: '| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Processes
20+
where Processes.process_name=gpupdate.exe
21+
by Processes.action Processes.dest Processes.original_file_name Processes.parent_process Processes.parent_process_exec
22+
Processes.parent_process_guid Processes.parent_process_id Processes.parent_process_name
23+
Processes.parent_process_path Processes.process Processes.process_exec Processes.process_guid Processes.process_hash
24+
Processes.process_id Processes.process_integrity_level Processes.process_name Processes.process_path
25+
Processes.user Processes.user_id Processes.vendor_product
26+
| `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)`
27+
| `security_content_ctime(lastTime)` | regex process="(?i)(gpupdate\.exe.{0,4}$)"|
28+
join process_id [| tstats `security_content_summariesonly` count values(All_Traffic.app) as app values(All_Traffic.dest_ip) as dest_ip
29+
values(All_Traffic.direction) as direction values(All_Traffic.dvc) as dvc values(All_Traffic.protocol) as protocol
30+
values(All_Traffic.protocol_version) as protocol_version values(All_Traffic.src) as src values(All_Traffic.src_ip) as src_ip
31+
values(All_Traffic.src_port) as src_port values(All_Traffic.transport) as transport FROM datamodel=Network_Traffic.All_Traffic
32+
where All_Traffic.dest_port != 0 by All_Traffic.process_id All_Traffic.dest All_Traffic.dest_port
33+
| `drop_dm_object_name(All_Traffic)` | rename dest as C2 ] | table _time user dest
34+
parent_process_name process_name process_path process process_id dest_port C2 app dest_ip direction dvc protocol
35+
protocol_version src src_ip src_port transport |
36+
`gpupdate_with_no_command_line_arguments_with_network_filter`'
5037
how_to_implement: The detection is based on data that originates from Endpoint Detection
5138
and Response (EDR) agents. These agents are designed to provide security-related
5239
telemetry from the endpoints where the agent is installed. To implement this search,

detections/endpoint/java_writing_jsp_file.yml

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: Java Writing JSP File
22
id: eb65619c-4f8d-4383-a975-d352765d344b
3-
version: 7
4-
date: '2024-11-13'
3+
version: 8
4+
date: '2025-04-22'
55
author: Michael Haag, Splunk
66
status: production
77
type: TTP
@@ -14,38 +14,24 @@ description: The following analytic detects the Java process writing a .jsp file
1414
the affected system, posing a severe security risk.
1515
data_source:
1616
- Sysmon for Linux EventID 1 AND Sysmon for Linux EventID 11
17-
search: '| tstats prestats=t `security_content_summariesonly` count min(_time) as
18-
firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes where Processes.process_name
19-
IN ("java","java.exe", "javaw.exe") by Processes.action Processes.dest Processes.original_file_name
17+
search: '| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Processes
18+
where Processes.process_name IN ("java","java.exe", "javaw.exe") by _time Processes.action Processes.dest Processes.original_file_name
2019
Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
2120
Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
2221
Processes.process Processes.process_exec Processes.process_guid Processes.process_hash
2322
Processes.process_id Processes.process_integrity_level Processes.process_name Processes.process_path
24-
Processes.user Processes.user_id Processes.vendor_product | `drop_dm_object_name(Processes)`
25-
| tstats prestats=t append=t `security_content_summariesonly` count min(_time) as
26-
firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem where Filesystem.file_name="*.jsp*"
27-
by Filesystem.action Filesystem.dest Filesystem.file_access_time Filesystem.file_create_time
23+
Processes.user Processes.user_id Processes.vendor_product
24+
| `drop_dm_object_name(Processes)`
25+
| join process_guid [| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Filesystem
26+
where Filesystem.file_name="*.jsp*" by _time Filesystem.action Filesystem.dest Filesystem.file_access_time Filesystem.file_create_time
2827
Filesystem.file_hash Filesystem.file_modify_time Filesystem.file_name Filesystem.file_path
2928
Filesystem.file_acl Filesystem.file_size Filesystem.process_guid Filesystem.process_id
30-
Filesystem.user Filesystem.vendor_product | `drop_dm_object_name(Filesystem)` |
31-
table action dest original_file_name parent_process parent_process_exec parent_process_guid
32-
parent_process_id parent_process_name parent_process_path process process_exec process_guid
33-
process_hash process_id process_integrity_level process_name process_path user user_id
34-
vendor_product file_access_time file_create_time file_hash file_modify_time file_name
35-
file_path file_acl file_size firstTime lastTime | stats values(action) as action
36-
values(dest) as dest values(original_file_name) as original_file_name values(parent_process)
37-
as parent_process values(parent_process_exec) as parent_process_exec values(parent_process_guid)
38-
as parent_process_guid values(parent_process_id) as parent_process_id values(parent_process_name)
39-
as parent_process_name values(parent_process_path) as parent_process_path values(process)
40-
as process values(process_exec) as process_exec values(process_hash) as process_hash
41-
values(process_id) as process_id values(process_integrity_level) as process_integrity_level
42-
values(process_name) as process_name values(process_path) as process_path values(user)
43-
as user values(user_id) as user_id values(vendor_product) as vendor_product values(file_access_time)
44-
as file_access_time values(file_create_time) as file_create_time values(file_hash)
45-
as file_hash values(file_modify_time) as file_modify_time values(file_name) as file_name
46-
values(file_path) as file_path values(file_acl) as file_acl values(file_size) as
47-
file_size by process_guid | where isnotnull(process) AND isnotnull(file_name) |
48-
`java_writing_jsp_file_filter`'
29+
Filesystem.user Filesystem.vendor_product
30+
| `drop_dm_object_name(Filesystem)` | fields _time process_guid file_path file_name
31+
file_create_time user dest process_name] | stats count min(_time) as firstTime max(_time)
32+
as lastTime by dest process_name process_guid file_name file_path file_create_time
33+
user | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
34+
| `java_writing_jsp_file_filter`'
4935
how_to_implement: To successfully implement this search you need to be ingesting information
5036
on process that include the name of the process responsible for the changes from
5137
your endpoints into the `Endpoint` datamodel in the `Processes` and `Filesystem`

0 commit comments

Comments
 (0)