Skip to content

Commit 4faaa1d

Browse files
authored
Merge branch 'develop' into develop
2 parents cac4a88 + de55408 commit 4faaa1d

2 files changed

Lines changed: 248 additions & 0 deletions

File tree

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
name: CrowdStrike Falcon Stream Alert
2+
id: 52b38751-b0db-4965-a800-ebaabd1fd7d5
3+
version: 1
4+
date: '2025-07-01'
5+
author: Bhavin Patel, Bryan Pluta, Splunk
6+
description: Logs of CrowdStrike Falcon Stream Alerts
7+
mitre_components:
8+
- Process Creation
9+
- Process Termination
10+
- Process Metadata
11+
- Command Execution
12+
- OS API Execution
13+
source: CrowdStrike:Event:Streams
14+
sourcetype: CrowdStrike:Event:Streams:JSON
15+
separator: event.DetectName
16+
supported_TA:
17+
- name: Splunk Add-on for CrowdStrike FDR
18+
url: https://splunkbase.splunk.com/app/5579
19+
version: 2.0.5
20+
fields:
21+
- action
22+
- description
23+
- dest
24+
- dest_nt_domain
25+
- event.AssociatedFile
26+
- event.CommandLine
27+
- event.ComputerName
28+
- event.DetectDescription
29+
- event.DetectId
30+
- event.DetectName
31+
- event.DocumentsAccessed{}.FileName
32+
- event.DocumentsAccessed{}.FilePath
33+
- event.DocumentsAccessed{}.Timestamp
34+
- event.ExecutablesWritten{}.FileName
35+
- event.ExecutablesWritten{}.FilePath
36+
- event.ExecutablesWritten{}.Timestamp
37+
- event.FalconHostLink
38+
- event.FileName
39+
- event.FilePath
40+
- event.GrandparentCommandLine
41+
- event.GrandparentImageFileName
42+
- event.HostGroups
43+
- event.IOARuleGroupName
44+
- event.IOARuleInstanceID
45+
- event.IOARuleInstanceVersion
46+
- event.IOARuleName
47+
- event.IOCType
48+
- event.IOCValue
49+
- event.LocalIP
50+
- event.MACAddress
51+
- event.MD5String
52+
- event.MachineDomain
53+
- event.NetworkAccesses{}.AccessTimestamp
54+
- event.NetworkAccesses{}.AccessType
55+
- event.NetworkAccesses{}.ConnectionDirection
56+
- event.NetworkAccesses{}.IsIPV6
57+
- event.NetworkAccesses{}.LocalAddress
58+
- event.NetworkAccesses{}.LocalPort
59+
- event.NetworkAccesses{}.Protocol
60+
- event.NetworkAccesses{}.RemoteAddress
61+
- event.NetworkAccesses{}.RemotePort
62+
- event.Objective
63+
- event.ParentCommandLine
64+
- event.ParentImageFileName
65+
- event.ParentProcessId
66+
- event.PatternDispositionDescription
67+
- event.PatternDispositionFlags.BlockingUnsupportedOrDisabled
68+
- event.PatternDispositionFlags.BootupSafeguardEnabled
69+
- event.PatternDispositionFlags.CriticalProcessDisabled
70+
- event.PatternDispositionFlags.Detect
71+
- event.PatternDispositionFlags.FsOperationBlocked
72+
- event.PatternDispositionFlags.HandleOperationDowngraded
73+
- event.PatternDispositionFlags.InddetMask
74+
- event.PatternDispositionFlags.Indicator
75+
- event.PatternDispositionFlags.KillActionFailed
76+
- event.PatternDispositionFlags.KillParent
77+
- event.PatternDispositionFlags.KillProcess
78+
- event.PatternDispositionFlags.KillSubProcess
79+
- event.PatternDispositionFlags.OperationBlocked
80+
- event.PatternDispositionFlags.PolicyDisabled
81+
- event.PatternDispositionFlags.ProcessBlocked
82+
- event.PatternDispositionFlags.QuarantineFile
83+
- event.PatternDispositionFlags.QuarantineMachine
84+
- event.PatternDispositionFlags.RegistryOperationBlocked
85+
- event.PatternDispositionFlags.Rooting
86+
- event.PatternDispositionFlags.SensorOnly
87+
- event.PatternDispositionFlags.SuspendParent
88+
- event.PatternDispositionFlags.SuspendProcess
89+
- event.PatternDispositionValue
90+
- event.PatternId
91+
- event.ProcessEndTime
92+
- event.ProcessId
93+
- event.ProcessStartTime
94+
- event.SHA1String
95+
- event.SHA256String
96+
- event.SensorId
97+
- event.Severity
98+
- event.SeverityName
99+
- event.Tactic
100+
- event.Tags
101+
- event.Technique
102+
- event.UserName
103+
- eventtype
104+
- file_hash
105+
- file_name
106+
- file_path
107+
- host
108+
- id
109+
- index
110+
- ip
111+
- linecount
112+
- metadata.customerIDString
113+
- metadata.eventCreationTime
114+
- metadata.eventType
115+
- metadata.offset
116+
- metadata.version
117+
- parent_process
118+
- parent_process_id
119+
- parent_process_name
120+
- process_id
121+
- punct
122+
- severity
123+
- severity_id
124+
- source
125+
- sourcetype
126+
- splunk_server
127+
- splunk_server_group
128+
- src
129+
- subject
130+
- ta_data.App_id
131+
- ta_data.Cloud_environment
132+
- ta_data.Event_types
133+
- ta_data.Feed_id
134+
- ta_data.Initial_start
135+
- ta_data.Input
136+
- ta_data.Multiple_feeds
137+
- ta_data.TA_version
138+
- tag
139+
- tag::action
140+
- tag::eventtype
141+
- timestamp
142+
- url
143+
- user
144+
- vendor_product
145+
output_fields:
146+
- dest
147+
- user
148+
- process
149+
- file_name
150+
- DetectName
151+
example_log: |
152+
{"metadata": {"customerIDString": "3061c7ff3b634e22b38274d4b586558e", "offset": 12570031, "eventType": "DetectionSummaryEvent", "eventCreationTime": 1748883058001, "version": "1.0"}, "event": {"ProcessStartTime": 1748883033, "ProcessEndTime": 1748883033, "ProcessId": 25482595567828, "ParentProcessId": 25482588177316, "ComputerName": "CROWDFAL1", "UserName": "Administrator", "DetectName": "Suspicious Activity", "DetectDescription": "For evaluation only - benign, no action needed.", "Severity": 2, "SeverityName": "Low", "FileName": "choice.exe", "FilePath": "\\Device\\HarddiskVolume2\\Windows\\System32", "CommandLine": "choice /m crowdstrike_sample_detection", "SHA256String": "df8085fb7d979c644a751804ed6bd3b74b26ce682291b5e5ede4c76eca599e7e", "MD5String": "ed5fc58ec99a058ce9b7bb1ee3a96a8e", "SHA1String": "0000000000000000000000000000000000000000", "MachineDomain": "CROWDFAL1", "FalconHostLink": "https://falcon.crowdstrike.com/activity/detections/detail/12e75112bdc44ac7a60b5ad1d2765303/10907785292170?_cid=g03000lcf73zmc2nbaploaxbwbj4zvsu", "SensorId": "12e75112bdc44ac7a60b5ad1d2765303", "DetectId": "ldt:12e75112bdc44ac7a60b5ad1d2765303:10907785292170", "LocalIP": "10.1.17.3", "MACAddress": "00-50-56-aa-64-1f", "Tactic": "Malware", "Technique": "Malicious File", "Objective": "Falcon Detection Method", "PatternDispositionDescription": "Detection, standard detection.", "PatternDispositionValue": 0, "PatternDispositionFlags": {"Indicator": false, "Detect": false, "InddetMask": false, "SensorOnly": false, "Rooting": false, "KillProcess": false, "KillSubProcess": false, "QuarantineMachine": false, "QuarantineFile": false, "PolicyDisabled": false, "KillParent": false, "OperationBlocked": false, "ProcessBlocked": false, "RegistryOperationBlocked": false, "CriticalProcessDisabled": false, "BootupSafeguardEnabled": false, "FsOperationBlocked": false, "HandleOperationDowngraded": false, "KillActionFailed": false, "BlockingUnsupportedOrDisabled": false, "SuspendProcess": false, "SuspendParent": false}, "ParentImageFileName": "\\Device\\HarddiskVolume2\\Windows\\System32\\cmd.exe", "ParentCommandLine": "C:\\Windows\\SYSTEM32\\cmd.exe /c \"\"C:\\CS_Script.bat\"\"", "GrandparentImageFileName": "\\Device\\HarddiskVolume2\\Windows\\System32\\svchost.exe", "GrandparentCommandLine": "C:\\Windows\\system32\\svchost.exe -k netsvcs", "HostGroups": "0ebde3fe33d547fc9bbe24f50be44da8,fd63f5073f644377a8150e9c1e5a86d0", "PatternId": 10197}, "ta_data": {"Feed_id": "0", "Multiple_feeds": "False", "Cloud_environment": "us_commercial", "TA_version": "3.5.0", "Input": "crwd_events", "App_id": "s2_pl", "Event_types": "['All']", "Initial_start": "historic"}}
153+
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
name: CrowdStrike Falcon Stream Alerts
2+
id: cb6af2b3-29ab-441c-8d8d-679811c8b014
3+
version: 1
4+
date: '2025-05-12'
5+
author: Bryan Pluta, Teoderick Contreras, Splunk
6+
status: production
7+
type: Anomaly
8+
data_source:
9+
- CrowdStrike Falcon Stream Alert
10+
description: The following analytic is to leverage alerts from CrowdStrike Falcon Event Stream. This query aggregates and summarizes DetectionSummaryEvent and IdpDetectionSummaryEvent alerts from CrowdStrike Falcon Event Stream, providing details such as destination, user, severity, MITRE information, and Crowdstrike id and links. The evals in the search do multiple things to include align the severity, ensure the user, dest, title, description, MITRE fields are set properly, and the drilldowns are defined based on the type of alert. The search is highly dynamic to account for different alert types in which some fields may or may not be populated. Having all these fields properly set ensure the appropriate risk and analyst queue fields are correctly populated.
11+
search: |
12+
`crowdstrike_stream` metadata.eventType IN (DetectionSummaryEvent,IdpDetectionSummaryEvent)
13+
| rename event.* as *
14+
| eval severity=lower(if("metadata.eventType"=="IdpDetectionSummaryEvent",case(Severity<20,"info",Severity<40,"low",Severity<60,"medium",Severity<80,"high",Severity>=80,"critical"),severity))
15+
| eval risk_score=case(severity="critical", 500, severity="high", 250, severity="medium", 100, severity="low", 25, severity="informational", 0)
16+
| eval user=coalesce(lower(SourceAccountName),lower(UserName))
17+
| eval dest=coalesce(ComputerName,SourceEndpointHostName)
18+
| eval mitre_technique = case(!match(DetectName, "(NGAV|Intel Detection)"), Technique)
19+
| join type=left mitre_technique
20+
[| inputlookup append=t mitre_attack_lookup
21+
| fields mitre_technique mitre_technique_id ]
22+
| eval annotations.mitre_attack = mitre_technique_id
23+
| eval drilldown_user = if(NOT isnull(user), if(NOT isnull(SourceAccountName),("event.SourceAccountName=" + $SourceAccountName$),"event.UserName=" + $UserName$ ),"")
24+
| eval drilldown_dest = if(NOT isnull(dest), if(NOT isnull(SourceEndpointHostName),("event.SourceEndpointHostName=" + $SourceEndpointHostName$ +"*"),"event.ComputerName=" + $ComputerName$ +"*"),"")
25+
| eval drilldown_dest2 = if( NOT isnull(dest) AND NOT isnull(IOARuleInstanceID) AND Tactic=="Custom Intelligence", if(NOT isnull(SourceEndpointHostName),("dest=" + $SourceEndpointHostName$ +"*"),"dest=" + $ComputerName$ +"*"),"")
26+
| eval annotations.drilldown_search = if(isnull(IOARuleInstanceID) AND Tactic!="Custom Intelligence", "`crowdstrike_stream` metadata.eventType=" + $metadata.eventType$ + " " + drilldown_user + " " + drilldown_dest, "`crowdstrike_stream` ((metadata.eventType=" + $metadata.eventType$ + " " + drilldown_user + " " + drilldown_dest + ") OR (event_simpleName IN (CustomIOABasicProcessDetectionInfoEvent,CustomIOADomainNameDetectionInfoEvent,CustomIOAFileWrittenDetectionInfoEvent,CustomIOANetworkConnectionDetectionInfoEvent) TemplateInstanceId=" + IOARuleInstanceID + " " + drilldown_dest2 + "))")
27+
| rename "metadata.eventType" as eventType
28+
| eval title = case(DetectName=="NGAV", ("RR - CS - " + Tactic + " - " + Technique),DetectName=="Intel Detection", ("RR - CS - " + DetectName),eventType=="IdpDetectionSummaryEvent", ("RR - CS - Identity Protection"),1==1, ("RR - CS - " + DetectName + " - " + Technique) )
29+
| eval user_append = if(NOT isnull(user)," by " + user,"")
30+
| eval dest_append = if(NOT isnull(dest)," on " + dest,"")
31+
| eval description = case(DetectName=="NGAV", ("CS " + Tactic + " - " + Technique + ": " + FileName),eventType=="IdpDetectionSummaryEvent", ("CS IdP" + " - " + DetectName),DetectName=="Intel Detection", ("CS " + DetectName + " - " + IOCType + ": " + IOCValue),1==1, (Objective + " - " + DetectDescription) )
32+
| eval description = description + user_append + dest_append
33+
| eval gid=DetectId, display_id=FalconHostLink, file_hash=SHA256String, hash=MD5String, signature=IOCValue, ip='NetworkAccesses{}.RemoteAddress', process=CommandLine, pid=ProcessId
34+
| eval file_name = if(isnull('ExecutablesWritten{}.FileName'), FileName, 'ExecutablesWritten{}.FileName')
35+
| rename DetectId as detection_id, FalconHostLink as detection_url
36+
| table _time source detection_id detection_url title risk_score description Severity severity ComputerName dest Tactic Technique user UserName SourceAccountName Objective DetectName DetectDescription gid, display_id, mitre_technique annotations.mitre_attack annotations.drilldown_search file_hash hash signature ip process pid file_name
37+
| `crowdstrike_falcon_stream_alerts_filter`
38+
how_to_implement: In order to properly run this search, you need to ingest alerts data from CrowdStrike Event Stream, specifcally using the CrowdStrike Falcon Event Streams Technical Add-On. This add-on will collect alerts using the CrowdStrike:Event:Streams:JSON sourcetype. You will need to define the `crowdstrike_stream` macro to point to the proper index that contains the CrowdStrike:Event:Streams:JSON sourcetype.
39+
known_false_positives: False positives may vary based on Crowdstrike configuration; monitor and filter out the alerts that are not relevant to your environment.
40+
references:
41+
- https://www.crowdstrike.com/en-us/resources/guides/crowdstrike-falcon-event-streams-add-on-for-splunk-guide-v3/
42+
- https://splunkbase.splunk.com/app/5082
43+
drilldown_searches:
44+
- name: View the detection results for - "$dest$"
45+
search: '%original_detection_search% | search dest = "$dest$"'
46+
earliest_offset: $info_min_time$
47+
latest_offset: $info_max_time$
48+
- name: View risk events for the last 7 days for - "$dest$"
49+
search: '| from datamodel Risk.All_Risk | search normalized_risk_object IN ("$dest$") starthoursago=168 | stats count min(_time) as firstTime max(_time) as lastTime values(search_name) as "Search Name" values(risk_message) as "Risk Message" values(analyticstories) as "Analytic Stories" values(annotations._all) as "Annotations" values(annotations.mitre_attack.mitre_tactic) as "ATT&CK Tactics" by normalized_risk_object | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`'
50+
earliest_offset: $info_min_time$
51+
latest_offset: $info_max_time$
52+
- name: View other CrowdStrike events for "$user$ on "$dest$"
53+
search: '$annotations.drilldown_search$'
54+
earliest_offset: $info_min_time$
55+
latest_offset: $info_max_time$
56+
rba:
57+
message: $description$
58+
risk_objects:
59+
- field: dest
60+
type: system
61+
score: 81
62+
- field: user
63+
type: user
64+
score: 81
65+
threat_objects:
66+
- field: file_name
67+
type: file_name
68+
- field: process
69+
type: process_name
70+
- field: ip
71+
type: ip_address
72+
- field: file_hash
73+
type: file_hash
74+
- field: hash
75+
type: file_hash
76+
- field: signature
77+
type: file_hash
78+
tags:
79+
analytic_story:
80+
- Critical Alerts
81+
asset_type: Endpoint
82+
atomic_guid: []
83+
mitre_attack_id: []
84+
product:
85+
- Splunk Enterprise
86+
- Splunk Enterprise Security
87+
- Splunk Cloud
88+
security_domain: endpoint
89+
manual_test: We are dynamically creating the risk_score field based on the severity of the alert in the SPL and that supersedes the risk score set in the detection. Setting this detection to manual test since otherwise we fail integration testing. This detection is also based on the mitre_attack_lookup lookup table which is not available in the ESCU app
90+
tests:
91+
- name: True Positive Test
92+
attack_data:
93+
- data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/suspicious_behaviour/crowdstrike_stream/event_stream_events/stream_events.log
94+
source: CrowdStrike:Event:Streams
95+
sourcetype: CrowdStrike:Event:Streams:JSON

0 commit comments

Comments
 (0)