diff --git a/bin/doc_gen.py b/bin/doc_gen.py
index e19570eba1..5bcde92874 100644
--- a/bin/doc_gen.py
+++ b/bin/doc_gen.py
@@ -7,6 +7,9 @@ from os import path, walk
import json
from jinja2 import Environment, FileSystemLoader
from pyattck import Attck
+import datetime
+
+
def mitre_attack_object(technique, attack):
@@ -148,7 +151,7 @@ def generate_doc_stories(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, attack, sorted_de
# write markdown
template = j2_env.get_template('doc_stories_markdown.j2')
output_path = path.join(OUTPUT_DIR + '/stories.md')
- output = template.render(categories=categories)
+ output = template.render(categories=categories,time=datetime.datetime.now())
with open(output_path, 'w', encoding="utf-8") as f:
f.write(output)
messages.append("doc_gen.py wrote {0} stories documentation in markdown to: {1}".format(len(stories),output_path))
@@ -156,7 +159,7 @@ def generate_doc_stories(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, attack, sorted_de
# write wikimarkup
template = j2_env.get_template('doc_stories_wiki.j2')
output_path = path.join(OUTPUT_DIR + '/stories.wiki')
- output = template.render(categories=categories)
+ output = template.render(categories=categories, time=datetime.datetime.now())
with open(output_path, 'w', encoding="utf-8") as f:
f.write(output)
messages.append("doc_gen.py wrote {0} stories documentation in mediawiki to: {1}".format(len(stories),output_path))
@@ -206,7 +209,7 @@ def generate_doc_detections(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, attack, messag
# write markdown
template = j2_env.get_template('doc_detections_markdown.j2')
output_path = path.join(OUTPUT_DIR + '/detections.md')
- output = template.render(detections=sorted_detections)
+ output = template.render(detections=sorted_detections, time=datetime.datetime.now())
with open(output_path, 'w', encoding="utf-8") as f:
f.write(output)
messages.append("doc_gen.py wrote {0} detections documentation in markdown to: {1}".format(len(detections),output_path))
@@ -231,7 +234,7 @@ def generate_doc_detections(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, attack, messag
# write wikimarkup
template = j2_env.get_template('doc_detections_wiki.j2')
output_path = path.join(OUTPUT_DIR + '/detections.wiki')
- output = template.render(kinds=kinds)
+ output = template.render(kinds=kinds, time=datetime.datetime.now())
with open(output_path, 'w', encoding="utf-8") as f:
f.write(output)
messages.append("doc_gen.py wrote {0} detections documentation in mediawiki to: {1}".format(len(detections),output_path))
diff --git a/bin/jinja2_templates/doc_detections_wiki.j2 b/bin/jinja2_templates/doc_detections_wiki.j2
index 7b5ece8ad2..e69a4a14b4 100644
--- a/bin/jinja2_templates/doc_detections_wiki.j2
+++ b/bin/jinja2_templates/doc_detections_wiki.j2
@@ -82,4 +82,3 @@ All the detections shipped to different Splunk products. Below is a breakdown by
''# Contact: research@splunk.com''
''#############''
-[[Category:V:ESSOC:drafts]]
diff --git a/bin/jinja2_templates/doc_stories_wiki.j2 b/bin/jinja2_templates/doc_stories_wiki.j2
index 67024eb080..d187f7d672 100644
--- a/bin/jinja2_templates/doc_stories_wiki.j2
+++ b/bin/jinja2_templates/doc_stories_wiki.j2
@@ -56,11 +56,12 @@ All the Analytic Stories shipped to different Splunk products. Below is a breakd
{% endfor %}
-''#############''
-''# Automatically generated by doc_gen.py in https://github.com/splunk/security_content''
-''# On Date: {{ time }} UTC''
-''# Author: Splunk Security Research''
-''# Contact: research@splunk.com''
-''#############''
+''
+#############
+# Automatically generated by doc_gen.py in https://github.com/splunk/security_content
+# On Date: {{ time }} UTC
+# Author: Splunk Security Research
+# Contact: research@splunk.com
+#############
+''
-[[Category:V:ESSOC:drafts]]
diff --git a/docs/detections.wiki b/docs/detections.wiki
index b1cdfa73be..0a13366eb2 100644
--- a/docs/detections.wiki
+++ b/docs/detections.wiki
@@ -11,7 +11,7 @@ The search queries the authentication logs for assets that are categorized as ro
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Authentication
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2017-09-12
@@ -20,11 +20,11 @@ The search queries the authentication logs for assets that are categorized as ro
====Search====
| tstats `security_content_summariesonly` count earliest(_time) as earliest latest(_time) as latest from datamodel=Authentication where Authentication.dest_category=router by Authentication.dest Authentication.user
-| eval isOutlier=if(earliest >= relative_time(now(), "-30d@d"), 1, 0)
+| eval isOutlier=if(earliest >= relative_time(now(), "-30d@d"), 1, 0)
| where isOutlier=1
| `security_content_ctime(earliest)`
-| `security_content_ctime(latest)`
-| `drop_dm_object_name("Authentication")`
+| `security_content_ctime(latest)`
+| `drop_dm_object_name("Authentication")`
| `detect_new_login_attempts_to_routers_filter`
====Associated Analytic Story====
@@ -65,7 +65,7 @@ Attackers often use spaces as a means to obfuscate an attachment's file extensio
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Email
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2017-09-19
@@ -73,13 +73,13 @@ Attackers often use spaces as a means to obfuscate an attachment's file extensio
====Search====
-| tstats `security_content_summariesonly` count values(All_Email.recipient) as recipient_address min(_time) as firstTime max(_time) as lastTime from datamodel=Email where All_Email.file_name="*" by All_Email.src_user, All_Email.file_name All_Email.message_id
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| `drop_dm_object_name("All_Email")`
-| eval space_ratio = (mvcount(split(file_name," "))-1)/len(file_name)
-| search space_ratio >= 0.1
-| rex field=recipient_address "(?.*)@"
+| tstats `security_content_summariesonly` count values(All_Email.recipient) as recipient_address min(_time) as firstTime max(_time) as lastTime from datamodel=Email where All_Email.file_name="*" by All_Email.src_user, All_Email.file_name All_Email.message_id
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+| `drop_dm_object_name("All_Email")`
+| eval space_ratio = (mvcount(split(file_name," "))-1)/len(file_name)
+| search space_ratio >= 0.1
+| rex field=recipient_address "(?.*)@"
| `email_attachments_with_lots_of_spaces_filter`
====Associated Analytic Story====
@@ -132,9 +132,9 @@ The search looks at the change-analysis data model and detects email files creat
====Search====
-| tstats `security_content_summariesonly` count values(Filesystem.file_path) as file_path min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Filesystem where (Filesystem.file_name=*.pst OR Filesystem.file_name=*.ost) Filesystem.file_path != "C:\\Users\\*\\My Documents\\Outlook Files\\*" Filesystem.file_path!="C:\\Users\\*\\AppData\\Local\\Microsoft\\Outlook*" by Filesystem.action Filesystem.process_id Filesystem.file_name Filesystem.dest
-| `drop_dm_object_name("Filesystem")`
-| `security_content_ctime(firstTime)`
+| tstats `security_content_summariesonly` count values(Filesystem.file_path) as file_path min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Filesystem where (Filesystem.file_name=*.pst OR Filesystem.file_name=*.ost) Filesystem.file_path != "C:\\Users\\*\\My Documents\\Outlook Files\\*" Filesystem.file_path!="C:\\Users\\*\\AppData\\Local\\Microsoft\\Outlook*" by Filesystem.action Filesystem.process_id Filesystem.file_name Filesystem.dest
+| `drop_dm_object_name("Filesystem")`
+| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `email_files_written_outside_of_the_outlook_directory_filter`
@@ -195,14 +195,14 @@ This search looks for an increase of data transfers from your email server to yo
====Search====
-| tstats `security_content_summariesonly` sum(All_Traffic.bytes_out) as bytes_out from datamodel=Network_Traffic where All_Traffic.src_category=email_server by All_Traffic.dest_ip _time span=1d
-| `drop_dm_object_name("All_Traffic")`
-| eventstats avg(bytes_out) as avg_bytes_out stdev(bytes_out) as stdev_bytes_out
-| eventstats count as num_data_samples avg(eval(if(_time < relative_time(now(), "@d"), bytes_out, null))) as per_source_avg_bytes_out stdev(eval(if(_time < relative_time(now(), "@d"), bytes_out, null))) as per_source_stdev_bytes_out by dest_ip
-| eval minimum_data_samples = 4, deviation_threshold = 3
-| where num_data_samples >= minimum_data_samples AND bytes_out > (avg_bytes_out + (deviation_threshold * stdev_bytes_out)) AND bytes_out > (per_source_avg_bytes_out + (deviation_threshold * per_source_stdev_bytes_out)) AND _time >= relative_time(now(), "@d")
-| eval num_standard_deviations_away_from_server_average = round(abs(bytes_out - avg_bytes_out) / stdev_bytes_out, 2), num_standard_deviations_away_from_client_average = round(abs(bytes_out - per_source_avg_bytes_out) / per_source_stdev_bytes_out, 2)
-| table dest_ip, _time, bytes_out, avg_bytes_out, per_source_avg_bytes_out, num_standard_deviations_away_from_server_average, num_standard_deviations_away_from_client_average
+| tstats `security_content_summariesonly` sum(All_Traffic.bytes_out) as bytes_out from datamodel=Network_Traffic where All_Traffic.src_category=email_server by All_Traffic.dest_ip _time span=1d
+| `drop_dm_object_name("All_Traffic")`
+| eventstats avg(bytes_out) as avg_bytes_out stdev(bytes_out) as stdev_bytes_out
+| eventstats count as num_data_samples avg(eval(if(_time < relative_time(now(), "@d"), bytes_out, null))) as per_source_avg_bytes_out stdev(eval(if(_time < relative_time(now(), "@d"), bytes_out, null))) as per_source_stdev_bytes_out by dest_ip
+| eval minimum_data_samples = 4, deviation_threshold = 3
+| where num_data_samples >= minimum_data_samples AND bytes_out > (avg_bytes_out + (deviation_threshold * stdev_bytes_out)) AND bytes_out > (per_source_avg_bytes_out + (deviation_threshold * per_source_stdev_bytes_out)) AND _time >= relative_time(now(), "@d")
+| eval num_standard_deviations_away_from_server_average = round(abs(bytes_out - avg_bytes_out) / stdev_bytes_out, 2), num_standard_deviations_away_from_client_average = round(abs(bytes_out - per_source_avg_bytes_out) / per_source_stdev_bytes_out, 2)
+| table dest_ip, _time, bytes_out, avg_bytes_out, per_source_avg_bytes_out, num_standard_deviations_away_from_server_average, num_standard_deviations_away_from_client_average
| `email_servers_sending_high_volume_traffic_to_hosts_filter`
====Associated Analytic Story====
@@ -254,7 +254,7 @@ This search looks for emails claiming to be sent from a domain similar to one th
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Email
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2018-01-05
@@ -262,15 +262,15 @@ This search looks for emails claiming to be sent from a domain similar to one th
====Search====
-| tstats `security_content_summariesonly` values(All_Email.recipient) as recipients, min(_time) as firstTime, max(_time) as lastTime from datamodel=Email by All_Email.src_user, All_Email.message_id
-| `drop_dm_object_name("All_Email")`
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| eval temp=split(src_user, "@")
-| eval email_domain=mvindex(temp, 1)
-| lookup update=true brandMonitoring_lookup domain as email_domain OUTPUT domain_abuse
-| search domain_abuse=true
-| table message_id, src_user, email_domain, recipients, firstTime, lastTime
+| tstats `security_content_summariesonly` values(All_Email.recipient) as recipients, min(_time) as firstTime, max(_time) as lastTime from datamodel=Email by All_Email.src_user, All_Email.message_id
+| `drop_dm_object_name("All_Email")`
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+| eval temp=split(src_user, "@")
+| eval email_domain=mvindex(temp, 1)
+| lookup update=true brandMonitoring_lookup domain as email_domain OUTPUT domain_abuse
+| search domain_abuse=true
+| table message_id, src_user, email_domain, recipients, firstTime, lastTime
| `monitor_email_for_brand_abuse_filter`
====Associated Analytic Story====
@@ -312,7 +312,7 @@ None at this time
This search detects Okta login failures due to bad credentials for multiple users originating from the same ip address.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.001/ T1078.001]
* '''Last Updated''': 2020-07-21
@@ -320,11 +320,11 @@ This search detects Okta login failures due to bad credentials for multiple user
====Search====
-
`okta` outcome.reason=INVALID_CREDENTIALS
-| rename client.geographicalContext.country as country, client.geographicalContext.state as state, client.geographicalContext.city as city
-| stats min(_time) as firstTime max(_time) as lastTime dc(user) as distinct_users values(user) as users by src_ip, displayMessage, outcome.reason, country, state, city
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+`okta` outcome.reason=INVALID_CREDENTIALS
+| rename client.geographicalContext.country as country, client.geographicalContext.state as state, client.geographicalContext.city as city
+| stats min(_time) as firstTime max(_time) as lastTime dc(user) as distinct_users values(user) as users by src_ip, displayMessage, outcome.reason, country, state, city
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| search distinct_users > 5
| `multiple_okta_users_with_invalid_credentials_from_the_same_ip_filter`
@@ -375,7 +375,7 @@ This search looks for Windows endpoints that have not generated an event indicat
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Updates
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2017-09-15
@@ -383,15 +383,15 @@ This search looks for Windows endpoints that have not generated an event indicat
====Search====
-| tstats `security_content_summariesonly` max(_time) as lastTime from datamodel=Updates where Updates.status=Installed Updates.vendor_product="Microsoft Windows" by Updates.dest Updates.status Updates.vendor_product
-| rename Updates.dest as Host
-| rename Updates.status as "Update Status"
-| rename Updates.vendor_product as Product
-| eval isOutlier=if(lastTime <= relative_time(now(), "-60d@d"), 1, 0)
-| `security_content_ctime(lastTime)`
-| search isOutlier=1
-| rename lastTime as "Last Update Time",
-| table Host, "Update Status", Product, "Last Update Time"
+| tstats `security_content_summariesonly` max(_time) as lastTime from datamodel=Updates where Updates.status=Installed Updates.vendor_product="Microsoft Windows" by Updates.dest Updates.status Updates.vendor_product
+| rename Updates.dest as Host
+| rename Updates.status as "Update Status"
+| rename Updates.vendor_product as Product
+| eval isOutlier=if(lastTime <= relative_time(now(), "-60d@d"), 1, 0)
+| `security_content_ctime(lastTime)`
+| search isOutlier=1
+| rename lastTime as "Last Update Time",
+| table Host, "Update Status", Product, "Last Update Time"
| `no_windows_updates_in_a_time_frame_filter`
====Associated Analytic Story====
@@ -429,7 +429,7 @@ None identified
Detect Okta user lockout events
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.001/ T1078.001]
* '''Last Updated''': 2020-07-21
@@ -437,9 +437,9 @@ Detect Okta user lockout events
====Search====
-
`okta` displayMessage="Max sign in attempts exceeded"
-| rename client.geographicalContext.country as country, client.geographicalContext.state as state, client.geographicalContext.city as city
-| table _time, user, country, state, city, src_ip
+`okta` displayMessage="Max sign in attempts exceeded"
+| rename client.geographicalContext.country as country, client.geographicalContext.state as state, client.geographicalContext.city as city
+| table _time, user, country, state, city, src_ip
| `okta_account_lockout_events_filter`
====Associated Analytic Story====
@@ -488,7 +488,7 @@ None. Account lockouts should be followed up on to determine if the actual user
Detect failed Okta SSO events
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.001/ T1078.001]
* '''Last Updated''': 2020-07-21
@@ -496,10 +496,10 @@ Detect failed Okta SSO events
====Search====
-
`okta` displayMessage="User attempted unauthorized access to app"
-| stats min(_time) as firstTime max(_time) as lastTime values(app) as Apps count by user, result ,displayMessage, src_ip
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+`okta` displayMessage="User attempted unauthorized access to app"
+| stats min(_time) as firstTime max(_time) as lastTime values(app) as Apps count by user, result ,displayMessage, src_ip
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `okta_failed_sso_attempts_filter`
====Associated Analytic Story====
@@ -548,7 +548,7 @@ There may be a faulty config preventing legitmate users from accessing apps they
This search detects logins from the same user from different cities in a 24 hour period.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.001/ T1078.001]
* '''Last Updated''': 2020-07-21
@@ -556,11 +556,11 @@ This search detects logins from the same user from different cities in a 24 hour
====Search====
-
`okta` displayMessage="User login to Okta" client.geographicalContext.city!=null
-| stats min(_time) as firstTime max(_time) as lastTime dc(client.geographicalContext.city) as locations values(client.geographicalContext.city) as cities values(client.geographicalContext.state) as states by user
+`okta` displayMessage="User login to Okta" client.geographicalContext.city!=null
+| stats min(_time) as firstTime max(_time) as lastTime dc(client.geographicalContext.city) as locations values(client.geographicalContext.city) as cities values(client.geographicalContext.state) as states by user
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| `okta_user_logins_from_multiple_cities_filter`
+| `security_content_ctime(lastTime)`
+| `okta_user_logins_from_multiple_cities_filter`
| search locations > 1
====Associated Analytic Story====
@@ -609,7 +609,7 @@ Users in your enviornment may legitmately be travelling and loggin in from diffe
Malicious mails can conduct phishing that induces readers to open attachment, click links or trigger third party service. This detect uses Natural Language Processing (NLP) approach to analyze an email message's content (Sender, Subject and Body) and judge whether it is a phishing email. The detection adopts a deep learning (neural network) model that employs character level embeddings plus LSTM layers to perform classification. The model is pre-trained and then published as ONNX format. Current sample model is trained using the dataset published at https://github.com/splunk/attack_data/tree/master/datasets/T1566_Phishing_Email/splunk_train.json User are expected to re-train the model by combining with their own training data for better accuracy using the provided model file (SMLE notebook). DSP pipeline then processes the email message and passes it as an event to Apply ML Models function, which returns the probability of a phishing email. Current implementation assumes the email is fed to DSP in JSON format contains at least email's sender, subject and its message body, including reply content, if any.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1566/ T1566]
* '''Last Updated''': 2020-08-25
@@ -618,16 +618,16 @@ Malicious mails can conduct phishing that induces readers to open attachment, cl
====Search====
-| from read_ssa_enriched_events()
-| eval eventLine=concat(ucast(map_get(input_event, "From"), "string", " "), " ", ucast(map_get(input_event, "Subject"), "string", " "), " ", ucast(map_get(input_event, "Content"), "string", " "), " "), _time=map_get(input_event, "_time")
-| where eventLine IS NOT NULL
+| from read_ssa_enriched_events()
+| eval eventLine=concat(ucast(map_get(input_event, "From"), "string", " "), " ", ucast(map_get(input_event, "Subject"), "string", " "), " ", ucast(map_get(input_event, "Content"), "string", " "), " "), _time=map_get(input_event, "_time")
+| where eventLine IS NOT NULL
| eval mapC={" ": 32, "!": 33, "\"": 34, "#": 35, "$": 36, "%": 37, "&": 38, "`": 39, "(": 40, ")": 41, "*": 42, "+": 43, ",": 44, "-": 45, ".": 46, "/": 47, "0": 48, "1": 49, "2": 50, "3": 51, "4": 52, "5": 53, "6": 54, "7": 55, "8": 56, "9": 57, ":": 58, ";": 59, "<": 60, "=": 61, ">": 62, "?": 63, "@": 64, "A": 65, "B": 66, "C": 67, "D": 68, "E": 69, "F": 70, "G": 71, "H": 72, "I": 73, "J": 74, "K": 75, "L": 76, "M": 77, "N": 78, "O": 79, "P": 80, "Q": 81, "R": 82, "S": 83, "T": 84, "U": 85, "V": 86, "W": 87, "X": 88, "Y": 89, "Z": 90, "[": 91, "\\": 92, "]": 93, "^": 94, "_": 95, "`": 96, "a": 97, "b": 98, "c": 99, "d": 100, "e": 101, "f": 102, "g": 103, "h": 104, "i": 105, "j": 106, "k": 107, "l": 108, "m": 109, "n": 110, "o": 111, "p": 112, "q": 113, "r": 114, "s": 115, "t": 116, "u": 117, "v": 118, "w": 119, "x": 120, "y": 121, "z": 122, "{": 123, "
-|": 124, "}": 125, "~": 126}, ml_in = for_each(iterator(mvrange(1,129), "i"), cast(map_get(mapC, substr(eventLine, i, 1)), "float") )
-| apply_model connection_id="YOUR_S3_ONNX_CONNECTOR_ID" name="phishing_email_v8" path="s3://smle-experiments/models/phishing_email"
-| eval probability = mvindex(ml_out, 0)
-| where probability > 0.5
-| eval start_time=_time, end_time=_time, entities="TBD", body="TBD"
-| select probability, body, entities, start_time, end_time
+|": 124, "}": 125, "~": 126}, ml_in = for_each(iterator(mvrange(1,129), "i"), cast(map_get(mapC, substr(eventLine, i, 1)), "float") )
+| apply_model connection_id="YOUR_S3_ONNX_CONNECTOR_ID" name="phishing_email_v8" path="s3://smle-experiments/models/phishing_email"
+| eval probability = mvindex(ml_out, 0)
+| where probability > 0.5
+| eval start_time=_time, end_time=_time, entities="TBD", body="TBD"
+| select probability, body, entities, start_time, end_time
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -677,7 +677,7 @@ The search is used to detect systems that are still vulnerable to the Spectre an
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Vulnerabilities
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2017-01-07
@@ -685,10 +685,10 @@ The search is used to detect systems that are still vulnerable to the Spectre an
====Search====
-| tstats `security_content_summariesonly` min(_time) as firstTime max(_time) as lastTime from datamodel=Vulnerabilities where Vulnerabilities.cve ="CVE-2017-5753" OR Vulnerabilities.cve ="CVE-2017-5715" OR Vulnerabilities.cve ="CVE-2017-5754" by Vulnerabilities.dest
-| `drop_dm_object_name(Vulnerabilities)`
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| tstats `security_content_summariesonly` min(_time) as firstTime max(_time) as lastTime from datamodel=Vulnerabilities where Vulnerabilities.cve ="CVE-2017-5753" OR Vulnerabilities.cve ="CVE-2017-5715" OR Vulnerabilities.cve ="CVE-2017-5754" by Vulnerabilities.dest
+| `drop_dm_object_name(Vulnerabilities)`
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `spectre_and_meltdown_vulnerable_systems_filter`
====Associated Analytic Story====
@@ -735,11 +735,11 @@ This detection looks for emails that are suspicious because of their sender, dom
====Search====
-|tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(All_UEBA_Events.category) as category from datamodel=UEBA where nodename=All_UEBA_Events.UEBA_Anomalies All_UEBA_Events.UEBA_Anomalies.uba_model = "SuspiciousEmailDetectionModel" by All_UEBA_Events.description All_UEBA_Events.severity All_UEBA_Events.user All_UEBA_Events.uba_event_type All_UEBA_Events.link All_UEBA_Events.signature All_UEBA_Events.url All_UEBA_Events.UEBA_Anomalies.uba_model
-| `drop_dm_object_name(All_UEBA_Events)`
+|tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(All_UEBA_Events.category) as category from datamodel=UEBA where nodename=All_UEBA_Events.UEBA_Anomalies All_UEBA_Events.UEBA_Anomalies.uba_model = "SuspiciousEmailDetectionModel" by All_UEBA_Events.description All_UEBA_Events.severity All_UEBA_Events.user All_UEBA_Events.uba_event_type All_UEBA_Events.link All_UEBA_Events.signature All_UEBA_Events.url All_UEBA_Events.UEBA_Anomalies.uba_model
+| `drop_dm_object_name(All_UEBA_Events)`
| `drop_dm_object_name(UEBA_Anomalies)`
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `suspicious_email___uba_anomaly_filter`
====Associated Analytic Story====
@@ -799,11 +799,11 @@ This search looks for emails that have attachments with suspicious file extensio
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Email where All_Email.file_name="*" by All_Email.src_user, All_Email.file_name All_Email.message_id
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| `drop_dm_object_name("All_Email")`
-| `suspicious_email_attachments`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Email where All_Email.file_name="*" by All_Email.src_user, All_Email.file_name All_Email.message_id
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+| `drop_dm_object_name("All_Email")`
+| `suspicious_email_attachments`
| `suspicious_email_attachment_extensions_filter`
====Associated Analytic Story====
@@ -858,21 +858,21 @@ None identified
This search looks for suspicious Java classes that are often used to exploit remote command execution in common Java frameworks, such as Apache Struts.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2018-12-06
====Search====
-
`stream_http` http_method=POST http_content_length>1
+`stream_http` http_method=POST http_content_length>1
| regex form_data="(?i)java\.lang\.(?:runtime
-|processbuilder)"
-| rename src_ip as src
-| stats count earliest(_time) as firstTime, latest(_time) as lastTime, values(url) as uri, values(status) as status, values(http_user_agent) as http_user_agent by src, dest
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+|processbuilder)"
+| rename src_ip as src
+| stats count earliest(_time) as firstTime, latest(_time) as lastTime, values(url) as uri, values(status) as status, values(http_user_agent) as http_user_agent by src, dest
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `suspicious_java_classes_filter`
====Associated Analytic Story====
@@ -922,9 +922,9 @@ This search looks for suspicious processes on all systems labeled as web servers
====Search====
| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.dest_category="web_server" AND (Processes.process="*whoami*" OR Processes.process="*ping*" OR Processes.process="*iptables*" OR Processes.process="*wget*" OR Processes.process="*service*" OR Processes.process="*curl*") by Processes.process Processes.process_name, Processes.dest Processes.user
-| `drop_dm_object_name(Processes)`
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `drop_dm_object_name(Processes)`
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `web_servers_executing_suspicious_processes_filter`
====Associated Analytic Story====
@@ -981,7 +981,7 @@ This search looks for AssumeRole events where an IAM role in a different account
* '''Product''': Splunk Security Analytics for AWS, Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Authentication
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-05-28
@@ -989,15 +989,15 @@ This search looks for AssumeRole events where an IAM role in a different account
====Search====
-| tstats min(_time) as firstTime max(_time) as lastTime from datamodel=Authentication where Authentication.signature=AssumeRole by Authentication.vendor_account Authentication.user Authentication.src Authentication.user_role
-| `drop_dm_object_name(Authentication)`
-| rex field=user_role "arn:aws:sts:*:(?.*):"
-| where vendor_account != dest_account
-| rename vendor_account as requestingAccountId dest_account as requestedAccountId
-| lookup previously_seen_aws_cross_account_activity requestingAccountId, requestedAccountId, OUTPUTNEW firstTime
-| eval status = if(firstTime > relative_time(now(), "-24h@h"),"New Cross Account Activity","Previously Seen")
-| where status = "New Cross Account Activity"
-| `security_content_ctime(firstTime)`
+| tstats min(_time) as firstTime max(_time) as lastTime from datamodel=Authentication where Authentication.signature=AssumeRole by Authentication.vendor_account Authentication.user Authentication.src Authentication.user_role
+| `drop_dm_object_name(Authentication)`
+| rex field=user_role "arn:aws:sts:*:(?.*):"
+| where vendor_account != dest_account
+| rename vendor_account as requestingAccountId dest_account as requestedAccountId
+| lookup previously_seen_aws_cross_account_activity requestingAccountId, requestedAccountId, OUTPUTNEW firstTime
+| eval status = if(firstTime > relative_time(now(), "-24h@h"),"New Cross Account Activity","Previously Seen")
+| where status = "New Cross Account Activity"
+| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `aws_cross_account_activity_from_previously_unseen_account_filter`
@@ -1040,7 +1040,7 @@ Using multiple AWS accounts and roles is perfectly valid behavior. It's suspicio
This search provides detection of KMS keys which action kms:Encrypt is accessible for everyone (also outside of your organization). This is an identicator that your account is compromised and the attacker uses the encryption key to compromise another company.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1486/ T1486]
* '''Last Updated''': 2021-01-11
@@ -1048,17 +1048,17 @@ This search provides detection of KMS keys which action kms:Encrypt is accessibl
====Search====
-
`cloudtrail` eventName=CreateKey OR eventName=PutKeyPolicy
-| spath input=requestParameters.policy output=key_policy_statements path=Statement{}
-| mvexpand key_policy_statements
-| spath input=key_policy_statements output=key_policy_action_1 path=Action
-| spath input=key_policy_statements output=key_policy_action_2 path=Action{}
-| eval key_policy_action=mvappend(key_policy_action_1, key_policy_action_2)
-| spath input=key_policy_statements output=key_policy_principal path=Principal.AWS
-| search key_policy_action="kms:Encrypt" AND key_policy_principal="*"
-| stats count min(_time) as firstTime max(_time) as lastTime by eventName eventSource eventID awsRegion userIdentity.principalId
+`cloudtrail` eventName=CreateKey OR eventName=PutKeyPolicy
+| spath input=requestParameters.policy output=key_policy_statements path=Statement{}
+| mvexpand key_policy_statements
+| spath input=key_policy_statements output=key_policy_action_1 path=Action
+| spath input=key_policy_statements output=key_policy_action_2 path=Action{}
+| eval key_policy_action=mvappend(key_policy_action_1, key_policy_action_2)
+| spath input=key_policy_statements output=key_policy_principal path=Principal.AWS
+| search key_policy_action="kms:Encrypt" AND key_policy_principal="*"
+| stats count min(_time) as firstTime max(_time) as lastTime by eventName eventSource eventID awsRegion userIdentity.principalId
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
|`aws_detect_users_creating_keys_with_encrypt_policy_without_mfa_filter`
====Associated Analytic Story====
@@ -1115,7 +1115,7 @@ unknown
This search provides detection of users with KMS keys performing encryption specifically against S3 buckets.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1486/ T1486]
* '''Last Updated''': 2021-01-11
@@ -1123,11 +1123,11 @@ This search provides detection of users with KMS keys performing encryption spec
====Search====
-
`cloudtrail` eventName=CopyObject requestParameters.x-amz-server-side-encryption="aws:kms"
-| rename requestParameters.bucketName AS bucket_name, requestParameters.x-amz-copy-source AS src_file, requestParameters.key AS dest_file
-| stats count min(_time) as firstTime max(_time) as lastTime values(src_file) AS src_file values(dest_file) AS dest_file values(userAgent) AS userAgent values(region) AS region values(src) AS src by user
+`cloudtrail` eventName=CopyObject requestParameters.x-amz-server-side-encryption="aws:kms"
+| rename requestParameters.bucketName AS bucket_name, requestParameters.x-amz-copy-source AS src_file, requestParameters.key AS dest_file
+| stats count min(_time) as firstTime max(_time) as lastTime values(src_file) AS src_file values(dest_file) AS dest_file values(userAgent) AS userAgent values(region) AS region values(src) AS src by user
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
|`aws_detect_users_with_kms_keys_performing_encryption_s3_filter`
====Associated Analytic Story====
@@ -1184,17 +1184,17 @@ bucket with S3 encryption
This search provides information on Kubernetes accounts accessing sensitve objects such as configmaps or secrets
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-06-23
====Search====
-
`aws_cloudwatchlogs_eks` objectRef.resource=secrets OR configmaps sourceIPs{}!=::1 sourceIPs{}!=127.0.0.1
-|table sourceIPs{} user.username user.groups{} objectRef.resource objectRef.namespace objectRef.name annotations.authorization.k8s.io/reason
-|dedup user.username user.groups{}
+`aws_cloudwatchlogs_eks` objectRef.resource=secrets OR configmaps sourceIPs{}!=::1 sourceIPs{}!=127.0.0.1
+|table sourceIPs{} user.username user.groups{} objectRef.resource objectRef.namespace objectRef.name annotations.authorization.k8s.io/reason
+|dedup user.username user.groups{}
|`aws_eks_kubernetes_cluster_sensitive_object_access_filter`
====Associated Analytic Story====
@@ -1234,7 +1234,7 @@ Sensitive object access is not necessarily malicious but user and object context
The search looks for CloudTrail events to detect if any network ACLs were created with all the ports open to a specified CIDR.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1562.007/ T1562.007]
* '''Last Updated''': 2021-01-11
@@ -1242,14 +1242,14 @@ The search looks for CloudTrail events to detect if any network ACLs were create
====Search====
-
`cloudtrail` eventName=CreateNetworkAclEntry OR eventName=ReplaceNetworkAclEntry requestParameters.ruleAction=allow requestParameters.egress=false requestParameters.aclProtocol=-1
-| append [search `cloudtrail` eventName=CreateNetworkAclEntry OR eventName=ReplaceNetworkAclEntry requestParameters.ruleAction=allow requestParameters.egress=false requestParameters.aclProtocol!=-1
-| eval port_range='requestParameters.portRange.to' - 'requestParameters.portRange.from'
-| where port_range>1024]
-| fillnull
-| stats count min(_time) as firstTime max(_time) as lastTime by userName userIdentity.principalId eventName requestParameters.ruleAction requestParameters.egress requestParameters.aclProtocol requestParameters.portRange.to requestParameters.portRange.from src userAgent requestParameters.cidrBlock
+`cloudtrail` eventName=CreateNetworkAclEntry OR eventName=ReplaceNetworkAclEntry requestParameters.ruleAction=allow requestParameters.egress=false requestParameters.aclProtocol=-1
+| append [search `cloudtrail` eventName=CreateNetworkAclEntry OR eventName=ReplaceNetworkAclEntry requestParameters.ruleAction=allow requestParameters.egress=false requestParameters.aclProtocol!=-1
+| eval port_range='requestParameters.portRange.to' - 'requestParameters.portRange.from'
+| where port_range>1024]
+| fillnull
+| stats count min(_time) as firstTime max(_time) as lastTime by userName userIdentity.principalId eventName requestParameters.ruleAction requestParameters.egress requestParameters.aclProtocol requestParameters.portRange.to requestParameters.portRange.from src userAgent requestParameters.cidrBlock
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `aws_network_access_control_list_created_with_all_open_ports_filter`
====Associated Analytic Story====
@@ -1302,7 +1302,7 @@ It's possible that an admin has created this ACL with all ports open for some le
Enforcing network-access controls is one of the defensive mechanisms used by cloud administrators to restrict access to a cloud instance. After the attacker has gained control of the AWS console by compromising an admin account, they can delete a network ACL and gain access to the instance from anywhere. This search will query the CloudTrail logs to detect users deleting network ACLs.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1562.007/ T1562.007]
* '''Last Updated''': 2021-01-12
@@ -1310,11 +1310,11 @@ Enforcing network-access controls is one of the defensive mechanisms used by clo
====Search====
-
`cloudtrail` eventName=DeleteNetworkAclEntry requestParameters.egress=false
-| fillnull
-| stats count min(_time) as firstTime max(_time) as lastTime by userName userIdentity.principalId eventName requestParameters.egress src userAgent
+`cloudtrail` eventName=DeleteNetworkAclEntry requestParameters.egress=false
+| fillnull
+| stats count min(_time) as firstTime max(_time) as lastTime by userName userIdentity.principalId eventName requestParameters.egress src userAgent
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `aws_network_access_control_list_deleted_filter`
====Associated Analytic Story====
@@ -1367,7 +1367,7 @@ It's possible that a user has legitimately deleted a network ACL.
This search provides specific SAML access from specific Service Provider, user and targeted principal at AWS. This search provides specific information to detect abnormal access or potential credential hijack or forgery, specially in federated environments using SAML protocol inside the perimeter or cloud provider.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078/ T1078]
* '''Last Updated''': 2021-01-26
@@ -1375,10 +1375,10 @@ This search provides specific SAML access from specific Service Provider, user a
====Search====
-
`cloudtrail` eventName=Assumerolewithsaml
-| stats count min(_time) as firstTime max(_time) as lastTime by requestParameters.principalArn requestParameters.roleArn requestParameters.roleSessionName recipientAccountId responseElements.issuer sourceIPAddress userAgent
+`cloudtrail` eventName=Assumerolewithsaml
+| stats count min(_time) as firstTime max(_time) as lastTime by requestParameters.principalArn requestParameters.roleArn requestParameters.roleSessionName recipientAccountId responseElements.issuer sourceIPAddress userAgent
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
|`aws_saml_access_by_provider_user_and_principal_filter`
====Associated Analytic Story====
@@ -1437,7 +1437,7 @@ Attacks using a Golden SAML or SAML assertion hijacks or forgeries are very diff
This search provides detection of updates to SAML provider in AWS. Updates to SAML provider need to be monitored closely as they may indicate possible perimeter compromise of federated credentials, or backdoor access from another cloud provider set by attacker.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078/ T1078]
* '''Last Updated''': 2021-01-26
@@ -1445,10 +1445,10 @@ This search provides detection of updates to SAML provider in AWS. Updates to SA
====Search====
-
`cloudtrail` eventName=UpdateSAMLProvider
-| stats count min(_time) as firstTime max(_time) as lastTime by eventType eventName requestParameters.sAMLProviderArn userIdentity.sessionContext.sessionIssuer.arn sourceIPAddress userIdentity.accessKeyId userIdentity.principalId
+`cloudtrail` eventName=UpdateSAMLProvider
+| stats count min(_time) as firstTime max(_time) as lastTime by eventType eventName requestParameters.sAMLProviderArn userIdentity.sessionContext.sessionIssuer.arn sourceIPAddress userIdentity.accessKeyId userIdentity.principalId
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
|`aws_saml_update_identity_provider_filter`
====Associated Analytic Story====
@@ -1516,21 +1516,21 @@ This search will detect a spike in the number of API calls made to your cloud in
====Search====
-| tstats count as api_calls values(All_Changes.command) as command from datamodel=Change where All_Changes.user!=unknown All_Changes.status=success by All_Changes.user _time span=1h
-| `drop_dm_object_name("All_Changes")`
-| eval HourOfDay=strftime(_time, "%H")
-| eval HourOfDay=floor(HourOfDay/4)*4
-| eval DayOfWeek=strftime(_time, "%w")
-| eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
-| join user HourOfDay isWeekend [ summary cloud_excessive_api_calls_v1]
-| where cardinality >=16
-| apply cloud_excessive_api_calls_v1 threshold=0.005
-| rename "IsOutlier(api_calls)" as isOutlier
-| where isOutlier=1
-| eval expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0)
-| where api_calls > expected_upper_threshold
-| eval distance_from_threshold = api_calls - expected_upper_threshold
-| table _time, user, command, api_calls, expected_upper_threshold, distance_from_threshold
+| tstats count as api_calls values(All_Changes.command) as command from datamodel=Change where All_Changes.user!=unknown All_Changes.status=success by All_Changes.user _time span=1h
+| `drop_dm_object_name("All_Changes")`
+| eval HourOfDay=strftime(_time, "%H")
+| eval HourOfDay=floor(HourOfDay/4)*4
+| eval DayOfWeek=strftime(_time, "%w")
+| eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
+| join user HourOfDay isWeekend [ summary cloud_excessive_api_calls_v1]
+| where cardinality >=16
+| apply cloud_excessive_api_calls_v1 threshold=0.005
+| rename "IsOutlier(api_calls)" as isOutlier
+| where isOutlier=1
+| eval expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0)
+| where api_calls > expected_upper_threshold
+| eval distance_from_threshold = api_calls - expected_upper_threshold
+| table _time, user, command, api_calls, expected_upper_threshold, distance_from_threshold
| `abnormally_high_number_of_cloud_infrastructure_api_calls_filter`
====Associated Analytic Story====
@@ -1592,20 +1592,20 @@ This search finds for the number successfully destroyed cloud instances for ever
====Search====
-| tstats count as instances_destroyed values(All_Changes.object_id) as object_id from datamodel=Change where All_Changes.action=deleted AND All_Changes.status=success AND All_Changes.object_category=instance by All_Changes.user _time span=1h
-| `drop_dm_object_name("All_Changes")`
-| eval HourOfDay=strftime(_time, "%H")
-| eval HourOfDay=floor(HourOfDay/4)*4
-| eval DayOfWeek=strftime(_time, "%w")
-| eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
-| join HourOfDay isWeekend [summary cloud_excessive_instances_destroyed_v1]
-| where cardinality >=16
-| apply cloud_excessive_instances_destroyed_v1 threshold=0.005
-| rename "IsOutlier(instances_destroyed)" as isOutlier
-| where isOutlier=1
-| eval expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0)
-| eval distance_from_threshold = instances_destroyed - expected_upper_threshold
-| table _time, user, instances_destroyed, expected_upper_threshold, distance_from_threshold, object_id
+| tstats count as instances_destroyed values(All_Changes.object_id) as object_id from datamodel=Change where All_Changes.action=deleted AND All_Changes.status=success AND All_Changes.object_category=instance by All_Changes.user _time span=1h
+| `drop_dm_object_name("All_Changes")`
+| eval HourOfDay=strftime(_time, "%H")
+| eval HourOfDay=floor(HourOfDay/4)*4
+| eval DayOfWeek=strftime(_time, "%w")
+| eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
+| join HourOfDay isWeekend [summary cloud_excessive_instances_destroyed_v1]
+| where cardinality >=16
+| apply cloud_excessive_instances_destroyed_v1 threshold=0.005
+| rename "IsOutlier(instances_destroyed)" as isOutlier
+| where isOutlier=1
+| eval expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0)
+| eval distance_from_threshold = instances_destroyed - expected_upper_threshold
+| table _time, user, instances_destroyed, expected_upper_threshold, distance_from_threshold, object_id
| `abnormally_high_number_of_cloud_instances_destroyed_filter`
====Associated Analytic Story====
@@ -1665,20 +1665,20 @@ This search finds for the number successfully created cloud instances for every
====Search====
-| tstats count as instances_launched values(All_Changes.object_id) as object_id from datamodel=Change where (All_Changes.action=created) AND All_Changes.status=success AND All_Changes.object_category=instance by All_Changes.user _time span=1h
-| `drop_dm_object_name("All_Changes")`
-| eval HourOfDay=strftime(_time, "%H")
-| eval HourOfDay=floor(HourOfDay/4)*4
-| eval DayOfWeek=strftime(_time, "%w")
-| eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
-| join HourOfDay isWeekend [summary cloud_excessive_instances_created_v1]
-| where cardinality >=16
-| apply cloud_excessive_instances_created_v1 threshold=0.005
-| rename "IsOutlier(instances_launched)" as isOutlier
-| where isOutlier=1
-| eval expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0)
-| eval distance_from_threshold = instances_launched - expected_upper_threshold
-| table _time, user, instances_launched, expected_upper_threshold, distance_from_threshold, object_id
+| tstats count as instances_launched values(All_Changes.object_id) as object_id from datamodel=Change where (All_Changes.action=created) AND All_Changes.status=success AND All_Changes.object_category=instance by All_Changes.user _time span=1h
+| `drop_dm_object_name("All_Changes")`
+| eval HourOfDay=strftime(_time, "%H")
+| eval HourOfDay=floor(HourOfDay/4)*4
+| eval DayOfWeek=strftime(_time, "%w")
+| eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
+| join HourOfDay isWeekend [summary cloud_excessive_instances_created_v1]
+| where cardinality >=16
+| apply cloud_excessive_instances_created_v1 threshold=0.005
+| rename "IsOutlier(instances_launched)" as isOutlier
+| where isOutlier=1
+| eval expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0)
+| eval distance_from_threshold = instances_launched - expected_upper_threshold
+| table _time, user, instances_launched, expected_upper_threshold, distance_from_threshold, object_id
| `abnormally_high_number_of_cloud_instances_launched_filter`
====Associated Analytic Story====
@@ -1740,21 +1740,21 @@ This search will detect a spike in the number of API calls made to your cloud in
====Search====
-| tstats count as security_group_api_calls values(All_Changes.command) as command from datamodel=Change where All_Changes.object_category=firewall AND All_Changes.status=success by All_Changes.user _time span=1h
-| `drop_dm_object_name("All_Changes")`
-| eval HourOfDay=strftime(_time, "%H")
-| eval HourOfDay=floor(HourOfDay/4)*4
-| eval DayOfWeek=strftime(_time, "%w")
-| eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
-| join user HourOfDay isWeekend [ summary cloud_excessive_security_group_api_calls_v1]
-| where cardinality >=16
-| apply cloud_excessive_security_group_api_calls_v1 threshold=0.005
-| rename "IsOutlier(security_group_api_calls)" as isOutlier
-| where isOutlier=1
-| eval expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0)
-| where security_group_api_calls > expected_upper_threshold
-| eval distance_from_threshold = security_group_api_calls - expected_upper_threshold
-| table _time, user, command, security_group_api_calls, expected_upper_threshold, distance_from_threshold
+| tstats count as security_group_api_calls values(All_Changes.command) as command from datamodel=Change where All_Changes.object_category=firewall AND All_Changes.status=success by All_Changes.user _time span=1h
+| `drop_dm_object_name("All_Changes")`
+| eval HourOfDay=strftime(_time, "%H")
+| eval HourOfDay=floor(HourOfDay/4)*4
+| eval DayOfWeek=strftime(_time, "%w")
+| eval isWeekend=if(DayOfWeek >= 1 AND DayOfWeek <= 5, 0, 1)
+| join user HourOfDay isWeekend [ summary cloud_excessive_security_group_api_calls_v1]
+| where cardinality >=16
+| apply cloud_excessive_security_group_api_calls_v1 threshold=0.005
+| rename "IsOutlier(security_group_api_calls)" as isOutlier
+| where isOutlier=1
+| eval expected_upper_threshold = mvindex(split(mvindex(BoundaryRanges, -1), ":"), 0)
+| where security_group_api_calls > expected_upper_threshold
+| eval distance_from_threshold = security_group_api_calls - expected_upper_threshold
+| table _time, user, command, security_group_api_calls, expected_upper_threshold, distance_from_threshold
| `abnormally_high_number_of_cloud_security_group_api_calls_filter`
====Associated Analytic Story====
@@ -1807,7 +1807,7 @@ You must be ingesting your cloud infrastructure logs. You also must run the base
This search provides detection information on unauthenticated requests against Kubernetes' Pods API
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1526/ T1526]
* '''Last Updated''': 2020-04-15
@@ -1815,11 +1815,11 @@ This search provides detection information on unauthenticated requests against K
====Search====
-
`aws_cloudwatchlogs_eks` "user.username"="system:anonymous" verb=list objectRef.resource=pods requestURI="/api/v1/pods"
-| rename source as cluster_name sourceIPs{} as src_ip
-| stats count min(_time) as firstTime max(_time) as lastTime values(responseStatus.reason) values(responseStatus.code) values(userAgent) values(verb) values(requestURI) by src_ip cluster_name user.username user.groups{}
-| `security_content_ctime(lastTime)`
-| `security_content_ctime(firstTime)`
+`aws_cloudwatchlogs_eks` "user.username"="system:anonymous" verb=list objectRef.resource=pods requestURI="/api/v1/pods"
+| rename source as cluster_name sourceIPs{} as src_ip
+| stats count min(_time) as firstTime max(_time) as lastTime values(responseStatus.reason) values(responseStatus.code) values(userAgent) values(verb) values(requestURI) by src_ip cluster_name user.username user.groups{}
+| `security_content_ctime(lastTime)`
+| `security_content_ctime(firstTime)`
| `amazon_eks_kubernetes_pod_scan_detection_filter`
====Associated Analytic Story====
@@ -1870,7 +1870,7 @@ Not all unauthenticated requests are malicious, but frequency, UA and source IPs
This search provides information of unauthenticated requests via user agent, and authentication data against Kubernetes cluster in AWS
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1526/ T1526]
* '''Last Updated''': 2020-04-15
@@ -1878,11 +1878,11 @@ This search provides information of unauthenticated requests via user agent, and
====Search====
-
`aws_cloudwatchlogs_eks` "user.username"="system:anonymous" userAgent!="AWS Security Scanner"
-| rename sourceIPs{} as src_ip
-| stats count min(_time) as firstTime max(_time) as lastTime values(responseStatus.reason) values(source) as cluster_name values(responseStatus.code) values(userAgent) as http_user_agent values(verb) values(requestURI) by src_ip user.username user.groups{}
-| `security_content_ctime(lastTime)`
-| `security_content_ctime(firstTime)`
+`aws_cloudwatchlogs_eks` "user.username"="system:anonymous" userAgent!="AWS Security Scanner"
+| rename sourceIPs{} as src_ip
+| stats count min(_time) as firstTime max(_time) as lastTime values(responseStatus.reason) values(source) as cluster_name values(responseStatus.code) values(userAgent) as http_user_agent values(verb) values(requestURI) by src_ip user.username user.groups{}
+| `security_content_ctime(lastTime)`
+| `security_content_ctime(firstTime)`
|`amazon_eks_kubernetes_cluster_scan_detection_filter`
====Associated Analytic Story====
@@ -1942,15 +1942,15 @@ This search looks for new commands from each user role.
====Search====
-| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change where All_Changes.user_type=AssumedRole AND All_Changes.status=success by All_Changes.user, All_Changes.command All_Changes.object
-| `drop_dm_object_name("All_Changes")`
-| lookup previously_seen_cloud_api_calls_per_user_role user as user, command as command OUTPUT firstTimeSeen, enough_data
-| eventstats max(enough_data) as enough_data
-| where enough_data=1
-| eval firstTimeSeenUserApiCall=min(firstTimeSeen)
-| where isnull(firstTimeSeenUserApiCall) OR firstTimeSeenUserApiCall > relative_time(now(),"-24h@h")
-| table firstTime, user, object, command
-|`security_content_ctime(firstTime)`
+| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change where All_Changes.user_type=AssumedRole AND All_Changes.status=success by All_Changes.user, All_Changes.command All_Changes.object
+| `drop_dm_object_name("All_Changes")`
+| lookup previously_seen_cloud_api_calls_per_user_role user as user, command as command OUTPUT firstTimeSeen, enough_data
+| eventstats max(enough_data) as enough_data
+| where enough_data=1
+| eval firstTimeSeenUserApiCall=min(firstTimeSeen)
+| where isnull(firstTimeSeenUserApiCall) OR firstTimeSeenUserApiCall > relative_time(now(),"-24h@h")
+| table firstTime, user, object, command
+|`security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `cloud_api_calls_from_previously_unseen_user_roles_filter`
@@ -2011,15 +2011,15 @@ This search looks for cloud compute instances created by users who have not crea
====Search====
-| tstats `security_content_summariesonly` count earliest(_time) as firstTime, latest(_time) as lastTime values(All_Changes.object) as dest from datamodel=Change where All_Changes.action=created by All_Changes.user All_Changes.vendor_region
-| `drop_dm_object_name("All_Changes")`
-| lookup previously_seen_cloud_compute_creations_by_user user as user OUTPUTNEW firstTimeSeen, enough_data
-| eventstats max(enough_data) as enough_data
-| where enough_data=1
-| eval firstTimeSeenUser=min(firstTimeSeen)
-| where isnull(firstTimeSeenUser) OR firstTimeSeenUser > relative_time(now(), "-24h@h")
-| table firstTime, user, dest, count vendor_region
-| `security_content_ctime(firstTime)`
+| tstats `security_content_summariesonly` count earliest(_time) as firstTime, latest(_time) as lastTime values(All_Changes.object) as dest from datamodel=Change where All_Changes.action=created by All_Changes.user All_Changes.vendor_region
+| `drop_dm_object_name("All_Changes")`
+| lookup previously_seen_cloud_compute_creations_by_user user as user OUTPUTNEW firstTimeSeen, enough_data
+| eventstats max(enough_data) as enough_data
+| where enough_data=1
+| eval firstTimeSeenUser=min(firstTimeSeen)
+| where isnull(firstTimeSeenUser) OR firstTimeSeenUser > relative_time(now(), "-24h@h")
+| table firstTime, user, dest, count vendor_region
+| `security_content_ctime(firstTime)`
| `cloud_compute_instance_created_by_previously_unseen_user_filter`
====Associated Analytic Story====
@@ -2079,15 +2079,15 @@ This search looks at cloud-infrastructure events where an instance is created in
====Search====
-| tstats earliest(_time) as firstTime latest(_time) as lastTime values(All_Changes.object_id) as dest, count from datamodel=Change where All_Changes.action=created by All_Changes.vendor_region, All_Changes.user
-| `drop_dm_object_name("All_Changes")`
-| lookup previously_seen_cloud_regions vendor_region as vendor_region OUTPUTNEW firstTimeSeen, enough_data
-| eventstats max(enough_data) as enough_data
-| where enough_data=1
-| eval firstTimeSeenRegion=min(firstTimeSeen)
-| where isnull(firstTimeSeenRegion) OR firstTimeSeenRegion > relative_time(now(), "-24h@h")
-| table firstTime, user, dest, count , vendor_region
-| `security_content_ctime(firstTime)`
+| tstats earliest(_time) as firstTime latest(_time) as lastTime values(All_Changes.object_id) as dest, count from datamodel=Change where All_Changes.action=created by All_Changes.vendor_region, All_Changes.user
+| `drop_dm_object_name("All_Changes")`
+| lookup previously_seen_cloud_regions vendor_region as vendor_region OUTPUTNEW firstTimeSeen, enough_data
+| eventstats max(enough_data) as enough_data
+| where enough_data=1
+| eval firstTimeSeenRegion=min(firstTimeSeen)
+| where isnull(firstTimeSeenRegion) OR firstTimeSeenRegion > relative_time(now(), "-24h@h")
+| table firstTime, user, dest, count , vendor_region
+| `security_content_ctime(firstTime)`
| `cloud_compute_instance_created_in_previously_unused_region_filter`
====Associated Analytic Story====
@@ -2141,7 +2141,7 @@ This search looks for cloud compute instances being created with previously unse
* '''Product''': Splunk Security Analytics for AWS, Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Change
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2018-10-12
@@ -2149,17 +2149,17 @@ This search looks for cloud compute instances being created with previously unse
====Search====
-| tstats count earliest(_time) as firstTime, latest(_time) as lastTime values(All_Changes.object_id) as dest from datamodel=Change where All_Changes.action=created by All_Changes.Instance_Changes.image_id, All_Changes.user
-| `drop_dm_object_name("All_Changes")`
-| `drop_dm_object_name("Instance_Changes")`
-| where image_id != "unknown"
-| lookup previously_seen_cloud_compute_images image_id as image_id OUTPUT firstTimeSeen, enough_data
-| eventstats max(enough_data) as enough_data
-| where enough_data=1
-| eval firstTimeSeenImage=min(firstTimeSeen)
-| where isnull(firstTimeSeenImage) OR firstTimeSeenImage > relative_time(now(), "-24h@h")
-| table firstTime, user, image_id, count, dest
-| `security_content_ctime(firstTime)`
+| tstats count earliest(_time) as firstTime, latest(_time) as lastTime values(All_Changes.object_id) as dest from datamodel=Change where All_Changes.action=created by All_Changes.Instance_Changes.image_id, All_Changes.user
+| `drop_dm_object_name("All_Changes")`
+| `drop_dm_object_name("Instance_Changes")`
+| where image_id != "unknown"
+| lookup previously_seen_cloud_compute_images image_id as image_id OUTPUT firstTimeSeen, enough_data
+| eventstats max(enough_data) as enough_data
+| where enough_data=1
+| eval firstTimeSeenImage=min(firstTimeSeen)
+| where isnull(firstTimeSeenImage) OR firstTimeSeenImage > relative_time(now(), "-24h@h")
+| table firstTime, user, image_id, count, dest
+| `security_content_ctime(firstTime)`
| `cloud_compute_instance_created_with_previously_unseen_image_filter`
====Associated Analytic Story====
@@ -2200,7 +2200,7 @@ Find EC2 instances being created with previously unseen instance types.
* '''Product''': Splunk Security Analytics for AWS, Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Change
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-09-12
@@ -2208,17 +2208,17 @@ Find EC2 instances being created with previously unseen instance types.
====Search====
-| tstats earliest(_time) as firstTime, latest(_time) as lastTime values(All_Changes.object_id) as dest, count from datamodel=Change where All_Changes.action=created by All_Changes.Instance_Changes.instance_type, All_Changes.user
-| `drop_dm_object_name("All_Changes")`
-| `drop_dm_object_name("Instance_Changes")`
-| where instance_type != "unknown"
-| lookup previously_seen_cloud_compute_instance_types instance_type as instance_type OUTPUTNEW firstTimeSeen, enough_data
-| eventstats max(enough_data) as enough_data
-| where enough_data=1
-| eval firstTimeSeenInstanceType=min(firstTimeSeen)
-| where isnull(firstTimeSeenInstanceType) OR firstTimeSeenInstanceType > relative_time(now(), "-24h@h")
-| table firstTime, user, dest, count, instance_type
-| `security_content_ctime(firstTime)`
+| tstats earliest(_time) as firstTime, latest(_time) as lastTime values(All_Changes.object_id) as dest, count from datamodel=Change where All_Changes.action=created by All_Changes.Instance_Changes.instance_type, All_Changes.user
+| `drop_dm_object_name("All_Changes")`
+| `drop_dm_object_name("Instance_Changes")`
+| where instance_type != "unknown"
+| lookup previously_seen_cloud_compute_instance_types instance_type as instance_type OUTPUTNEW firstTimeSeen, enough_data
+| eventstats max(enough_data) as enough_data
+| where enough_data=1
+| eval firstTimeSeenInstanceType=min(firstTimeSeen)
+| where isnull(firstTimeSeenInstanceType) OR firstTimeSeenInstanceType > relative_time(now(), "-24h@h")
+| table firstTime, user, dest, count, instance_type
+| `security_content_ctime(firstTime)`
| `cloud_compute_instance_created_with_previously_unseen_instance_type_filter`
====Associated Analytic Story====
@@ -2267,15 +2267,15 @@ This search looks for cloud instances being modified by users who have not previ
====Search====
-| tstats `security_content_summariesonly` count earliest(_time) as firstTime, latest(_time) as lastTime values(All_Changes.object_id) as object_id values(All_Changes.command) as command from datamodel=Change where All_Changes.action=modified All_Changes.change_type=EC2 All_Changes.status=success by All_Changes.user
-| `drop_dm_object_name("All_Changes")`
-| lookup previously_seen_cloud_instance_modifications_by_user user as user OUTPUTNEW firstTimeSeen, enough_data
-| eventstats max(enough_data) as enough_data
-| where enough_data=1
-| eval firstTimeSeenUser=min(firstTimeSeen)
-| where isnull(firstTimeSeenUser) OR firstTimeSeenUser > relative_time(now(), "-24h@h")
-| table firstTime user command object_id count
-| `security_content_ctime(firstTime)`
+| tstats `security_content_summariesonly` count earliest(_time) as firstTime, latest(_time) as lastTime values(All_Changes.object_id) as object_id values(All_Changes.command) as command from datamodel=Change where All_Changes.action=modified All_Changes.change_type=EC2 All_Changes.status=success by All_Changes.user
+| `drop_dm_object_name("All_Changes")`
+| lookup previously_seen_cloud_instance_modifications_by_user user as user OUTPUTNEW firstTimeSeen, enough_data
+| eventstats max(enough_data) as enough_data
+| where enough_data=1
+| eval firstTimeSeenUser=min(firstTimeSeen)
+| where isnull(firstTimeSeenUser) OR firstTimeSeenUser > relative_time(now(), "-24h@h")
+| table firstTime user command object_id count
+| `security_content_ctime(firstTime)`
| `cloud_instance_modified_by_previously_unseen_user_filter`
====Associated Analytic Story====
@@ -2335,17 +2335,17 @@ This search looks for cloud provisioning activities from previously unseen citie
====Search====
-| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.object, All_Changes.command
-| `drop_dm_object_name("All_Changes")`
-| iplocation src
-| where isnotnull(City)
-| lookup previously_seen_cloud_provisioning_activity_sources City as City OUTPUT firstTimeSeen, enough_data
-| eventstats max(enough_data) as enough_data
-| where enough_data=1
-| eval firstTimeSeenCity=min(firstTimeSeen)
-| where isnull(firstTimeSeenCity) OR firstTimeSeenCity > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`)
-| table firstTime, src, City, user, object, command
-| `cloud_provisioning_activity_from_previously_unseen_city_filter`
+| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.object, All_Changes.command
+| `drop_dm_object_name("All_Changes")`
+| iplocation src
+| where isnotnull(City)
+| lookup previously_seen_cloud_provisioning_activity_sources City as City OUTPUT firstTimeSeen, enough_data
+| eventstats max(enough_data) as enough_data
+| where enough_data=1
+| eval firstTimeSeenCity=min(firstTimeSeen)
+| where isnull(firstTimeSeenCity) OR firstTimeSeenCity > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`)
+| table firstTime, src, City, user, object, command
+| `cloud_provisioning_activity_from_previously_unseen_city_filter`
| `security_content_ctime(firstTime)`
====Associated Analytic Story====
@@ -2406,17 +2406,17 @@ This search looks for cloud provisioning activities from previously unseen count
====Search====
-| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.object, All_Changes.command
-| `drop_dm_object_name("All_Changes")`
-| iplocation src
-| where isnotnull(Country)
-| lookup previously_seen_cloud_provisioning_activity_sources Country as Country OUTPUT firstTimeSeen, enough_data
-| eventstats max(enough_data) as enough_data
-| where enough_data=1
-| eval firstTimeSeenCountry=min(firstTimeSeen)
-| where isnull(firstTimeSeenCountry) OR firstTimeSeenCountry > relative_time(now(), "-24h@h")
-| table firstTime, src, Country, user, object, command
-| `cloud_provisioning_activity_from_previously_unseen_country_filter`
+| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.object, All_Changes.command
+| `drop_dm_object_name("All_Changes")`
+| iplocation src
+| where isnotnull(Country)
+| lookup previously_seen_cloud_provisioning_activity_sources Country as Country OUTPUT firstTimeSeen, enough_data
+| eventstats max(enough_data) as enough_data
+| where enough_data=1
+| eval firstTimeSeenCountry=min(firstTimeSeen)
+| where isnull(firstTimeSeenCountry) OR firstTimeSeenCountry > relative_time(now(), "-24h@h")
+| table firstTime, src, Country, user, object, command
+| `cloud_provisioning_activity_from_previously_unseen_country_filter`
| `security_content_ctime(firstTime)`
====Associated Analytic Story====
@@ -2477,15 +2477,15 @@ This search looks for cloud provisioning activities from previously unseen IP ad
====Search====
-| tstats earliest(_time) as firstTime, latest(_time) as lastTime, values(All_Changes.object_id) as object_id from datamodel=Change where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.command
-| `drop_dm_object_name("All_Changes")`
-| lookup previously_seen_cloud_provisioning_activity_sources src as src OUTPUT firstTimeSeen, enough_data
-| eventstats max(enough_data) as enough_data
-| where enough_data=1
-| eval firstTimeSeenSrc=min(firstTimeSeen)
-| where isnull(firstTimeSeenSrc) OR firstTimeSeenSrc > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`)
-| table firstTime, src, user, object_id, command
-| `cloud_provisioning_activity_from_previously_unseen_ip_address_filter`
+| tstats earliest(_time) as firstTime, latest(_time) as lastTime, values(All_Changes.object_id) as object_id from datamodel=Change where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.command
+| `drop_dm_object_name("All_Changes")`
+| lookup previously_seen_cloud_provisioning_activity_sources src as src OUTPUT firstTimeSeen, enough_data
+| eventstats max(enough_data) as enough_data
+| where enough_data=1
+| eval firstTimeSeenSrc=min(firstTimeSeen)
+| where isnull(firstTimeSeenSrc) OR firstTimeSeenSrc > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`)
+| table firstTime, src, user, object_id, command
+| `cloud_provisioning_activity_from_previously_unseen_ip_address_filter`
| `security_content_ctime(firstTime)`
====Associated Analytic Story====
@@ -2546,17 +2546,17 @@ This search looks for cloud provisioning activities from previously unseen regio
====Search====
-| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.object, All_Changes.command
-| `drop_dm_object_name("All_Changes")`
-| iplocation src
-| where isnotnull(Region)
-| lookup previously_seen_cloud_provisioning_activity_sources Region as Region OUTPUT firstTimeSeen, enough_data
-| eventstats max(enough_data) as enough_data
-| where enough_data=1
-| eval firstTimeSeenRegion=min(firstTimeSeen)
-| where isnull(firstTimeSeenRegion) OR firstTimeSeenRegion > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`)
-| table firstTime, src, Region, user, object, command
-| `cloud_provisioning_activity_from_previously_unseen_region_filter`
+| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.object, All_Changes.command
+| `drop_dm_object_name("All_Changes")`
+| iplocation src
+| where isnotnull(Region)
+| lookup previously_seen_cloud_provisioning_activity_sources Region as Region OUTPUT firstTimeSeen, enough_data
+| eventstats max(enough_data) as enough_data
+| where enough_data=1
+| eval firstTimeSeenRegion=min(firstTimeSeen)
+| where isnull(firstTimeSeenRegion) OR firstTimeSeenRegion > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`)
+| table firstTime, src, Region, user, object, command
+| `cloud_provisioning_activity_from_previously_unseen_region_filter`
| `security_content_ctime(firstTime)`
====Associated Analytic Story====
@@ -2609,7 +2609,7 @@ This search looks for CloudTrail events wherein a console login event by a user
* '''Product''': Splunk Security Analytics for AWS, Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Authentication
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-05-28
@@ -2617,13 +2617,13 @@ This search looks for CloudTrail events wherein a console login event by a user
====Search====
-| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication where Authentication.signature=ConsoleLogin by Authentication.user
-| `drop_dm_object_name(Authentication)`
-| inputlookup append=t previously_seen_users_console_logins
-| stats min(firstTime) as firstTime max(lastTime) as lastTime by user
-| eval userStatus=if(firstTime >=relative_time(now(),"-24h@h"), "First Time Logging into AWS Console", "Previously Seen User")
-|where userStatus="First Time Logging into AWS Console"
-| `security_content_ctime(firstTime)`
+| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication where Authentication.signature=ConsoleLogin by Authentication.user
+| `drop_dm_object_name(Authentication)`
+| inputlookup append=t previously_seen_users_console_logins
+| stats min(firstTime) as firstTime max(lastTime) as lastTime by user
+| eval userStatus=if(firstTime >=relative_time(now(),"-24h@h"), "First Time Logging into AWS Console", "Previously Seen User")
+|where userStatus="First Time Logging into AWS Console"
+| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `detect_aws_console_login_by_new_user_filter`
@@ -2675,20 +2675,20 @@ This search looks for CloudTrail events wherein a console login event by a user
====Search====
-| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication where Authentication.signature=ConsoleLogin by Authentication.user Authentication.src
-| iplocation Authentication.src
-| `drop_dm_object_name(Authentication)`
-| table firstTime lastTime user City
+| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication where Authentication.signature=ConsoleLogin by Authentication.user Authentication.src
+| iplocation Authentication.src
+| `drop_dm_object_name(Authentication)`
+| table firstTime lastTime user City
| join user type=outer [
-| inputlookup previously_seen_users_console_logins
-| stats earliest(firstTime) AS earliestseen by user City
-| fields earliestseen user City]
-| eval userCity=if(firstTime >= relative_time(now(), "-24h@h"), "New City","Previously Seen City")
-| eval userStatus=if(earliestseen >= relative_time(now(), "-24h@h") OR isnull(earliestseen), "New User","Old User")
-| where userCity = "New City" AND userStatus != "Old User"
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| table firstTime lastTime user City userStatus userCity
+| inputlookup previously_seen_users_console_logins
+| stats earliest(firstTime) AS earliestseen by user City
+| fields earliestseen user City]
+| eval userCity=if(firstTime >= relative_time(now(), "-24h@h"), "New City","Previously Seen City")
+| eval userStatus=if(earliestseen >= relative_time(now(), "-24h@h") OR isnull(earliestseen), "New User","Old User")
+| where userCity = "New City" AND userStatus != "Old User"
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+| table firstTime lastTime user City userStatus userCity
| `detect_aws_console_login_by_user_from_new_city_filter`
====Associated Analytic Story====
@@ -2752,20 +2752,20 @@ This search looks for CloudTrail events wherein a console login event by a user
====Search====
-| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication where Authentication.signature=ConsoleLogin by Authentication.user Authentication.src
-| iplocation Authentication.src
-| `drop_dm_object_name(Authentication)`
-| table firstTime lastTime user Country
+| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication where Authentication.signature=ConsoleLogin by Authentication.user Authentication.src
+| iplocation Authentication.src
+| `drop_dm_object_name(Authentication)`
+| table firstTime lastTime user Country
| join user type=outer [
-| inputlookup previously_seen_users_console_logins
-| stats earliest(firstTime) AS earliestseen by user Country
-| fields earliestseen user Country]
-| eval userCountry=if(firstTime >= relative_time(now(), "-24h@h"), "New Country","Previously Seen Country")
-| eval userStatus=if(earliestseen >= relative_time(now(),"-24h@h") OR isnull(earliestseen), "New User","Old User")
-| where userCountry = "New Country" AND userStatus != "Old User"
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| table firstTime lastTime user Country userStatus userCountry
+| inputlookup previously_seen_users_console_logins
+| stats earliest(firstTime) AS earliestseen by user Country
+| fields earliestseen user Country]
+| eval userCountry=if(firstTime >= relative_time(now(), "-24h@h"), "New Country","Previously Seen Country")
+| eval userStatus=if(earliestseen >= relative_time(now(),"-24h@h") OR isnull(earliestseen), "New User","Old User")
+| where userCountry = "New Country" AND userStatus != "Old User"
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+| table firstTime lastTime user Country userStatus userCountry
| `detect_aws_console_login_by_user_from_new_country_filter`
====Associated Analytic Story====
@@ -2829,20 +2829,20 @@ This search looks for CloudTrail events wherein a console login event by a user
====Search====
-| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication where Authentication.signature=ConsoleLogin by Authentication.user Authentication.src
-| iplocation Authentication.src
-| `drop_dm_object_name(Authentication)`
-| table firstTime lastTime user Region
+| tstats earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Authentication where Authentication.signature=ConsoleLogin by Authentication.user Authentication.src
+| iplocation Authentication.src
+| `drop_dm_object_name(Authentication)`
+| table firstTime lastTime user Region
| join user type=outer [
-| inputlookup previously_seen_users_console_logins
-| stats earliest(firstTime) AS earliestseen by user Region
-| fields earliestseen user Region]
-| eval userRegion=if(firstTime >= relative_time(now(), "-24h@h"), "New Region","Previously Seen Region")
-| eval userStatus=if(earliestseen >= relative_time(now(), "-24h@h") OR isnull(earliestseen), "New User","Old User")
-| where userRegion = "New Region" AND userStatus != "Old User"
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| table firstTime lastTime user Region userStatus userRegion
+| inputlookup previously_seen_users_console_logins
+| stats earliest(firstTime) AS earliestseen by user Region
+| fields earliestseen user Region]
+| eval userRegion=if(firstTime >= relative_time(now(), "-24h@h"), "New Region","Previously Seen Region")
+| eval userStatus=if(earliestseen >= relative_time(now(), "-24h@h") OR isnull(earliestseen), "New User","Old User")
+| where userRegion = "New Region" AND userStatus != "Old User"
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+| table firstTime lastTime user Region userStatus userRegion
| `detect_aws_console_login_by_user_from_new_region_filter`
====Associated Analytic Story====
@@ -2897,7 +2897,7 @@ When a legitimate new user logins for the first time, this activity will be dete
This search looks at GCP Storage bucket-access logs and detects new or previously unseen remote IP addresses that have successfully accessed a GCP Storage bucket.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1530/ T1530]
* '''Last Updated''': 2020-08-10
@@ -2905,24 +2905,24 @@ This search looks at GCP Storage bucket-access logs and detects new or previousl
====Search====
-
`google_gcp_pubsub_message`
-| multikv
-| rename sc_status_ as status
-| rename cs_object_ as bucket_name
-| rename c_ip_ as remote_ip
-| rename cs_uri_ as request_uri
-| rename cs_method_ as operation
-| search status="\"200\""
-| stats earliest(_time) as firstTime latest(_time) as lastTime by bucket_name remote_ip operation request_uri
-| table firstTime, lastTime, bucket_name, remote_ip, operation, request_uri
-| inputlookup append=t previously_seen_gcp_storage_access_from_remote_ip.csv
-| stats min(firstTime) as firstTime, max(lastTime) as lastTime by bucket_name remote_ip operation request_uri
-| outputlookup previously_seen_gcp_storage_access_from_remote_ip.csv
-| eval newIP=if(firstTime >= relative_time(now(),"-70m@m"), 1, 0)
-| where newIP=1
-| eval first_time=strftime(firstTime,"%m/%d/%y %H:%M:%S")
-| eval last_time=strftime(lastTime,"%m/%d/%y %H:%M:%S")
-| table first_time last_time bucket_name remote_ip operation request_uri
+`google_gcp_pubsub_message`
+| multikv
+| rename sc_status_ as status
+| rename cs_object_ as bucket_name
+| rename c_ip_ as remote_ip
+| rename cs_uri_ as request_uri
+| rename cs_method_ as operation
+| search status="\"200\""
+| stats earliest(_time) as firstTime latest(_time) as lastTime by bucket_name remote_ip operation request_uri
+| table firstTime, lastTime, bucket_name, remote_ip, operation, request_uri
+| inputlookup append=t previously_seen_gcp_storage_access_from_remote_ip.csv
+| stats min(firstTime) as firstTime, max(lastTime) as lastTime by bucket_name remote_ip operation request_uri
+| outputlookup previously_seen_gcp_storage_access_from_remote_ip.csv
+| eval newIP=if(firstTime >= relative_time(now(),"-70m@m"), 1, 0)
+| where newIP=1
+| eval first_time=strftime(firstTime,"%m/%d/%y %H:%M:%S")
+| eval last_time=strftime(lastTime,"%m/%d/%y %H:%M:%S")
+| table first_time last_time bucket_name remote_ip operation request_uri
| `detect_gcp_storage_access_from_a_new_ip_filter`
====Associated Analytic Story====
@@ -2973,7 +2973,7 @@ GCP Storage buckets can be accessed from any IP (if the ACLs are open to allow i
This search looks for GCP PubSub events where a user has created an open/public GCP Storage bucket.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1530/ T1530]
* '''Last Updated''': 2020-08-05
@@ -2981,16 +2981,16 @@ This search looks for GCP PubSub events where a user has created an open/public
====Search====
-
`google_gcp_pubsub_message` data.resource.type=gcs_bucket data.protoPayload.methodName=storage.setIamPermissions
-| spath output=action path=data.protoPayload.serviceData.policyDelta.bindingDeltas{}.action
-| spath output=user path=data.protoPayload.authenticationInfo.principalEmail
-| spath output=location path=data.protoPayload.resourceLocation.currentLocations{}
-| spath output=src path=data.protoPayload.requestMetadata.callerIp
-| spath output=bucketName path=data.protoPayload.resourceName
-| spath output=role path=data.protoPayload.serviceData.policyDelta.bindingDeltas{}.role
-| spath output=member path=data.protoPayload.serviceData.policyDelta.bindingDeltas{}.member
-| search (member=allUsers AND action=ADD)
-| table _time, bucketName, src, user, location, action, role, member
+`google_gcp_pubsub_message` data.resource.type=gcs_bucket data.protoPayload.methodName=storage.setIamPermissions
+| spath output=action path=data.protoPayload.serviceData.policyDelta.bindingDeltas{}.action
+| spath output=user path=data.protoPayload.authenticationInfo.principalEmail
+| spath output=location path=data.protoPayload.resourceLocation.currentLocations{}
+| spath output=src path=data.protoPayload.requestMetadata.callerIp
+| spath output=bucketName path=data.protoPayload.resourceName
+| spath output=role path=data.protoPayload.serviceData.policyDelta.bindingDeltas{}.role
+| spath output=member path=data.protoPayload.serviceData.policyDelta.bindingDeltas{}.member
+| search (member=allUsers AND action=ADD)
+| table _time, bucketName, src, user, location, action, role, member
| search `detect_new_open_gcp_storage_buckets_filter`
====Associated Analytic Story====
@@ -3041,7 +3041,7 @@ While this search has no known false positives, it is possible that a GCP admin
This search looks for CloudTrail events where a user has created an open/public S3 bucket over the aws cli.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1530/ T1530]
* '''Last Updated''': 2021-01-12
@@ -3049,12 +3049,12 @@ This search looks for CloudTrail events where a user has created an open/public
====Search====
-
`cloudtrail` eventSource="s3.amazonaws.com" eventName=PutBucketAcl OR requestParameters.accessControlList.x-amz-grant-read-acp IN ("*AuthenticatedUsers","*AllUsers") OR requestParameters.accessControlList.x-amz-grant-write IN ("*AuthenticatedUsers","*AllUsers") OR requestParameters.accessControlList.x-amz-grant-write-acp IN ("*AuthenticatedUsers","*AllUsers") OR requestParameters.accessControlList.x-amz-grant-full-control IN ("*AuthenticatedUsers","*AllUsers")
-| rename requestParameters.bucketName AS bucketName
-| fillnull
-| stats count min(_time) as firstTime max(_time) as lastTime by userName userIdentity.principalId userAgent bucketName requestParameters.accessControlList.x-amz-grant-read requestParameters.accessControlList.x-amz-grant-read-acp requestParameters.accessControlList.x-amz-grant-write requestParameters.accessControlList.x-amz-grant-write-acp requestParameters.accessControlList.x-amz-grant-full-control
+`cloudtrail` eventSource="s3.amazonaws.com" eventName=PutBucketAcl OR requestParameters.accessControlList.x-amz-grant-read-acp IN ("*AuthenticatedUsers","*AllUsers") OR requestParameters.accessControlList.x-amz-grant-write IN ("*AuthenticatedUsers","*AllUsers") OR requestParameters.accessControlList.x-amz-grant-write-acp IN ("*AuthenticatedUsers","*AllUsers") OR requestParameters.accessControlList.x-amz-grant-full-control IN ("*AuthenticatedUsers","*AllUsers")
+| rename requestParameters.bucketName AS bucketName
+| fillnull
+| stats count min(_time) as firstTime max(_time) as lastTime by userName userIdentity.principalId userAgent bucketName requestParameters.accessControlList.x-amz-grant-read requestParameters.accessControlList.x-amz-grant-read-acp requestParameters.accessControlList.x-amz-grant-write requestParameters.accessControlList.x-amz-grant-write-acp requestParameters.accessControlList.x-amz-grant-full-control
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `detect_new_open_s3_buckets_over_aws_cli_filter`
====Associated Analytic Story====
@@ -3107,7 +3107,7 @@ While this search has no known false positives, it is possible that an AWS admin
This search looks for CloudTrail events where a user has created an open/public S3 bucket.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1530/ T1530]
* '''Last Updated''': 2021-01-12
@@ -3115,19 +3115,19 @@ This search looks for CloudTrail events where a user has created an open/public
====Search====
-
`cloudtrail` eventSource=s3.amazonaws.com eventName=PutBucketAcl
-| rex field=_raw "(?{.+})"
-| spath input=json_field output=grantees path=requestParameters.AccessControlPolicy.AccessControlList.Grant{}
-| search grantees=*
-| mvexpand grantees
-| spath input=grantees output=uri path=Grantee.URI
-| spath input=grantees output=permission path=Permission
-| search uri IN ("http://acs.amazonaws.com/groups/global/AllUsers","http://acs.amazonaws.com/groups/global/AuthenticatedUsers")
-| search permission IN ("READ","READ_ACP","WRITE","WRITE_ACP","FULL_CONTROL")
-| rename requestParameters.bucketName AS bucketName
-| stats count min(_time) as firstTime max(_time) as lastTime by userName userIdentity.principalId userAgent uri permission bucketName
+`cloudtrail` eventSource=s3.amazonaws.com eventName=PutBucketAcl
+| rex field=_raw "(?{.+})"
+| spath input=json_field output=grantees path=requestParameters.AccessControlPolicy.AccessControlList.Grant{}
+| search grantees=*
+| mvexpand grantees
+| spath input=grantees output=uri path=Grantee.URI
+| spath input=grantees output=permission path=Permission
+| search uri IN ("http://acs.amazonaws.com/groups/global/AllUsers","http://acs.amazonaws.com/groups/global/AuthenticatedUsers")
+| search permission IN ("READ","READ_ACP","WRITE","WRITE_ACP","FULL_CONTROL")
+| rename requestParameters.bucketName AS bucketName
+| stats count min(_time) as firstTime max(_time) as lastTime by userName userIdentity.principalId userAgent uri permission bucketName
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `detect_new_open_s3_buckets_filter`
====Associated Analytic Story====
@@ -3180,7 +3180,7 @@ While this search has no known false positives, it is possible that an AWS admin
This search looks at S3 bucket-access logs and detects new or previously unseen remote IP addresses that have successfully accessed an S3 bucket.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1530/ T1530]
* '''Last Updated''': 2018-06-28
@@ -3188,19 +3188,19 @@ This search looks at S3 bucket-access logs and detects new or previously unseen
====Search====
-
`aws_s3_accesslogs` http_status=200 [search `aws_s3_accesslogs` http_status=200
-| stats earliest(_time) as firstTime latest(_time) as lastTime by bucket_name remote_ip
-| inputlookup append=t previously_seen_S3_access_from_remote_ip.csv
-| stats min(firstTime) as firstTime, max(lastTime) as lastTime by bucket_name remote_ip
-| outputlookup previously_seen_S3_access_from_remote_ip.csv
-| eval newIP=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
-| where newIP=1
+`aws_s3_accesslogs` http_status=200 [search `aws_s3_accesslogs` http_status=200
+| stats earliest(_time) as firstTime latest(_time) as lastTime by bucket_name remote_ip
+| inputlookup append=t previously_seen_S3_access_from_remote_ip.csv
+| stats min(firstTime) as firstTime, max(lastTime) as lastTime by bucket_name remote_ip
+| outputlookup previously_seen_S3_access_from_remote_ip.csv
+| eval newIP=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
+| where newIP=1
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| table bucket_name remote_ip]
-| iplocation remote_ip
-|rename remote_ip as src_ip
-| table _time bucket_name src_ip City Country operation request_uri
+| iplocation remote_ip
+|rename remote_ip as src_ip
+| table _time bucket_name src_ip City Country operation request_uri
| `detect_s3_access_from_a_new_ip_filter`
====Associated Analytic Story====
@@ -3251,22 +3251,22 @@ S3 buckets can be accessed from any IP, as long as it can make a successful conn
This search looks for a spike in number of of AWS security Hub alerts for an EC2 instance in 4 hours intervals
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2021-01-26
====Search====
-
`aws_securityhub_finding` "Resources{}.Type"=AWSEC2Instance
-| bucket span=4h _time
-| stats count AS alerts values(Title) as Title values(Types{}) as Types values(vendor_account) as vendor_account values(vendor_region) as vendor_region values(severity) as severity by _time dest
-| eventstats avg(alerts) as total_alerts_avg, stdev(alerts) as total_alerts_stdev
-| eval threshold_value = 3
-| eval isOutlier=if(alerts > total_alerts_avg+(total_alerts_stdev * threshold_value), 1, 0)
-| search isOutlier=1
-| table _time dest alerts Title Types vendor_account vendor_region severity isOutlier total_alerts_avg
+`aws_securityhub_finding` "Resources{}.Type"=AWSEC2Instance
+| bucket span=4h _time
+| stats count AS alerts values(Title) as Title values(Types{}) as Types values(vendor_account) as vendor_account values(vendor_region) as vendor_region values(severity) as severity by _time dest
+| eventstats avg(alerts) as total_alerts_avg, stdev(alerts) as total_alerts_stdev
+| eval threshold_value = 3
+| eval isOutlier=if(alerts > total_alerts_avg+(total_alerts_stdev * threshold_value), 1, 0)
+| search isOutlier=1
+| table _time dest alerts Title Types vendor_account vendor_region severity isOutlier total_alerts_avg
| `detect_spike_in_aws_security_hub_alerts_for_ec2_instance_filter`
====Associated Analytic Story====
@@ -3306,23 +3306,23 @@ None
This search looks for a spike in number of of AWS security Hub alerts for an AWS IAM User in 4 hours intervals.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2021-01-26
====Search====
-
`aws_securityhub_finding` "findings{}.Resources{}.Type"= AwsIamUser
-| rename findings{}.Resources{}.Id as user
-| bucket span=4h _time
-| stats count AS alerts by _time user
-| eventstats avg(alerts) as total_launched_avg, stdev(alerts) as total_launched_stdev
-| eval threshold_value = 2
-| eval isOutlier=if(alerts > total_launched_avg+(total_launched_stdev * threshold_value), 1, 0)
-| search isOutlier=1
-| table _time user alerts
+`aws_securityhub_finding` "findings{}.Resources{}.Type"= AwsIamUser
+| rename findings{}.Resources{}.Id as user
+| bucket span=4h _time
+| stats count AS alerts by _time user
+| eventstats avg(alerts) as total_launched_avg, stdev(alerts) as total_launched_stdev
+| eval threshold_value = 2
+| eval isOutlier=if(alerts > total_launched_avg+(total_launched_stdev * threshold_value), 1, 0)
+| search isOutlier=1
+| table _time user alerts
|`detect_spike_in_aws_security_hub_alerts_for_user_filter`
====Associated Analytic Story====
@@ -3360,7 +3360,7 @@ None
This search detects users creating spikes in API activity related to deletion of S3 buckets in your AWS environment. It will also update the cache file that factors in the latest data.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1530/ T1530]
* '''Last Updated''': 2018-11-27
@@ -3368,26 +3368,26 @@ This search detects users creating spikes in API activity related to deletion of
====Search====
-
`cloudtrail` eventName=DeleteBucket [search `cloudtrail` eventName=DeleteBucket
-| spath output=arn path=userIdentity.arn
-| stats count as apiCalls by arn
-| inputlookup s3_deletion_baseline append=t
-| fields - latestCount
-| stats values(*) as * by arn
-| rename apiCalls as latestCount
-| eval newAvgApiCalls=avgApiCalls + (latestCount-avgApiCalls)/720
-| eval newStdevApiCalls=sqrt(((pow(stdevApiCalls, 2)*719 + (latestCount-newAvgApiCalls)*(latestCount-avgApiCalls))/720))
-| eval avgApiCalls=coalesce(newAvgApiCalls, avgApiCalls), stdevApiCalls=coalesce(newStdevApiCalls, stdevApiCalls), numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
-| table arn, latestCount, numDataPoints, avgApiCalls, stdevApiCalls
-| outputlookup s3_deletion_baseline
-| eval dataPointThreshold = 15, deviationThreshold = 3
-| eval isSpike=if((latestCount > avgApiCalls+deviationThreshold*stdevApiCalls) AND numDataPoints > dataPointThreshold, 1, 0)
-| where isSpike=1
-| rename arn as userIdentity.arn
-| table userIdentity.arn]
-| spath output=user userIdentity.arn
-| spath output=bucketName path=requestParameters.bucketName
-| stats values(bucketName) as bucketName, count as numberOfApiCalls, dc(eventName) as uniqueApisCalled by user
+`cloudtrail` eventName=DeleteBucket [search `cloudtrail` eventName=DeleteBucket
+| spath output=arn path=userIdentity.arn
+| stats count as apiCalls by arn
+| inputlookup s3_deletion_baseline append=t
+| fields - latestCount
+| stats values(*) as * by arn
+| rename apiCalls as latestCount
+| eval newAvgApiCalls=avgApiCalls + (latestCount-avgApiCalls)/720
+| eval newStdevApiCalls=sqrt(((pow(stdevApiCalls, 2)*719 + (latestCount-newAvgApiCalls)*(latestCount-avgApiCalls))/720))
+| eval avgApiCalls=coalesce(newAvgApiCalls, avgApiCalls), stdevApiCalls=coalesce(newStdevApiCalls, stdevApiCalls), numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
+| table arn, latestCount, numDataPoints, avgApiCalls, stdevApiCalls
+| outputlookup s3_deletion_baseline
+| eval dataPointThreshold = 15, deviationThreshold = 3
+| eval isSpike=if((latestCount > avgApiCalls+deviationThreshold*stdevApiCalls) AND numDataPoints > dataPointThreshold, 1, 0)
+| where isSpike=1
+| rename arn as userIdentity.arn
+| table userIdentity.arn]
+| spath output=user userIdentity.arn
+| spath output=bucketName path=requestParameters.bucketName
+| stats values(bucketName) as bucketName, count as numberOfApiCalls, dc(eventName) as uniqueApisCalled by user
| `detect_spike_in_s3_bucket_deletion_filter`
====Associated Analytic Story====
@@ -3438,30 +3438,30 @@ Based on the values of`dataPointThreshold` and `deviationThreshold`, the false p
This search will detect spike in blocked outbound network connections originating from within your AWS environment. It will also update the cache file that factors in the latest data.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2018-05-07
====Search====
-
`cloudwatchlogs_vpcflow` action=blocked (src_ip=10.0.0.0/8 OR src_ip=172.16.0.0/12 OR src_ip=192.168.0.0/16) ( dest_ip!=10.0.0.0/8 AND dest_ip!=172.16.0.0/12 AND dest_ip!=192.168.0.0/16) [search `cloudwatchlogs_vpcflow` action=blocked (src_ip=10.0.0.0/8 OR src_ip=172.16.0.0/12 OR src_ip=192.168.0.0/16) ( dest_ip!=10.0.0.0/8 AND dest_ip!=172.16.0.0/12 AND dest_ip!=192.168.0.0/16)
-| stats count as numberOfBlockedConnections by src_ip
-| inputlookup baseline_blocked_outbound_connections append=t
-| fields - latestCount
-| stats values(*) as * by src_ip
-| rename numberOfBlockedConnections as latestCount
-| eval newAvgBlockedConnections=avgBlockedConnections + (latestCount-avgBlockedConnections)/720
-| eval newStdevBlockedConnections=sqrt(((pow(stdevBlockedConnections, 2)*719 + (latestCount-newAvgBlockedConnections)*(latestCount-avgBlockedConnections))/720))
-| eval avgBlockedConnections=coalesce(newAvgBlockedConnections, avgBlockedConnections), stdevBlockedConnections=coalesce(newStdevBlockedConnections, stdevBlockedConnections), numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
-| table src_ip, latestCount, numDataPoints, avgBlockedConnections, stdevBlockedConnections
-| outputlookup baseline_blocked_outbound_connections
-| eval dataPointThreshold = 5, deviationThreshold = 3
-| eval isSpike=if((latestCount > avgBlockedConnections+deviationThreshold*stdevBlockedConnections) AND numDataPoints > dataPointThreshold, 1, 0)
-| where isSpike=1
-| table src_ip]
-| stats values(dest_ip) as "Blocked Destination IPs", values(interface_id) as "resourceId" count as numberOfBlockedConnections, dc(dest_ip) as uniqueDestConnections by src_ip
+`cloudwatchlogs_vpcflow` action=blocked (src_ip=10.0.0.0/8 OR src_ip=172.16.0.0/12 OR src_ip=192.168.0.0/16) ( dest_ip!=10.0.0.0/8 AND dest_ip!=172.16.0.0/12 AND dest_ip!=192.168.0.0/16) [search `cloudwatchlogs_vpcflow` action=blocked (src_ip=10.0.0.0/8 OR src_ip=172.16.0.0/12 OR src_ip=192.168.0.0/16) ( dest_ip!=10.0.0.0/8 AND dest_ip!=172.16.0.0/12 AND dest_ip!=192.168.0.0/16)
+| stats count as numberOfBlockedConnections by src_ip
+| inputlookup baseline_blocked_outbound_connections append=t
+| fields - latestCount
+| stats values(*) as * by src_ip
+| rename numberOfBlockedConnections as latestCount
+| eval newAvgBlockedConnections=avgBlockedConnections + (latestCount-avgBlockedConnections)/720
+| eval newStdevBlockedConnections=sqrt(((pow(stdevBlockedConnections, 2)*719 + (latestCount-newAvgBlockedConnections)*(latestCount-avgBlockedConnections))/720))
+| eval avgBlockedConnections=coalesce(newAvgBlockedConnections, avgBlockedConnections), stdevBlockedConnections=coalesce(newStdevBlockedConnections, stdevBlockedConnections), numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
+| table src_ip, latestCount, numDataPoints, avgBlockedConnections, stdevBlockedConnections
+| outputlookup baseline_blocked_outbound_connections
+| eval dataPointThreshold = 5, deviationThreshold = 3
+| eval isSpike=if((latestCount > avgBlockedConnections+deviationThreshold*stdevBlockedConnections) AND numDataPoints > dataPointThreshold, 1, 0)
+| where isSpike=1
+| table src_ip]
+| stats values(dest_ip) as "Blocked Destination IPs", values(interface_id) as "resourceId" count as numberOfBlockedConnections, dc(dest_ip) as uniqueDestConnections by src_ip
| `detect_spike_in_blocked_outbound_traffic_from_your_aws_filter`
====Associated Analytic Story====
@@ -3507,7 +3507,7 @@ The false-positive rate may vary based on the values of`dataPointThreshold` and
This search provides detection of accounts with high risk roles by projects. Compromised accounts with high risk roles can move laterally or even scalate privileges at different projects depending on organization schema.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078/ T1078]
* '''Last Updated''': 2020-10-09
@@ -3515,8 +3515,8 @@ This search provides detection of accounts with high risk roles by projects. Com
====Search====
-
`google_gcp_pubsub_message` data.protoPayload.request.policy.bindings{}.role=roles/owner OR roles/editor OR roles/iam.serviceAccountUser OR roles/iam.serviceAccountAdmin OR roles/iam.serviceAccountTokenCreator OR roles/dataflow.developer OR roles/dataflow.admin OR roles/composer.admin OR roles/dataproc.admin OR roles/dataproc.editor
-| table data.resource.type data.protoPayload.authenticationInfo.principalEmail data.protoPayload.authorizationInfo{}.permission data.protoPayload.authorizationInfo{}.resource data.protoPayload.response.bindings{}.role data.protoPayload.response.bindings{}.members{}
+`google_gcp_pubsub_message` data.protoPayload.request.policy.bindings{}.role=roles/owner OR roles/editor OR roles/iam.serviceAccountUser OR roles/iam.serviceAccountAdmin OR roles/iam.serviceAccountTokenCreator OR roles/dataflow.developer OR roles/dataflow.admin OR roles/composer.admin OR roles/dataproc.admin OR roles/dataproc.editor
+| table data.resource.type data.protoPayload.authenticationInfo.principalEmail data.protoPayload.authorizationInfo{}.permission data.protoPayload.authorizationInfo{}.resource data.protoPayload.response.bindings{}.role data.protoPayload.response.bindings{}.members{}
| `gcp_detect_accounts_with_high_risk_roles_by_project_filter`
====Associated Analytic Story====
@@ -3573,7 +3573,7 @@ Accounts with high risk roles should be reduced to the minimum number needed, ho
This search provides detection of GCPloit exploitation framework. This framework can be used to escalate privileges and move laterally from compromised high privilege accounts.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078/ T1078]
* '''Last Updated''': 2020-10-08
@@ -3581,8 +3581,8 @@ This search provides detection of GCPloit exploitation framework. This framework
====Search====
-
`google_gcp_pubsub_message` data.protoPayload.request.function.timeout=539s
-| table src src_user data.resource.labels.project_id data.protoPayload.request.function.serviceAccountEmail data.protoPayload.authorizationInfo{}.permission data.protoPayload.request.location http_user_agent
+`google_gcp_pubsub_message` data.protoPayload.request.function.timeout=539s
+| table src src_user data.resource.labels.project_id data.protoPayload.request.function.serviceAccountEmail data.protoPayload.authorizationInfo{}.permission data.protoPayload.request.location http_user_agent
| `gcp_detect_gcploit_framework_filter`
====Associated Analytic Story====
@@ -3637,7 +3637,7 @@ Payload.request.function.timeout value can possibly be match with other function
This search provides detection of high risk permissions by resource and accounts. These are permissions that can allow attackers with compromised accounts to move laterally and escalate privileges.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078/ T1078]
* '''Last Updated''': 2020-10-09
@@ -3645,8 +3645,8 @@ This search provides detection of high risk permissions by resource and accounts
====Search====
-
`google_gcp_pubsub_message` data.protoPayload.authorizationInfo{}.permission=iam.serviceAccounts.getaccesstoken OR iam.serviceAccounts.setIamPolicy OR iam.serviceAccounts.actas OR dataflow.jobs.create OR composer.environments.create OR dataproc.clusters.create
-|table data.protoPayload.requestMetadata.callerIp data.protoPayload.authenticationInfo.principalEmail data.protoPayload.authorizationInfo{}.permission data.protoPayload.response.bindings{}.members{} data.resource.labels.project_id
+`google_gcp_pubsub_message` data.protoPayload.authorizationInfo{}.permission=iam.serviceAccounts.getaccesstoken OR iam.serviceAccounts.setIamPolicy OR iam.serviceAccounts.actas OR dataflow.jobs.create OR composer.environments.create OR dataproc.clusters.create
+|table data.protoPayload.requestMetadata.callerIp data.protoPayload.authenticationInfo.principalEmail data.protoPayload.authorizationInfo{}.permission data.protoPayload.response.bindings{}.members{} data.resource.labels.project_id
| `gcp_detect_high_risk_permissions_by_resource_and_account_filter`
====Associated Analytic Story====
@@ -3703,7 +3703,7 @@ High risk permissions are part of any GCP environment, however it is important t
This search provides information of unauthenticated requests via user agent, and authentication data against Kubernetes cluster's pods
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1526/ T1526]
* '''Last Updated''': 2020-07-17
@@ -3711,10 +3711,10 @@ This search provides information of unauthenticated requests via user agent, and
====Search====
-
`google_gcp_pubsub_message` category=kube-audit
-|spath input=properties.log
-|search responseStatus.code=401
-|table sourceIPs{} userAgent verb requestURI responseStatus.reason properties.pod
+`google_gcp_pubsub_message` category=kube-audit
+|spath input=properties.log
+|search responseStatus.code=401
+|table sourceIPs{} userAgent verb requestURI responseStatus.reason properties.pod
| `gcp_kubernetes_cluster_pod_scan_detection_filter`
====Associated Analytic Story====
@@ -3765,7 +3765,7 @@ Not all unauthenticated requests are malicious, but frequency, User Agent, sourc
This search provides information of unauthenticated requests via user agent, and authentication data against Kubernetes cluster
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1526/ T1526]
* '''Last Updated''': 2020-04-15
@@ -3773,12 +3773,12 @@ This search provides information of unauthenticated requests via user agent, and
====Search====
-
`google_gcp_pubsub_message` data.protoPayload.requestMetadata.callerIp!=127.0.0.1 data.protoPayload.requestMetadata.callerIp!=::1 "data.labels.authorization.k8s.io/decision"=forbid "data.protoPayload.status.message"=PERMISSION_DENIED data.protoPayload.authenticationInfo.principalEmail="system:anonymous"
-| rename data.protoPayload.requestMetadata.callerIp as src_ip
-| stats count min(_time) as firstTime max(_time) as lastTime values(data.protoPayload.methodName) as method_name values(data.protoPayload.resourceName) as resource_name values(data.protoPayload.requestMetadata.callerSuppliedUserAgent) as http_user_agent by src_ip data.resource.labels.cluster_name
+`google_gcp_pubsub_message` data.protoPayload.requestMetadata.callerIp!=127.0.0.1 data.protoPayload.requestMetadata.callerIp!=::1 "data.labels.authorization.k8s.io/decision"=forbid "data.protoPayload.status.message"=PERMISSION_DENIED data.protoPayload.authenticationInfo.principalEmail="system:anonymous"
+| rename data.protoPayload.requestMetadata.callerIp as src_ip
+| stats count min(_time) as firstTime max(_time) as lastTime values(data.protoPayload.methodName) as method_name values(data.protoPayload.resourceName) as resource_name values(data.protoPayload.requestMetadata.callerSuppliedUserAgent) as http_user_agent by src_ip data.resource.labels.cluster_name
| rename data.resource.labels.cluster_name as cluster_name
-| `security_content_ctime(lastTime)`
-| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+| `security_content_ctime(firstTime)`
| `gcp_kubernetes_cluster_scan_detection_filter`
====Associated Analytic Story====
@@ -3829,7 +3829,7 @@ Not all unauthenticated requests are malicious, but frequency, User Agent and so
This search will detect more than 5 login failures in Office365 Azure Active Directory from a single source IP address. Please adjust the threshold value of 5 as suited for your environment.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1110.001/ T1110.001]
* '''Last Updated''': 2020-12-16
@@ -3837,8 +3837,8 @@ This search will detect more than 5 login failures in Office365 Azure Active Dir
====Search====
-
`o365_management_activity` Operation=UserLoginFailed record_type=AzureActiveDirectoryStsLogon app=AzureActiveDirectory
-| stats count dc(user) as accounts_locked values(user) as user values(LogonError) as LogonError values(authentication_method) as authentication_method values(signature) as signature values(UserAgent) as UserAgent by src_ip record_type Operation app
+`o365_management_activity` Operation=UserLoginFailed record_type=AzureActiveDirectoryStsLogon app=AzureActiveDirectory
+| stats count dc(user) as accounts_locked values(user) as user values(LogonError) as LogonError values(authentication_method) as authentication_method values(signature) as signature values(UserAgent) as UserAgent by src_ip record_type Operation app
| search accounts_locked >= 5
| `high_number_of_login_failures_from_a_single_source_filter`
@@ -3890,18 +3890,18 @@ unknown
This search provides information on Kubernetes RBAC authorizations by accounts, this search can be modified by adding top to see both extremes of RBAC by accounts occurrences
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-06-23
====Search====
-
`aws_cloudwatchlogs_eks` annotations.authorization.k8s.io/reason=*
-| table sourceIPs{} user.username userAgent annotations.authorization.k8s.io/reason
-| stats count by user.username annotations.authorization.k8s.io/reason
-| rare user.username annotations.authorization.k8s.io/reason
+`aws_cloudwatchlogs_eks` annotations.authorization.k8s.io/reason=*
+| table sourceIPs{} user.username userAgent annotations.authorization.k8s.io/reason
+| stats count by user.username annotations.authorization.k8s.io/reason
+| rare user.username annotations.authorization.k8s.io/reason
|`kubernetes_aws_detect_rbac_authorization_by_account_filter`
====Associated Analytic Story====
@@ -3941,17 +3941,17 @@ Not all RBAC Authorications are malicious. RBAC authorizations can uncover malic
This search provides information on Kubernetes service accounts,accessing pods by IP address, verb and decision
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-06-23
====Search====
-
`aws_cloudwatchlogs_eks` user.groups{}=system:serviceaccounts objectRef.resource=pods
-| table sourceIPs{} user.username userAgent verb annotations.authorization.k8s.io/decision
-| top sourceIPs{} user.username verb annotations.authorization.k8s.io/decision
+`aws_cloudwatchlogs_eks` user.groups{}=system:serviceaccounts objectRef.resource=pods
+| table sourceIPs{} user.username userAgent verb annotations.authorization.k8s.io/decision
+| top sourceIPs{} user.username verb annotations.authorization.k8s.io/decision
|`kubernetes_aws_detect_most_active_service_accounts_by_pod_filter`
====Associated Analytic Story====
@@ -3991,17 +3991,17 @@ Not all service accounts interactions are malicious. Analyst must consider IP, v
This search provides information on Kubernetes accounts accessing sensitve objects such as configmpas or secrets
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-06-23
====Search====
-
`aws_cloudwatchlogs_eks` objectRef.resource=clusterroles OR clusterrolebindings sourceIPs{}!=::1 sourceIPs{}!=127.0.0.1
-| table sourceIPs{} user.username user.groups{} objectRef.namespace requestURI annotations.authorization.k8s.io/reason
-| dedup user.username user.groups{}
+`aws_cloudwatchlogs_eks` objectRef.resource=clusterroles OR clusterrolebindings sourceIPs{}!=::1 sourceIPs{}!=127.0.0.1
+| table sourceIPs{} user.username user.groups{} objectRef.namespace requestURI annotations.authorization.k8s.io/reason
+| dedup user.username user.groups{}
|`kubernetes_aws_detect_sensitive_role_access_filter`
====Associated Analytic Story====
@@ -4023,7 +4023,7 @@ You must install splunk AWS add on and Splunk App for AWS. This search works wit
====Known False Positives====
-Sensitive role resource access is necessary for cluster operation, however source IP, namespace and user group may indicate possible malicious use.
+Sensitive role resource access is necessary for cluster operation, however source IP, namespace and user group may indicate possible malicious use.
====Reference====
@@ -4041,16 +4041,16 @@ Sensitive role resource access is necessary for cluster operation, however sourc
This search provides information on Kubernetes service accounts with failure or forbidden access status, this search can be extended by using top or rare operators to find trends or rarities in failure status, user agents, source IPs and request URI
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-06-23
====Search====
-
`aws_cloudwatchlogs_eks` user.groups{}=system:serviceaccounts responseStatus.status = Failure
-| table sourceIPs{} user.username userAgent verb responseStatus.status requestURI
+`aws_cloudwatchlogs_eks` user.groups{}=system:serviceaccounts responseStatus.status = Failure
+| table sourceIPs{} user.username userAgent verb responseStatus.status requestURI
| `kubernetes_aws_detect_service_accounts_forbidden_failure_access_filter`
====Associated Analytic Story====
@@ -4090,17 +4090,17 @@ This search can give false positives as there might be inherent issues with auth
This search provides information on anonymous Kubectl calls with IP, verb namespace and object access context
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-06-23
====Search====
-
`aws_cloudwatchlogs_eks` userAgent=kubectl* sourceIPs{}!=127.0.0.1 sourceIPs{}!=::1 src_user=system:anonymous
-| table src_ip src_user verb userAgent requestURI
-| stats count by src_ip src_user verb userAgent requestURI
+`aws_cloudwatchlogs_eks` userAgent=kubectl* sourceIPs{}!=127.0.0.1 sourceIPs{}!=::1 src_user=system:anonymous
+| table src_ip src_user verb userAgent requestURI
+| stats count by src_ip src_user verb userAgent requestURI
|`kubernetes_aws_detect_suspicious_kubectl_calls_filter`
====Associated Analytic Story====
@@ -4140,20 +4140,20 @@ Kubectl calls are not malicious by nature. However source IP, verb and Object ca
This search provides information on Kubernetes RBAC authorizations by accounts, this search can be modified by adding rare or top to see both extremes of RBAC by accounts occurrences
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-05-26
====Search====
-
`kubernetes_azure` category=kube-audit
-| spath input=properties.log
-| search annotations.authorization.k8s.io/reason=*
-| table sourceIPs{} user.username userAgent annotations.authorization.k8s.io/reason
-|stats count by user.username annotations.authorization.k8s.io/reason
-| rare user.username annotations.authorization.k8s.io/reason
+`kubernetes_azure` category=kube-audit
+| spath input=properties.log
+| search annotations.authorization.k8s.io/reason=*
+| table sourceIPs{} user.username userAgent annotations.authorization.k8s.io/reason
+|stats count by user.username annotations.authorization.k8s.io/reason
+| rare user.username annotations.authorization.k8s.io/reason
|`kubernetes_azure_detect_rbac_authorization_by_account_filter`
====Associated Analytic Story====
@@ -4193,19 +4193,19 @@ Not all RBAC Authorications are malicious. RBAC authorizations can uncover malic
This search provides information on Kubernetes service accounts,accessing pods and namespaces by IP address and verb
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-05-26
====Search====
-
`kubernetes_azure` category=kube-audit
-| spath input=properties.log
-| search user.groups{}=system:serviceaccounts* OR user.username=system.anonymous OR annotations.authorization.k8s.io/decision=allow
-| table sourceIPs{} user.username userAgent verb responseStatus.reason responseStatus.status properties.pod objectRef.namespace
-| top sourceIPs{} user.username verb responseStatus.status properties.pod objectRef.namespace
+`kubernetes_azure` category=kube-audit
+| spath input=properties.log
+| search user.groups{}=system:serviceaccounts* OR user.username=system.anonymous OR annotations.authorization.k8s.io/decision=allow
+| table sourceIPs{} user.username userAgent verb responseStatus.reason responseStatus.status properties.pod objectRef.namespace
+| top sourceIPs{} user.username verb responseStatus.status properties.pod objectRef.namespace
|`kubernetes_azure_detect_most_active_service_accounts_by_pod_namespace_filter`
====Associated Analytic Story====
@@ -4245,19 +4245,19 @@ Not all service accounts interactions are malicious. Analyst must consider IP an
This search provides information on Kubernetes accounts accessing sensitve objects such as configmpas or secrets
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-05-20
====Search====
-
`kubernetes_azure` category=kube-audit
+`kubernetes_azure` category=kube-audit
| spath input=properties.log
-| search objectRef.resource=secrets OR configmaps user.username=system.anonymous OR annotations.authorization.k8s.io/decision=allow
-|table user.username user.groups{} objectRef.resource objectRef.namespace objectRef.name annotations.authorization.k8s.io/reason
-|dedup user.username user.groups{}
+| search objectRef.resource=secrets OR configmaps user.username=system.anonymous OR annotations.authorization.k8s.io/decision=allow
+|table user.username user.groups{} objectRef.resource objectRef.namespace objectRef.name annotations.authorization.k8s.io/reason
+|dedup user.username user.groups{}
|`kubernetes_azure_detect_sensitive_object_access_filter`
====Associated Analytic Story====
@@ -4297,19 +4297,19 @@ Sensitive object access is not necessarily malicious but user and object context
This search provides information on Kubernetes accounts accessing sensitve objects such as configmpas or secrets
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-05-20
====Search====
-
`kubernetes_azure` category=kube-audit
+`kubernetes_azure` category=kube-audit
| spath input=properties.log
-| search objectRef.resource=clusterroles OR clusterrolebindings
-| table sourceIPs{} user.username user.groups{} objectRef.namespace requestURI annotations.authorization.k8s.io/reason
-| dedup user.username user.groups{}
+| search objectRef.resource=clusterroles OR clusterrolebindings
+| table sourceIPs{} user.username user.groups{} objectRef.namespace requestURI annotations.authorization.k8s.io/reason
+| dedup user.username user.groups{}
|`kubernetes_azure_detect_sensitive_role_access_filter`
====Associated Analytic Story====
@@ -4331,7 +4331,7 @@ You must install the Add-on for Microsoft Cloud Services and Configure Kube-Audi
====Known False Positives====
-Sensitive role resource access is necessary for cluster operation, however source IP, namespace and user group may indicate possible malicious use.
+Sensitive role resource access is necessary for cluster operation, however source IP, namespace and user group may indicate possible malicious use.
====Reference====
@@ -4349,18 +4349,18 @@ Sensitive role resource access is necessary for cluster operation, however sourc
This search provides information on Kubernetes service accounts with failure or forbidden access status
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-05-20
====Search====
-
`kubernetes_azure` category=kube-audit
-| spath input=properties.log
-| search user.groups{}=system:serviceaccounts* responseStatus.reason=Forbidden
-| table sourceIPs{} user.username userAgent verb responseStatus.reason responseStatus.status properties.pod objectRef.namespace
+`kubernetes_azure` category=kube-audit
+| spath input=properties.log
+| search user.groups{}=system:serviceaccounts* responseStatus.reason=Forbidden
+| table sourceIPs{} user.username userAgent verb responseStatus.reason responseStatus.status properties.pod objectRef.namespace
|`kubernetes_azure_detect_service_accounts_forbidden_failure_access_filter`
====Associated Analytic Story====
@@ -4400,20 +4400,20 @@ This search can give false positives as there might be inherent issues with auth
This search provides information on rare Kubectl calls with IP, verb namespace and object access context
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-05-26
====Search====
-
`kubernetes_azure` category=kube-audit
-| spath input=properties.log
-| spath input=responseObject.metadata.annotations.kubectl.kubernetes.io/last-applied-configuration
-| search userAgent=kubectl* sourceIPs{}!=127.0.0.1 sourceIPs{}!=::1
-| table sourceIPs{} verb userAgent user.groups{} objectRef.resource objectRef.namespace requestURI
-| rare sourceIPs{} verb userAgent user.groups{} objectRef.resource objectRef.namespace requestURI
+`kubernetes_azure` category=kube-audit
+| spath input=properties.log
+| spath input=responseObject.metadata.annotations.kubectl.kubernetes.io/last-applied-configuration
+| search userAgent=kubectl* sourceIPs{}!=127.0.0.1 sourceIPs{}!=::1
+| table sourceIPs{} verb userAgent user.groups{} objectRef.resource objectRef.namespace requestURI
+| rare sourceIPs{} verb userAgent user.groups{} objectRef.resource objectRef.namespace requestURI
|`kubernetes_azure_detect_suspicious_kubectl_calls_filter`
====Associated Analytic Story====
@@ -4453,18 +4453,18 @@ Kubectl calls are not malicious by nature. However source IP, verb and Object ca
This search provides information of unauthenticated requests via source IP user agent, request URI and response status data against Kubernetes cluster pod in Azure
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-05-20
====Search====
-
`kubernetes_azure` category=kube-audit
-| spath input=properties.log
-| search responseStatus.code=401
-| table sourceIPs{} userAgent verb requestURI responseStatus.reason properties.pod
+`kubernetes_azure` category=kube-audit
+| spath input=properties.log
+| search responseStatus.code=401
+| table sourceIPs{} userAgent verb requestURI responseStatus.reason properties.pod
|`kubernetes_azure_pod_scan_fingerprint_filter`
====Associated Analytic Story====
@@ -4504,7 +4504,7 @@ Not all unauthenticated requests are malicious, but source IPs, userAgent, verb,
This search provides information of unauthenticated requests via source IP user agent, request URI and response status data against Kubernetes cluster in Azure
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1526/ T1526]
* '''Last Updated''': 2020-05-19
@@ -4512,10 +4512,10 @@ This search provides information of unauthenticated requests via source IP user
====Search====
-
`kubernetes_azure` category=kube-audit
-| spath input=properties.log
-| search responseStatus.code=401
-| table sourceIPs{} userAgent verb requestURI responseStatus.reason
+`kubernetes_azure` category=kube-audit
+| spath input=properties.log
+| search responseStatus.code=401
+| table sourceIPs{} userAgent verb requestURI responseStatus.reason
|`kubernetes_azure_scan_fingerprint_filter`
====Associated Analytic Story====
@@ -4566,17 +4566,17 @@ Not all unauthenticated requests are malicious, but source IPs, userAgent, verb,
This search provides information on Kubernetes RBAC authorizations by accounts, this search can be modified by adding top to see both extremes of RBAC by accounts occurrences
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-07-11
====Search====
-
`google_gcp_pubsub_message` data.labels.authorization.k8s.io/reason=ClusterRoleBinding OR Clusterrole
-| table src_ip src_user data.labels.authorization.k8s.io/decision data.labels.authorization.k8s.io/reason
-| rare src_user data.labels.authorization.k8s.io/reason
+`google_gcp_pubsub_message` data.labels.authorization.k8s.io/reason=ClusterRoleBinding OR Clusterrole
+| table src_ip src_user data.labels.authorization.k8s.io/decision data.labels.authorization.k8s.io/reason
+| rare src_user data.labels.authorization.k8s.io/reason
|`kubernetes_gcp_detect_rbac_authorizations_by_account_filter`
====Associated Analytic Story====
@@ -4616,17 +4616,17 @@ Not all RBAC Authorications are malicious. RBAC authorizations can uncover malic
This search provides information on Kubernetes service accounts,accessing pods by IP address, verb and decision
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-07-10
====Search====
-
`google_gcp_pubsub_message` data.protoPayload.request.spec.group{}=system:serviceaccounts
-| table src_ip src_user http_user_agent data.protoPayload.request.spec.nonResourceAttributes.verb data.labels.authorization.k8s.io/decision data.protoPayload.response.spec.resourceAttributes.resource
-| top src_ip src_user http_user_agent data.labels.authorization.k8s.io/decision data.protoPayload.response.spec.resourceAttributes.resource
+`google_gcp_pubsub_message` data.protoPayload.request.spec.group{}=system:serviceaccounts
+| table src_ip src_user http_user_agent data.protoPayload.request.spec.nonResourceAttributes.verb data.labels.authorization.k8s.io/decision data.protoPayload.response.spec.resourceAttributes.resource
+| top src_ip src_user http_user_agent data.labels.authorization.k8s.io/decision data.protoPayload.response.spec.resourceAttributes.resource
|`kubernetes_gcp_detect_most_active_service_accounts_by_pod_filter`
====Associated Analytic Story====
@@ -4666,17 +4666,17 @@ Not all service accounts interactions are malicious. Analyst must consider IP, v
This search provides information on Kubernetes accounts accessing sensitve objects such as configmaps or secrets
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-07-11
====Search====
-
`google_gcp_pubsub_message` data.protoPayload.authorizationInfo{}.resource=configmaps OR secrets
-| table data.protoPayload.requestMetadata.callerIp src_user data.resource.labels.cluster_name data.protoPayload.request.metadata.namespace data.labels.authorization.k8s.io/decision
-| dedup data.protoPayload.requestMetadata.callerIp src_user data.resource.labels.cluster_name
+`google_gcp_pubsub_message` data.protoPayload.authorizationInfo{}.resource=configmaps OR secrets
+| table data.protoPayload.requestMetadata.callerIp src_user data.resource.labels.cluster_name data.protoPayload.request.metadata.namespace data.labels.authorization.k8s.io/decision
+| dedup data.protoPayload.requestMetadata.callerIp src_user data.resource.labels.cluster_name
|`kubernetes_gcp_detect_sensitive_object_access_filter`
====Associated Analytic Story====
@@ -4716,17 +4716,17 @@ Sensitive object access is not necessarily malicious but user and object context
This search provides information on Kubernetes accounts accessing sensitve objects such as configmpas or secrets
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-07-11
====Search====
-
`google_gcp_pubsub_message` data.labels.authorization.k8s.io/reason=ClusterRoleBinding OR Clusterrole dest=apis/rbac.authorization.k8s.io/v1 src_ip!=::1
-| table src_ip src_user http_user_agent data.labels.authorization.k8s.io/decision data.labels.authorization.k8s.io/reason
-| dedup src_ip src_user
+`google_gcp_pubsub_message` data.labels.authorization.k8s.io/reason=ClusterRoleBinding OR Clusterrole dest=apis/rbac.authorization.k8s.io/v1 src_ip!=::1
+| table src_ip src_user http_user_agent data.labels.authorization.k8s.io/decision data.labels.authorization.k8s.io/reason
+| dedup src_ip src_user
|`kubernetes_gcp_detect_sensitive_role_access_filter`
====Associated Analytic Story====
@@ -4748,7 +4748,7 @@ You must install splunk add on for GCP. This search works with pubsub messaging
====Known False Positives====
-Sensitive role resource access is necessary for cluster operation, however source IP, user agent, decision and reason may indicate possible malicious use.
+Sensitive role resource access is necessary for cluster operation, however source IP, user agent, decision and reason may indicate possible malicious use.
====Reference====
@@ -4766,17 +4766,17 @@ Sensitive role resource access is necessary for cluster operation, however sourc
This search provides information on Kubernetes service accounts with failure or forbidden access status, this search can be extended by using top or rare operators to find trends or rarities in failure status, user agents, source IPs and request URI
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-06-23
====Search====
-
`google_gcp_pubsub_message` system:serviceaccounts data.protoPayload.response.status.allowed!=*
-| table src_ip src_user http_user_agent data.protoPayload.response.spec.resourceAttributes.namespace data.resource.labels.cluster_name data.protoPayload.response.spec.resourceAttributes.verb data.protoPayload.request.status.allowed data.protoPayload.response.status.reason data.labels.authorization.k8s.io/decision
-| dedup src_ip src_user
+`google_gcp_pubsub_message` system:serviceaccounts data.protoPayload.response.status.allowed!=*
+| table src_ip src_user http_user_agent data.protoPayload.response.spec.resourceAttributes.namespace data.resource.labels.cluster_name data.protoPayload.response.spec.resourceAttributes.verb data.protoPayload.request.status.allowed data.protoPayload.response.status.reason data.labels.authorization.k8s.io/decision
+| dedup src_ip src_user
| `kubernetes_gcp_detect_service_accounts_forbidden_failure_access_filter`
====Associated Analytic Story====
@@ -4816,17 +4816,17 @@ This search can give false positives as there might be inherent issues with auth
This search provides information on anonymous Kubectl calls with IP, verb namespace and object access context
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-07-11
====Search====
-
`google_gcp_pubsub_message` data.protoPayload.requestMetadata.callerSuppliedUserAgent=kubectl* src_user=system:unsecured OR src_user=system:anonymous
-| table src_ip src_user data.protoPayload.requestMetadata.callerSuppliedUserAgent data.protoPayload.authorizationInfo{}.granted object_path
-|dedup src_ip src_user
+`google_gcp_pubsub_message` data.protoPayload.requestMetadata.callerSuppliedUserAgent=kubectl* src_user=system:unsecured OR src_user=system:anonymous
+| table src_ip src_user data.protoPayload.requestMetadata.callerSuppliedUserAgent data.protoPayload.authorizationInfo{}.granted object_path
+|dedup src_ip src_user
|`kubernetes_gcp_detect_suspicious_kubectl_calls_filter`
====Associated Analytic Story====
@@ -4866,7 +4866,7 @@ Kubectl calls are not malicious by nature. However source IP, source user, user
This searches show information on uploaded containers including source user, image id, source IP user type, http user agent, region, first time, last time of operation (PutImage). These searches are based on Cloud Infrastructure Data Model.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1525/ T1525]
* '''Last Updated''': 2020-02-20
@@ -4875,8 +4875,8 @@ This searches show information on uploaded containers including source user, ima
====Search====
-| tstats count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Cloud_Infrastructure.Compute where Compute.user_type!="AssumeRole" AND Compute.http_user_agent="AWS Internal" AND Compute.event_name="PutImage" by Compute.image_id Compute.src_user Compute.src Compute.region Compute.msg Compute.user_type
-| `drop_dm_object_name("Compute")`
+| tstats count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Cloud_Infrastructure.Compute where Compute.user_type!="AssumeRole" AND Compute.http_user_agent="AWS Internal" AND Compute.event_name="PutImage" by Compute.image_id Compute.src_user Compute.src Compute.region Compute.msg Compute.user_type
+| `drop_dm_object_name("Compute")`
| `new_container_uploaded_to_aws_ecr_filter`
====Associated Analytic Story====
@@ -4925,7 +4925,7 @@ Uploading container is a normal behavior from developers or users with access to
This search detects the creation of a new Federation setting by alerting about an specific event related to its creation.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1136.003/ T1136.003]
* '''Last Updated''': 2021-01-26
@@ -4933,10 +4933,10 @@ This search detects the creation of a new Federation setting by alerting about a
====Search====
-
`o365_management_activity` Workload=AzureActiveDirectory Operation="Add app role assignment grant to user."
-| stats count min(_time) as firstTime max(_time) as lastTime values(Actor{}.ID) as Actor.ID values(Actor{}.Type) as Actor.Type by ActorIpAddress dest ResultStatus
+`o365_management_activity` Workload=AzureActiveDirectory Operation="Add app role assignment grant to user."
+| stats count min(_time) as firstTime max(_time) as lastTime values(Actor{}.ID) as Actor.ID values(Actor{}.Type) as Actor.Type by ActorIpAddress dest ResultStatus
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `o365_add_app_role_assignment_grant_user_filter`
====Associated Analytic Story====
@@ -4995,7 +4995,7 @@ The creation of a new Federation is not necessarily malicious, however this even
This search detects the creation of a new Federation setting by alerting about an specific event related to its creation.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1136.003/ T1136.003]
* '''Last Updated''': 2021-01-26
@@ -5003,10 +5003,10 @@ This search detects the creation of a new Federation setting by alerting about a
====Search====
-
`o365_management_activity` Workload=AzureActiveDirectory signature="Add service principal credentials."
-| stats min(_time) as firstTime max(_time) as lastTime values(Actor{}.ID) as Actor.ID values(ModifiedProperties{}.Name) as ModifiedProperties.Name values(ModifiedProperties{}.NewValue) as ModifiedProperties.NewValue values(Target{}.ID) as Target.ID by ActorIpAddress signature
+`o365_management_activity` Workload=AzureActiveDirectory signature="Add service principal credentials."
+| stats min(_time) as firstTime max(_time) as lastTime values(Actor{}.ID) as Actor.ID values(ModifiedProperties{}.Name) as ModifiedProperties.Name values(ModifiedProperties{}.NewValue) as ModifiedProperties.NewValue values(Target{}.ID) as Target.ID by ActorIpAddress signature
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `o365_added_service_principal_filter`
====Associated Analytic Story====
@@ -5069,7 +5069,7 @@ The creation of a new Federation is not necessarily malicious, however these eve
This search detects newly added IP addresses/CIDR blocks to the list of MFA Trusted IPs to bypass multi factor authentication. Attackers are often known to use this technique so that they can bypass the MFA system.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1562.007/ T1562.007]
* '''Last Updated''': 2021-01-12
@@ -5077,13 +5077,13 @@ This search detects newly added IP addresses/CIDR blocks to the list of MFA Trus
====Search====
-
`o365_management_activity` signature="Set Company Information." ModifiedProperties{}.Name=StrongAuthenticationPolicy
-| rex max_match=100 field=ModifiedProperties{}.NewValue "(?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2})"
-| rex max_match=100 field=ModifiedProperties{}.OldValue "(?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2})"
-| eval ip_addresses_old=if(isnotnull(ip_addresses_old),ip_addresses_old,"0")
-| mvexpand ip_addresses_new_added
-| where isnull(mvfind(ip_addresses_old,ip_addresses_new_added))
-|stats count min(_time) as firstTime max(_time) as lastTime values(ip_addresses_old) as ip_addresses_old by user ip_addresses_new_added signature vendor_product vendor_account status user_id action
+`o365_management_activity` signature="Set Company Information." ModifiedProperties{}.Name=StrongAuthenticationPolicy
+| rex max_match=100 field=ModifiedProperties{}.NewValue "(?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2})"
+| rex max_match=100 field=ModifiedProperties{}.OldValue "(?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2})"
+| eval ip_addresses_old=if(isnotnull(ip_addresses_old),ip_addresses_old,"0")
+| mvexpand ip_addresses_new_added
+| where isnull(mvfind(ip_addresses_old,ip_addresses_new_added))
+|stats count min(_time) as firstTime max(_time) as lastTime values(ip_addresses_old) as ip_addresses_old by user ip_addresses_new_added signature vendor_product vendor_account status user_id action
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `o365_bypass_mfa_via_trusted_ip_filter`
@@ -5142,7 +5142,7 @@ Unless it is a special case, it is uncommon to continually update Trusted IPs to
This search detects when multi factor authentication has been disabled, what entitiy performed the action and against what user
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1556/ T1556]
* '''Last Updated''': 2020-12-16
@@ -5150,10 +5150,10 @@ This search detects when multi factor authentication has been disabled, what ent
====Search====
-
`o365_management_activity` Operation="Disable Strong Authentication."
-| stats count earliest(_time) as firstTime latest(_time) as lastTime by UserType Operation user status signature dest ResultStatus
-|`security_content_ctime(firstTime)`
-|`security_content_ctime(lastTime)`
+`o365_management_activity` Operation="Disable Strong Authentication."
+| stats count earliest(_time) as firstTime latest(_time) as lastTime by UserType Operation user status signature dest ResultStatus
+|`security_content_ctime(firstTime)`
+|`security_content_ctime(lastTime)`
| `o365_disable_mfa_filter`
====Associated Analytic Story====
@@ -5208,7 +5208,7 @@ Unless it is a special case, it is uncommon to disable MFA or Strong Authenticat
This search detects when an excessive number of authentication failures occur this search also includes attempts against MFA prompt codes
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1110/ T1110]
* '''Last Updated''': 2020-12-16
@@ -5216,11 +5216,11 @@ This search detects when an excessive number of authentication failures occur th
====Search====
-
`o365_management_activity` Workload=AzureActiveDirectory UserAuthenticationMethod=* status=Failed
-| stats count earliest(_time) as firstTime latest(_time) values(UserAuthenticationMethod) AS UserAuthenticationMethod values(UserAgent) AS UserAgent values(status) AS status values(src_ip) AS src_ip by user
-| where count > 10
-|`security_content_ctime(firstTime)`
-|`security_content_ctime(lastTime)`
+`o365_management_activity` Workload=AzureActiveDirectory UserAuthenticationMethod=* status=Failed
+| stats count earliest(_time) as firstTime latest(_time) values(UserAuthenticationMethod) AS UserAuthenticationMethod values(UserAgent) AS UserAgent values(status) AS status values(src_ip) AS src_ip by user
+| where count > 10
+|`security_content_ctime(firstTime)`
+|`security_content_ctime(lastTime)`
| `o365_excessive_authentication_failures_alert_filter`
====Associated Analytic Story====
@@ -5275,7 +5275,7 @@ The threshold for alert is above 10 attempts and this should reduce the number o
This search detects accounts with high number of Single Sign ON (SSO) logon errors. Excessive logon errors may indicate attempts to bruteforce of password or single sign on token hijack or reuse.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1556/ T1556]
* '''Last Updated''': 2021-01-26
@@ -5283,11 +5283,11 @@ This search detects accounts with high number of Single Sign ON (SSO) logon erro
====Search====
-
`o365_management_activity` Workload=AzureActiveDirectory LogonError=SsoArtifactInvalidOrExpired
-| stats count min(_time) as firstTime max(_time) as lastTime by LogonError ActorIpAddress UserAgent UserId
-| where count > 5
+`o365_management_activity` Workload=AzureActiveDirectory LogonError=SsoArtifactInvalidOrExpired
+| stats count min(_time) as firstTime max(_time) as lastTime by LogonError ActorIpAddress UserAgent UserId
+| where count > 5
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `o365_excessive_sso_logon_errors_filter`
====Associated Analytic Story====
@@ -5344,7 +5344,7 @@ Logon errors may not be malicious in nature however it may indicate attempts to
This search detects the addition of a new Federated domain.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1136.003/ T1136.003]
* '''Last Updated''': 2021-01-26
@@ -5352,10 +5352,10 @@ This search detects the addition of a new Federated domain.
====Search====
-
`o365_management_activity` Workload=Exchange Operation="Add-FederatedDomain"
-| stats count min(_time) as firstTime max(_time) as lastTime values(Parameters{}.Value) as Parameters.Value by ObjectId Operation OrganizationName OriginatingServer UserId UserKey
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+`o365_management_activity` Workload=Exchange Operation="Add-FederatedDomain"
+| stats count min(_time) as firstTime max(_time) as lastTime values(Parameters{}.Value) as Parameters.Value by ObjectId Operation OrganizationName OriginatingServer UserId UserKey
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `o365_new_federated_domain_added_filter`
====Associated Analytic Story====
@@ -5420,7 +5420,7 @@ The creation of a new Federated domain is not necessarily malicious, however the
This search detects when a user has performed an Ediscovery search or exported a PST file from the search. This PST file usually has sensitive information including email body content
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1114/ T1114]
* '''Last Updated''': 2020-12-16
@@ -5428,10 +5428,10 @@ This search detects when a user has performed an Ediscovery search or exported a
====Search====
-
`o365_management_activity` Category=ThreatManagement Name="eDiscovery search started or exported"
-| stats count earliest(_time) as firstTime latest(_time) as lastTime by Source Severity AlertEntityId Operation Name
-|`security_content_ctime(firstTime)`
-|`security_content_ctime(lastTime)`
+`o365_management_activity` Category=ThreatManagement Name="eDiscovery search started or exported"
+| stats count earliest(_time) as firstTime latest(_time) as lastTime by Source Severity AlertEntityId Operation Name
+|`security_content_ctime(firstTime)`
+|`security_content_ctime(lastTime)`
| `o365_pst_export_alert_filter`
====Associated Analytic Story====
@@ -5486,7 +5486,7 @@ PST export can be done for legitimate purposes but due to the sensitive nature o
This search detects when an admin configured a forwarding rule for multiple mailboxes to the same destination.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1114.003/ T1114.003]
* '''Last Updated''': 2020-12-16
@@ -5494,14 +5494,14 @@ This search detects when an admin configured a forwarding rule for multiple mail
====Search====
-
`o365_management_activity` Operation=Set-Mailbox
-| spath input=Parameters
-| rename Identity AS src_user
-| search ForwardingAddress=*
-| stats dc(src_user) AS count_src_user earliest(_time) as firstTime latest(_time) as lastTime values(src_user) AS src_user values(user) AS user by ForwardingAddress
-| where count_src_user > 1
-|`security_content_ctime(firstTime)`
-|`security_content_ctime(lastTime)`
+`o365_management_activity` Operation=Set-Mailbox
+| spath input=Parameters
+| rename Identity AS src_user
+| search ForwardingAddress=*
+| stats dc(src_user) AS count_src_user earliest(_time) as firstTime latest(_time) as lastTime values(src_user) AS src_user values(user) AS user by ForwardingAddress
+| where count_src_user > 1
+|`security_content_ctime(firstTime)`
+|`security_content_ctime(lastTime)`
|`o365_suspicious_admin_email_forwarding_filter`
====Associated Analytic Story====
@@ -5554,7 +5554,7 @@ unknown
This search detects the assignment of rights to accesss content from another mailbox. This is usually only assigned to a service account.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1114.002/ T1114.002]
* '''Last Updated''': 2020-12-15
@@ -5562,13 +5562,13 @@ This search detects the assignment of rights to accesss content from another mai
====Search====
-
`o365_management_activity` Operation=Add-MailboxPermission
-| spath input=Parameters
-| rename User AS src_user, Identity AS dest_user
-| search AccessRights=FullAccess OR AccessRights=SendAs OR AccessRights=SendOnBehalf
-| stats count earliest(_time) as firstTime latest(_time) as lastTime by user src_user dest_user Operation AccessRights
-|`security_content_ctime(firstTime)`
-|`security_content_ctime(lastTime)`
+`o365_management_activity` Operation=Add-MailboxPermission
+| spath input=Parameters
+| rename User AS src_user, Identity AS dest_user
+| search AccessRights=FullAccess OR AccessRights=SendAs OR AccessRights=SendOnBehalf
+| stats count earliest(_time) as firstTime latest(_time) as lastTime by user src_user dest_user Operation AccessRights
+|`security_content_ctime(firstTime)`
+|`security_content_ctime(lastTime)`
|`o365_suspicious_rights_delegation_filter`
====Associated Analytic Story====
@@ -5621,7 +5621,7 @@ Service Accounts
This search detects when multiple user configured a forwarding rule to the same destination.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1114.003/ T1114.003]
* '''Last Updated''': 2020-12-16
@@ -5629,14 +5629,14 @@ This search detects when multiple user configured a forwarding rule to the same
====Search====
-
`o365_management_activity` Operation=Set-Mailbox
-| spath input=Parameters
-| rename Identity AS src_user
-| search ForwardingSmtpAddress=*
-| stats dc(src_user) AS count_src_user earliest(_time) as firstTime latest(_time) as lastTime values(src_user) AS src_user values(user) AS user by ForwardingSmtpAddress
-| where count_src_user > 1
-|`security_content_ctime(firstTime)`
-|`security_content_ctime(lastTime)`
+`o365_management_activity` Operation=Set-Mailbox
+| spath input=Parameters
+| rename Identity AS src_user
+| search ForwardingSmtpAddress=*
+| stats dc(src_user) AS count_src_user earliest(_time) as firstTime latest(_time) as lastTime values(src_user) AS src_user values(user) AS user by ForwardingSmtpAddress
+| where count_src_user > 1
+|`security_content_ctime(firstTime)`
+|`security_content_ctime(lastTime)`
|`o365_suspicious_user_email_forwarding_filter`
====Associated Analytic Story====
@@ -5689,7 +5689,7 @@ unknown
This search provides detection of an user attaching itself to a different role trust policy. This can be used for lateral movement and escalation of privileges.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078/ T1078]
* '''Last Updated''': 2020-07-27
@@ -5698,8 +5698,8 @@ This search provides detection of an user attaching itself to a different role t
====Search====
`aws_cloudwatchlogs_eks` attach policy
-| spath requestParameters.policyArn
-| table sourceIPAddress user_access_key userIdentity.arn userIdentity.sessionContext.sessionIssuer.arn eventName errorCode errorMessage status action requestParameters.policyArn userIdentity.sessionContext.attributes.mfaAuthenticated userIdentity.sessionContext.attributes.creationDate
+| spath requestParameters.policyArn
+| table sourceIPAddress user_access_key userIdentity.arn userIdentity.sessionContext.sessionIssuer.arn eventName errorCode errorMessage status action requestParameters.policyArn userIdentity.sessionContext.attributes.mfaAuthenticated userIdentity.sessionContext.attributes.creationDate
| `aws_detect_attach_to_role_policy_filter`
====Associated Analytic Story====
@@ -5750,7 +5750,7 @@ Attach to policy can create a lot of noise. This search can be adjusted to provi
This search provides detection of accounts creating permanent keys. Permanent keys are not created by default and they are only needed for programmatic calls. Creation of Permanent key is an important event to monitor.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078/ T1078]
* '''Last Updated''': 2020-07-27
@@ -5758,10 +5758,10 @@ This search provides detection of accounts creating permanent keys. Permanent ke
====Search====
-
`aws_cloudwatchlogs_eks` CreateAccessKey
-| spath eventName
-| search eventName=CreateAccessKey "userIdentity.type"=IAMUser
-| table sourceIPAddress userName userIdentity.type userAgent action status responseElements.accessKey.createDate responseElements.accessKey.status responseElements.accessKey.accessKeyId
+`aws_cloudwatchlogs_eks` CreateAccessKey
+| spath eventName
+| search eventName=CreateAccessKey "userIdentity.type"=IAMUser
+| table sourceIPAddress userName userIdentity.type userAgent action status responseElements.accessKey.createDate responseElements.accessKey.status responseElements.accessKey.accessKeyId
|`aws_detect_permanent_key_creation_filter`
====Associated Analytic Story====
@@ -5812,7 +5812,7 @@ Not all permanent key creations are malicious. If there is a policy of rotating
This search provides detection of role creation by IAM users. Role creation is an event by itself if user is creating a new role with trust policies different than the available in AWS and it can be used for lateral movement and escalation of privileges.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078/ T1078]
* '''Last Updated''': 2020-07-27
@@ -5820,8 +5820,8 @@ This search provides detection of role creation by IAM users. Role creation is a
====Search====
-
`aws_cloudwatchlogs_eks` event_name=CreateRole action=created userIdentity.type=AssumedRole requestParameters.description=Allows*
-| table sourceIPAddress userIdentity.principalId userIdentity.arn action event_name awsRegion http_user_agent mfa_auth msg requestParameters.roleName requestParameters.description responseElements.role.arn responseElements.role.createDate
+`aws_cloudwatchlogs_eks` event_name=CreateRole action=created userIdentity.type=AssumedRole requestParameters.description=Allows*
+| table sourceIPAddress userIdentity.principalId userIdentity.arn action event_name awsRegion http_user_agent mfa_auth msg requestParameters.roleName requestParameters.description responseElements.role.arn responseElements.role.createDate
| `aws_detect_role_creation_filter`
====Associated Analytic Story====
@@ -5872,7 +5872,7 @@ CreateRole is not very common in common users. This search can be adjusted to pr
This search provides detection of suspicious use of sts:AssumeRole. These tokens can be created on the go and used by attackers to move laterally and escalate privileges.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078/ T1078]
* '''Last Updated''': 2020-07-27
@@ -5880,8 +5880,8 @@ This search provides detection of suspicious use of sts:AssumeRole. These tokens
====Search====
-
`cloudtrail` user_type=AssumedRole userIdentity.sessionContext.sessionIssuer.type=Role
-| table sourceIPAddress userIdentity.arn user_agent user_access_key status action requestParameters.roleName responseElements.role.roleName responseElements.role.createDate
+`cloudtrail` user_type=AssumedRole userIdentity.sessionContext.sessionIssuer.type=Role
+| table sourceIPAddress userIdentity.arn user_agent user_access_key status action requestParameters.roleName responseElements.role.roleName responseElements.role.createDate
| `aws_detect_sts_assume_role_abuse_filter`
====Associated Analytic Story====
@@ -5932,7 +5932,7 @@ Sts:AssumeRole can be very noisy as it is a standard mechanism to provide cross
This search provides detection of suspicious use of sts:GetSessionToken. These tokens can be created on the go and used by attackers to move laterally and escalate privileges.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1550/ T1550]
* '''Last Updated''': 2020-07-27
@@ -5941,9 +5941,9 @@ This search provides detection of suspicious use of sts:GetSessionToken. These t
====Search====
`aws_cloudwatchlogs_eks` ASIA userIdentity.type=IAMUser
-| spath eventName
-| search eventName=GetSessionToken
-| table sourceIPAddress eventTime userIdentity.arn userName userAgent user_type status region
+| spath eventName
+| search eventName=GetSessionToken
+| table sourceIPAddress eventTime userIdentity.arn userName userAgent user_type status region
| `aws_detect_sts_get_session_token_abuse_filter`
====Associated Analytic Story====
@@ -5994,7 +5994,7 @@ Sts:GetSessionToken can be very noisy as in certain environments numerous calls
This search provides detection of possible GCP Oauth token abuse. GCP Oauth token without time limit can be exfiltrated and reused for keeping access sessions alive without further control of authentication, allowing attackers to access and move laterally.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078/ T1078]
* '''Last Updated''': 2020-09-01
@@ -6002,8 +6002,8 @@ This search provides detection of possible GCP Oauth token abuse. GCP Oauth toke
====Search====
-
`google_gcp_pubsub_message` type.googleapis.com/google.cloud.audit.AuditLog
-|table protoPayload.@type protoPayload.status.details{}.@type protoPayload.status.details{}.violations{}.callerIp protoPayload.status.details{}.violations{}.type protoPayload.status.message
+`google_gcp_pubsub_message` type.googleapis.com/google.cloud.audit.AuditLog
+|table protoPayload.@type protoPayload.status.details{}.@type protoPayload.status.details{}.violations{}.callerIp protoPayload.status.details{}.violations{}.type protoPayload.status.message
| `gcp_detect_oauth_token_abuse_filter`
====Associated Analytic Story====
@@ -6060,10 +6060,10 @@ GCP Oauth token abuse detection will only work if there are access policies in p
===Aws cloud provisioning from previously unseen city===
-This search looks for AWS provisioning activities from previously unseen cities. Provisioning activities are defined broadly as any event that begins with "Run" or "Create." This search is deprecated and have been translated to use the latest Change Datamodel.
+This search looks for AWS provisioning activities from previously unseen cities. Provisioning activities are defined broadly as any event that begins with "Run" or "Create." This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1535/ T1535]
* '''Last Updated''': 2018-03-16
@@ -6071,22 +6071,22 @@ This search looks for AWS provisioning activities from previously unseen cities.
====Search====
-
`cloudtrail` (eventName=Run* OR eventName=Create*)
-| iplocation sourceIPAddress
-| search City=* [search `cloudtrail` (eventName=Run* OR eventName=Create*)
-| iplocation sourceIPAddress
-| search City=*
-| stats earliest(_time) as firstTime, latest(_time) as lastTime by sourceIPAddress, City, Region, Country
-| inputlookup append=t previously_seen_provisioning_activity_src.csv
-| stats min(firstTime) as firstTime max(lastTime) as lastTime by sourceIPAddress, City, Region, Country
-| outputlookup previously_seen_provisioning_activity_src.csv
-| stats min(firstTime) as firstTime max(lastTime) as lastTime by City
-| eval newCity=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
-| where newCity=1
-| table City]
-| spath output=user userIdentity.arn
-| rename sourceIPAddress as src_ip
-| table _time, user, src_ip, City, eventName, errorCode
+`cloudtrail` (eventName=Run* OR eventName=Create*)
+| iplocation sourceIPAddress
+| search City=* [search `cloudtrail` (eventName=Run* OR eventName=Create*)
+| iplocation sourceIPAddress
+| search City=*
+| stats earliest(_time) as firstTime, latest(_time) as lastTime by sourceIPAddress, City, Region, Country
+| inputlookup append=t previously_seen_provisioning_activity_src.csv
+| stats min(firstTime) as firstTime max(lastTime) as lastTime by sourceIPAddress, City, Region, Country
+| outputlookup previously_seen_provisioning_activity_src.csv
+| stats min(firstTime) as firstTime max(lastTime) as lastTime by City
+| eval newCity=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
+| where newCity=1
+| table City]
+| spath output=user userIdentity.arn
+| rename sourceIPAddress as src_ip
+| table _time, user, src_ip, City, eventName, errorCode
| `aws_cloud_provisioning_from_previously_unseen_city_filter`
====Associated Analytic Story====
@@ -6133,10 +6133,10 @@ This is a strictly behavioral search, so we define "false positive" slightly dif
----
===Aws cloud provisioning from previously unseen country===
-This search looks for AWS provisioning activities from previously unseen countries. Provisioning activities are defined broadly as any event that begins with "Run" or "Create." This search is deprecated and have been translated to use the latest Change Datamodel.
+This search looks for AWS provisioning activities from previously unseen countries. Provisioning activities are defined broadly as any event that begins with "Run" or "Create." This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1535/ T1535]
* '''Last Updated''': 2018-03-16
@@ -6144,22 +6144,22 @@ This search looks for AWS provisioning activities from previously unseen countri
====Search====
-
`cloudtrail` (eventName=Run* OR eventName=Create*)
-| iplocation sourceIPAddress
-| search Country=* [search `cloudtrail` (eventName=Run* OR eventName=Create*)
-| iplocation sourceIPAddress
-| search Country=*
-| stats earliest(_time) as firstTime, latest(_time) as lastTime by sourceIPAddress, City, Region, Country
-| inputlookup append=t previously_seen_provisioning_activity_src.csv
-| stats min(firstTime) as firstTime max(lastTime) as lastTime by sourceIPAddress, City, Region, Country
-| outputlookup previously_seen_provisioning_activity_src.csv
-| stats min(firstTime) as firstTime max(lastTime) as lastTime by Country
-| eval newCountry=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
-| where newCountry=1
-| table Country]
-| spath output=user userIdentity.arn
-| rename sourceIPAddress as src_ip
-| table _time, user, src_ip, Country, eventName, errorCode
+`cloudtrail` (eventName=Run* OR eventName=Create*)
+| iplocation sourceIPAddress
+| search Country=* [search `cloudtrail` (eventName=Run* OR eventName=Create*)
+| iplocation sourceIPAddress
+| search Country=*
+| stats earliest(_time) as firstTime, latest(_time) as lastTime by sourceIPAddress, City, Region, Country
+| inputlookup append=t previously_seen_provisioning_activity_src.csv
+| stats min(firstTime) as firstTime max(lastTime) as lastTime by sourceIPAddress, City, Region, Country
+| outputlookup previously_seen_provisioning_activity_src.csv
+| stats min(firstTime) as firstTime max(lastTime) as lastTime by Country
+| eval newCountry=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
+| where newCountry=1
+| table Country]
+| spath output=user userIdentity.arn
+| rename sourceIPAddress as src_ip
+| table _time, user, src_ip, Country, eventName, errorCode
| `aws_cloud_provisioning_from_previously_unseen_country_filter`
====Associated Analytic Story====
@@ -6206,31 +6206,31 @@ This is a strictly behavioral search, so we define "false positive" slightly dif
----
===Aws cloud provisioning from previously unseen ip address===
-This search looks for AWS provisioning activities from previously unseen IP addresses. Provisioning activities are defined broadly as any event that begins with "Run" or "Create." This search is deprecated and have been translated to use the latest Change Datamodel.
+This search looks for AWS provisioning activities from previously unseen IP addresses. Provisioning activities are defined broadly as any event that begins with "Run" or "Create." This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2018-03-16
====Search====
-
`cloudtrail` (eventName=Run* OR eventName=Create*) [search `cloudtrail` (eventName=Run* OR eventName=Create*)
-| iplocation sourceIPAddress
-| search Country=*
-| stats earliest(_time) as firstTime, latest(_time) as lastTime by sourceIPAddress, City, Region, Country
-| inputlookup append=t previously_seen_provisioning_activity_src.csv
-| stats min(firstTime) as firstTime max(lastTime) as lastTime by sourceIPAddress, City, Region, Country
-| outputlookup previously_seen_provisioning_activity_src.csv
-| stats min(firstTime) as firstTime max(lastTime) as lastTime by sourceIPAddress
-| eval newIP=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
-| where newIP=1
-| table sourceIPAddress]
-| spath output=user userIdentity.arn
-| rename sourceIPAddress as src_ip
-| table _time, user, src_ip, eventName, errorCode
+`cloudtrail` (eventName=Run* OR eventName=Create*) [search `cloudtrail` (eventName=Run* OR eventName=Create*)
+| iplocation sourceIPAddress
+| search Country=*
+| stats earliest(_time) as firstTime, latest(_time) as lastTime by sourceIPAddress, City, Region, Country
+| inputlookup append=t previously_seen_provisioning_activity_src.csv
+| stats min(firstTime) as firstTime max(lastTime) as lastTime by sourceIPAddress, City, Region, Country
+| outputlookup previously_seen_provisioning_activity_src.csv
+| stats min(firstTime) as firstTime max(lastTime) as lastTime by sourceIPAddress
+| eval newIP=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
+| where newIP=1
+| table sourceIPAddress]
+| spath output=user userIdentity.arn
+| rename sourceIPAddress as src_ip
+| table _time, user, src_ip, eventName, errorCode
| `aws_cloud_provisioning_from_previously_unseen_ip_address_filter`
====Associated Analytic Story====
@@ -6269,7 +6269,7 @@ This is a strictly behavioral search, so we define "false positive" slightly dif
This search looks for AWS provisioning activities from previously unseen regions. Region in this context is similar to a state in the United States. Provisioning activities are defined broadly as any event that begins with "Run" or "Create." This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1535/ T1535]
* '''Last Updated''': 2018-03-16
@@ -6277,22 +6277,22 @@ This search looks for AWS provisioning activities from previously unseen regions
====Search====
-
`cloudtrail` (eventName=Run* OR eventName=Create*)
-| iplocation sourceIPAddress
-| search Region=* [search `cloudtrail` (eventName=Run* OR eventName=Create*)
-| iplocation sourceIPAddress
-| search Region=*
-| stats earliest(_time) as firstTime, latest(_time) as lastTime by sourceIPAddress, City, Region, Country
-| inputlookup append=t previously_seen_provisioning_activity_src.csv
-| stats min(firstTime) as firstTime max(lastTime) as lastTime by sourceIPAddress, City, Region, Country
-| outputlookup previously_seen_provisioning_activity_src.csv
-| stats min(firstTime) as firstTime max(lastTime) as lastTime by Region
-| eval newRegion=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
-| where newRegion=1
-| table Region]
-| spath output=user userIdentity.arn
-| rename sourceIPAddress as src_ip
-| table _time, user, src_ip, Region, eventName, errorCode
+`cloudtrail` (eventName=Run* OR eventName=Create*)
+| iplocation sourceIPAddress
+| search Region=* [search `cloudtrail` (eventName=Run* OR eventName=Create*)
+| iplocation sourceIPAddress
+| search Region=*
+| stats earliest(_time) as firstTime, latest(_time) as lastTime by sourceIPAddress, City, Region, Country
+| inputlookup append=t previously_seen_provisioning_activity_src.csv
+| stats min(firstTime) as firstTime max(lastTime) as lastTime by sourceIPAddress, City, Region, Country
+| outputlookup previously_seen_provisioning_activity_src.csv
+| stats min(firstTime) as firstTime max(lastTime) as lastTime by Region
+| eval newRegion=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
+| where newRegion=1
+| table Region]
+| spath output=user userIdentity.arn
+| rename sourceIPAddress as src_ip
+| table _time, user, src_ip, Region, eventName, errorCode
| `aws_cloud_provisioning_from_previously_unseen_region_filter`
====Associated Analytic Story====
@@ -6342,7 +6342,7 @@ This is a strictly behavioral search, so we define "false positive" slightly dif
This search looks for CloudTrail events where a user successfully launches an abnormally high number of instances. This search is deprecated and have been translated to use the latest Change Datamodel
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.004/ T1078.004]
* '''Last Updated''': 2020-07-21
@@ -6350,15 +6350,15 @@ This search looks for CloudTrail events where a user successfully launches an ab
====Search====
-
`cloudtrail` eventName=RunInstances errorCode=success
-| bucket span=10m _time
-| stats count AS instances_launched by _time userName
-| eventstats avg(instances_launched) as total_launched_avg, stdev(instances_launched) as total_launched_stdev
-| eval threshold_value = 4
-| eval isOutlier=if(instances_launched > total_launched_avg+(total_launched_stdev * threshold_value), 1, 0)
-| search isOutlier=1 AND _time >= relative_time(now(), "-10m@m")
-| eval num_standard_deviations_away = round(abs(instances_launched - total_launched_avg) / total_launched_stdev, 2)
-| table _time, userName, instances_launched, num_standard_deviations_away, total_launched_avg, total_launched_stdev
+`cloudtrail` eventName=RunInstances errorCode=success
+| bucket span=10m _time
+| stats count AS instances_launched by _time userName
+| eventstats avg(instances_launched) as total_launched_avg, stdev(instances_launched) as total_launched_stdev
+| eval threshold_value = 4
+| eval isOutlier=if(instances_launched > total_launched_avg+(total_launched_stdev * threshold_value), 1, 0)
+| search isOutlier=1 AND _time >= relative_time(now(), "-10m@m")
+| eval num_standard_deviations_away = round(abs(instances_launched - total_launched_avg) / total_launched_stdev, 2)
+| table _time, userName, instances_launched, num_standard_deviations_away, total_launched_avg, total_launched_stdev
| `abnormally_high_aws_instances_launched_by_user_filter`
====Associated Analytic Story====
@@ -6411,7 +6411,7 @@ Many service accounts configured within an AWS infrastructure are known to exhib
This search looks for CloudTrail events where a user successfully launches an abnormally high number of instances. This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.004/ T1078.004]
* '''Last Updated''': 2020-07-21
@@ -6419,11 +6419,11 @@ This search looks for CloudTrail events where a user successfully launches an ab
====Search====
-
`cloudtrail` eventName=RunInstances errorCode=success `abnormally_high_aws_instances_launched_by_user___mltk_filter`
-| bucket span=10m _time
-| stats count as instances_launched by _time src_user
-| apply ec2_excessive_runinstances_v1
-| rename "IsOutlier(instances_launched)" as isOutlier
+`cloudtrail` eventName=RunInstances errorCode=success `abnormally_high_aws_instances_launched_by_user___mltk_filter`
+| bucket span=10m _time
+| stats count as instances_launched by _time src_user
+| apply ec2_excessive_runinstances_v1
+| rename "IsOutlier(instances_launched)" as isOutlier
| where isOutlier=1
====Associated Analytic Story====
@@ -6476,7 +6476,7 @@ Many service accounts configured within an AWS infrastructure are known to exhib
This search looks for CloudTrail events where an abnormally high number of instances were successfully terminated by a user in a 10-minute window. This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.004/ T1078.004]
* '''Last Updated''': 2020-07-21
@@ -6484,15 +6484,15 @@ This search looks for CloudTrail events where an abnormally high number of insta
====Search====
-
`cloudtrail` eventName=TerminateInstances errorCode=success
-| bucket span=10m _time
-| stats count AS instances_terminated by _time userName
-| eventstats avg(instances_terminated) as total_terminations_avg, stdev(instances_terminated) as total_terminations_stdev
-| eval threshold_value = 4
-| eval isOutlier=if(instances_terminated > total_terminations_avg+(total_terminations_stdev * threshold_value), 1, 0)
+`cloudtrail` eventName=TerminateInstances errorCode=success
+| bucket span=10m _time
+| stats count AS instances_terminated by _time userName
+| eventstats avg(instances_terminated) as total_terminations_avg, stdev(instances_terminated) as total_terminations_stdev
+| eval threshold_value = 4
+| eval isOutlier=if(instances_terminated > total_terminations_avg+(total_terminations_stdev * threshold_value), 1, 0)
| search isOutlier=1 AND _time >= relative_time(now(), "-10m@m")
-| eval num_standard_deviations_away = round(abs(instances_terminated - total_terminations_avg) / total_terminations_stdev, 2)
-|table _time, userName, instances_terminated, num_standard_deviations_away, total_terminations_avg, total_terminations_stdev
+| eval num_standard_deviations_away = round(abs(instances_terminated - total_terminations_avg) / total_terminations_stdev, 2)
+|table _time, userName, instances_terminated, num_standard_deviations_away, total_terminations_avg, total_terminations_stdev
| `abnormally_high_aws_instances_terminated_by_user_filter`
====Associated Analytic Story====
@@ -6543,7 +6543,7 @@ Many service accounts configured with your AWS infrastructure are known to exhib
This search looks for CloudTrail events where a user successfully terminates an abnormally high number of instances. This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.004/ T1078.004]
* '''Last Updated''': 2020-07-21
@@ -6551,11 +6551,11 @@ This search looks for CloudTrail events where a user successfully terminates an
====Search====
-
`cloudtrail` eventName=TerminateInstances errorCode=success `abnormally_high_aws_instances_terminated_by_user___mltk_filter`
-| bucket span=10m _time
-| stats count as instances_terminated by _time src_user
-| apply ec2_excessive_terminateinstances_v1
-| rename "IsOutlier(instances_terminated)" as isOutlier
+`cloudtrail` eventName=TerminateInstances errorCode=success `abnormally_high_aws_instances_terminated_by_user___mltk_filter`
+| bucket span=10m _time
+| stats count as instances_terminated by _time src_user
+| apply ec2_excessive_terminateinstances_v1
+| rename "IsOutlier(instances_terminated)" as isOutlier
| where isOutlier=1
====Associated Analytic Story====
@@ -6615,9 +6615,9 @@ This search allows you to identify the endpoints that have connected to more tha
====Search====
-| tstats `security_content_summariesonly` count, values(DNS.dest) AS dest dc(DNS.dest) as dest_count from datamodel=Network_Resolution where DNS.message_type=QUERY by DNS.src
-| `drop_dm_object_name("Network_Resolution")`
-|where dest_count > 5
+| tstats `security_content_summariesonly` count, values(DNS.dest) AS dest dc(DNS.dest) as dest_count from datamodel=Network_Resolution where DNS.message_type=QUERY by DNS.src
+| `drop_dm_object_name("Network_Resolution")`
+|where dest_count > 5
| `clients_connecting_to_multiple_dns_servers_filter`
====Associated Analytic Story====
@@ -6676,8 +6676,8 @@ It's possible that an enterprise has more than five DNS servers that are configu
Enforcing network-access controls is one of the defensive mechanisms used by cloud administrators to restrict access to a cloud instance. After the attacker has gained control of the console by compromising an admin account, they can delete a network ACL and gain access to the instance from anywhere. This search will query the Change datamodel to detect users deleting network ACLs. Deprecated because it's a duplicate
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-09-08
@@ -6685,10 +6685,10 @@ Enforcing network-access controls is one of the defensive mechanisms used by clo
====Search====
`cloudtrail` eventName=DeleteNetworkAcl
-|rename userIdentity.arn as arn
-| stats count min(_time) as firstTime max(_time) as lastTime values(errorMessage) values(errorCode) values(userAgent) values(userIdentity.*) by src userName arn eventName
-| `security_content_ctime(lastTime)`
-| `security_content_ctime(firstTime)`
+|rename userIdentity.arn as arn
+| stats count min(_time) as firstTime max(_time) as lastTime values(errorMessage) values(errorCode) values(userAgent) values(userIdentity.*) by src userName arn eventName
+| `security_content_ctime(lastTime)`
+| `security_content_ctime(firstTime)`
| `cloud_network_access_control_list_deleted_filter`
====Associated Analytic Story====
@@ -6737,8 +6737,8 @@ This search will detect DNS requests resolved by unauthorized DNS servers. Legit
====Search====
-| tstats `security_content_summariesonly` count from datamodel=Network_Resolution where DNS.dest_category != dns_server AND DNS.src_category != dns_server by DNS.src DNS.dest
-| `drop_dm_object_name("DNS")`
+| tstats `security_content_summariesonly` count from datamodel=Network_Resolution where DNS.dest_category != dns_server AND DNS.src_category != dns_server by DNS.src DNS.dest
+| `drop_dm_object_name("DNS")`
| `dns_query_requests_resolved_by_unauthorized_dns_servers_filter`
====Associated Analytic Story====
@@ -6795,22 +6795,22 @@ Legitimate DNS activity can be detected in this search. Investigate, verify and
This search looks for CloudTrail events where a user logged into the AWS account, is making API calls and has not enabled Multi Factor authentication. Multi factor authentication adds a layer of security by forcing the users to type a unique authentication code from an approved authentication device when they access AWS websites or services. AWS Best Practices recommend that you enable MFA for privileged IAM users.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2018-05-17
====Search====
-
`cloudtrail` userIdentity.sessionContext.attributes.mfaAuthenticated=false
+`cloudtrail` userIdentity.sessionContext.attributes.mfaAuthenticated=false
| search NOT [
-| inputlookup aws_service_accounts
-| fields identity
+| inputlookup aws_service_accounts
+| fields identity
| rename identity as user]
-| stats count min(_time) as firstTime max(_time) as lastTime values(eventName) as eventName by userIdentity.arn userIdentity.type user
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| stats count min(_time) as firstTime max(_time) as lastTime values(eventName) as eventName by userIdentity.arn userIdentity.type user
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `detect_api_activity_from_users_without_mfa_filter`
====Associated Analytic Story====
@@ -6854,7 +6854,7 @@ Many service accounts configured within an AWS infrastructure do not have multi
This search looks for successful CloudTrail activity by user accounts that are not listed in the identity table or `aws_service_accounts.csv`. It returns event names and count, as well as the first and last time a specific user or service is detected, grouped by users. Deprecated because managing this list can be quite hard.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.004/ T1078.004]
* '''Last Updated''': 2020-07-21
@@ -6862,18 +6862,18 @@ This search looks for successful CloudTrail activity by user accounts that are n
====Search====
-
`cloudtrail` errorCode=success
-| rename userName as identity
+`cloudtrail` errorCode=success
+| rename userName as identity
| search NOT [
-| inputlookup identity_lookup_expanded
-| fields identity]
+| inputlookup identity_lookup_expanded
+| fields identity]
| search NOT [
-| inputlookup aws_service_accounts
-| fields identity]
-| rename identity as user
-| stats count min(_time) as firstTime max(_time) as lastTime values(eventName) as eventName by user
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| inputlookup aws_service_accounts
+| fields identity]
+| rename identity as user
+| stats count min(_time) as firstTime max(_time) as lastTime values(eventName) as eventName by user
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `detect_aws_api_activities_from_unapproved_accounts_filter`
====Associated Analytic Story====
@@ -6939,21 +6939,21 @@ This search looks for DNS requests for phishing domains that are leveraging Evil
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(DNS.answer) as answer from datamodel=Network_Resolution.DNS by DNS.dest DNS.src DNS.query host
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(DNS.answer) as answer from datamodel=Network_Resolution.DNS by DNS.dest DNS.src DNS.query host
| `drop_dm_object_name(DNS)`
| rex field=query ".*?(?[^./:]+\.(\S{2,3}
-|\S{2,3}.\S{2,3}))$"
+|\S{2,3}.\S{2,3}))$"
| stats count values(query) as query by domain dest src answer
-| search `evilginx_phishlets_amazon` OR `evilginx_phishlets_facebook` OR `evilginx_phishlets_github` OR `evilginx_phishlets_0365` OR `evilginx_phishlets_outlook` OR `evilginx_phishlets_aws` OR `evilginx_phishlets_google`
-| search NOT [ inputlookup legit_domains.csv
+| search `evilginx_phishlets_amazon` OR `evilginx_phishlets_facebook` OR `evilginx_phishlets_github` OR `evilginx_phishlets_0365` OR `evilginx_phishlets_outlook` OR `evilginx_phishlets_aws` OR `evilginx_phishlets_google`
+| search NOT [ inputlookup legit_domains.csv
| fields domain]
| join domain type=outer [
-| tstats count `security_content_summariesonly` values(Web.url) as url from datamodel=Web.Web by Web.dest Web.site
-| rename "Web.*" as *
+| tstats count `security_content_summariesonly` values(Web.url) as url from datamodel=Web.Web by Web.dest Web.site
+| rename "Web.*" as *
| rex field=site ".*?(?[^./:]+\.(\S{2,3}
-|\S{2,3}.\S{2,3}))$"
-| table dest domain url]
-| table count src dest query answer domain url
+|\S{2,3}.\S{2,3}))$"
+| table dest domain url]
+| table count src dest query answer domain url
| `detect_dns_requests_to_phishing_sites_leveraging_evilginx2_filter`
====Associated Analytic Story====
@@ -7019,14 +7019,14 @@ This search is used to detect attempts to use DNS tunneling, by calculating the
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Network_Resolution where DNS.message_type=response AND DNS.record_type=TXT by DNS.src DNS.dest DNS.answer DNS.record_type
-| `drop_dm_object_name("DNS")`
-| eval anslen=len(answer)
-| search anslen>100
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| rename src as "Source IP", dest as "Destination IP", answer as "DNS Answer" anslen as "Answer Length" record_type as "DNS Record Type" firstTime as "First Time" lastTime as "Last Time" count as Count
-| table "Source IP" "Destination IP" "DNS Answer" "DNS Record Type" "Answer Length" Count "First Time" "Last Time"
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Network_Resolution where DNS.message_type=response AND DNS.record_type=TXT by DNS.src DNS.dest DNS.answer DNS.record_type
+| `drop_dm_object_name("DNS")`
+| eval anslen=len(answer)
+| search anslen>100
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+| rename src as "Source IP", dest as "Destination IP", answer as "DNS Answer" anslen as "Answer Length" record_type as "DNS Record Type" firstTime as "First Time" lastTime as "Last Time" count as Count
+| table "Source IP" "Destination IP" "DNS Answer" "DNS Record Type" "Answer Length" Count "First Time" "Last Time"
| `detect_long_dns_txt_record_response_filter`
====Associated Analytic Story====
@@ -7079,7 +7079,7 @@ It's possible that legitimate TXT record responses can be long enough to trigger
This search looks for reading loaded Images unique to credential dumping with Mimikatz. Deprecated because mimikatz libraries changed and very noisy sysmon Event Code.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003.001/ T1003.001]
* '''Last Updated''': 2019-12-03
@@ -7087,12 +7087,12 @@ This search looks for reading loaded Images unique to credential dumping with Mi
====Search====
-
`sysmon` EventCode=7
-| stats values(ImageLoaded) as ImageLoaded values(ProcessId) as ProcessId by Computer, Image
-| search ImageLoaded=*WinSCard.dll ImageLoaded=*cryptdll.dll ImageLoaded=*hid.dll ImageLoaded=*samlib.dll ImageLoaded=*vaultcli.dll
-| rename Computer as dest
+`sysmon` EventCode=7
+| stats values(ImageLoaded) as ImageLoaded values(ProcessId) as ProcessId by Computer, Image
+| search ImageLoaded=*WinSCard.dll ImageLoaded=*cryptdll.dll ImageLoaded=*hid.dll ImageLoaded=*samlib.dll ImageLoaded=*vaultcli.dll
+| rename Computer as dest
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `detect_mimikatz_using_loaded_images_filter`
====Associated Analytic Story====
@@ -7149,7 +7149,7 @@ Other tools can import the same DLLs. These tools should be part of a whitelist.
This search looks for PowerShell requesting privileges consistent with credential dumping. Deprecated, looks like things changed from a logging perspective.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003.001/ T1003.001]
* '''Last Updated''': 2019-02-27
@@ -7157,14 +7157,14 @@ This search looks for PowerShell requesting privileges consistent with credentia
====Search====
-
`wineventlog_security` signature_id=4703 Process_Name=*powershell.exe
-| rex field=Message "Enabled Privileges:\s+(?\w+)\s+Disabled Privileges:"
-| where privs="SeDebugPrivilege"
-| stats count min(_time) as firstTime max(_time) as lastTime by dest, Process_Name, privs, Process_ID, Message
-| rename privs as "Enabled Privilege"
-| rename Process_Name as process
+`wineventlog_security` signature_id=4703 Process_Name=*powershell.exe
+| rex field=Message "Enabled Privileges:\s+(?\w+)\s+Disabled Privileges:"
+| where privs="SeDebugPrivilege"
+| stats count min(_time) as firstTime max(_time) as lastTime by dest, Process_Name, privs, Process_ID, Message
+| rename privs as "Enabled Privilege"
+| rename Process_Name as process
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `detect_mimikatz_via_powershell_and_eventcode_4703_filter`
====Associated Analytic Story====
@@ -7215,7 +7215,7 @@ The activity may be legitimate. PowerShell is often used by administrators to pe
This search will detect users creating spikes of API activity in your AWS environment. It will also update the cache file that factors in the latest data. This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.004/ T1078.004]
* '''Last Updated''': 2020-07-21
@@ -7223,25 +7223,25 @@ This search will detect users creating spikes of API activity in your AWS enviro
====Search====
-
`cloudtrail` eventType=AwsApiCall [search `cloudtrail` eventType=AwsApiCall
-| spath output=arn path=userIdentity.arn
-| stats count as apiCalls by arn
-| inputlookup api_call_by_user_baseline append=t
-| fields - latestCount
-| stats values(*) as * by arn
-| rename apiCalls as latestCount
-| eval newAvgApiCalls=avgApiCalls + (latestCount-avgApiCalls)/720
-| eval newStdevApiCalls=sqrt(((pow(stdevApiCalls, 2)*719 + (latestCount-newAvgApiCalls)*(latestCount-avgApiCalls))/720))
-| eval avgApiCalls=coalesce(newAvgApiCalls, avgApiCalls), stdevApiCalls=coalesce(newStdevApiCalls, stdevApiCalls), numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
-| table arn, latestCount, numDataPoints, avgApiCalls, stdevApiCalls
-| outputlookup api_call_by_user_baseline
-| eval dataPointThreshold = 15, deviationThreshold = 3
-| eval isSpike=if((latestCount > avgApiCalls+deviationThreshold*stdevApiCalls) AND numDataPoints > dataPointThreshold, 1, 0)
-| where isSpike=1
-| rename arn as userIdentity.arn
-| table userIdentity.arn]
-| spath output=user userIdentity.arn
-| stats values(eventName) as eventName, count as numberOfApiCalls, dc(eventName) as uniqueApisCalled by user
+`cloudtrail` eventType=AwsApiCall [search `cloudtrail` eventType=AwsApiCall
+| spath output=arn path=userIdentity.arn
+| stats count as apiCalls by arn
+| inputlookup api_call_by_user_baseline append=t
+| fields - latestCount
+| stats values(*) as * by arn
+| rename apiCalls as latestCount
+| eval newAvgApiCalls=avgApiCalls + (latestCount-avgApiCalls)/720
+| eval newStdevApiCalls=sqrt(((pow(stdevApiCalls, 2)*719 + (latestCount-newAvgApiCalls)*(latestCount-avgApiCalls))/720))
+| eval avgApiCalls=coalesce(newAvgApiCalls, avgApiCalls), stdevApiCalls=coalesce(newStdevApiCalls, stdevApiCalls), numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
+| table arn, latestCount, numDataPoints, avgApiCalls, stdevApiCalls
+| outputlookup api_call_by_user_baseline
+| eval dataPointThreshold = 15, deviationThreshold = 3
+| eval isSpike=if((latestCount > avgApiCalls+deviationThreshold*stdevApiCalls) AND numDataPoints > dataPointThreshold, 1, 0)
+| where isSpike=1
+| rename arn as userIdentity.arn
+| table userIdentity.arn]
+| spath output=user userIdentity.arn
+| stats values(eventName) as eventName, count as numberOfApiCalls, dc(eventName) as uniqueApisCalled by user
| `detect_spike_in_aws_api_activity_filter`
====Associated Analytic Story====
@@ -7298,7 +7298,7 @@ Detailed documentation on how to create a new field within Incident Review may b
This search will detect users creating spikes in API activity related to network access-control lists (ACLs)in your AWS environment. This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1562.007/ T1562.007]
* '''Last Updated''': 2018-05-21
@@ -7306,25 +7306,25 @@ This search will detect users creating spikes in API activity related to network
====Search====
-
`cloudtrail` `network_acl_events` [search `cloudtrail` `network_acl_events`
-| spath output=arn path=userIdentity.arn
-| stats count as apiCalls by arn
-| inputlookup network_acl_activity_baseline append=t
-| fields - latestCount
-| stats values(*) as * by arn
-| rename apiCalls as latestCount
-| eval newAvgApiCalls=avgApiCalls + (latestCount-avgApiCalls)/720
-| eval newStdevApiCalls=sqrt(((pow(stdevApiCalls, 2)*719 + (latestCount-newAvgApiCalls)*(latestCount-avgApiCalls))/720))
-| eval avgApiCalls=coalesce(newAvgApiCalls, avgApiCalls), stdevApiCalls=coalesce(newStdevApiCalls, stdevApiCalls), numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
-| table arn, latestCount, numDataPoints, avgApiCalls, stdevApiCalls
-| outputlookup network_acl_activity_baseline
-| eval dataPointThreshold = 15, deviationThreshold = 3
-| eval isSpike=if((latestCount > avgApiCalls+deviationThreshold*stdevApiCalls) AND numDataPoints > dataPointThreshold, 1, 0)
-| where isSpike=1
-| rename arn as userIdentity.arn
-| table userIdentity.arn]
-| spath output=user userIdentity.arn
-| stats values(eventName) as eventNames, count as numberOfApiCalls, dc(eventName) as uniqueApisCalled by user
+`cloudtrail` `network_acl_events` [search `cloudtrail` `network_acl_events`
+| spath output=arn path=userIdentity.arn
+| stats count as apiCalls by arn
+| inputlookup network_acl_activity_baseline append=t
+| fields - latestCount
+| stats values(*) as * by arn
+| rename apiCalls as latestCount
+| eval newAvgApiCalls=avgApiCalls + (latestCount-avgApiCalls)/720
+| eval newStdevApiCalls=sqrt(((pow(stdevApiCalls, 2)*719 + (latestCount-newAvgApiCalls)*(latestCount-avgApiCalls))/720))
+| eval avgApiCalls=coalesce(newAvgApiCalls, avgApiCalls), stdevApiCalls=coalesce(newStdevApiCalls, stdevApiCalls), numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
+| table arn, latestCount, numDataPoints, avgApiCalls, stdevApiCalls
+| outputlookup network_acl_activity_baseline
+| eval dataPointThreshold = 15, deviationThreshold = 3
+| eval isSpike=if((latestCount > avgApiCalls+deviationThreshold*stdevApiCalls) AND numDataPoints > dataPointThreshold, 1, 0)
+| where isSpike=1
+| rename arn as userIdentity.arn
+| table userIdentity.arn]
+| spath output=user userIdentity.arn
+| stats values(eventName) as eventNames, count as numberOfApiCalls, dc(eventName) as uniqueApisCalled by user
| `detect_spike_in_network_acl_activity_filter`
====Associated Analytic Story====
@@ -7375,7 +7375,7 @@ The false-positive rate may vary based on the values of`dataPointThreshold` and
This search will detect users creating spikes in API activity related to security groups in your AWS environment. It will also update the cache file that factors in the latest data. This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.004/ T1078.004]
* '''Last Updated''': 2018-04-18
@@ -7383,25 +7383,25 @@ This search will detect users creating spikes in API activity related to securit
====Search====
-
`cloudtrail` `security_group_api_calls` [search `cloudtrail` `security_group_api_calls`
-| spath output=arn path=userIdentity.arn
-| stats count as apiCalls by arn
-| inputlookup security_group_activity_baseline append=t
-| fields - latestCount
-| stats values(*) as * by arn
-| rename apiCalls as latestCount
-| eval newAvgApiCalls=avgApiCalls + (latestCount-avgApiCalls)/720
-| eval newStdevApiCalls=sqrt(((pow(stdevApiCalls, 2)*719 + (latestCount-newAvgApiCalls)*(latestCount-avgApiCalls))/720))
-| eval avgApiCalls=coalesce(newAvgApiCalls, avgApiCalls), stdevApiCalls=coalesce(newStdevApiCalls, stdevApiCalls), numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
-| table arn, latestCount, numDataPoints, avgApiCalls, stdevApiCalls
-| outputlookup security_group_activity_baseline
-| eval dataPointThreshold = 15, deviationThreshold = 3
-| eval isSpike=if((latestCount > avgApiCalls+deviationThreshold*stdevApiCalls) AND numDataPoints > dataPointThreshold, 1, 0)
-| where isSpike=1
-| rename arn as userIdentity.arn
-| table userIdentity.arn]
-| spath output=user userIdentity.arn
-| stats values(eventName) as eventNames, count as numberOfApiCalls, dc(eventName) as uniqueApisCalled by user
+`cloudtrail` `security_group_api_calls` [search `cloudtrail` `security_group_api_calls`
+| spath output=arn path=userIdentity.arn
+| stats count as apiCalls by arn
+| inputlookup security_group_activity_baseline append=t
+| fields - latestCount
+| stats values(*) as * by arn
+| rename apiCalls as latestCount
+| eval newAvgApiCalls=avgApiCalls + (latestCount-avgApiCalls)/720
+| eval newStdevApiCalls=sqrt(((pow(stdevApiCalls, 2)*719 + (latestCount-newAvgApiCalls)*(latestCount-avgApiCalls))/720))
+| eval avgApiCalls=coalesce(newAvgApiCalls, avgApiCalls), stdevApiCalls=coalesce(newStdevApiCalls, stdevApiCalls), numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
+| table arn, latestCount, numDataPoints, avgApiCalls, stdevApiCalls
+| outputlookup security_group_activity_baseline
+| eval dataPointThreshold = 15, deviationThreshold = 3
+| eval isSpike=if((latestCount > avgApiCalls+deviationThreshold*stdevApiCalls) AND numDataPoints > dataPointThreshold, 1, 0)
+| where isSpike=1
+| rename arn as userIdentity.arn
+| table userIdentity.arn]
+| spath output=user userIdentity.arn
+| stats values(eventName) as eventNames, count as numberOfApiCalls, dc(eventName) as uniqueApisCalled by user
| `detect_spike_in_security_group_activity_filter`
====Associated Analytic Story====
@@ -7453,7 +7453,7 @@ The search is used to detect hosts that generate Windows Event ID 4663 for succe
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Change_Analysis
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2017-11-27
@@ -7461,10 +7461,10 @@ The search is used to detect hosts that generate Windows Event ID 4663 for succe
====Search====
-| tstats `security_content_summariesonly` count earliest(_time) AS earliest latest(_time) AS latest from datamodel=Change_Analysis where (nodename = All_Changes) All_Changes.result="Removable Storage device" (All_Changes.result_id=4663 OR All_Changes.result_id=4656) (All_Changes.src_priority=high) by All_Changes.dest
+| tstats `security_content_summariesonly` count earliest(_time) AS earliest latest(_time) AS latest from datamodel=Change_Analysis where (nodename = All_Changes) All_Changes.result="Removable Storage device" (All_Changes.result_id=4663 OR All_Changes.result_id=4656) (All_Changes.src_priority=high) by All_Changes.dest
| `drop_dm_object_name("All_Changes")`
| `security_content_ctime(earliest)`
-| `security_content_ctime(latest)`
+| `security_content_ctime(latest)`
| `detect_usb_device_insertion_filter`
====Associated Analytic Story====
@@ -7506,7 +7506,7 @@ Legitimate USB activity will also be detected. Please verify and investigate as
This search detects new API calls that have either never been seen before or that have not been seen in the previous hour, where the identity type is `AssumedRole`.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.004/ T1078.004]
* '''Last Updated''': 2018-04-16
@@ -7514,20 +7514,20 @@ This search detects new API calls that have either never been seen before or tha
====Search====
-
`cloudtrail` eventType=AwsApiCall errorCode=success userIdentity.type=AssumedRole [search `cloudtrail` eventType=AwsApiCall errorCode=success userIdentity.type=AssumedRole
-| stats earliest(_time) as earliest latest(_time) as latest by userName eventName
-| inputlookup append=t previously_seen_api_calls_from_user_roles
-| stats min(earliest) as earliest, max(latest) as latest by userName eventName
+`cloudtrail` eventType=AwsApiCall errorCode=success userIdentity.type=AssumedRole [search `cloudtrail` eventType=AwsApiCall errorCode=success userIdentity.type=AssumedRole
+| stats earliest(_time) as earliest latest(_time) as latest by userName eventName
+| inputlookup append=t previously_seen_api_calls_from_user_roles
+| stats min(earliest) as earliest, max(latest) as latest by userName eventName
| outputlookup previously_seen_api_calls_from_user_roles
-| eval newApiCallfromUserRole=if(earliest>=relative_time(now(), "-70m@m"), 1, 0)
-| where newApiCallfromUserRole=1
-| `security_content_ctime(earliest)`
-| `security_content_ctime(latest)`
-| table eventName userName]
+| eval newApiCallfromUserRole=if(earliest>=relative_time(now(), "-70m@m"), 1, 0)
+| where newApiCallfromUserRole=1
+| `security_content_ctime(earliest)`
+| `security_content_ctime(latest)`
+| table eventName userName]
|rename userName as user
-| stats values(eventName) earliest(_time) as earliest latest(_time) as latest by user
-| `security_content_ctime(earliest)`
-| `security_content_ctime(latest)`
+| stats values(eventName) earliest(_time) as earliest latest(_time) as latest by user
+| `security_content_ctime(earliest)`
+| `security_content_ctime(latest)`
| `detect_new_api_calls_from_user_roles_filter`
====Associated Analytic Story====
@@ -7576,7 +7576,7 @@ It is possible that there are legitimate user roles making new or infrequently u
This search looks for CloudTrail events wherein a console login event by a user was recorded within the last hour, then compares the event to a lookup file of previously seen users (by ARN values) who have logged into the console. The alert is fired if the user has logged into the console for the first time within the last hour. Deprecated now this search is updated to use the Authentication datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.004/ T1078.004]
* '''Last Updated''': 2020-07-21
@@ -7584,15 +7584,15 @@ This search looks for CloudTrail events wherein a console login event by a user
====Search====
-
`cloudtrail` eventName=ConsoleLogin
-| rename userIdentity.arn as user
-| stats earliest(_time) as firstTime latest(_time) as lastTime by user
-| inputlookup append=t previously_seen_users_console_logins_cloudtrail
-| stats min(firstTime) as firstTime max(lastTime) as lastTime by user
-| eval userStatus=if(firstTime >= relative_time(now(), "-70m@m"), "First Time Logging into AWS Console","Previously Seen User")
+`cloudtrail` eventName=ConsoleLogin
+| rename userIdentity.arn as user
+| stats earliest(_time) as firstTime latest(_time) as lastTime by user
+| inputlookup append=t previously_seen_users_console_logins_cloudtrail
+| stats min(firstTime) as firstTime max(lastTime) as lastTime by user
+| eval userStatus=if(firstTime >= relative_time(now(), "-70m@m"), "First Time Logging into AWS Console","Previously Seen User")
| `security_content_ctime(firstTime)`
|`security_content_ctime(lastTime)`
-| where userStatus ="First Time Logging into AWS Console"
+| where userStatus ="First Time Logging into AWS Console"
| `detect_new_user_aws_console_login_filter`
====Associated Analytic Story====
@@ -7652,10 +7652,10 @@ This search looks for web connections to dynamic DNS providers.
====Search====
-| tstats `security_content_summariesonly` count values(Web.url) as url min(_time) as firstTime from datamodel=Web where Web.status=200 by Web.src Web.dest Web.status
-| `drop_dm_object_name("Web")`
-| `security_content_ctime(firstTime)`
-| `dynamic_dns_web_traffic`
+| tstats `security_content_summariesonly` count values(Web.url) as url min(_time) as firstTime from datamodel=Web where Web.status=200 by Web.src Web.dest Web.status
+| `drop_dm_object_name("Web")`
+| `security_content_ctime(firstTime)`
+| `dynamic_dns_web_traffic`
| `detect_web_traffic_to_dynamic_domain_providers_filter`
====Associated Analytic Story====
@@ -7719,17 +7719,17 @@ This search is used to detect DNS tunneling, by calculating the sum of the lengt
====Search====
-| tstats `security_content_summariesonly` dc("DNS.query") as count from datamodel=Network_Resolution where nodename=DNS "DNS.message_type"="QUERY" NOT (`cim_corporate_web_domain_search("DNS.query")`) NOT "DNS.query"="*.in-addr.arpa" NOT ("DNS.src_category"="svc_infra_dns" OR "DNS.src_category"="svc_infra_webproxy" OR "DNS.src_category"="svc_infra_email*" ) by "DNS.src","DNS.query"
-| rename "DNS.src" as src "DNS.query" as message
-| eval length=len(message)
-| stats sum(length) as length by src
-| append [ tstats `security_content_summariesonly` dc("DNS.answer") as count from datamodel=Network_Resolution where nodename=DNS "DNS.message_type"="QUERY" NOT (`cim_corporate_web_domain_search("DNS.query")`) NOT "DNS.query"="*.in-addr.arpa" NOT ("DNS.src_category"="svc_infra_dns" OR "DNS.src_category"="svc_infra_webproxy" OR "DNS.src_category"="svc_infra_email*" ) by "DNS.src","DNS.answer"
-| rename "DNS.src" as src "DNS.answer" as message
-| eval message=if(message=="unknown","", message)
-| eval length=len(message)
-| stats sum(length) as length by src ]
-| stats sum(length) as length by src
-| where length > 10000
+| tstats `security_content_summariesonly` dc("DNS.query") as count from datamodel=Network_Resolution where nodename=DNS "DNS.message_type"="QUERY" NOT (`cim_corporate_web_domain_search("DNS.query")`) NOT "DNS.query"="*.in-addr.arpa" NOT ("DNS.src_category"="svc_infra_dns" OR "DNS.src_category"="svc_infra_webproxy" OR "DNS.src_category"="svc_infra_email*" ) by "DNS.src","DNS.query"
+| rename "DNS.src" as src "DNS.query" as message
+| eval length=len(message)
+| stats sum(length) as length by src
+| append [ tstats `security_content_summariesonly` dc("DNS.answer") as count from datamodel=Network_Resolution where nodename=DNS "DNS.message_type"="QUERY" NOT (`cim_corporate_web_domain_search("DNS.query")`) NOT "DNS.query"="*.in-addr.arpa" NOT ("DNS.src_category"="svc_infra_dns" OR "DNS.src_category"="svc_infra_webproxy" OR "DNS.src_category"="svc_infra_email*" ) by "DNS.src","DNS.answer"
+| rename "DNS.src" as src "DNS.answer" as message
+| eval message=if(message=="unknown","", message)
+| eval length=len(message)
+| stats sum(length) as length by src ]
+| stats sum(length) as length by src
+| where length > 10000
| `detection_of_dns_tunnels_filter`
====Associated Analytic Story====
@@ -7786,7 +7786,7 @@ It's possible that normal DNS traffic will exhibit this behavior. If an alert is
This search looks for EC2 instances being modified by users who have not previously modified them. This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.004/ T1078.004]
* '''Last Updated''': 2020-07-21
@@ -7794,21 +7794,21 @@ This search looks for EC2 instances being modified by users who have not previou
====Search====
-
`cloudtrail` `ec2_modification_api_calls` [search `cloudtrail` `ec2_modification_api_calls` errorCode=success
-| stats earliest(_time) as firstTime latest(_time) as lastTime by userIdentity.arn
-| rename userIdentity.arn as arn
-| inputlookup append=t previously_seen_ec2_modifications_by_user
-| stats min(firstTime) as firstTime, max(lastTime) as lastTime by arn
-| outputlookup previously_seen_ec2_modifications_by_user
-| eval newUser=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
-| where newUser=1
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| rename arn as userIdentity.arn
-| table userIdentity.arn]
-| spath output=dest responseElements.instancesSet.items{}.instanceId
-| spath output=user userIdentity.arn
-| table _time, user, dest
+`cloudtrail` `ec2_modification_api_calls` [search `cloudtrail` `ec2_modification_api_calls` errorCode=success
+| stats earliest(_time) as firstTime latest(_time) as lastTime by userIdentity.arn
+| rename userIdentity.arn as arn
+| inputlookup append=t previously_seen_ec2_modifications_by_user
+| stats min(firstTime) as firstTime, max(lastTime) as lastTime by arn
+| outputlookup previously_seen_ec2_modifications_by_user
+| eval newUser=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
+| where newUser=1
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+| rename arn as userIdentity.arn
+| table userIdentity.arn]
+| spath output=dest responseElements.instancesSet.items{}.instanceId
+| spath output=user userIdentity.arn
+| table _time, user, dest
| `ec2_instance_modified_with_previously_unseen_user_filter`
====Associated Analytic Story====
@@ -7857,7 +7857,7 @@ It's possible that a new user will start to modify EC2 instances when they haven
This search looks for CloudTrail events where an instance is started in a particular region in the last one hour and then compares it to a lookup file of previously seen regions where an instance was started
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1535/ T1535]
* '''Last Updated''': 2018-02-23
@@ -7865,15 +7865,15 @@ This search looks for CloudTrail events where an instance is started in a partic
====Search====
-
`cloudtrail` earliest=-1h StartInstances
-| stats earliest(_time) as earliest latest(_time) as latest by awsRegion
-| inputlookup append=t previously_seen_aws_regions.csv
-| stats min(earliest) as earliest max(latest) as latest by awsRegion
-| outputlookup previously_seen_aws_regions.csv
-| eval regionStatus=if(earliest >= relative_time(now(),"-1d@d"), "Instance Started in a New Region","Previously Seen Region")
-| `security_content_ctime(earliest)`
-| `security_content_ctime(latest)`
-| where regionStatus="Instance Started in a New Region"
+`cloudtrail` earliest=-1h StartInstances
+| stats earliest(_time) as earliest latest(_time) as latest by awsRegion
+| inputlookup append=t previously_seen_aws_regions.csv
+| stats min(earliest) as earliest max(latest) as latest by awsRegion
+| outputlookup previously_seen_aws_regions.csv
+| eval regionStatus=if(earliest >= relative_time(now(),"-1d@d"), "Instance Started in a New Region","Previously Seen Region")
+| `security_content_ctime(earliest)`
+| `security_content_ctime(latest)`
+| where regionStatus="Instance Started in a New Region"
| `ec2_instance_started_in_previously_unseen_region_filter`
====Associated Analytic Story====
@@ -7926,28 +7926,28 @@ It's possible that a user has unknowingly started an instance in a new region. P
This search looks for EC2 instances being created with previously unseen AMIs. This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2018-03-12
====Search====
-
`cloudtrail` eventName=RunInstances [search `cloudtrail` eventName=RunInstances errorCode=success
-| stats earliest(_time) as firstTime latest(_time) as lastTime by requestParameters.instancesSet.items{}.imageId
-| rename requestParameters.instancesSet.items{}.imageId as amiID
-| inputlookup append=t previously_seen_ec2_amis.csv
-| stats min(firstTime) as firstTime max(lastTime) as lastTime by amiID
-| outputlookup previously_seen_ec2_amis.csv
-| eval newAMI=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
+`cloudtrail` eventName=RunInstances [search `cloudtrail` eventName=RunInstances errorCode=success
+| stats earliest(_time) as firstTime latest(_time) as lastTime by requestParameters.instancesSet.items{}.imageId
+| rename requestParameters.instancesSet.items{}.imageId as amiID
+| inputlookup append=t previously_seen_ec2_amis.csv
+| stats min(firstTime) as firstTime max(lastTime) as lastTime by amiID
+| outputlookup previously_seen_ec2_amis.csv
+| eval newAMI=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
| `security_content_ctime(firstTime)`
-|`security_content_ctime(lastTime)`
-| where newAMI=1
-| rename amiID as requestParameters.instancesSet.items{}.imageId
-| table requestParameters.instancesSet.items{}.imageId]
-| rename requestParameters.instanceType as instanceType, responseElements.instancesSet.items{}.instanceId as dest, userIdentity.arn as arn, requestParameters.instancesSet.items{}.imageId as amiID
-| table firstTime, lastTime, arn, amiID, dest, instanceType
+|`security_content_ctime(lastTime)`
+| where newAMI=1
+| rename amiID as requestParameters.instancesSet.items{}.imageId
+| table requestParameters.instancesSet.items{}.imageId]
+| rename requestParameters.instanceType as instanceType, responseElements.instancesSet.items{}.instanceId as dest, userIdentity.arn as arn, requestParameters.instancesSet.items{}.imageId as amiID
+| table firstTime, lastTime, arn, amiID, dest, instanceType
| `ec2_instance_started_with_previously_unseen_ami_filter`
====Associated Analytic Story====
@@ -7985,30 +7985,30 @@ After a new AMI is created, the first systems created with that AMI will cause t
This search looks for EC2 instances being created with previously unseen instance types. This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-02-07
====Search====
-
`cloudtrail` eventName=RunInstances [search `cloudtrail` eventName=RunInstances errorCode=success
-| fillnull value="m1.small" requestParameters.instanceType
-| stats earliest(_time) as earliest latest(_time) as latest by requestParameters.instanceType
-| rename requestParameters.instanceType as instanceType
-| inputlookup append=t previously_seen_ec2_instance_types.csv
-| stats min(earliest) as earliest max(latest) as latest by instanceType
-| outputlookup previously_seen_ec2_instance_types.csv
-| eval newType=if(earliest >= relative_time(now(), "-70m@m"), 1, 0)
-| `security_content_ctime(earliest)`
-| `security_content_ctime(latest)`
-| where newType=1
-| rename instanceType as requestParameters.instanceType
-| table requestParameters.instanceType]
-| spath output=user userIdentity.arn
-| rename requestParameters.instanceType as instanceType, responseElements.instancesSet.items{}.instanceId as dest
-| table _time, user, dest, instanceType
+`cloudtrail` eventName=RunInstances [search `cloudtrail` eventName=RunInstances errorCode=success
+| fillnull value="m1.small" requestParameters.instanceType
+| stats earliest(_time) as earliest latest(_time) as latest by requestParameters.instanceType
+| rename requestParameters.instanceType as instanceType
+| inputlookup append=t previously_seen_ec2_instance_types.csv
+| stats min(earliest) as earliest max(latest) as latest by instanceType
+| outputlookup previously_seen_ec2_instance_types.csv
+| eval newType=if(earliest >= relative_time(now(), "-70m@m"), 1, 0)
+| `security_content_ctime(earliest)`
+| `security_content_ctime(latest)`
+| where newType=1
+| rename instanceType as requestParameters.instanceType
+| table requestParameters.instanceType]
+| spath output=user userIdentity.arn
+| rename requestParameters.instanceType as instanceType, responseElements.instancesSet.items{}.instanceId as dest
+| table _time, user, dest, instanceType
| `ec2_instance_started_with_previously_unseen_instance_type_filter`
====Associated Analytic Story====
@@ -8046,7 +8046,7 @@ It is possible that an admin will create a new system using a new instance type
This search looks for EC2 instances being created by users who have not created them before. This search is deprecated and have been translated to use the latest Change Datamodel.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.004/ T1078.004]
* '''Last Updated''': 2020-07-21
@@ -8054,20 +8054,20 @@ This search looks for EC2 instances being created by users who have not created
====Search====
-
`cloudtrail` eventName=RunInstances [search `cloudtrail` eventName=RunInstances errorCode=success
-| stats earliest(_time) as firstTime latest(_time) as lastTime by userIdentity.arn
-| rename userIdentity.arn as arn
-| inputlookup append=t previously_seen_ec2_launches_by_user.csv
-| stats min(firstTime) as firstTime, max(lastTime) as lastTime by arn
-| outputlookup previously_seen_ec2_launches_by_user.csv
-| eval newUser=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
-| where newUser=1
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| rename arn as userIdentity.arn
-| table userIdentity.arn]
-| rename requestParameters.instanceType as instanceType, responseElements.instancesSet.items{}.instanceId as dest, userIdentity.arn as user
-| table _time, user, dest, instanceType
+`cloudtrail` eventName=RunInstances [search `cloudtrail` eventName=RunInstances errorCode=success
+| stats earliest(_time) as firstTime latest(_time) as lastTime by userIdentity.arn
+| rename userIdentity.arn as arn
+| inputlookup append=t previously_seen_ec2_launches_by_user.csv
+| stats min(firstTime) as firstTime, max(lastTime) as lastTime by arn
+| outputlookup previously_seen_ec2_launches_by_user.csv
+| eval newUser=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
+| where newUser=1
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+| rename arn as userIdentity.arn
+| table userIdentity.arn]
+| rename requestParameters.instanceType as instanceType, responseElements.instancesSet.items{}.instanceId as dest, userIdentity.arn as user
+| table _time, user, dest, instanceType
| `ec2_instance_started_with_previously_unseen_user_filter`
====Associated Analytic Story====
@@ -8127,10 +8127,10 @@ This search looks for processes launched from files with at least five spaces in
====Search====
-| tstats `security_content_summariesonly` count values(Processes.process_path) as process_path min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process = "* .*" by Processes.dest Processes.user Processes.process Processes.process_name
+| tstats `security_content_summariesonly` count values(Processes.process_path) as process_path min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process = "* .*" by Processes.dest Processes.user Processes.process Processes.process_name
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| `drop_dm_object_name(Processes)`
+| `security_content_ctime(lastTime)`
+| `drop_dm_object_name(Processes)`
| `execution_of_file_with_spaces_before_extension_filter`
====Associated Analytic Story====
@@ -8181,21 +8181,21 @@ None identified.
This search returns a list of hosts that have not successfully completed a backup in over a week. Deprecated because it's a infrastructure monitoring.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2017-09-12
====Search====
-
`netbackup` MESSAGE="Disk/Partition backup completed successfully."
-| stats latest(_time) as latestTime by COMPUTERNAME
-| `security_content_ctime(latestTime)`
-| rename COMPUTERNAME as dest
-| eval isOutlier=if(latestTime <= relative_time(now(), "-7d@d"), 1, 0)
-| search isOutlier=1
-| table latestTime, dest
+`netbackup` MESSAGE="Disk/Partition backup completed successfully."
+| stats latest(_time) as latestTime by COMPUTERNAME
+| `security_content_ctime(latestTime)`
+| rename COMPUTERNAME as dest
+| eval isOutlier=if(latestTime <= relative_time(now(), "-7d@d"), 1, 0)
+| search isOutlier=1
+| table latestTime, dest
| `extended_period_without_successful_netbackup_backups_filter`
====Associated Analytic Story====
@@ -8244,19 +8244,19 @@ This search looks for command-line arguments that use a `/c` parameter to execut
| tstats `security_content_summariesonly` min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name = cmd.exe Processes.process = "* /c *" by Processes.process Processes.process_name Processes.parent_process_name Processes.dest
| `drop_dm_object_name(Processes)`
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| search [
-| tstats `security_content_summariesonly` earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name = cmd.exe Processes.process = "* /c *" by Processes.process
-| `drop_dm_object_name(Processes)`
-| inputlookup append=t previously_seen_cmd_line_arguments
-| stats min(firstTime) as firstTime, max(lastTime) as lastTime by process
-| outputlookup previously_seen_cmd_line_arguments
-| eval newCmdLineArgument=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
-| where newCmdLineArgument=1
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| table process]
+| tstats `security_content_summariesonly` earliest(_time) as firstTime latest(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name = cmd.exe Processes.process = "* /c *" by Processes.process
+| `drop_dm_object_name(Processes)`
+| inputlookup append=t previously_seen_cmd_line_arguments
+| stats min(firstTime) as firstTime, max(lastTime) as lastTime by process
+| outputlookup previously_seen_cmd_line_arguments
+| eval newCmdLineArgument=if(firstTime >= relative_time(now(), "-70m@m"), 1, 0)
+| where newCmdLineArgument=1
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+| table process]
| `first_time_seen_command_line_argument_filter`
====Associated Analytic Story====
@@ -8321,7 +8321,7 @@ Legitimate programs can also use command-line arguments to execute. Please verif
This search show information on uploaded containers including source user, account, action, bucket name event name, http user agent, message and destination path.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1525/ T1525]
* '''Last Updated''': 2020-02-20
@@ -8330,8 +8330,8 @@ This search show information on uploaded containers including source user, accou
====Search====
-|tstats count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Cloud_Infrastructure.Storage where Storage.event_name=storage.objects.create by Storage.src_user Storage.account Storage.action Storage.bucket_name Storage.event_name Storage.http_user_agent Storage.msg Storage.object_path
-| `drop_dm_object_name("Storage")`
+|tstats count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Cloud_Infrastructure.Storage where Storage.event_name=storage.objects.create by Storage.src_user Storage.account Storage.action Storage.bucket_name Storage.event_name Storage.http_user_agent Storage.msg Storage.object_path
+| `drop_dm_object_name("Storage")`
| `gcp_gcr_container_uploaded_filter`
====Associated Analytic Story====
@@ -8380,7 +8380,7 @@ Uploading container is a normal behavior from developers or users with access to
This detection search will help profile user accounts in your environment by identifying newly created accounts that have been added to your network in the past week.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078.002/ T1078.002]
* '''Last Updated''': 2017-09-12
@@ -8389,12 +8389,12 @@ This detection search will help profile user accounts in your environment by ide
====Search====
-| from datamodel Identity_Management.All_Identities
-| eval empStatus=case((now()-startDate)<604800, "Accounts created in last week")
+| from datamodel Identity_Management.All_Identities
+| eval empStatus=case((now()-startDate)<604800, "Accounts created in last week")
| search empStatus="Accounts created in last week"
-| `security_content_ctime(endDate)`
+| `security_content_ctime(endDate)`
| `security_content_ctime(startDate)`
-| table identity empStatus endDate startDate
+| table identity empStatus endDate startDate
| `identify_new_user_accounts_filter`
====Associated Analytic Story====
@@ -8452,11 +8452,11 @@ This search looks for PowerShell processes started with a base64 encoded command
====Search====
-| tstats `security_content_summariesonly` count values(Processes.process) as process values(Processes.parent_process) as parent_process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=powershell.exe by Processes.user Processes.process_name Processes.parent_process_name Processes.dest
-| `drop_dm_object_name(Processes)`
+| tstats `security_content_summariesonly` count values(Processes.process) as process values(Processes.parent_process) as parent_process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=powershell.exe by Processes.user Processes.process_name Processes.parent_process_name Processes.dest
+| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
-| search (process=*-EncodedCommand* OR process=*-enc*) process=*-Exec*
+| search (process=*-EncodedCommand* OR process=*-enc*) process=*-Exec*
| `malicious_powershell_process___multiple_suspicious_command_line_arguments_filter`
====Associated Analytic Story====
@@ -8510,7 +8510,7 @@ This search looks for DNS requests for faux domains similar to the domains that
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Network_Resolution
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2017-09-23
@@ -8518,10 +8518,10 @@ This search looks for DNS requests for faux domains similar to the domains that
====Search====
-| tstats `security_content_summariesonly` values(DNS.answer) as IPs min(_time) as firstTime from datamodel=Network_Resolution by DNS.src, DNS.query
-| `drop_dm_object_name("DNS")`
+| tstats `security_content_summariesonly` values(DNS.answer) as IPs min(_time) as firstTime from datamodel=Network_Resolution by DNS.src, DNS.query
+| `drop_dm_object_name("DNS")`
| `security_content_ctime(firstTime)`
-| `brand_abuse_dns`
+| `brand_abuse_dns`
| `monitor_dns_for_brand_abuse_filter`
====Associated Analytic Story====
@@ -8563,15 +8563,15 @@ None at this time
This search allows you to look for evidence of exploitation for CVE-2016-4859, the Splunk Open Redirect Vulnerability.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2017-09-19
====Search====
-
index=_internal sourcetype=splunk_web_access return_to="/%09/*"
+index=_internal sourcetype=splunk_web_access return_to="/%09/*"
| `open_redirect_in_splunk_web_filter`
====Associated Analytic Story====
@@ -8611,8 +8611,8 @@ None identified
This search looks for ColdRoot events from the osx-attacks osquery pack.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2019-01-29
@@ -8620,11 +8620,11 @@ This search looks for ColdRoot events from the osx-attacks osquery pack.
====Search====
-| from datamodel Alerts.Alerts
-| search app=osquery:results (name=pack_osx-attacks_OSX_ColdRoot_RAT_Launchd OR name=pack_osx-attacks_OSX_ColdRoot_RAT_Files)
-| rename columns.path as path
-| bucket _time span=30s
-| stats count(path) by _time, host, user, path
+| from datamodel Alerts.Alerts
+| search app=osquery:results (name=pack_osx-attacks_OSX_ColdRoot_RAT_Launchd OR name=pack_osx-attacks_OSX_ColdRoot_RAT_Files)
+| rename columns.path as path
+| bucket _time span=30s
+| stats count(path) by _time, host, user, path
| `osquery_pack___coldroot_detection_filter`
====Associated Analytic Story====
@@ -8675,10 +8675,10 @@ This search looks for processes launching netsh.exe to execute various commands
====Search====
-| tstats `security_content_summariesonly` count values(Processes.process) as process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=netsh.exe by Processes.user Processes.dest Processes.parent_process Processes.parent_process_name Processes.process_name
-| `drop_dm_object_name(Processes)`
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| tstats `security_content_summariesonly` count values(Processes.process) as process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=netsh.exe by Processes.user Processes.dest Processes.parent_process Processes.parent_process_name Processes.process_name
+| `drop_dm_object_name(Processes)`
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `processes_created_by_netsh_filter`
====Associated Analytic Story====
@@ -8730,7 +8730,7 @@ This search looks for applications on the endpoint that you have marked as prohi
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Endpoint
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2019-10-11
@@ -8738,11 +8738,11 @@ This search looks for applications on the endpoint that you have marked as prohi
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes by Processes.dest Processes.user Processes.process_name
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes by Processes.dest Processes.user Processes.process_name
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| `drop_dm_object_name(Processes)`
-| `prohibited_softwares`
+| `security_content_ctime(lastTime)`
+| `drop_dm_object_name(Processes)`
+| `prohibited_softwares`
| `prohibited_software_on_endpoint_filter`
====Associated Analytic Story====
@@ -8800,10 +8800,10 @@ The search looks for command-line arguments used to hide a file or directory usi
====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 = reg.exe Processes.process="*add*" Processes.process="*Hidden*" Processes.process="*REG_DWORD*" by Processes.process_name Processes.parent_process_name Processes.dest Processes.user
-| `drop_dm_object_name(Processes)`
-| `security_content_ctime(firstTime)`
+| `drop_dm_object_name(Processes)`
+| `security_content_ctime(firstTime)`
|`security_content_ctime(lastTime)`
-| regex process = "(/d\s+2)"
+| regex process = "(/d\s+2)"
| `reg_exe_used_to_hide_files_directories_via_registry_keys_filter`
====Associated Analytic Story====
@@ -8858,8 +8858,8 @@ None at the moment
This search monitors for remote modifications to registry keys.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2020-03-02
@@ -8867,10 +8867,10 @@ This search monitors for remote modifications to registry keys.
====Search====
-| tstats `security_content_summariesonly` count values(Registry.registry_key_name) as registry_key_name values(Registry.registry_path) as registry_path min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path="\\\\*" by Registry.dest , Registry.user
-| `security_content_ctime(lastTime)`
-| `security_content_ctime(firstTime)`
-| `drop_dm_object_name(Registry)`
+| tstats `security_content_summariesonly` count values(Registry.registry_key_name) as registry_key_name values(Registry.registry_path) as registry_path min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path="\\\\*" by Registry.dest , Registry.user
+| `security_content_ctime(lastTime)`
+| `security_content_ctime(firstTime)`
+| `drop_dm_object_name(Registry)`
| `remote_registry_key_modifications_filter`
====Associated Analytic Story====
@@ -8923,10 +8923,10 @@ This search looks for wmic.exe being launched with parameters to operate on remo
====Search====
-| tstats `security_content_summariesonly` count values(Processes.process) as process values(Processes.parent_process) as parent_process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=wmic.exe AND Processes.process= */node* by Processes.user Processes.process_name Processes.parent_process_name Processes.dest
-| `drop_dm_object_name(Processes)`
+| tstats `security_content_summariesonly` count values(Processes.process) as process values(Processes.parent_process) as parent_process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=wmic.exe AND Processes.process= */node* by Processes.user Processes.process_name Processes.parent_process_name Processes.dest
+| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `remote_wmi_command_attempt_filter`
====Associated Analytic Story====
@@ -8986,11 +8986,11 @@ This search looks for flags passed to schtasks.exe on the command-line that indi
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Processes.process) as process from datamodel=Endpoint.Processes where Processes.process_name=schtasks.exe (Processes.process= "*create*" OR Processes.process= "*delete*") by Processes.parent_process Processes.process_name Processes.user
-| `drop_dm_object_name("Processes")`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Processes.process) as process from datamodel=Endpoint.Processes where Processes.process_name=schtasks.exe (Processes.process= "*create*" OR Processes.process= "*delete*") by Processes.parent_process Processes.process_name Processes.user
+| `drop_dm_object_name("Processes")`
| `security_content_ctime(firstTime)`
-|`security_content_ctime(lastTime)`
-| search (process=*rhaegal* OR process=*drogon* OR *viserion_*)
+|`security_content_ctime(lastTime)`
+| search (process=*rhaegal* OR process=*drogon* OR *viserion_*)
| `scheduled_tasks_used_in_badrabbit_ransomware_filter`
====Associated Analytic Story====
@@ -9041,20 +9041,20 @@ No known false positives
This search allows you to look for evidence of exploitation for CVE-2018-11409, a Splunk Enterprise Information Disclosure Bug.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2018-06-14
====Search====
-
index=_internal sourcetype=splunkd_ui_access server-info
-| search clientip!=127.0.0.1 uri_path="*raw/services/server/info/server-info"
-| rename clientip as src_ip, splunk_server as dest
-| stats earliest(_time) as firstTime, latest(_time) as lastTime, values(uri) as uri, values(useragent) as http_user_agent, values(user) as user by src_ip, dest
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+index=_internal sourcetype=splunkd_ui_access server-info
+| search clientip!=127.0.0.1 uri_path="*raw/services/server/info/server-info"
+| rename clientip as src_ip, splunk_server as dest
+| stats earliest(_time) as firstTime, latest(_time) as lastTime, values(uri) as uri, values(useragent) as http_user_agent, values(user) as user by src_ip, dest
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `splunk_enterprise_information_disclosure_filter`
====Associated Analytic Story====
@@ -9094,7 +9094,7 @@ Retrieving server information may be a legitimate API request. Verify that the a
This search looks for changes to registry values that control Windows file associations, executed by a process that is not typical for legitimate, routine changes to this area.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1546.001/ T1546.001]
* '''Last Updated''': 2020-07-22
@@ -9103,13 +9103,13 @@ This search looks for changes to registry values that control Windows file assoc
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Processes.process_name) as process_name values(Processes.parent_process_name) as parent_process_name FROM datamodel=Endpoint.Processes where Processes.process_name!=Explorer.exe AND Processes.process_name!=OpenWith.exe by Processes.process_id Processes.dest
-| `drop_dm_object_name("Processes")`
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Processes.process_name) as process_name values(Processes.parent_process_name) as parent_process_name FROM datamodel=Endpoint.Processes where Processes.process_name!=Explorer.exe AND Processes.process_name!=OpenWith.exe by Processes.process_id Processes.dest
+| `drop_dm_object_name("Processes")`
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| join [
-| tstats `security_content_summariesonly` values(Registry.registry_path) as registry_path count FROM datamodel=Endpoint.Registry where Registry.registry_path=*\\Explorer\\FileExts* by Registry.process_id Registry.dest
-| `drop_dm_object_name("Registry")`
+| tstats `security_content_summariesonly` values(Registry.registry_path) as registry_path count FROM datamodel=Endpoint.Registry where Registry.registry_path=*\\Explorer\\FileExts* by Registry.process_id Registry.dest
+| `drop_dm_object_name("Registry")`
| table process_id dest registry_path]
| `suspicious_changes_to_file_associations_filter`
@@ -9163,8 +9163,8 @@ There may be other processes in your environment that users may legitimately use
The search looks for files created with names that have been linked to malicious activity.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2019-04-25
@@ -9172,11 +9172,11 @@ The search looks for files created with names that have been linked to malicious
====Search====
-| tstats `security_content_summariesonly` count values(Filesystem.action) as action values(Filesystem.file_path) as file_path min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem by Filesystem.file_name Filesystem.dest
-| `security_content_ctime(lastTime)`
-| `security_content_ctime(firstTime)`
-| `drop_dm_object_name(Filesystem)`
-| `suspicious_writes`
+| tstats `security_content_summariesonly` count values(Filesystem.action) as action values(Filesystem.file_path) as file_path min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem by Filesystem.file_name Filesystem.dest
+| `security_content_ctime(lastTime)`
+| `security_content_ctime(firstTime)`
+| `drop_dm_object_name(Filesystem)`
+| `suspicious_writes`
| `suspicious_file_write_filter`
====Associated Analytic Story====
@@ -9216,7 +9216,7 @@ It's possible for a legitimate file to be created with the same name as one note
This search detects writes to the 'System Volume Information' folder by something other than the System process.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1036/ T1036]
* '''Last Updated''': 2020-07-22
@@ -9224,10 +9224,10 @@ This search detects writes to the 'System Volume Information' folder by somethin
====Search====
-
(`sysmon` OR tag=process) EventCode=11 process_id!=4 file_path=*System\ Volume\ Information*
-| stats count min(_time) as firstTime max(_time) as lastTime by dest, Image, file_path
+(`sysmon` OR tag=process) EventCode=11 process_id!=4 file_path=*System\ Volume\ Information*
+| stats count min(_time) as firstTime max(_time) as lastTime by dest, Image, file_path
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `suspicious_writes_to_system_volume_information_filter`
====Associated Analytic Story====
@@ -9285,11 +9285,11 @@ This search looks for applications on the endpoint that you have marked as uncom
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes by Processes.dest Processes.user Processes.process Processes.process_name
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes by Processes.dest Processes.user Processes.process Processes.process_name
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| `drop_dm_object_name(Processes)`
-| `uncommon_processes`
+| `security_content_ctime(lastTime)`
+| `drop_dm_object_name(Processes)`
+| `uncommon_processes`
|`uncommon_processes_on_endpoint_filter`
====Associated Analytic Story====
@@ -9344,7 +9344,7 @@ None identified
This search detects loading of unsigned images by LSASS. Deprecated because too noisy.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003.001/ T1003.001]
* '''Last Updated''': 2019-12-06
@@ -9352,11 +9352,11 @@ This search detects loading of unsigned images by LSASS. Deprecated because too
====Search====
-
`sysmon` EventID=7 Image=*lsass.exe Signed=false
-| stats count min(_time) as firstTime max(_time) as lastTime by Computer, Image, ImageLoaded, Signed, SHA1
-| rename Computer as dest
+`sysmon` EventID=7 Image=*lsass.exe Signed=false
+| stats count min(_time) as firstTime max(_time) as lastTime by Computer, Image, ImageLoaded, Signed, SHA1
+| rename Computer as dest
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `unsigned_image_loaded_by_lsass_filter`
====Associated Analytic Story====
@@ -9409,20 +9409,20 @@ Other tools could load images into LSASS for legitimate reason. But enterprise t
This search gives you the hosts where a backup was attempted and then failed.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2017-09-12
====Search====
-
`netbackup`
-| stats latest(_time) as latestTime by COMPUTERNAME, MESSAGE
-| search MESSAGE="An error occurred, failed to backup."
-| `security_content_ctime(latestTime)`
-| rename COMPUTERNAME as dest, MESSAGE as signature
-| table latestTime, dest, signature
+`netbackup`
+| stats latest(_time) as latestTime by COMPUTERNAME, MESSAGE
+| search MESSAGE="An error occurred, failed to backup."
+| `security_content_ctime(latestTime)`
+| rename COMPUTERNAME as dest, MESSAGE as signature
+| table latestTime, dest, signature
| `unsuccessful_netbackup_backups_filter`
====Associated Analytic Story====
@@ -9469,10 +9469,10 @@ The search looks for the Registry Key DisableAntiSpyware set to disable. This is
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_key_name="DisableAntiSpyware" AND Registry.registry_value_name="DWORD (0x00000000)" by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name
-| `drop_dm_object_name(Registry)`
-| `security_content_ctime(lastTime)`
-| `security_content_ctime(firstTime)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_key_name="DisableAntiSpyware" AND Registry.registry_value_name="DWORD (0x00000000)" by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name
+| `drop_dm_object_name(Registry)`
+| `security_content_ctime(lastTime)`
+| `security_content_ctime(firstTime)`
| `windows_disableantispyware_registry_filter`
====Associated Analytic Story====
@@ -9520,10 +9520,10 @@ It is unusual to turn this feature on a Windows system since it is a default sec
----
===Windows connhost exe started forcefully===
-The search looks for the Console Window Host process (connhost.exe) executed using the force flag -ForceV1. This is not regular behavior in the Windows OS and is often seen executed by the Ryuk Ransomware. DEPRECATED This event is actually seen in the windows 10 client of attack_range_local. After further testing we realized this is not specific to Ryuk.
+The search looks for the Console Window Host process (connhost.exe) executed using the force flag -ForceV1. This is not regular behavior in the Windows OS and is often seen executed by the Ryuk Ransomware. DEPRECATED This event is actually seen in the windows 10 client of attack_range_local. After further testing we realized this is not specific to Ryuk.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1059.003/ T1059.003]
* '''Last Updated''': 2020-11-06
@@ -9532,10 +9532,10 @@ The search looks for the Console Window Host process (connhost.exe) executed usi
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes WHERE Processes.process="*C:\\Windows\\system32\\conhost.exe* 0xffffffff *-ForceV1*" by Processes.user Processes.process_name Processes.process Processes.dest
-| `drop_dm_object_name(Processes)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes WHERE Processes.process="*C:\\Windows\\system32\\conhost.exe* 0xffffffff *-ForceV1*" by Processes.user Processes.process_name Processes.process Processes.dest
+| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `windows_connhost_exe_started_forcefully_filter`
====Associated Analytic Story====
@@ -9586,8 +9586,8 @@ This process should not be ran forcefully, we have not see any false positives f
The search looks for modifications to the hosts file on all Windows endpoints across your environment.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
-* '''ATT&CK''':
+* '''Datamodel''':
+* '''ATT&CK''':
* '''Last Updated''': 2018-11-02
@@ -9595,11 +9595,11 @@ The search looks for modifications to the hosts file on all Windows endpoints ac
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem by Filesystem.file_name Filesystem.file_path Filesystem.dest
-| `security_content_ctime(lastTime)`
-| `security_content_ctime(firstTime)`
-| search Filesystem.file_name=hosts AND Filesystem.file_path=*Windows\\System32\\*
-| `drop_dm_object_name(Filesystem)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem by Filesystem.file_name Filesystem.file_path Filesystem.dest
+| `security_content_ctime(lastTime)`
+| `security_content_ctime(firstTime)`
+| search Filesystem.file_name=hosts AND Filesystem.file_path=*Windows\\System32\\*
+| `drop_dm_object_name(Filesystem)`
| `windows_hosts_file_modification_filter`
====Associated Analytic Story====
@@ -9644,7 +9644,7 @@ There may be legitimate reasons for system administrators to add entries to this
Detect memory dumping of the LSASS process.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003.001/ T1003.001]
* '''Last Updated''': 2019-12-06
@@ -9652,11 +9652,11 @@ Detect memory dumping of the LSASS process.
====Search====
-
`sysmon` EventCode=10 TargetImage=*lsass.exe CallTrace=*dbgcore.dll* OR CallTrace=*dbghelp.dll*
-| stats count min(_time) as firstTime max(_time) as lastTime by Computer, TargetImage, TargetProcessId, SourceImage, SourceProcessId
-| rename Computer as dest
+`sysmon` EventCode=10 TargetImage=*lsass.exe CallTrace=*dbgcore.dll* OR CallTrace=*dbghelp.dll*
+| stats count min(_time) as firstTime max(_time) as lastTime by Computer, TargetImage, TargetProcessId, SourceImage, SourceProcessId
+| rename Computer as dest
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `access_lsass_memory_for_dump_creation_filter`
====Associated Analytic Story====
@@ -9711,7 +9711,7 @@ Administrators can create memory dumps for debugging purposes, but memory dumps
This detection indicates use of Mimikatz modules that facilitate Pass-the-Token attack, Golden or Silver kerberos ticket attack, and Skeleton key attack.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1055/ T1055], [https://attack.mitre.org/techniques/T1068/ T1068], [https://attack.mitre.org/techniques/T1078/ T1078], [https://attack.mitre.org/techniques/T1098/ T1098], [https://attack.mitre.org/techniques/T1134/ T1134], [https://attack.mitre.org/techniques/T1543/ T1543], [https://attack.mitre.org/techniques/T1547/ T1547], [https://attack.mitre.org/techniques/T1548/ T1548], [https://attack.mitre.org/techniques/T1554/ T1554], [https://attack.mitre.org/techniques/T1556/ T1556], [https://attack.mitre.org/techniques/T1558/ T1558]
* '''Last Updated''': 2020-11-03
@@ -9722,10 +9722,10 @@ This detection indicates use of Mimikatz modules that facilitate Pass-the-Token
| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
| where cmd_line != null AND ( match_regex(cmd_line, /(?i)kerberos::ptt/)=true OR match_regex(cmd_line, /(?i)kerberos::golden/)=true OR match_regex(cmd_line, /(?i)kerberos::silver/)=true OR match_regex(cmd_line, /(?i)misc::skeleton/)=true )
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -9826,7 +9826,7 @@ None identified.
Stolen credentials are applied by methods such as user impersonation, credential injection, spoofing of authentication processes or getting hold of critical accounts. This detection indicates such activities carried out by PowerSploit exploit kit APIs.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1055/ T1055], [https://attack.mitre.org/techniques/T1068/ T1068], [https://attack.mitre.org/techniques/T1078/ T1078], [https://attack.mitre.org/techniques/T1098/ T1098], [https://attack.mitre.org/techniques/T1134/ T1134], [https://attack.mitre.org/techniques/T1543/ T1543], [https://attack.mitre.org/techniques/T1547/ T1547], [https://attack.mitre.org/techniques/T1548/ T1548], [https://attack.mitre.org/techniques/T1554/ T1554], [https://attack.mitre.org/techniques/T1556/ T1556], [https://attack.mitre.org/techniques/T1558/ T1558]
* '''Last Updated''': 2020-11-03
@@ -9837,10 +9837,10 @@ Stolen credentials are applied by methods such as user impersonation, credential
| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
| where cmd_line != null AND ( match_regex(cmd_line, /(?i)Invoke-CredentialInjection/)=true OR match_regex(cmd_line, /(?i)Invoke-TokenManipulation/)=true OR match_regex(cmd_line, /(?i)Invoke-UserImpersonation/)=true OR match_regex(cmd_line, /(?i)Get-System/)=true OR match_regex(cmd_line, /(?i)Invoke-RevertToSelf/)=true )
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -9939,7 +9939,7 @@ None identified.
This detection identifies use of DSInternals modules that verify password strength, i.e., identify week accounts that would be easily compromised.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1078/ T1078], [https://attack.mitre.org/techniques/T1098/ T1098], [https://attack.mitre.org/techniques/T1087/ T1087], [https://attack.mitre.org/techniques/T1201/ T1201], [https://attack.mitre.org/techniques/T1552/ T1552], [https://attack.mitre.org/techniques/T1555/ T1555]
* '''Last Updated''': 2020-11-03
@@ -9950,10 +9950,10 @@ This detection identifies use of DSInternals modules that verify password streng
| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
| where cmd_line != null AND ( match_regex(cmd_line, /(?i)Test-PasswordQuality/)=true )
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -10041,10 +10041,10 @@ Attempt to add a certificate to the certificate store
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime values(Processes.process) as process max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=*certutil* (Processes.process=*-addstore*) by Processes.parent_process Processes.process_name Processes.user
-| `drop_dm_object_name("Processes")`
-| `security_content_ctime(firstTime)`
-|`security_content_ctime(lastTime)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime values(Processes.process) as process max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=*certutil* (Processes.process=*-addstore*) by Processes.parent_process Processes.process_name Processes.user
+| `drop_dm_object_name("Processes")`
+| `security_content_ctime(firstTime)`
+|`security_content_ctime(lastTime)`
| `attempt_to_add_certificate_to_untrusted_store_filter`
====Associated Analytic Story====
@@ -10108,10 +10108,10 @@ Monitor for changes of the ExecutionPolicy in the registry to the values "unrest
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path=*Software\\Microsoft\\Powershell\\1\\ShellIds\\Microsoft.PowerShell* Registry.registry_key_name=ExecutionPolicy (Registry.registry_value_name=Unrestricted OR Registry.registry_value_name=Bypass) by Registry.registry_path Registry.registry_key_name Registry.registry_value_name Registry.dest
-| `drop_dm_object_name(Registry)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path=*Software\\Microsoft\\Powershell\\1\\ShellIds\\Microsoft.PowerShell* Registry.registry_key_name=ExecutionPolicy (Registry.registry_value_name=Unrestricted OR Registry.registry_value_name=Bypass) by Registry.registry_path Registry.registry_key_name Registry.registry_value_name Registry.dest
+| `drop_dm_object_name(Registry)`
| `security_content_ctime(firstTime)`
-|`security_content_ctime(lastTime)`
+|`security_content_ctime(lastTime)`
| `attempt_to_set_default_powershell_execution_policy_to_unrestricted_or_bypass_filter`
====Associated Analytic Story====
@@ -10177,12 +10177,12 @@ This search looks for attempts to stop security-related services on the endpoint
====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 = net.exe OR Processes.process_name = sc.exe) Processes.process="* stop *" by Processes.process_name Processes.parent_process_name Processes.dest Processes.user
-| `drop_dm_object_name(Processes)`
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-|lookup security_services_lookup service as process OUTPUTNEW category, description
-| search category=security
+| 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 = net.exe OR Processes.process_name = sc.exe) Processes.process="* stop *" by Processes.process_name Processes.parent_process_name Processes.dest Processes.user
+| `drop_dm_object_name(Processes)`
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
+|lookup security_services_lookup service as process OUTPUTNEW category, description
+| search category=security
| `attempt_to_stop_security_service_filter`
====Associated Analytic Story====
@@ -10246,10 +10246,10 @@ Monitor for execution of reg.exe with parameters specifying an export of keys th
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where (Processes.process_name=reg.exe OR Processes.process_name=cmd.exe) Processes.process=*save* (Processes.process=*HKEY_LOCAL_MACHINE\\Security* OR Processes.process=*HKEY_LOCAL_MACHINE\\SAM* OR Processes.process=*HKEY_LOCAL_MACHINE\\System* OR Processes.process=*HKLM\\Security* OR Processes.process=*HKLM\\System* OR Processes.process=*HKLM\\SAM*) by Processes.user Processes.process_name Processes.process Processes.dest
-| `drop_dm_object_name(Processes)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where (Processes.process_name=reg.exe OR Processes.process_name=cmd.exe) Processes.process=*save* (Processes.process=*HKEY_LOCAL_MACHINE\\Security* OR Processes.process=*HKEY_LOCAL_MACHINE\\SAM* OR Processes.process=*HKEY_LOCAL_MACHINE\\System* OR Processes.process=*HKLM\\Security* OR Processes.process=*HKLM\\System* OR Processes.process=*HKLM\\SAM*) by Processes.user Processes.process_name Processes.process Processes.dest
+| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `attempted_credential_dump_from_registry_via_reg_exe_filter`
====Associated Analytic Story====
@@ -10302,7 +10302,7 @@ None identified.
Monitor for execution of reg.exe with parameters specifying an export of keys that contain hashed credentials that attackers may try to crack offline.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003/ T1003]
* '''Last Updated''': 2020-6-04
@@ -10310,13 +10310,13 @@ Monitor for execution of reg.exe with parameters specifying an export of keys th
====Search====
-
-| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null))
-| eval process_name=lower(ucast(map_get(input_event, "process_name"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null), dest_user_id=ucast(map_get(input_event, "dest_user_id"), "string", null), dest_device_id=ucast(map_get(input_event, "dest_device_id"), "string", null)
-| where process_name="cmd.exe" OR process_name="reg.exe"
-| where cmd_line != null AND match_regex(cmd_line, /(?i)save\s+/)=true AND ( match_regex(cmd_line, /(?i)HKLM\\Security/)=true OR match_regex(cmd_line, /(?i)HKLM\\SAM/)=true OR match_regex(cmd_line, /(?i)HKLM\\System/)=true OR match_regex(cmd_line, /(?i)HKEY_LOCAL_MACHINE\\Security/)=true OR match_regex(cmd_line, /(?i)HKEY_LOCAL_MACHINE\\SAM/)=true OR match_regex(cmd_line, /(?i)HKEY_LOCAL_MACHINE\\System/)=true )
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend(dest_device_id, dest_user_id), body = "TBD"
+
+| from read_ssa_enriched_events()
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null))
+| eval process_name=lower(ucast(map_get(input_event, "process_name"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null), dest_user_id=ucast(map_get(input_event, "dest_user_id"), "string", null), dest_device_id=ucast(map_get(input_event, "dest_device_id"), "string", null)
+| where process_name="cmd.exe" OR process_name="reg.exe"
+| where cmd_line != null AND match_regex(cmd_line, /(?i)save\s+/)=true AND ( match_regex(cmd_line, /(?i)HKLM\\Security/)=true OR match_regex(cmd_line, /(?i)HKLM\\SAM/)=true OR match_regex(cmd_line, /(?i)HKLM\\System/)=true OR match_regex(cmd_line, /(?i)HKEY_LOCAL_MACHINE\\Security/)=true OR match_regex(cmd_line, /(?i)HKEY_LOCAL_MACHINE\\SAM/)=true OR match_regex(cmd_line, /(?i)HKEY_LOCAL_MACHINE\\System/)=true )
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend(dest_device_id, dest_user_id), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -10388,10 +10388,10 @@ This search looks for flags passed to bcdedit.exe modifications to the built-in
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name = bcdedit.exe Processes.process="*recoveryenabled*" (Processes.process="* no*") by Processes.process_name Processes.process Processes.parent_process_name Processes.dest Processes.user
-| `drop_dm_object_name(Processes)`
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name = bcdedit.exe Processes.process="*recoveryenabled*" (Processes.process="* no*") by Processes.process_name Processes.process Processes.parent_process_name Processes.dest Processes.user
+| `drop_dm_object_name(Processes)`
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `bcdedit_failure_recovery_modification_filter`
====Associated Analytic Story====
@@ -10457,12 +10457,12 @@ The search looks for a batch file (.bat) written to the Windows system directory
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Filesystem.dest) as dest values(Filesystem.file_name) as file_name values(Filesystem.user) as user from datamodel=Endpoint.Filesystem by Filesystem.file_path
-| `drop_dm_object_name(Filesystem)`
-| `security_content_ctime(lastTime)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Filesystem.dest) as dest values(Filesystem.file_name) as file_name values(Filesystem.user) as user from datamodel=Endpoint.Filesystem by Filesystem.file_path
+| `drop_dm_object_name(Filesystem)`
+| `security_content_ctime(lastTime)`
| `security_content_ctime(firstTime)`
-| rex field=file_name "(?\.[^\.]+)$"
-| search file_path=*system32* AND file_extension=.bat
+| rex field=file_name "(?\.[^\.]+)$"
+| search file_path=*system32* AND file_extension=.bat
| `batch_file_write_to_system32_filter`
====Associated Analytic Story====
@@ -10516,7 +10516,7 @@ This search looks for arguments to certutil.exe indicating the manipulation or e
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
* '''Datamodel''': Endpoint
-* '''ATT&CK''':
+* '''ATT&CK''':
* '''Last Updated''': 2021-01-26
@@ -10524,10 +10524,10 @@ This search looks for arguments to certutil.exe indicating the manipulation or e
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime values(Processes.process) as process max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=certutil.exe Processes.process = "* -exportPFX *" by Processes.parent_process Processes.process_name Processes.process Processes.user
-| `drop_dm_object_name("Processes")`
-| `security_content_ctime(firstTime)`
-|`security_content_ctime(lastTime)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime values(Processes.process) as process max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=certutil.exe Processes.process = "* -exportPFX *" by Processes.parent_process Processes.process_name Processes.process Processes.user
+| `drop_dm_object_name("Processes")`
+| `security_content_ctime(firstTime)`
+|`security_content_ctime(lastTime)`
| `certutil_exe_certificate_extraction_filter`
====Associated Analytic Story====
@@ -10580,10 +10580,10 @@ This search looks for child processes of spoolsv.exe. This activity is associate
====Search====
-| tstats `security_content_summariesonly` count values(Processes.process_name) as process_name values(Processes.process) as process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.parent_process_name=spoolsv.exe AND Processes.process_name!=regsvr32.exe by Processes.dest Processes.parent_process Processes.user
-| `drop_dm_object_name(Processes)`
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| tstats `security_content_summariesonly` count values(Processes.process_name) as process_name values(Processes.process) as process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.parent_process_name=spoolsv.exe AND Processes.process_name!=regsvr32.exe by Processes.dest Processes.parent_process Processes.user
+| `drop_dm_object_name(Processes)`
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `child_processes_of_spoolsv_exe_filter`
====Associated Analytic Story====
@@ -10643,12 +10643,12 @@ The search looks for file modifications with extensions commonly used by Ransomw
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Filesystem.user) as user values(Filesystem.dest) as dest values(Filesystem.file_path) as file_path from datamodel=Endpoint.Filesystem by Filesystem.file_name
-| `drop_dm_object_name(Filesystem)`
-| `security_content_ctime(lastTime)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Filesystem.user) as user values(Filesystem.dest) as dest values(Filesystem.file_path) as file_path from datamodel=Endpoint.Filesystem by Filesystem.file_name
+| `drop_dm_object_name(Filesystem)`
+| `security_content_ctime(lastTime)`
| `security_content_ctime(firstTime)`
-| rex field=file_name "(?\.[^\.]+)$"
-| `ransomware_extensions`
+| rex field=file_name "(?\.[^\.]+)$"
+| `ransomware_extensions`
| `common_ransomware_extensions_filter`
====Associated Analytic Story====
@@ -10718,11 +10718,11 @@ The search looks for files created with names matching those typically used in r
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Filesystem.user) as user values(Filesystem.dest) as dest values(Filesystem.file_path) as file_path from datamodel=Endpoint.Filesystem by Filesystem.file_name
-| `drop_dm_object_name(Filesystem)`
-| `security_content_ctime(lastTime)`
-| `security_content_ctime(firstTime)`
-| `ransomware_notes`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Filesystem.user) as user values(Filesystem.dest) as dest values(Filesystem.file_path) as file_path from datamodel=Endpoint.Filesystem by Filesystem.file_name
+| `drop_dm_object_name(Filesystem)`
+| `security_content_ctime(lastTime)`
+| `security_content_ctime(firstTime)`
+| `ransomware_notes`
| `common_ransomware_notes_filter`
====Associated Analytic Story====
@@ -10779,7 +10779,7 @@ It's possible that a legitimate file could be created with the same name used by
Detect remote thread creation into LSASS consistent with credential dumping.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003.001/ T1003.001]
* '''Last Updated''': 2019-12-06
@@ -10787,11 +10787,11 @@ Detect remote thread creation into LSASS consistent with credential dumping.
====Search====
-
`sysmon` EventID=8 TargetImage=*lsass.exe
-| stats count min(_time) as firstTime max(_time) as lastTime by Computer, EventCode, TargetImage, TargetProcessId
-| rename Computer as dest
+`sysmon` EventID=8 TargetImage=*lsass.exe
+| stats count min(_time) as firstTime max(_time) as lastTime by Computer, EventCode, TargetImage, TargetProcessId
+| rename Computer as dest
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `create_remote_thread_into_lsass_filter`
====Associated Analytic Story====
@@ -10855,10 +10855,10 @@ This search looks for the creation of local administrator accounts using net.exe
====Search====
-| tstats `security_content_summariesonly` count values(Processes.user) as user values(Processes.parent_process) as parent_process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where (Processes.process_name=net.exe OR Processes.process_name=net1.exe) AND (Processes.process=*localgroup* OR Processes.process=*/add* OR Processes.process=*user*) by Processes.process Processes.process_name Processes.dest
-| `drop_dm_object_name(Processes)`
+| tstats `security_content_summariesonly` count values(Processes.user) as user values(Processes.parent_process) as parent_process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where (Processes.process_name=net.exe OR Processes.process_name=net1.exe) AND (Processes.process=*localgroup* OR Processes.process=*/add* OR Processes.process=*user*) by Processes.process Processes.process_name Processes.dest
+| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
|`create_local_admin_accounts_using_net_exe_filter`
====Associated Analytic Story====
@@ -10924,11 +10924,11 @@ This search looks for the creation or deletion of hidden shares using net.exe.
====Search====
-| tstats `security_content_summariesonly` count values(Processes.user) as user values(Processes.parent_process) as parent_process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where (Processs.process_name=net.exe OR Processes.process_name=net1.exe) by Processes.process Processes.process_name Processes.dest
-| `drop_dm_object_name(Processes)`
+| tstats `security_content_summariesonly` count values(Processes.user) as user values(Processes.parent_process) as parent_process min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where (Processs.process_name=net.exe OR Processes.process_name=net1.exe) by Processes.process Processes.process_name Processes.dest
+| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
-| search process=*share*
+| `security_content_ctime(lastTime)`
+| search process=*share*
| `create_or_delete_windows_shares_using_net_exe_filter`
====Associated Analytic Story====
@@ -10992,10 +10992,10 @@ Monitor for signs that Vssadmin or Wmic has been used to create a shadow copy.
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where (Processes.process_name=vssadmin.exe Processes.process=*create* Processes.process=*shadow*) OR (Processes.process_name=wmic.exe Processes.process=*shadowcopy* Processes.process=*create*) by Processes.dest Processes.user Processes.process_name Processes.process Processes.parent_process Processes.process_id Processes.parent_process_id
-| `drop_dm_object_name(Processes)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where (Processes.process_name=vssadmin.exe Processes.process=*create* Processes.process=*shadow*) OR (Processes.process_name=wmic.exe Processes.process=*shadowcopy* Processes.process=*create*) by Processes.dest Processes.user Processes.process_name Processes.process Processes.parent_process Processes.process_id Processes.parent_process_id
+| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `creation_of_shadow_copy_filter`
====Associated Analytic Story====
@@ -11059,10 +11059,10 @@ This search detects the use of wmic and Powershell to create a shadow copy.
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=wmic* OR Processes.process_name=powershell* Processes.process=*shadowcopy* Processes.process=*create* by Processes.user Processes.process_name Processes.process Processes.dest
-| `drop_dm_object_name(Processes)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=wmic* OR Processes.process_name=powershell* Processes.process=*shadowcopy* Processes.process=*create* by Processes.user Processes.process_name Processes.process Processes.dest
+| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `creation_of_shadow_copy_with_wmic_and_powershell_filter`
====Associated Analytic Story====
@@ -11117,7 +11117,7 @@ Legtimate administrator usage of wmic to create a shadow copy.
Detect the hands on keyboard behavior of Windows Task Manager creating a prcoess dump of lsass.exe. Upon this behavior occurring, a file write/modification will occur in the users profile under \AppData\Local\Temp. The dump file, lsass.dmp, cannot be renamed, however if the dump occurs more than once, it will be named lsass (2).dmp.
* '''Product''': Splunk Enterprise, Splunk Enterprise Security, Splunk Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003.001/ T1003.001]
* '''Last Updated''': 2020-02-03
@@ -11125,11 +11125,11 @@ Detect the hands on keyboard behavior of Windows Task Manager creating a prcoess
====Search====
-
`sysmon` EventID=11 process_name=taskmgr.exe TargetFilename=*lsass*.dmp
-| stats count min(_time) as firstTime max(_time) as lastTime by Computer, object_category, process_name, TargetFilename
-| rename Computer as dest
-| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+`sysmon` EventID=11 process_name=taskmgr.exe TargetFilename=*lsass*.dmp
+| stats count min(_time) as firstTime max(_time) as lastTime by Computer, object_category, process_name, TargetFilename
+| rename Computer as dest
+| `security_content_ctime(firstTime)`
+| `security_content_ctime(lastTime)`
| `creation_of_lsass_dump_with_taskmgr_filter`
====Associated Analytic Story====
@@ -11197,10 +11197,10 @@ This search detects credential dumping using copy command from a shadow copy.
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=cmd.exe (Processes.process=*\\system32\\config\\sam* OR Processes.process=*\\system32\\config\\security* OR Processes.process=*\\system32\\config\\system* OR Processes.process=*\\windows\\ntds\\ntds.dit*) by Processes.dest Processes.user Processes.process_name Processes.process Processes.parent_process Processes.process_id Processes.parent_process_id
-| `drop_dm_object_name(Processes)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=cmd.exe (Processes.process=*\\system32\\config\\sam* OR Processes.process=*\\system32\\config\\security* OR Processes.process=*\\system32\\config\\system* OR Processes.process=*\\windows\\ntds\\ntds.dit*) by Processes.dest Processes.user Processes.process_name Processes.process Processes.parent_process Processes.process_id Processes.parent_process_id
+| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `credential_dumping_via_copy_command_from_shadow_copy_filter`
====Associated Analytic Story====
@@ -11264,10 +11264,10 @@ This search detects the creation of a symlink to a shadow copy.
====Search====
-| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=cmd.exe Processes.process=*mklink* Processes.process=*HarddiskVolumeShadowCopy* by Processes.dest Processes.user Processes.process_name Processes.process Processes.parent_process Processes.process_id Processes.parent_process_id
-| `drop_dm_object_name(Processes)`
+| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name=cmd.exe Processes.process=*mklink* Processes.process=*HarddiskVolumeShadowCopy* by Processes.dest Processes.user Processes.process_name Processes.process Processes.parent_process Processes.process_id Processes.parent_process_id
+| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
-| `security_content_ctime(lastTime)`
+| `security_content_ctime(lastTime)`
| `credential_dumping_via_symlink_to_shadow_copy_filter`
====Associated Analytic Story====
@@ -11322,7 +11322,7 @@ unknown
Credential extraction is often an illegal recovery of credential material from secured authentication resources and repositories. This process may also involve decryption or other transformations of the stored credential material. FGdump is a newer version of pwdump tool that extracts NTLM and LanMan password hashes from Windows. Cachedump is a publicly-available tool that extracts cached password hashes from a system's registry.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003/ T1003]
* '''Last Updated''': 2020-10-18
@@ -11330,13 +11330,13 @@ Credential extraction is often an illegal recovery of credential material from s
====Search====
-
+
| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null), process_name=ucast(map_get(input_event, "process_name"), "string", null), process_path=ucast(map_get(input_event, "process_path"), "string", null), parent_process_name=ucast(map_get(input_event, "parent_process_name"), "string", null)
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null), process_name=ucast(map_get(input_event, "process_name"), "string", null), process_path=ucast(map_get(input_event, "process_path"), "string", null), parent_process_name=ucast(map_get(input_event, "parent_process_name"), "string", null)
| where cmd_line != null AND process_name != null AND parent_process_name != null AND match_regex(parent_process_name, /(?i)System32\\services.exe/)=true AND match_regex(process_name, /(?i)cachedump\d{0,2}.exe/)=true AND match_regex(process_path, /(?i)\\Temp/)=true AND match_regex(cmd_line, /(?i)\-s/)=true
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -11399,7 +11399,7 @@ None identified.
Credential extraction is often an illegal recovery of credential material from secured authentication resources and repositories. This process may also involve decryption or other transformations of the stored credential material. FGdump is a newer version of pwdump tool that extracts NTLM and LanMan password hashes from Windows. Cachedump is a publicly-available tool that extracts cached password hashes from a system's registry.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003/ T1003]
* '''Last Updated''': 2020-10-18
@@ -11407,13 +11407,13 @@ Credential extraction is often an illegal recovery of credential material from s
====Search====
-
+
| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null), process_name=ucast(map_get(input_event, "process_name"), "string", null), process_path=ucast(map_get(input_event, "process_path"), "string", null)
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null), process_name=ucast(map_get(input_event, "process_name"), "string", null), process_path=ucast(map_get(input_event, "process_path"), "string", null)
| where cmd_line != null AND process_name != null AND process_path != null AND match_regex(process_name, /(?i)cachedump\d{0,2}.exe/)=true AND match_regex(process_path, /(?i)\\Temp/)=true AND match_regex(cmd_line, /(?i)\-v/)=true
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -11474,7 +11474,7 @@ None identified.
Credential extraction is often an illegal recovery of credential material from secured authentication resources and repositories. This process may also involve decryption or other transformations of the stored credential material. LaZagne is a tool that extracts various kinds of credentials from a local computer, including account passwords, domain passwords, browser passwords, etc.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003/ T1003], [https://attack.mitre.org/techniques/T1555/ T1555]
* '''Last Updated''': 2020-10-18
@@ -11482,13 +11482,13 @@ Credential extraction is often an illegal recovery of credential material from s
====Search====
-
+
| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
| where cmd_line != null AND match_regex(cmd_line, /(?i)all\s+\-oA\s+\-output/)=true
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -11549,7 +11549,7 @@ None identified.
Credential extraction is often an illegal recovery of credential material from secured authentication resources and repositories. This process may also involve decryption or other transformations of the stored credential material. DSInternals is a collection of PowerShell modules commonly employed in exploits.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003/ T1003]
* '''Last Updated''': 2020-10-21
@@ -11560,10 +11560,10 @@ Credential extraction is often an illegal recovery of credential material from s
| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), process_name=ucast(map_get(input_event, "process_name"), "string", null), process_path=ucast(map_get(input_event, "process_path"), "string", null), cmd_line=ucast(map_get(input_event, "process"), "string", null), parent_process_name=ucast(map_get(input_event, "parent_process_name"), "string", null)
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), process_name=ucast(map_get(input_event, "process_name"), "string", null), process_path=ucast(map_get(input_event, "process_path"), "string", null), cmd_line=ucast(map_get(input_event, "process"), "string", null), parent_process_name=ucast(map_get(input_event, "parent_process_name"), "string", null)
| where cmd_line != null AND ( match_regex(cmd_line, /(?i)ConvertFrom-ADManagedPasswordBlob/)=true OR match_regex(cmd_line, /(?i)ConvertFrom-GPPrefPassword/)=true OR match_regex(cmd_line, /(?i)ConvertFrom-UnicodePassword/)=true OR match_regex(cmd_line, /(?i)ConvertTo-GPPrefPassword/)=true OR match_regex(cmd_line, /(?i)ConvertTo-KerberosKey/)=true OR match_regex(cmd_line, /(?i)ConvertTo-LMHash/)=true OR match_regex(cmd_line, /(?i)ConvertTo-NTHash/)=true OR match_regex(cmd_line, /(?i)ConvertTo-OrgIdHash/)=true OR match_regex(cmd_line, /(?i)ConvertTo-UnicodePassword/)=true )
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -11628,7 +11628,7 @@ None identified.
Credential extraction is often an illegal recovery of credential material from secured authentication resources and repositories. This process may also involve decryption or other transformations of the stored credential material. DSInternals is a collection of PowerShell modules commonly employed in exploits.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003/ T1003]
* '''Last Updated''': 2020-10-21
@@ -11639,10 +11639,10 @@ Credential extraction is often an illegal recovery of credential material from s
| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), process_name=ucast(map_get(input_event, "process_name"), "string", null), process_path=ucast(map_get(input_event, "process_path"), "string", null), cmd_line=ucast(map_get(input_event, "process"), "string", null), parent_process_name=ucast(map_get(input_event, "parent_process_name"), "string", null)
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), process_name=ucast(map_get(input_event, "process_name"), "string", null), process_path=ucast(map_get(input_event, "process_path"), "string", null), cmd_line=ucast(map_get(input_event, "process"), "string", null), parent_process_name=ucast(map_get(input_event, "parent_process_name"), "string", null)
| where cmd_line != null AND ( match_regex(cmd_line, /(?i)Get-ADDBBackupKey/)=true OR match_regex(cmd_line, /(?i)Get-ADDBDomainController/)=true OR match_regex(cmd_line, /(?i)Get-ADDBKdsRootKey/)=true OR match_regex(cmd_line, /(?i)Get-ADDBSchemaAttribute/)=true OR match_regex(cmd_line, /(?i)Get-ADKeyCredential/)=true OR match_regex(cmd_line, /(?i)Get-ADReplAccount/)=true OR match_regex(cmd_line, /(?i)Get-ADReplBackupKey/)=true OR match_regex(cmd_line, /(?i)Get-ADSIAccount/)=true OR match_regex(cmd_line, /(?i)Get-AzureADUserEx/)=true OR match_regex(cmd_line, /(?i)Get-BootKey/)=true OR match_regex(cmd_line, /(?i)Get-LsaBackupKey/)=true OR match_regex(cmd_line, /(?i)Get-LsaPolicyInformation/)=true OR match_regex(cmd_line, /(?i)Get-SamPasswordPolicy/)=true )
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -11707,7 +11707,7 @@ None identified.
Credential extraction is often an illegal recovery of credential material from secured authentication resources and repositories. This process may also involve decryption or other transformations of the stored credential material. Mimikatz is a collection of tools and modules commonly employed in Windows exploits.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003/ T1003]
* '''Last Updated''': 2020-10-21
@@ -11718,10 +11718,10 @@ Credential extraction is often an illegal recovery of credential material from s
| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
| where cmd_line != null AND ( match_regex(cmd_line, /(?i)CRYPTO::Certificates/)=true OR match_regex(cmd_line, /(?i)CRYPTO::keys/)=true OR match_regex(cmd_line, /(?i)kerberos::list/)=true OR match_regex(cmd_line, /(?i)kerberos::tgt/)=true OR match_regex(cmd_line, /(?i)lsadump::sam/)=true OR match_regex(cmd_line, /(?i)lsadump::secrets/)=true OR match_regex(cmd_line, /(?i)lsadump::cache/)=true OR match_regex(cmd_line, /(?i)lsadump::lsa/)=true OR match_regex(cmd_line, /(?i)lsadump::trust/)=true OR match_regex(cmd_line, /(?i)lsadump::backupkeys/)=true )
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -11780,7 +11780,7 @@ None identified.
Credential extraction is often an illegal recovery of credential material from secured authentication resources and repositories. This process may also involve decryption or other transformations of the stored credential material. PowerSploit is a collection of Microsoft PowerShell modules commonly employed in exploits.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003/ T1003]
* '''Last Updated''': 2020-10-21
@@ -11791,10 +11791,10 @@ Credential extraction is often an illegal recovery of credential material from s
| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null)
| where cmd_line != null AND ( match_regex(cmd_line, /(?i)Get-ApplicationHost/)=true OR match_regex(cmd_line, /(?i)Get-CachedGPPPassword/)=true OR match_regex(cmd_line, /(?i)Get-GPPAutologon/)=true OR match_regex(cmd_line, /(?i)Get-GPPPassword/)=true OR match_regex(cmd_line, /(?i)Get-RegistryAutoLogon/)=true OR match_regex(cmd_line, /(?i)Get-SiteListPassword/)=true OR match_regex(cmd_line, /(?i)Get-SPNTicket/)=true OR match_regex(cmd_line, /(?i)Request-SPNTicket/)=true OR match_regex(cmd_line, /(?i)Get-VaultCredential/)=true OR match_regex(cmd_line, /(?i)Invoke-Kerberoast/)=true )
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -11853,7 +11853,7 @@ None identified.
Credential extraction is often an illegal recovery of credential material from secured authentication resources and repositories. This process may also involve decryption or other transformations of the stored credential material. Native Microsoft debuggers, such as kd, ntkd, livekd and windbg, can be leveraged to read credential material directly from memory and process dumps.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003/ T1003]
* '''Last Updated''': 2020-10-18
@@ -11861,13 +11861,13 @@ Credential extraction is often an illegal recovery of credential material from s
====Search====
-
+
| from read_ssa_enriched_events()
-| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null), process_name=ucast(map_get(input_event, "process_name"), "string", null), parent_process_name=ucast(map_get(input_event, "parent_process_name"), "string", null)
+| eval timestamp=parse_long(ucast(map_get(input_event, "_time"), "string", null)), cmd_line=ucast(map_get(input_event, "process"), "string", null), process_name=ucast(map_get(input_event, "process_name"), "string", null), parent_process_name=ucast(map_get(input_event, "parent_process_name"), "string", null)
| where cmd_line != null AND parent_process_name != null AND process_name != null AND ( match_regex(parent_process_name, /(?i)ntkd\.exe/)=true OR match_regex(parent_process_name, /(?i)livekd\.exe/)=true ) AND match_regex(process_name, /(?i)conhost\.exe/)=true AND match_regex(cmd_line, /(?i)0xffffffff/)=true AND match_regex(cmd_line, /(?i)\-ForceV1/)=true
-| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
+| eval start_time = timestamp, end_time = timestamp, entities = mvappend( ucast(map_get(input_event, "dest_user_id"), "string", null), ucast(map_get(input_event, "dest_device_id"), "string", null)), body = "TBD"
| into write_ssa_detected_events();
====Associated Analytic Story====
@@ -11930,7 +11930,7 @@ Although unlikely, using debuggers this way may be indicative of developers anal
Credential extraction is often an illegal recovery of credential material from secured authentication resources and repositories. This process may also involve decryption or other transformations of the stored credential material. Native Microsoft debuggers, such as kd, ntkd, livekd and windbg, can be leveraged to read credential material directly from memory and process dumps.
* '''Product''': UEBA for Security Cloud
-* '''Datamodel''':
+* '''Datamodel''':
* '''ATT&CK''': [https://attack.mitre.org/techniques/T1003/ T1003]
* '''Last Updated''': 2020-10-18
@@ -11938,13 +11938,13 @@ Credential extraction is often an illegal recovery of credential material from s
====Search====
-
+