Branch was auto-updated.

This commit is contained in:
srv-rr-gh-researchbt
2023-10-04 13:51:46 -07:00
committed by GitHub
350 changed files with 6252 additions and 5949 deletions
@@ -99,7 +99,7 @@ class BAFactory():
if detection.status == "production":
if detection.status in ["production","validation"]:
self.output_dto.detections.append(detection)
else:
raise(Exception(f"Unsupported content type: [{type}]"))
@@ -75,6 +75,7 @@ class Detection(BaseModel, SecurityContentObject):
nes_fields: str = None
providing_technologies: list = None
runtime: str = None
internalVersion: str = None
# @validator('name')v
# def name_max_length(cls, v, values):
@@ -139,6 +140,17 @@ class Detection(BaseModel, SecurityContentObject):
if len(values["name"]) > 67:
raise ValueError("name is longer then 67 chars: " + values["name"])
return values
@root_validator
def validation_for_ba_only(cls, values):
# Ensure that only a BA detection can have status: validation
if values["status"] == "validation":
if "ssa_" not in values["file_path"]:
raise ValueError(f"The following is NOT an ssa_ detection, but has 'status: {values['status']} which may ONLY be used for ssa_ detections:' {values['file_path']}")
else:
#This is an ssa_ validation detection
pass
return values
@root_validator
@@ -40,7 +40,9 @@ class DetectionTags(BaseModel):
risk_level: str = None
observable_str: str = None
evidence_str: str = None
analytics_story_str: str = None
kill_chain_phases_id: list = None
kill_chain_phases_str: str = None
research_site_url: str = None
event_schema: str = None
mappings: list = None
@@ -59,3 +59,4 @@ class DetectionStatus(enum.Enum):
production = "production"
deprecated = "deprecated"
experimental = "experimental"
validation = "validation"
@@ -10,6 +10,37 @@ class FindingReportObject():
@staticmethod
def writeFindingReport(detection : Detection) -> None:
if detection.tags.confidence < 33:
detection.tags.confidence_id = 1
elif detection.tags.confidence < 66:
detection.tags.confidence_id = 2
else:
detection.tags.confidence_id = 3
if detection.tags.impact < 20:
detection.tags.impact_id = 1
elif detection.tags.impact < 40:
detection.tags.impact_id = 2
elif detection.tags.impact < 60:
detection.tags.impact_id = 3
elif detection.tags.impact < 80:
detection.tags.impact_id = 4
else:
detection.tags.impact_id = 5
detection.tags.kill_chain_phases_id = dict()
for kill_chain_phase in detection.tags.kill_chain_phases:
detection.tags.kill_chain_phases_id[kill_chain_phase] = SES_KILL_CHAIN_MAPPINGS[kill_chain_phase]
kill_chain_phase_str = "["
i = 0
for kill_chain_phase in detection.tags.kill_chain_phases_id.keys():
kill_chain_phase_str = kill_chain_phase_str + '{"phase": "' + kill_chain_phase + '", "phase_id": ' + str(detection.tags.kill_chain_phases_id[kill_chain_phase]) + "}"
if not i == (len(detection.tags.kill_chain_phases_id.keys()) - 1):
kill_chain_phase_str = kill_chain_phase_str + ', '
i = i + 1
kill_chain_phase_str = kill_chain_phase_str + ']'
detection.tags.kill_chain_phases_str = kill_chain_phase_str
if detection.tags.risk_score < 20:
detection.tags.risk_level_id = 0
@@ -27,15 +58,23 @@ class FindingReportObject():
detection.tags.risk_level_id = 4
detection.tags.risk_level = "Critical"
evidence_str = "create_map("
evidence_str = "{"
for i in range(len(detection.tags.observable)):
evidence_str = evidence_str + '"' + detection.tags.observable[i]["name"] + '", ' + detection.tags.observable[i]["name"].replace(".", "_")
evidence_str = evidence_str + '"' + detection.tags.observable[i]["name"] + '": ' + detection.tags.observable[i]["name"].replace(".", "_")
if not i == (len(detection.tags.observable) - 1):
evidence_str = evidence_str + ', '
evidence_str = evidence_str + ')'
evidence_str = evidence_str + '}'
detection.tags.evidence_str = evidence_str
analytics_story_str = "["
for i in range(len(detection.tags.analytic_story)):
analytics_story_str = analytics_story_str + '"' + detection.tags.analytic_story[i] + '"'
if not i == (len(detection.tags.analytic_story) - 1):
analytics_story_str = analytics_story_str + ', '
analytics_story_str = analytics_story_str + ']'
detection.tags.analytics_story_str = analytics_story_str
if "actor.user.name" in detection.tags.required_fields:
actor_user_name = "actor_user_name"
else:
@@ -66,7 +66,8 @@ class ObjToYmlAdapter(Adapter):
"nist": obj.tags.nist
}
obj.runtime = "SPL-DSP"
obj.runtime = "SPL2"
obj.internalVersion = 2
# remove unncessary fields
YmlWriter.writeYmlFile(file_path, obj.dict(
@@ -84,6 +85,7 @@ class ObjToYmlAdapter(Adapter):
"known_false_positives": True,
"references": True,
"runtime": True,
"internalVersion": True,
"tags":
{
#"analytic_story": True,
@@ -1,28 +1,30 @@
| eval body=create_map(
"devices", [
create_map(
"hostname", device_hostname, "type_id", 0, "uuid", ucast(map_get(device,"uuid"), "string", null)
)
],
"time", timestamp,
"evidence", {{ detection.tags.evidence_str }},
"message", concat("{{ detection.name }} has been triggered on ", device_hostname, " by ", {{ actor_user_name }}, "."),
"users", [
create_map(
"name", {{ actor_user_name }}, "uid", ucast(map_get(actor_user,"uid"), "string", null)
)
],
"activity_id", 1,
"category_uid", 2,
"class_uid", 102001,
"risk_level_id", {{ detection.tags.risk_level_id }},
"risk_score", {{ detection.tags.risk_score }},
"severity_id", 0,
"rule", create_map("name", "{{ detection.name }}", "uid", "{{ detection.id }}", "type", "Streaming"),
"metadata", create_map("customer_uid", ucast(map_get(metadata,"customer_uid"), "string", null), "product", create_map("name", "Behavior Analytics", "vendor_name", "Splunk"), "version", "1.0.0-rc.2", "logged_time", time()),
"type_uid", 10200101,
"start_time", timestamp,
"end_time", timestamp
)
| into write_ba_finding_events();
| eval devices = [{"hostname": device_hostname, "type_id": 0, "uuid": device.uuid}],
time = timestamp,
evidence = {{ detection.tags.evidence_str }},
message = "{{ detection.name }} has been triggered on " + device_hostname + " by " + {{ actor_user_name }} + ".",
users = [{"name": {{ actor_user_name }}, "uid": actor_user.uid}],
activity_id = 1,
cis_csc = [{"control": "CIS 10", "version": 8}],
analytic_stories = {{ detection.tags.analytics_story_str }},
class_name = "Detection Report",
confidence = {{ detection.tags.confidence }},
confidence_id = {{ detection.tags.confidence_id }},
duration = 0,
impact = {{ detection.tags.impact }},
impact_id = {{ detection.tags.impact_id }},
kill_chain = {{ detection.tags.kill_chain_phases_str }},
nist = ["DE.AE"],
risk_level = "{{ detection.tags.risk_level }}",
category_uid = 2,
class_uid = 102001,
risk_level_id = {{ detection.tags.risk_level_id }},
risk_score = {{ detection.tags.risk_score }},
severity_id = 0,
rule = {"name": "{{ detection.name }}", "uid": "{{ detection.id }}", "type": "Streaming"},
metadata = {"customer_uid": metadata.customer_uid, "product": {"name": "Behavior Analytics", "vendor_name": "Splunk"}, "version": "1.0.0-rc.2", "logged_time": time()},
type_uid = 10200101,
start_time = timestamp,
end_time = timestamp
| fields metadata, rule, activity_id, analytic_stories, cis_csc, category_uid, class_name, class_uid, confidence, confidence_id, devices, duration, time, evidence, impact, impact_id, kill_chain, message, nist, observables, risk_level, risk_level_id, risk_score, severity_id, type_uid, users, start_time, end_time
| into sink;
@@ -33,7 +33,7 @@ class SplunkBABackend(TextQueryBackend):
wildcard_single : ClassVar[str] = "%"
add_escaped : ClassVar[str] = "\\"
re_expression : ClassVar[str] = "match_regex({field}, /(?i){regex}/)=true"
re_expression : ClassVar[str] = "match({field}, /(?i){regex}/)=true"
re_escape_char : ClassVar[str] = ""
re_escape : ClassVar[Tuple[str]] = ('"',)
@@ -64,7 +64,7 @@ class SplunkBABackend(TextQueryBackend):
deferred_separator : ClassVar[str] = " OR "
deferred_only_query : ClassVar[str] = "*"
wildcard_match_expression : ClassVar[Optional[str]] = "like({field}, {value})"
wildcard_match_expression : ClassVar[Optional[str]] = "{field} LIKE {value}"
def __init__(self, processing_pipeline: Optional["sigma.processing.pipeline.ProcessingPipeline"] = None, collect_errors: bool = False, min_time : str = "-30d", max_time : str = "now", detection : Detection = None, field_mapping: dict = None, **kwargs):
@@ -88,32 +88,29 @@ class SplunkBABackend(TextQueryBackend):
# fields_input_parsing = fields_input_parsing + ', '
detection_str = """
| from read_ba_enriched_events()
| eval timestamp = ucast(map_get(input_event,"time"),"long", null)
| eval metadata = ucast(map_get(input_event, "metadata"),"map<string, any>", null)
| eval metadata_uid = ucast(map_get(metadata, "uid"),"string", null)
$main = from source
| eval timestamp = time
| eval metadata_uid = metadata.uid
""".replace("\n", " ")
parsed_fields = []
for field in self.field_mapping["mapping"].keys():
mapped_field = self.field_mapping["mapping"][field]
parent = 'input_event'
parent = 'parent'
i = 1
values = mapped_field.split('.')
for val in values:
if parent == "input_event":
new_val = val
if parent == "parent":
parent = val
continue
else:
new_val = parent + '_' + val
if new_val in parsed_fields:
parent = new_val
i = i + 1
continue
if i == len(values):
parser_str = '| eval ' + new_val + '' + '=ucast(map_get(' + parent + ',"' + val + '"), "string", null) '
else:
parser_str = '| eval ' + new_val + '' + '=ucast(map_get(' + parent + ',"' + val + '"), "map<string, any>", null) '
parser_str = '| eval ' + new_val + ' = ' + parent + '.' + val + ' '
detection_str = detection_str + parser_str
parsed_fields.append(new_val)
parent = new_val
@@ -121,8 +118,6 @@ class SplunkBABackend(TextQueryBackend):
detection_str = detection_str + "| where " + query
detection_str = detection_str.replace("\\\\\\\\", "\\\\")
return detection_str
def finalize_output_data_model(self, queries: List[str]) -> List[str]:
@@ -8,9 +8,7 @@ type: Correlation
description:
The following correlation will take risk associated with the content
from "Suspicious Okta Activity" and "Okta MFA Exhaustion" analytic stories and
tally it up. Once it hits the threshold of 100 (may be changed), it will trigger
an anomaly. As needed, reduce or raise the risk scores assocaited with the anomaly
and TTP analytics tagged to these two stories.
tally it up. Once it hits the threshold of 100 (can be changed), it will trigger an a notable. As needed, reduce or raise the risk scores assocaited with the anomaly and TTP analytics tagged to these two analytic stories.
data_source: []
search:
'| tstats `security_content_summariesonly` sum(All_Risk.calculated_risk_score) as risk_score,
@@ -44,19 +42,13 @@ tags:
asset_type: Infrastructure
confidence: 80
impact: 70
message:
Risk threshold exceeded for $risk_object_type$=$risk_object$ related to
Okta events.
message: Risk score $risk_score$ threshold exceeded for $risk_object$ related to Okta events.
mitre_attack_id:
- T1078
- T1110
observable:
- name: risk_object
type: Other
role:
- Victim
- name: risk_object_type
type: Other
type: Hostname
role:
- Victim
product:
@@ -0,0 +1,58 @@
name: Splunk Absolute Path Traversal Using runshellscript
id: 356bd3fe-f59b-4f64-baa1-51495411b7ad
version: 1
date: '2023-09-05'
author: Rod Soto
status: production
type: Hunting
data_source: []
description: In Splunk Enterprise versions lower than 8.2.12, 9.0.6, and 9.1.1, an attacker can exploit an absolute path traversal to execute arbitrary code that is located on a separate disk.
search: >
`splunk_python` *runshellscript*
| eval log_split=split(_raw, "runshellscript: ")
| eval array_raw = mvindex(log_split,1)
| eval data_cleaned=replace(replace(replace(array_raw,"\[",""),"\]",""),"'","")
| eval array_indices=split(data_cleaned,",")
| eval runshellscript_args_count=mvcount(array_indices)
| where runshellscript_args_count = 10
| eval interpreter=mvindex(array_indices,0)
| eval targetScript=mvindex(array_indices,1)
| eval targetScript != "*C:*"
| stats count min(_time) as firstTime max(_time) as lastTime by splunk_server interpreter targetScript
| `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
| `splunk_absolute_path_traversal_using_runshellscript_filter`
how_to_implement: Must have access to internal indexes. Only applies to Splunk on Windows versions.
known_false_positives: The command runshellscript can be used for benign purposes. Analyst will have to review the searches and determined maliciousness specially by looking at targeted script.
references:
- https://advisory.splunk.com/advisories/SVD-2023-0806
tags:
analytic_story:
- Splunk Vulnerabilities
asset_type: endpoint
confidence: 70
impact: 50
message: Possible attack against splunk_server $splunk_server$ through abuse of the runshellscript command
mitre_attack_id:
- T1083
cve:
- CVE-2023-40597
observable:
- name: splunk_server
type: Hostname
role:
- Victim
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
risk_score: 35
required_fields:
- search
security_domain: endpoint
tests:
- name: True Positive Test
attack_data:
- data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1083/splunk/splunk_absolute_path_traversal_using_runshellscript_splunk_python.log
source: python.log
sourcetype: splunk_python
custom_index: _internal
@@ -14,7 +14,7 @@ description: In Splunk Enterprise versions below 8.1.13, 8.2.10, and 9.0.4, a cr
this vulnerability.
data_source: []
search: '`splunkda` uri_path="/en-US/splunkd/__raw/services/ssg/kvstore_client" method="GET"
delete_field_value="spacebridge_server" status="200" | table splunk_server status
delete_field_value="spacebridge_server" status="200" | table splunk_server status
uri delete_field_value method post_data | `splunk_csrf_in_the_ssg_kvstore_client_endpoint_filter`'
how_to_implement: Requires access to internal index.
known_false_positives: This hunting search only applies to the affected versions and
@@ -31,7 +31,7 @@ tags:
cve:
- CVE-2023-22942
impact: 50
message: Potential CSRF exploitation attempt from $host$
message: Potential CSRF exploitation attempt from $splunk_server$
mitre_attack_id:
- T1189
observable:
@@ -0,0 +1,46 @@
name: Splunk DoS Using Malformed SAML Request
id: 8e8a86d5-f323-4567-95be-8e817e2baee6
version: 1
date: '2023-09-05'
author: Rod Soto
status: production
type: Hunting
data_source: []
description: In Splunk Enterprise versions lower than 9.0.6, and 8.2.12, an attacker can send a malformed security assertion markup language SAML request to the /saml/acs REST endpoint which can cause a denial of service through a crash or hang of the Splunk daemon.The SAML extensible markup language (XML) parser does not fail SAML signature validation when the attacker modifies the URI in the SAML request. Instead it attempts to access the modified URI, which causes the Splunk daemon to crash or hang.
search: '`splunkd` event_message=*error* expr=*xpointer* | stats count min(_time) as firstTime max(_time) as lastTime by component expr splunk_server event_message | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)` | `splunk_dos_using_malformed_saml_request_filter`'
how_to_implement: To run this search, you must have access to the _internal index.
known_false_positives: This search will show false positives. The analyst must look for errors and a pointer indicating a malicious file.
references:
- https://advisory.splunk.com/advisories/SVD-2023-0802
tags:
analytic_story:
- Splunk Vulnerabilities
asset_type: endpoint
confidence: 30
impact: 50
message: Possible DoS attack against Splunk Server $splunk_server$
mitre_attack_id:
- T1498
observable:
- name: splunk_server
type: Hostname
role:
- Victim
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
risk_score: 15
required_fields:
- component
- expr
- host
- event_message
security_domain: endpoint
tests:
- name: True Positive Test
attack_data:
- data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1498/splunk/splunk_dos_using_malformed_saml_request_splunkd.log
source: splunkd.log
sourcetype: splunkd
custom_index: _internal
@@ -0,0 +1,62 @@
name: Splunk RCE via Serialized Session Payload
id: d1d8fda6-874a-400f-82cf-dcbb59d8e4db
version: 1
date: '2023-10-02'
author: Chase Franklin, Rod Soto, Eric McGinnis, Splunk
status: production
type: Hunting
description: In Splunk Enterprise versions lower than 8.2.12, 9.0.6, and 9.1.1, an attacker can execute a specially crafted query that
they can then use to serialize untrusted data. The attacker can use the query to execute arbitrary code. The exploit requires the use
of the 'collect' SPL command which writes a file within the Splunk Enterprise installation. The attacker can then use this file to
submit a serialized payload that can result in execution of code within the payload. Please refer to the
following URL for additional information on these disclosures - https://advisory.splunk.com
data_source: []
search: '`audit_searches` file=* (search="*makeresults*" AND search="*collect*")
| stats count min(_time) as firstTime max(_time) as lastTime by action file user splunk_server search
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `splunk_rce_via_serialized_session_payload_filter`'
how_to_implement: Requires access to the _audit index.
known_false_positives: There are numerous many uses of the 'makeresults' and 'collect' SPL commands.
Please evaluate the results of this search for potential abuse.
references:
- https://www.splunk.com/en_us/product-security.html
tags:
analytic_story:
- Splunk Vulnerabilities
asset_type: Endpoint
confidence: 50
cve:
- CVE-2023-40595
impact: 50
message: Potential abuse of the 'collect' SPL command against $splunk_server$ by detected by $user$
mitre_attack_id:
- T1190
observable:
- name: user
type: User
role:
- Attacker
- name: splunk_server
type: Hostname
role:
- Victim
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
required_fields:
- search
- info
- user
- search_type
- count
risk_score: 25
security_domain: threat
tests:
- name: True Positive Test
attack_data:
- data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1190/splunk/splunk_rce_via_serialized_session_payload_audittrail.log
source: audittrail
sourcetype: audittrail
custom_index: _audit
@@ -0,0 +1,49 @@
name: Splunk Reflected XSS on App Search Table Endpoint
id: 182f9080-4137-4629-94ac-cb1083ac981a
version: 1
date: '2023-09-05'
author: Rod Soto
status: production
type: Hunting
data_source: []
description: In Splunk Enterprise versions below 9.1.1, 9.0.6, and 8.2.12, an attacker can craft a special web request that can result in reflected cross-site scripting XSS on the app search table web endpoint, which presents as the Create Table View page in Splunk Web. Exploitation of this vulnerability can lead to the execution of arbitrary commands on the Splunk platform instance. A JavaScript file within this web endpoint does not properly validate input which lets an attacker insert a payload into a function.
search: '`splunkd_web` (dataset_commands="*makeresults*" AND dataset_commands="*count*" AND dataset_commands="*eval*" AND dataset_commands="*baseSPL*") | stats count min(_time) as firstTime max(_time) as lastTime by clientip status user view root uri_path | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)` | `splunk_reflected_xss_on_app_search_table_endpoint_filter`'
how_to_implement: Need access to the internal indexes.
known_false_positives: This search will produce false positives. It is necessary to also look at uri_query parameter to determine the possible malicious intention of inserting makeresults within the uri string.
references:
- https://advisory.splunk.com/advisories/SVD-2023-0801
tags:
analytic_story:
- Splunk Vulnerabilities
asset_type: endpoint
confidence: 40
impact: 30
message: Possible XSS attack against from $user$
mitre_attack_id:
- T1189
observable:
- name: user
type: User
role:
- Attacker
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
risk_score: 12
required_fields:
- dataset_commands
- clientip
- status
- user
- view
- root
- uri_path
security_domain: endpoint
tests:
- name: True Positive Test
attack_data:
- data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1189/splunk/splunk_reflected_xss_on_app_search_table_endpoint_splunk_web_access.log
source: web_access.log
sourcetype: splunk_web_access
custom_index: _internal
@@ -9,12 +9,15 @@ description: This search looks for a variety of high-risk commands throughout
a number of different Splunk Vulnerability Disclosures. Please refer to the
following URL for additional information on these disclosures - https://advisory.splunk.com
data_source: []
search: '| tstats count min(_time) as firstTime max(_time) as lastTime from datamodel=Splunk_Audit.Search_Activity
search: '| tstats fillnull_value="N/A" count min(_time) as firstTime max(_time) as lastTime from datamodel=Splunk_Audit.Search_Activity
where Search_Activity.search_type=adhoc Search_Activity.user!=splunk-system-user
by Search_Activity.search Search_Activity.info Search_Activity.total_run_time Search_Activity.user
Search_Activity.search_type | `drop_dm_object_name(Search_Activity)` | lookup splunk_risky_command
splunk_risky_command as search output splunk_risky_command description vulnerable_versions
CVE other_metadata | where splunk_risky_command != "false" | `splunk_risky_command_abuse_disclosed_february_2023_filter`'
CVE other_metadata | where splunk_risky_command != "false"
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `splunk_risky_command_abuse_disclosed_february_2023_filter`'
how_to_implement: Requires implementation of Splunk_Audit.Search_Activity datamodel.
known_false_positives: This search encompasses many commands.
references:
@@ -32,10 +35,12 @@ tags:
- CVE-2023-22939
- CVE-2023-22940
- CVE-2023-40598
- CVE-2023-40598
impact: 50
message: Use of risky splunk command $splunk_risky_command$ detected by $user$
mitre_attack_id:
- T1548
- T1202
observable:
- name: user
type: User
@@ -67,6 +72,12 @@ tests:
- name: True Positive Test runshellscript abuse
attack_data:
- data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1548/splunk/splunk_runshellscript_abuse.log
source: audittrail
sourcetype: audittrail
custom_index: _audit
- name: True Positive Test Additional runshellscript abuse
attack_data:
- data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1202/splunk/splunk_cmd_injection_using_external_lookups_audittrail.log
source: audittrail
sourcetype: audittrail
custom_index: _audit
@@ -11,7 +11,7 @@ description: This search looks for AWS CloudTrail events and analyse the amount
data_source: []
search: '`cloudtrail` eventName=Describe* OR eventName=List* OR eventName=Get* |
stats dc(eventName) as dc_events min(_time) as firstTime max(_time) as lastTime
values(eventName) as eventName values(src) as src values(userAgent) as userAgent
values(eventName) as command values(src) as src values(userAgent) as userAgent
by user userIdentity.arn | where dc_events > 50 | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`|`aws_excessive_security_scanning_filter`'
how_to_implement: You must install splunk AWS add on and Splunk App for AWS. This
@@ -25,9 +25,7 @@ tags:
asset_type: AWS Account
confidence: 60
impact: 30
message: user $user$ has excessive number of api calls $dc_events$ from these IP
addresses $src$, violating the threshold of 50, using the following commands
$command$.
message: User $user$ has excessive number of api calls $dc_events$ from these IP addresses $src$, violating the threshold of 50, using the following commands $command$.
mitre_attack_id:
- T1526
observable:
@@ -38,7 +36,7 @@ tags:
- name: user
type: User
role:
- Attacker
- Victim
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -5,8 +5,7 @@ date: '2021-01-11'
author: Bhavin Patel, Patrick Bareiss, Splunk
status: production
type: TTP
description: The search looks for AWS CloudTrail events to detect if any network ACLs
were created with all the ports open to a specified CIDR.
description: The search looks for AWS CloudTrail events to detect if any network ACLs were created with all the ports open to a specified CIDR.
data_source: []
search: '`cloudtrail` eventName=CreateNetworkAclEntry OR eventName=ReplaceNetworkAclEntry
requestParameters.ruleAction=allow requestParameters.egress=false requestParameters.aclProtocol=-1
@@ -14,7 +13,7 @@ search: '`cloudtrail` eventName=CreateNetworkAclEntry OR eventName=ReplaceNetwor
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
as lastTime by userName user_arn 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)` | `aws_network_access_control_list_created_with_all_open_ports_filter`'
@@ -31,8 +30,7 @@ tags:
asset_type: AWS Instance
confidence: 80
impact: 60
message: User $user_arn$ has created network ACLs with all the ports open to a specified
CIDR $requestParameters.cidrBlock$
message: User $user_arn$ has created network ACLs with all the ports open to a specified CIDR $requestParameters.cidrBlock$
mitre_attack_id:
- T1562.007
- T1562
@@ -41,14 +39,10 @@ tags:
type: IP Address
role:
- Attacker
- name: userName
- name: user_arn
type: User
role:
- Victim
- name: requestParameters.cidrBlock
type: IP Address
role:
- Victim
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -30,7 +30,7 @@ tags:
asset_type: AWS Account
confidence: 60
impact: 50
message: From IP address $sourceIPAddress$, user agent $userAgent$ has trigged an
message: From IP address $src$, user $user_arn$ has trigged an
event $eventName$ for updating the the default policy version
mitre_attack_id:
- T1078.004
+1 -1
View File
@@ -29,7 +29,7 @@ tags:
asset_type: AWS Account
confidence: 60
impact: 50
message: From IP address $sourceIPAddress$, user agent $userAgent$ has trigged an
message: From IP address $src$, user agent $userAgent$ has trigged an
event $eventName$ for updating the existing login profile, potentially giving
user $user_arn$ more access privilleges
mitre_attack_id:
@@ -14,8 +14,8 @@ search: ' `azuread` (operationName="Enable account" OR operationName="Reset pass
OR operationName="Update user") | transaction properties.targetResources{}.userPrincipalName
startsWith=(operationName="Enable account") endsWith=(operationName="Reset password (by admin)") maxspan=2m
| rename properties.* as * | rename targetResources{}.userPrincipalName
as userPrincipalName | rename initiatedBy.user.userPrincipalName as initiatedBy
| stats values(operationName) values(initiatedBy) as initiatedBy by _time, userPrincipalName,
as user | rename initiatedBy.user.userPrincipalName as initiatedBy
| stats values(operationName) values(initiatedBy) as initiatedBy by _time, user,
result | `azure_ad_user_enabled_and_password_reset_filter`'
how_to_implement: You must install the latest version of Splunk Add-on for Microsoft
Cloud Services from Splunkbase(https://splunkbase.splunk.com/app/3110/#/details).
@@ -36,12 +36,12 @@ tags:
mitre_attack_id:
- T1098
observable:
- name: userPrincipalName
type: User Name
- name: user
type: User
role:
- Victim
- name: initiatedBy
type: User Name
type: User
role:
- Attacker
product:
@@ -46,7 +46,7 @@ tags:
asset_type: AWS Instance
confidence: 60
impact: 30
message: User $user$ is starting or creating an instance $dest$ for the first time
message: User $user$ is starting or creating an instance $object$ for the first time
in City $City$ from IP address $src$
mitre_attack_id:
- T1078
@@ -54,7 +54,7 @@ tags:
- name: user
type: User
role:
- Attacker
- Victim
- name: src
type: IP Address
role:
@@ -36,8 +36,7 @@ tags:
asset_type: Google Cloud Platform tenant
confidence: 90
impact: 60
message: Multiple failed login attempts against users $tried_accounts$ seen from
$src_ip$
message: Multiple failed login attempts against users $tried_accounts$ seen from $src$
mitre_attack_id:
- T1586
- T1586.003
@@ -44,7 +44,7 @@ tags:
confidence: 90
impact: 60
message: Unusual number of failed console login attempts against users $tried_accounts$
seen from $src_ip$
seen from $src$
mitre_attack_id:
- T1586
- T1586.003
@@ -11,7 +11,7 @@ description: This search is designed to detect the creation of a new Federation
providing an additional layer of security for your environment.
data_source: []
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 UserId dest ResultStatus
| stats count min(_time) as firstTime max(_time) as lastTime values(Actor{}.ID) as Actor.ID values(Actor{}.Type) as Actor.Type values(ModifiedProperties{}.Name) as modified_properties_name by user dest ResultStatus Operation
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `o365_add_app_role_assignment_grant_user_filter`'
@@ -30,16 +30,15 @@ tags:
asset_type: Office 365
confidence: 60
impact: 30
message: User $Actor.ID$ has created a new federation setting on $dest$ from IP
Address $ActorIpAddress$
message: User $user$ has created a new federation setting $modified_properties_name$ on $dest$
mitre_attack_id:
- T1136.003
- T1136
observable:
- name: UserId
- name: user
type: User
role:
- Attacker
- Victim
- name: dest
type: Endpoint
role:
+1 -2
View File
@@ -25,8 +25,7 @@ tags:
asset_type: Office 365
confidence: 80
impact: 80
message: User $user$ has executed an operation $Operation$ for this destination
$dest$
message: User $src_user$ has executed an operation $action$ for user $user$
mitre_attack_id:
- T1556
observable:
@@ -6,10 +6,9 @@ author: Rod Soto, Splunk
status: production
type: Anomaly
description: The following analytic 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.
logon errors. Excessive logon errors may indicate attempts to bruteforce of password or single sign on token hijack or reuse.
data_source: []
search: '`o365_management_activity` Workload=AzureActiveDirectory LogonError=*Sso* Operation=UserLoginFailed | stats count min(_time) as firstTime max(_time) as lastTime by user src_ip LogonError user_agent UserId Operation Workload authentication_method authentication_service| where count >= 5 | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `o365_excessive_sso_logon_errors_filter`'
search: '`o365_management_activity` Workload=AzureActiveDirectory LogonError=*Sso* Operation=UserLoginFailed | stats count min(_time) as firstTime max(_time) as lastTime values(user) as user by src_ip signature user_agent authentication_service action| where count >= 5 | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `o365_excessive_sso_logon_errors_filter`'
how_to_implement: You must install splunk Microsoft Office 365 add-on. This search
works with o365:management:activity
known_false_positives: Logon errors may not be malicious in nature however it may
@@ -23,8 +22,7 @@ tags:
asset_type: Office 365
confidence: 80
impact: 80
message: User $user$ has caused excessive number of SSO logon errors from $src_ip$
using UserAgent $UserAgent$.
message: Excessive number of SSO logon errors from $src_ip$ using UserAgent $user_agent$.
mitre_attack_id:
- T1556
observable:
@@ -3,17 +3,15 @@ id: 29e307ba-40af-4ab2-91b2-3c6b392bbba0
version: 1
date: '2019-12-03'
author: Patrick Bareiss, Splunk
status: production
status: deprecated
type: TTP
description: This search looks for reading loaded Images unique to credential dumping
with Mimikatz. Deprecated because mimikatz libraries changed and very noisy sysmon
Event Code.
with Mimikatz. Deprecated because mimikatz libraries changed and very noisy sysmon Event Code.
data_source:
- Sysmon Event ID 7
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 | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
as ProcessId by dest, Image | search ImageLoaded=*WinSCard.dll ImageLoaded=*cryptdll.dll
ImageLoaded=*hid.dll ImageLoaded=*samlib.dll ImageLoaded=*vaultcli.dll | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
| `detect_mimikatz_using_loaded_images_filter`'
how_to_implement: This search needs Sysmon Logs and a sysmon configuration, which
includes EventCode 7 with powershell.exe. This search uses an input macro named
@@ -40,7 +38,7 @@ tags:
confidence: 80
impact: 80
message: A process, $Image$, has loaded $ImageLoaded$ that are typically related
to credential dumping on $Computer$. Review for further details.
to credential dumping on $dest$. Review for further details.
mitre_attack_id:
- T1003.001
- T1003
@@ -49,18 +47,10 @@ tags:
type: User
role:
- Victim
- name: Computer
- name: dest
type: Hostname
role:
- Victim
- name: ImageLoaded
type: Process
role:
- Other
- name: Image
type: Process
role:
- Child Process
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -70,7 +60,7 @@ tags:
- EventCode
- ImageLoaded
- ProcessId
- Computer
- dest
- Image
risk_score: 64
security_domain: endpoint
@@ -17,8 +17,7 @@ description: 'Detect a renamed instance of procdump.exe dumping the lsass proces
data_source:
- Sysmon Event ID 1
search: '`sysmon` OriginalFileName=procdump process_name!=procdump*.exe EventID=1
(CommandLine=*-ma* OR CommandLine=*-mm*) CommandLine=*lsass* | rename Computer as
dest | stats count min(_time) as firstTime max(_time) as lastTime by dest, parent_process_name,
(CommandLine=*-ma* OR CommandLine=*-mm*) CommandLine=*lsass* | stats count min(_time) as firstTime max(_time) as lastTime by dest, parent_process_name,
process_name, OriginalFileName, CommandLine | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `dump_lsass_via_procdump_rename_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information
@@ -64,7 +63,7 @@ tags:
- process_name
- EventID
- CommandLine
- Computer
- dest
- parent_process_name
risk_score: 80
security_domain: endpoint
@@ -10,8 +10,8 @@ description: This search detects loading of unsigned images by LSASS. Deprecated
data_source:
- Sysmon Event ID 7
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 | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
as firstTime max(_time) as lastTime by dest, Image, ImageLoaded, Signed, SHA1
| `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
| `unsigned_image_loaded_by_lsass_filter` '
how_to_implement: This search needs Sysmon Logs with a sysmon configuration, which
includes EventCode 7 with lsass.exe. This search uses an input macro named `sysmon`.
@@ -9,8 +9,8 @@ description: The following analytic is designed to detect potentially malicious
data_source:
- Sysmon Event ID 1
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 | `security_content_ctime(firstTime)`|
| stats count min(_time) as firstTime max(_time) as lastTime by dest, TargetImage,
TargetProcessId, SourceImage, SourceProcessId | `security_content_ctime(firstTime)`|
`security_content_ctime(lastTime)` | `access_lsass_memory_for_dump_creation_filter` '
how_to_implement: This search requires Sysmon Logs and a Sysmon configuration, which
includes EventCode 10 for lsass.exe. This search uses an input macro named `sysmon`.
@@ -53,7 +53,7 @@ tags:
- EventCode
- TargetImage
- CallTrace
- Computer
- dest
- TargetProcessId
- SourceImage
- SourceProcessId
@@ -13,7 +13,7 @@ data_source:
- Powershell 4104
search: '`powershell` EventCode=4104 ScriptBlockText = "*[adsisearcher]*" ScriptBlockText
= "*objectcategory=user*" ScriptBlockText = "*.findAll()*" | stats count min(_time)
as firstTime max(_time) as lastTime by EventCode Computer ScriptBlockText UserID
as firstTime max(_time) as lastTime by EventCode Computer ScriptBlockText UserID | rename Computer as dest, UserID as user
| `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `adsisearcher_account_discovery_filter`'
how_to_implement: The following Hunting analytic requires PowerShell operational logs
to be imported. Modify the powershell macro as needed to match the sourcetype or
@@ -31,16 +31,16 @@ tags:
asset_type: Endpoint
confidence: 50
impact: 50
message: powershell process having commandline $Message$ for user enumeration
message: Powershell process having commandline "AdsiSearcher" used for user enumeration on $dest$
mitre_attack_id:
- T1087.002
- T1087
observable:
- name: Computer
- name: dest
type: Hostname
role:
- Victim
- name: UserID
- name: user
type: User
role:
- Victim
@@ -29,6 +29,7 @@ tags:
- Prohibited Traffic Allowed or Protocol Mismatch
- Windows Registry Abuse
- Azorult
- NjRAT
asset_type: Endpoint
confidence: 50
impact: 50
@@ -37,6 +37,7 @@ tags:
- Ransomware
- Revil Ransomware
- BlackByte Ransomware
- NjRAT
asset_type: Endpoint
confidence: 50
impact: 50
@@ -15,7 +15,7 @@ data_source:
- Sysmon Event ID 1
search: '| tstats `security_content_summariesonly` min(_time) as firstTime max(_time)
as lastTime from datamodel=Endpoint.Processes where `process_cmd` AND Processes.process="*
/c *" by Processes.dest Processes.user Processes.parent_process Processes.process_name
/c *" by Processes.dest Processes.user Processes.parent_process_name Processes.parent_process Processes.process_name
Processes.original_file_name Processes.process Processes.process_id Processes.parent_process_id
| `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `cmd_carry_out_string_command_parameter_filter`'
@@ -50,14 +50,14 @@ tags:
- Azorult
- Data Destruction
- Warzone RAT
- NjRAT
asset_type: Endpoint
automated_detection_testing: passed
confidence: 50
cve:
- CVE-2021-44228
impact: 60
message: An instance of $parent_process_name$ spawning $process_name$ was identified
on endpoint $dest$ by user $user$ attempting spawn a new process.
message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ by user $user$ attempting spawn a new process.
mitre_attack_id:
- T1059.003
- T1059
@@ -13,7 +13,7 @@ data_source:
search: '`sysmon` EventCode=7 ImageLoaded IN ("*\\CMLUA.dll", "*\\CMSTPLUA.dll",
"*\\CMLUAUTIL.dll") NOT(process_name IN("CMSTP.exe", "CMMGR32.exe")) NOT(Image IN("*\\windows\\*",
"*\\program files*")) | stats count min(_time) as firstTime max(_time) as lastTime
by dest Image ImageLoaded process_name Computer EventCode Signed ProcessId | `security_content_ctime(firstTime)`
by dest Image ImageLoaded process_name EventCode Signed ProcessId | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `cmlua_or_cmstplua_uac_bypass_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
logs with the process name and imageloaded executions from your endpoints. If you
@@ -49,7 +49,7 @@ tags:
- Image
- ImageLoaded
- process_name
- Computer
- dest
- EventCode
- Signed
- ProcessId
@@ -22,8 +22,7 @@ data_source:
search: '`sysmon` EventID=17 OR EventID=18 PipeName IN (\\msagent_*, \\DserNamePipe*,
\\srvsvc_*, \\postex_*, \\status_*, \\MSSE-*, \\spoolss_*, \\win_svc*, \\ntsvcs*,
\\winsock*, \\UIA_PIPE*) | stats count min(_time) as firstTime max(_time) as lastTime
by Computer, process_name, process_id process_path, PipeName | rename Computer as
dest | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
by dest, process_name, process_id process_path, PipeName | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `cobalt_strike_named_pipes_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
logs with the process name, parent process, and command-line executions from your
@@ -70,7 +69,7 @@ tags:
- _time
- EventID
- PipeName
- Computer
- dest
- process_name
- process_path
- process_id
@@ -13,7 +13,7 @@ data_source:
- Sysmon Event ID 8
search: '`sysmon` EventCode=8 TargetImage IN ("*\\cmd.exe", "*\\powershell*") | stats
count min(_time) as firstTime max(_time) as lastTime by TargetImage TargetProcessId
SourceProcessId EventCode StartAddress SourceImage Computer | `security_content_ctime(firstTime)`
SourceProcessId EventCode StartAddress SourceImage dest | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `create_remote_thread_in_shell_application_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
logs with the process name, parent process, and command-line executions from your
@@ -31,11 +31,11 @@ tags:
confidence: 100
impact: 70
message: process $SourceImage$ create a remote thread to shell app process $TargetImage$
in host $Computer$
in host $dest$
mitre_attack_id:
- T1055
observable:
- name: Computer
- name: dest
type: Hostname
role:
- Victim
@@ -55,7 +55,7 @@ tags:
- SourceProcessId
- StartAddress
- EventCode
- Computer
- dest
risk_score: 70
security_domain: endpoint
tests:
@@ -9,8 +9,7 @@ description: The following analytic developed to detect potential credential dum
data_source:
- Sysmon Event ID 8
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 | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
max(_time) as lastTime by dest, EventCode, TargetImage, TargetProcessId | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
| `create_remote_thread_into_lsass_filter`'
how_to_implement: This search needs Sysmon Logs with a Sysmon configuration, which
includes EventCode 8 with lsass.exe. This search uses an input macro named `sysmon`.
@@ -50,7 +49,7 @@ tags:
- _time
- EventID
- TargetImage
- Computer
- dest
- EventCode
- TargetImage
- TargetProcessId
@@ -13,8 +13,8 @@ description: Detect the hands on keyboard behavior of Windows Task Manager creat
data_source:
- Sysmon Event ID 1
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)`
stats count min(_time) as firstTime max(_time) as lastTime by dest, object_category,
process_name, TargetFilename | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `creation_of_lsass_dump_with_taskmgr_filter`'
how_to_implement: This search requires Sysmon Logs and a Sysmon configuration, which
includes EventCode 11 for detecting file create of lsass.dmp. This search uses an
@@ -54,7 +54,7 @@ tags:
- EventID
- process_name
- TargetFilename
- Computer
- dest
- object_category
risk_score: 80
security_domain: endpoint
@@ -13,7 +13,7 @@ search: '| tstats `security_content_summariesonly` count min(_time) as firstTime
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.process_name Processes.process Processes.parent_process_name Processes.parent_process Processes.process_id
Processes.parent_process_id | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)`|
`security_content_ctime(lastTime)` | `creation_of_shadow_copy_filter`'
how_to_implement: The detection is based on data that originates from Endpoint Detection
@@ -39,7 +39,7 @@ tags:
role:
- Victim
- name: user
type: User Name
type: User
role:
- Victim
- name: command
@@ -10,9 +10,8 @@ description: This search looks for reading lsass memory consistent with credenti
data_source:
- Sysmon Event ID 1
search: '`sysmon` EventCode=10 TargetImage=*lsass.exe (GrantedAccess=0x1010 OR GrantedAccess=0x1410)
| stats count min(_time) as firstTime max(_time) as lastTime by Computer, SourceImage,
SourceProcessId, TargetImage, TargetProcessId, EventCode, GrantedAccess | rename
Computer as dest | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
| stats count min(_time) as firstTime max(_time) as lastTime by dest, SourceImage,
SourceProcessId, TargetImage, TargetProcessId, EventCode, GrantedAccess | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
| `detect_credential_dumping_through_lsass_access_filter` '
how_to_implement: This search needs Sysmon Logs and a sysmon configuration, which
includes EventCode 10 with lsass.exe. This search uses an input macro named `sysmon`.
@@ -32,7 +31,7 @@ tags:
asset_type: Windows
confidence: 100
impact: 80
message: The $source_image$ has attempted access to read $TargetImage$ was identified
message: The $SourceImage$ has attempted access to read $TargetImage$ was identified
on endpoint $dest$, this is indicative of credential dumping and should be
investigated.
mitre_attack_id:
@@ -56,7 +55,7 @@ tags:
- EventCode
- TargetImage
- GrantedAccess
- Computer
- dest
- SourceImage
- SourceProcessId
- TargetImage
@@ -26,8 +26,7 @@ tags:
asset_type: Windows
confidence: 60
impact: 60
message: Multiple accounts have been locked out. Review $nodename$ and $result$
related to $user$.
message: Excessive user account lockouts for $user$ in a short period of time
mitre_attack_id:
- T1078
- T1078.003
@@ -36,10 +35,6 @@ tags:
type: User
role:
- Victim
- name: result
type: Other
role:
- Victim
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -46,8 +46,7 @@ tags:
asset_type: Endpoint
confidence: 100
impact: 80
message: The following $process_name$ has been identified as renamed, spawning from
$parent_process_name$.
message: The following $process_name$ has been identified as renamed, spawning from $parent_process_name$ on $dest$ executed by $user$
mitre_attack_id:
- T1218
- T1218.001
@@ -56,7 +55,7 @@ tags:
type: User
role:
- Victim
- name: Computer
- name: dest
type: Hostname
role:
- Victim
+2 -3
View File
@@ -39,8 +39,7 @@ tags:
asset_type: Endpoint
confidence: 100
impact: 80
message: The following $process_name$ has been identified as renamed, spawning from
$parent_process_name$.
message: The following $process_name$ has been identified as renamed, spawning from $parent_process_name$ on $dest$ executed by user $user$
mitre_attack_id:
- T1218
- T1218.005
@@ -49,7 +48,7 @@ tags:
type: User
role:
- Victim
- name: Computer
- name: dest
type: Hostname
role:
- Victim
@@ -36,8 +36,7 @@ tags:
asset_type: Endpoint
confidence: 100
impact: 80
message: An instance of $parent_process_name$ spawning $process_name$ was identified
on endpoint $dest$ by user $user$ running prohibited applications.
message: An instance of $parent_process_name$ spawning $process_name$ was identified on endpoint $dest$ by user $user$ running prohibited applications.
mitre_attack_id:
- T1059
- T1059.003
@@ -46,7 +45,7 @@ tags:
type: User
role:
- Victim
- name: Computer
- name: dest
type: Hostname
role:
- Victim
@@ -18,7 +18,7 @@ description: The following analytic identifies regasm.exe with a network connect
data_source:
- Sysmon Event ID 3
search: '`sysmon` EventID=3 dest_ip!=10.0.0.0/12 dest_ip!=172.16.0.0/12 dest_ip!=192.168.0.0/16
process_name=regasm.exe | rename Computer as dest | stats count min(_time) as firstTime
process_name=regasm.exe | stats count min(_time) as firstTime
max(_time) as lastTime by dest, user, process_name, src_ip, dest_ip | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `detect_regasm_with_network_connection_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
@@ -40,7 +40,7 @@ tags:
confidence: 100
impact: 80
message: An instance of $process_name$ contacting a remote destination was identified
on endpoint $Computer$ by user $user$. This behavior is not normal for $process_name$.
on endpoint $dest$ by user $user$. This behavior is not normal for $process_name$.
mitre_attack_id:
- T1218
- T1218.009
@@ -66,7 +66,7 @@ tags:
- EventID
- dest_ip
- process_name
- Computer
- dest
- user
- src_ip
- dest_host
@@ -18,7 +18,7 @@ description: The following analytic identifies Regsvcs.exe with a network connec
data_source:
- Sysmon Event ID 3
search: '`sysmon` EventID=3 dest_ip!=10.0.0.0/12 dest_ip!=172.16.0.0/12 dest_ip!=192.168.0.0/16
process_name=regsvcs.exe | rename Computer as dest | stats count min(_time) as firstTime
process_name=regsvcs.exe | stats count min(_time) as firstTime
max(_time) as lastTime by dest, user, process_name, src_ip, dest_ip | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `detect_regsvcs_with_network_connection_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
@@ -40,7 +40,7 @@ tags:
confidence: 100
impact: 80
message: An instance of $process_name$ contacting a remote destination was identified
on endpoint $Computer$ by user $user$. This behavior is not normal for $process_name$.
on endpoint $dest$ by user $user$. This behavior is not normal for $process_name$.
mitre_attack_id:
- T1218
- T1218.009
@@ -66,7 +66,7 @@ tags:
- EventID
- dest_ip
- process_name
- Computer
- dest
- user
- src_ip
- dest_host
@@ -49,6 +49,7 @@ tags:
- CISA AA22-264A
- Citrix ShareFile RCE CVE-2023-24489
- Flax Typhoon
- WS FTP Server Critical Vulnerabilities
asset_type: Endpoint
confidence: 80
impact: 100
@@ -64,7 +64,7 @@ tags:
required_fields:
- _time
- Destination
- Computer
- dest
- User
risk_score: 63
security_domain: endpoint
@@ -29,6 +29,7 @@ tags:
analytic_story:
- Windows Defense Evasion Tactics
- Windows Registry Abuse
- NjRAT
asset_type: Endpoint
confidence: 100
impact: 40
@@ -28,6 +28,7 @@ tags:
analytic_story:
- Windows Defense Evasion Tactics
- Windows Registry Abuse
- NjRAT
asset_type: Endpoint
confidence: 50
impact: 50
@@ -31,6 +31,7 @@ tags:
analytic_story:
- Windows Defense Evasion Tactics
- Windows Registry Abuse
- NjRAT
asset_type: Endpoint
confidence: 70
impact: 70
@@ -29,6 +29,7 @@ tags:
analytic_story:
- Windows Defense Evasion Tactics
- Windows Registry Abuse
- NjRAT
asset_type: Endpoint
confidence: 60
impact: 70
@@ -13,8 +13,8 @@ description: The following analytic will identify a suspicious download by the T
data_source:
- Sysmon Event ID 15
search: '`sysmon` EventCode= 15 process_name = "telegram.exe" TargetFilename = "*:Zone.Identifier"
|stats count min(_time) as firstTime max(_time) as lastTime by Computer EventCode
Image process_id TargetFilename Hash | rename Computer as dest | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
|stats count min(_time) as firstTime max(_time) as lastTime by dest EventCode
process_name process_id TargetFilename Hash | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `download_files_using_telegram_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
logs with the process name and TargetFilename from your endpoints or Events that
@@ -45,7 +45,7 @@ tags:
- Splunk Cloud
required_fields:
- _time
- Computer
- dest
- EventCode
- Image
- process_id
@@ -12,7 +12,7 @@ data_source:
- Sysmon Event ID 11
search: '`sysmon` EventCode= 11 TargetFilename = "*\\license.dat" AND (TargetFilename="*\\appdata\\*"
OR TargetFilename="*\\programdata\\*") |stats count min(_time) as firstTime max(_time)
as lastTime by TargetFilename EventCode process_id process_name Computer | `security_content_ctime(firstTime)`
as lastTime by TargetFilename EventCode process_id process_name dest | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `drop_icedid_license_dat_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
logs with the process name, parent process, and command-line executions from your
@@ -27,16 +27,16 @@ tags:
asset_type: Endpoint
confidence: 90
impact: 70
message: process $SourceImage$ create a file $TargetImage$ in host $Computer$
message: A process $process_name$ created a file $TargetFilename$ on host $dest$
mitre_attack_id:
- T1204
- T1204.002
observable:
- name: Computer
- name: dest
type: Hostname
role:
- Victim
- name: SourceImage
- name: process_name
type: Process
role:
- Attacker
@@ -53,4 +53,4 @@ tests:
attack_data:
- data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/malware/icedid/simulated_icedid/windows-sysmon.log
source: XmlWinEventLog:Microsoft-Windows-Sysmon/Operational
sourcetype: xmlwineventlog
sourcetype: xmlwineventlog
@@ -17,7 +17,7 @@ data_source:
search: '`powershell` EventCode=4104 (Message = "*Get-DomainGroupMember*") AND Message
IN ("*Domain Admins*","*Enterprise Admins*", "*Schema Admins*", "*Account Operators*"
, "*Server Operators*", "*Protected Users*", "*Dns Admins*") | stats count min(_time)
as firstTime max(_time) as lastTime by EventCode Message ComputerName User | `security_content_ctime(firstTime)`
as firstTime max(_time) as lastTime by EventCode Message ComputerName User | rename ComputerName as dest, User as user | `security_content_ctime(firstTime)`
| `elevated_group_discovery_with_powerview_filter`'
how_to_implement: To successfully implement this analytic, you will need to enable
PowerShell Script Block Logging on some or all endpoints. Additional setup here
@@ -15,7 +15,7 @@ data_source:
- Sysmon Event ID 23
search: '`sysmon` EventCode=23 TargetFilename = "*\\ProgramData\\Microsoft\\Windows
Defender*" | stats values(TargetFilename) as deleted_files min(_time) as firstTime
max(_time) as lastTime count by user EventCode Image ProcessID Computer |where count
max(_time) as lastTime count by user EventCode Image ProcessID dest |where count
>=50 | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `excessive_file_deletion_in_windefender_folder_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
@@ -33,7 +33,7 @@ tags:
asset_type: Endpoint
confidence: 50
impact: 50
message: High frequency file deletion activity detected on host $Computer$
message: High frequency file deletion activity detected on host $dest$
mitre_attack_id:
- T1485
observable:
@@ -41,7 +41,7 @@ tags:
type: User
role:
- Victim
- name: Computer
- name: dest
type: Endpoint
role:
- Victim
@@ -57,7 +57,7 @@ tags:
- _time
- EventCode
- TargetFilename
- Computer
- dest
- user
- Image
- ProcessID
@@ -14,8 +14,8 @@ description: This search is to detect potential DNS exfiltration using nslookup
data_source:
- Sysmon Event ID 1
search: '`sysmon` EventCode = 1 process_name = "nslookup.exe" | bucket _time span=1m
| stats count as numNsLookup by Computer, _time | eventstats avg(numNsLookup) as
avgNsLookup, stdev(numNsLookup) as stdNsLookup, count as numSlots by Computer |
| stats count as numNsLookup by dest, _time | eventstats avg(numNsLookup) as
avgNsLookup, stdev(numNsLookup) as stdNsLookup, count as numSlots by dest |
eval upperThreshold=(avgNsLookup + stdNsLookup *3) | eval isOutlier=if(numNsLookup
> 20 and numNsLookup >= upperThreshold, 1, 0) | search isOutlier=1 | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `excessive_usage_of_nslookup_app_filter`'
@@ -37,12 +37,12 @@ tags:
asset_type: Endpoint
confidence: 70
impact: 40
message: Excessive usage of nslookup.exe has been detected on $Computer$. This detection
message: Excessive usage of nslookup.exe has been detected on $dest$. This detection
is triggered as as it violates the dynamic threshold
mitre_attack_id:
- T1048
observable:
- name: Computer
- name: dest
type: Endpoint
role:
- Victim
@@ -52,7 +52,7 @@ tags:
- Splunk Cloud
required_fields:
- _time
- Computer
- dest
- process_name
- EventCode
risk_score: 28
@@ -12,8 +12,8 @@ description: This search is to detect a suspicious excessive usage of sc.exe in
data_source:
- Sysmon Event ID 1
search: '`sysmon` EventCode = 1 process_name = "sc.exe" | bucket _time span=15m |
stats values(process) as process count as numScExe by Computer, _time | eventstats
avg(numScExe) as avgScExe, stdev(numScExe) as stdScExe, count as numSlots by Computer
stats values(process) as process count as numScExe by dest, _time | eventstats
avg(numScExe) as avgScExe, stdev(numScExe) as stdScExe, count as numSlots by dest
| eval upperThreshold=(avgScExe + stdScExe *3) | eval isOutlier=if(avgScExe >
5 and avgScExe >= upperThreshold, 1, 0) | search isOutlier=1 | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `excessive_usage_of_sc_service_utility_filter`'
@@ -37,7 +37,7 @@ tags:
- T1569
- T1569.002
observable:
- name: Computer
- name: dest
type: Endpoint
role:
- Victim
@@ -36,6 +36,7 @@ tags:
- CISA AA22-264A
- AgentTesla
- CISA AA22-277A
- NjRAT
asset_type: Endpoint
confidence: 70
impact: 40
@@ -62,6 +62,7 @@ tags:
- Amadey
- BlackByte Ransomware
- Warzone RAT
- NjRAT
asset_type: Endpoint
confidence: 50
impact: 40
@@ -38,6 +38,7 @@ tags:
- Windows Defense Evasion Tactics
- Azorult
- BlackByte Ransomware
- NjRAT
asset_type: Endpoint
confidence: 50
impact: 50
@@ -14,7 +14,7 @@ data_source:
- Powershell 4104
search: '`powershell` EventCode=4104 ScriptBlockText ="*Get-ADDefaultDomainPasswordPolicy*"
| stats count min(_time) as firstTime max(_time) as lastTime by EventCode ScriptBlockText
Computer user_id | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
Computer UserID | rename Computer as dest, UserID as user | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `get_addefaultdomainpasswordpolicy_with_powershell_script_block_filter`'
how_to_implement: The following Hunting analytic requires PowerShell operational logs
to be imported. Modify the powershell macro as needed to match the sourcetype or
@@ -30,16 +30,15 @@ tags:
asset_type: Endpoint
confidence: 30
impact: 30
message: powershell process having commandline $Message$ to query domain password
policy
message: Powershell process having commandline "Get-ADDefaultDomainPasswordPolicy" to query domain password policy on $dest$
mitre_attack_id:
- T1201
observable:
- name: ComputerName
- name: dest
type: Hostname
role:
- Victim
- name: User
- name: user
type: User
role:
- Victim
@@ -14,7 +14,7 @@ data_source:
- Powershell 4104
search: '`powershell` EventCode=4104 ScriptBlockText = "*get-aduser*" ScriptBlockText
= "*-filter*" | stats count min(_time) as firstTime max(_time) as lastTime by EventCode
ScriptBlockText Computer UserID | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
ScriptBlockText Computer UserID | rename Computer as dest, UserID as user| `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `get_aduser_with_powershell_script_block_filter`'
how_to_implement: The following Hunting analytic requires PowerShell operational logs
to be imported. Modify the powershell macro as needed to match the sourcetype or
@@ -30,16 +30,16 @@ tags:
asset_type: Endpoint
confidence: 50
impact: 50
message: powershell process having commandline $Message$ for user enumeration
message: Powershell process having commandline "get-aduser" for user enumeration on $dest$
mitre_attack_id:
- T1087.002
- T1087
observable:
- name: ComputerName
- name: dest
type: Hostname
role:
- Victim
- name: User
- name: user
type: User
role:
- Victim
@@ -14,7 +14,7 @@ data_source:
- Powershell 4104
search: '`powershell` EventCode=4104 ScriptBlockText = "*Get-DomainUser*" | stats
count min(_time) as firstTime max(_time) as lastTime by EventCode ScriptBlockText
Computer UserID | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
Computer UserID | rename Computer as dest, UserID as user| `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `get_domainuser_with_powershell_script_block_filter`'
how_to_implement: The following Hunting analytic requires PowerShell operational logs
to be imported. Modify the powershell macro as needed to match the sourcetype or
@@ -28,16 +28,16 @@ tags:
asset_type: Endpoint
confidence: 50
impact: 50
message: powershell process having commandline $Message$ for user enumeration
message: Powershell process having commandline "*Get-DomainUser*" for user enumeration on $dest$
mitre_attack_id:
- T1087.002
- T1087
observable:
- name: Computer
- name: dest
type: Hostname
role:
- Victim
- name: UserID
- name: user
type: User
role:
- Victim
@@ -22,7 +22,7 @@ data_source:
- Powershell 4104
search: '`powershell` EventCode=4104 ScriptBlockText = "*Get-WMIObject*" AND ScriptBlockText
= "*Win32_Group*" | stats count min(_time) as firstTime max(_time) as lastTime by
EventCode ScriptBlockText Computer user_id | `security_content_ctime(firstTime)`
EventCode ScriptBlockText Computer UserID | rename Computer as dest, UserID as user | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `get_wmiobject_group_discovery_with_script_block_logging_filter`'
how_to_implement: To successfully implement this analytic, you will need to enable
PowerShell Script Block Logging on some or all endpoints. Additional setup here
@@ -13,8 +13,7 @@ description: The following analytic utilizes PowerShell Script Block Logging (Ev
data_source:
- Powershell 4104
search: '`powershell` EventCode=4104 ScriptBlockText = "*Get-ADGroup*" | stats count
min(_time) as firstTime max(_time) as lastTime by EventCode ScriptBlockText Computer
user_id | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
min(_time) as firstTime max(_time) as lastTime by EventCode ScriptBlockText Computer UserID | rename Computer as dest, UserID as user | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `getadgroup_with_powershell_script_block_filter`'
how_to_implement: To successfully implement this analytic, you will need to enable
PowerShell Script Block Logging on some or all endpoints. Additional setup here
@@ -47,8 +46,8 @@ tags:
- _time
- EventCode
- Message
- ComputerName
- User
- Computer
- UserID
risk_score: 15
security_domain: endpoint
tests:
@@ -14,7 +14,7 @@ data_source:
- Powershell 4104
search: '`powershell` EventCode=4104 ScriptBlockText = "*[System.Security.Principal.WindowsIdentity]*" ScriptBlockText
= "*GetCurrent()*" | stats count min(_time) as firstTime max(_time) as lastTime
by EventCode ScriptBlockText Computer user_id | `security_content_ctime(firstTime)`
by EventCode ScriptBlockText Computer UserID | rename Computer as dest, UserID as user | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `getcurrent_user_with_powershell_script_block_filter`'
how_to_implement: To successfully implement this analytic, you will need to enable
PowerShell Script Block Logging on some or all endpoints. Additional setup here
@@ -30,7 +30,7 @@ tags:
asset_type: Endpoint
confidence: 50
impact: 30
message: System user discovery on $dest$
message: System user discovery on $dest$ by $user$
mitre_attack_id:
- T1033
observable:
@@ -13,7 +13,7 @@ description: This analytic is designed to identify a high frequency of process t
data_source:
- Sysmon Event ID 5
search: '`sysmon` EventCode=5 |bin _time span=3s |stats values(Image) as proc_terminated
min(_time) as firstTime max(_time) as lastTime count by _time Computer EventCode
min(_time) as firstTime max(_time) as lastTime count by _time dest EventCode
ProcessID | where count >= 15 | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)`
| `high_process_termination_frequency_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
@@ -32,11 +32,11 @@ tags:
confidence: 80
impact: 90
message: High frequency process termination (more than 15 processes within 3s) detected
on host $Computer$
on host $dest$
mitre_attack_id:
- T1486
observable:
- name: Computer
- name: dest
type: Endpoint
role:
- Victim
@@ -51,7 +51,7 @@ tags:
required_fields:
- EventCode
- Image
- Computer
- dest
- _time
- ProcessID
risk_score: 72
@@ -12,7 +12,7 @@ data_source:
- Sysmon Event ID 11
search: '`sysmon` EventCode= 11 (TargetFilename = "*\\passff.tar" OR TargetFilename
= "*\\cookie.tar") |stats count min(_time) as firstTime max(_time) as lastTime by
TargetFilename EventCode process_id process_name Computer | `security_content_ctime(firstTime)`
TargetFilename EventCode process_id process_name dest | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `icedid_exfiltrated_archived_file_creation_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
logs with the process name, parent process, and command-line executions from your
@@ -27,16 +27,16 @@ tags:
asset_type: Endpoint
confidence: 90
impact: 80
message: process $SourceImage$ create a file $TargetImage$ in host $Computer$
message: Process $process_name$ create a file $TargetImage$ on host $dest$
mitre_attack_id:
- T1560.001
- T1560
observable:
- name: Computer
- name: dest
type: Hostname
role:
- Victim
- name: SourceImage
- name: process_name
type: Process
role:
- Attacker
@@ -50,7 +50,7 @@ tags:
- EventCode
- process_id
- process_name
- Computer
- dest
risk_score: 72
security_domain: endpoint
tests:
@@ -58,4 +58,4 @@ tests:
attack_data:
- data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/malware/icedid/simulated_icedid/windows-sysmon.log
source: XmlWinEventLog:Microsoft-Windows-Sysmon/Operational
sourcetype: xmlwineventlog
sourcetype: xmlwineventlog
@@ -44,8 +44,7 @@ tags:
asset_type: Endpoint
confidence: 50
impact: 90
message: A Kerberos Service TTicket request with RC4 encryption was requested from
$Client_Address$
message: A Kerberos Service TTicket request with RC4 encryption was requested from $dest$
mitre_attack_id:
- T1558
- T1558.001
@@ -35,7 +35,7 @@ tags:
asset_type: endpoint
confidence: 70
impact: 70
message: a $process_name$ deleting a SSH key in $dest$
message: SSH Config and keys are deleted on $dest$ by Process GUID - $process_guid$
mitre_attack_id:
- T1485
- T1070.004
@@ -45,6 +45,10 @@ tags:
type: Hostname
role:
- Victim
- name: process_guid
type: Process
role:
- Attacker
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -35,7 +35,7 @@ tags:
asset_type: endpoint
confidence: 70
impact: 70
message: a $process_name$ deleting cron jobs in $dest$
message: Linux cron jobs are deleted on host $dest$ by process GUID- $process_guid$
mitre_attack_id:
- T1485
- T1070.004
@@ -45,6 +45,10 @@ tags:
type: Hostname
role:
- Victim
- name: process_guid
type: Process
role:
- Attacker
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -37,7 +37,7 @@ tags:
asset_type: endpoint
confidence: 70
impact: 70
message: a $process_name$ deleting a daemon script in $dest$
message: Init daemon script deleted on host $dest$ by process GUID- $process_guid$
mitre_attack_id:
- T1485
- T1070.004
@@ -47,6 +47,10 @@ tags:
type: Hostname
role:
- Victim
- name: process_guid
type: Process
role:
- Attacker
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -39,7 +39,7 @@ tags:
asset_type: endpoint
confidence: 80
impact: 80
message: a $process_name$ deleting a services in $dest$
message: A services file $file_name$ deteted on host $dest$ by process GUID - $process_guid$
mitre_attack_id:
- T1485
- T1070.004
@@ -49,6 +49,10 @@ tags:
type: Hostname
role:
- Victim
- name: process_guid
type: Process
role:
- Attacker
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -36,7 +36,7 @@ tags:
asset_type: endpoint
confidence: 70
impact: 70
message: a $process_name$ deleting a SSL certificate in $dest$
message: SSL certificate deleted on host $dest$ by process GUID- $process_guid$
mitre_attack_id:
- T1485
- T1070.004
@@ -46,6 +46,10 @@ tags:
type: Hostname
role:
- Victim
- name: process_guid
type: Process
role:
- Attacker
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -36,7 +36,7 @@ tags:
asset_type: endpoint
confidence: 80
impact: 100
message: a $process_name$ deleting multiple files in /boot/ folder in $dest$
message: Multiple files detection in /boot/ folder on $dest$ by process GUID - $process_guid$
mitre_attack_id:
- T1485
- T1070.004
@@ -46,6 +46,10 @@ tags:
type: Hostname
role:
- Victim
- name: process_guid
type: Process
role:
- Attacker
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -35,7 +35,7 @@ tags:
asset_type: endpoint
confidence: 70
impact: 70
message: a $process_name$ deleting multiple files in /etc/ folder in $dest$
message: Multiple files delted in /etc/ folder on $dest$ by process GUID - $process_guid$
mitre_attack_id:
- T1485
- T1070.004
@@ -45,6 +45,10 @@ tags:
type: Hostname
role:
- Victim
- name: process_guid
type: Process
role:
- Attacker
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -18,7 +18,7 @@ data_source:
search: '`sysmon` EventCode=7 (ImageLoaded = "*\\dynwrapx.dll" OR OriginalFileName
= "dynwrapx.dll" OR Product = "DynamicWrapperX") | stats count min(_time) as firstTime
max(_time) as lastTime by Image ImageLoaded OriginalFileName Product process_name
Computer EventCode Signed ProcessId | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
dest EventCode Signed ProcessId | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `loading_of_dynwrapx_module_filter`'
how_to_implement: To successfully implement this search you need to be ingesting information
on processes that include the name of the process responsible for the changes from
@@ -43,12 +43,12 @@ tags:
asset_type: Endpoint
confidence: 100
impact: 80
message: dynwrapx.dll loaded by process $process_name$ on $Computer$
message: dynwrapx.dll loaded by process $process_name$ on $dest$
mitre_attack_id:
- T1055
- T1055.001
observable:
- name: Computer
- name: dest
type: Endpoint
role:
- Victim
@@ -63,7 +63,7 @@ tags:
- OriginalFileName
- Product
- process_name
- Computer
- dest
- EventCode
- Signed
- ProcessId
@@ -14,7 +14,7 @@ data_source:
search: '`sysmon` EventCode =13 (TargetObject= "*\\Control Panel\\Desktop\\Wallpaper"
AND Image != "*\\explorer.exe") OR (TargetObject= "*\\Control Panel\\Desktop\\Wallpaper"
AND Details = "*\\temp\\*") | stats count min(_time) as firstTime max(_time) as
lastTime by EventCode Image TargetObject Details Computer process_guid process_id
lastTime by EventCode Image TargetObject Details Computer process_guid process_id
user_id | rename Computer as dest | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `modification_of_wallpaper_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
@@ -54,7 +54,7 @@ tags:
- Image
- TargetObject
- Details
- Computer
- dest
- process_guid
- process_id
- user_id
@@ -54,7 +54,7 @@ tags:
- process_name
- ProcessId
- ProcessGuid
- Computer
- dest
- ImageLoaded
risk_score: 9
security_domain: endpoint
@@ -55,7 +55,7 @@ tags:
- process_name
- ProcessId
- ProcessGuid
- Computer
- dest
- ImageLoaded
risk_score: 9
security_domain: endpoint
@@ -14,8 +14,8 @@ data_source:
- Sysmon Event ID 7
search: '`sysmon` EventID=7 parent_process_name IN ("winword.exe","excel.exe","powerpnt.exe","mspub.exe","visio.exe","wordpad.exe","wordview.exe","onenote.exe","onenotem.exe","onenoteviewer.exe","onenoteim.exe",
"msaccess.exe","Graph.exe","winproj.exe") ImageLoaded IN ("*\\mshtml.dll", "*\\Microsoft.mshtml.dll","*\\IE.Interop.MSHTML.dll","*\\MshtmlDac.dll","*\\MshtmlDed.dll","*\\MshtmlDer.dll")
| stats count min(_time) as firstTime max(_time) as lastTime by Computer, process_name,
ImageLoaded, OriginalFileName, ProcessGuid | rename Computer as dest | `security_content_ctime(firstTime)`
| stats count min(_time) as firstTime max(_time) as lastTime by dest, process_name,
ImageLoaded, OriginalFileName, ProcessGuid | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `mshtml_module_load_in_office_product_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
logs with the process names and image loads from your endpoints. If you are using
@@ -27,7 +27,7 @@ data_source:
- Sysmon Event ID 7
search: '`sysmon` EventCode=7 ImageLoaded="*\\msi.dll" NOT (Image IN ("*\\System32\\*","*\\syswow64\\*","*\\windows\\*",
"*\\winsxs\\*")) | stats count min(_time) as firstTime max(_time) as lastTime by
Image ImageLoaded process_name Computer EventCode ProcessId | `security_content_ctime(firstTime)`
Image ImageLoaded process_name dest EventCode ProcessId | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `msi_module_loaded_by_non_system_binary_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
logs with the process name and imageloaded executions from your endpoints. If you
@@ -49,7 +49,7 @@ tags:
- CVE-2021-41379
impact: 80
message: The following module $ImageLoaded$ was loaded by $Image$ outside of the
normal system paths on endpoint $Computer$, potentally related to DLL side-loading.
normal system paths on endpoint $dest$, potentally related to DLL side-loading.
mitre_attack_id:
- T1574.002
- T1574
@@ -67,7 +67,7 @@ tags:
- Image
- ImageLoaded
- process_name
- Computer
- dest
- EventCode
- ProcessId
risk_score: 56
@@ -33,13 +33,13 @@ tags:
confidence: 90
impact: 70
message: Suspicious modification of registry $registry_path$ with possible payload
path $registry_value_name$ in $dest$
path $registry_path$ and key $registry_key_name$ in $dest$
mitre_attack_id:
- T1548.002
- T1548
observable:
- name: dest
type: Hostname
type: Endpoint
role:
- Victim
product:
@@ -15,6 +15,7 @@ description: The following analytic identifies object access on Windows administ
this behavior to try to infect other machines in the infected network.
search: '`wineventlog_security` EventCode=5140 ShareName IN("\\\\*\\ADMIN$","\\\\*\\C$","*\\\\*\\IPC$") AccessMask= 0x1
| stats min(_time) as firstTime max(_time) as lastTime count by ShareName IpAddress ObjectType SubjectUserName SubjectDomainName IpPort AccessMask Computer
| rename Computer as dest
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `network_share_discovery_via_dir_command_filter`'
@@ -35,11 +36,11 @@ tags:
confidence: 50
impact: 50
message: $user$ list executable files or directory in known sensitive SMB share. Share
name=$Share_Name$, Access mask=$Access_Mask$
name=$ShareName$, Access mask=$AccessMask$
mitre_attack_id:
- T1135
observable:
- name: Computer
- name: dest
type: Endpoint
role:
- Victim
@@ -34,6 +34,7 @@ tags:
- RedLine Stealer
- FIN7
- Warzone RAT
- NjRAT
asset_type: Endpoint
confidence: 70
impact: 50
@@ -34,6 +34,8 @@ tags:
- AgentTesla
- RedLine Stealer
- FIN7
- Warzone RAT
- NjRAT
asset_type: Endpoint
confidence: 70
impact: 50
@@ -57,7 +57,7 @@ tags:
required_fields:
- ImageLoaded
- AllImageLoaded
- Computer
- dest
- EventCode
- Image
- process_name
@@ -60,7 +60,7 @@ tags:
required_fields:
- ImageLoaded
- AllImageLoaded
- Computer
- dest
- EventCode
- Image
- process_name
@@ -37,9 +37,10 @@ search: '`powershell` EventCode=4104 | eval DoIt = if(match(ScriptBlockText,"(?i
| eval invokecmd = if(match(lower(ScriptBlockText),"invoke-command"), "4", 0) |
addtotals fieldname=Score DoIt, enccom, suspcmdlet, suspkeywrd, compressed, downgrade,
mimikatz, iex, empire, rundll32, webclient, syswow64, httplocal, reflection, invokewmi,
invokecmd, base64, get | stats values(Score) by DoIt, enccom, compressed, downgrade,
invokecmd, base64, get | stats values(Score) by UserID, Computer, DoIt, enccom, compressed, downgrade,
iex, mimikatz, rundll32, empire, webclient, syswow64, httplocal, reflection, invokewmi,
invokecmd, base64, get, suspcmdlet, suspkeywrd | `powershell_4104_hunting_filter`'
invokecmd, base64, get, suspcmdlet, suspkeywrd | rename Computer as dest, UserID as user
| `powershell_4104_hunting_filter`'
how_to_implement: The following Hunting analytic requires PowerShell operational logs
to be imported. Modify the powershell macro as needed to match the sourcetype or
add index. This analytic is specific to 4104, or PowerShell Script Block Logging.
@@ -63,28 +64,19 @@ tags:
asset_type: Endpoint
confidence: 100
impact: 80
message: An instance of $parent_process_name$ spawning $process_name$ was identified
on endpoint $Computer$ by user $user$ executing suspicious commands.
message: Powershell was identified on endpoint $host$ by user $user$ executing suspicious commands.
mitre_attack_id:
- T1059
- T1059.001
observable:
- name: UserID
- name: user
type: User
role:
- Victim
- name: Computer
type: Hostname
- name: dest
type: Endpoint
role:
- Victim
- name: parent_process_name
type: Process
role:
- Parent Process
- name: process_name
type: Process
role:
- Child Process
product:
- Splunk Enterprise
- Splunk Enterprise Security
@@ -44,6 +44,7 @@ tags:
- AsyncRAT
- Data Destruction
- IcedID
- NjRAT
confidence: 80
impact: 70
message: A suspicious powershell script contains base64 command in $ScriptBlockText$
@@ -22,7 +22,9 @@ data_source:
- Powershell 4104
search: '`powershell` EventCode=4104 ScriptBlockText = "*get-localgroup*" | stats
count min(_time) as firstTime max(_time) as lastTime by Opcode Computer UserID EventCode
ScriptBlockText | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
ScriptBlockText | rename Computer as dest, UserID as user
| `security_content_ctime(firstTime)`
|`security_content_ctime(lastTime)`
| `powershell_get_localgroup_discovery_with_script_block_logging_filter`'
how_to_implement: To successfully implement this analytic, you will need to enable
PowerShell Script Block Logging on some or all endpoints. Additional setup here
@@ -41,7 +43,7 @@ tags:
asset_type: Endpoint
confidence: 50
impact: 30
message: Local group discovery on $dest$ by $user$.
message: Local group discovery on endpoint $dest$ by user $user$.
mitre_attack_id:
- T1069
- T1069.001
@@ -16,7 +16,7 @@ search: '`sysmon` EventCode = 8 parent_process_name IN ("powershell_ise.exe", "p
TargetImage IN ("*\\svchost.exe","*\\csrss.exe" "*\\gpupdate.exe", "*\\explorer.exe","*\\services.exe","*\\winlogon.exe","*\\smss.exe","*\\wininit.exe","*\\userinit.exe","*\\spoolsv.exe","*\\taskhost.exe")
| stats min(_time) as firstTime max(_time) as lastTime count by SourceImage process_name
SourceProcessId SourceProcessGuid TargetImage TargetProcessId NewThreadId StartAddress
Computer EventCode | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
dest EventCode | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `powershell_remote_thread_to_known_windows_process_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
logs with the process name, Create Remote thread from your endpoints. If you are
@@ -32,11 +32,11 @@ tags:
confidence: 90
impact: 70
message: A suspicious powershell process $process_name$ that tries to create a remote
thread on target process $TargetImage$ with eventcode $EventCode$ in host $Computer$
thread on target process $TargetImage$ with eventcode $EventCode$ in host $dest$
mitre_attack_id:
- T1055
observable:
- name: Computer
- name: dest
type: Hostname
role:
- Victim
@@ -58,7 +58,7 @@ tags:
- TargetProcessId
- NewThreadId
- StartAddress
- Computer
- dest
- EventCode
risk_score: 63
security_domain: endpoint
@@ -14,15 +14,19 @@ data_source:
- Sysmon Event ID 1
search: '`sysmon` EventCode=1 CommandLine = "* /c *" CommandLine = "* del*" Image
= "*\\cmd.exe" | eval result = if(like(process,"%".parent_process."%"), "Found",
"Not Found") | stats min(_time) as firstTime max(_time) as lastTime count by Computer
"Not Found") | stats min(_time) as firstTime max(_time) as lastTime count by dest
user ParentImage ParentCommandLine Image CommandLine EventCode ProcessID result
| where result = "Found" | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`
| `process_deleting_its_process_file_path_filter`'
how_to_implement: You must be ingesting data that records process activity from your
hosts to populate the Endpoint data model in the Processes node. You must also be
ingesting logs with both the process name and command line from your endpoints.
The command-line arguments are mapped to the "process" field in the Endpoint data
model.
how_to_implement: The detection is based on data that originates from Endpoint Detection
and Response (EDR) agents. These agents are designed to provide security-related
telemetry from the endpoints where the agent is installed. To implement this search,
you must ingest logs that contain the process GUID, process name, and parent process.
Additionally, you must ingest complete command-line executions. These logs must
be processed using the appropriate Splunk Technology Add-ons that are specific to
the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint`
data model. Use the Splunk Common Information Model (CIM) to normalize the field
names and speed up the data modeling process.
known_false_positives: unknown
references:
- https://www.mandiant.com/resources/fin11-email-campaigns-precursor-for-ransomware-data-theft
@@ -37,13 +41,13 @@ tags:
asset_type: Endpoint
confidence: 100
impact: 60
message: A process $Image$ tries to delete its process path in commandline $cmdline$
as part of defense evasion in host $Computer$
message: A process $Image$ tries to delete its process path in commandline $CommandLine$
as part of defense evasion in host $dest$ by user $user$
mitre_attack_id:
- T1070
observable:
- name: Computer
type: Hostname
- name: dest
type: Endpoint
role:
- Victim
- name: user
@@ -56,7 +60,7 @@ tags:
- Splunk Cloud
required_fields:
- EventCode
- Computer
- dest
- user
- ParentImage
- ParentCommandLine
@@ -53,7 +53,7 @@ tags:
- file_name
- _time
- TargetFilename
- Computer
- dest
- Image
- user
risk_score: 81
@@ -69,6 +69,7 @@ tags:
- Sneaky Active Directory Persistence Tricks
- BlackByte Ransomware
- Warzone RAT
- NjRAT
asset_type: Endpoint
confidence: 95
impact: 80
@@ -21,8 +21,8 @@ search: ' `sysmon` EventCode=10 TargetImage=C:\\Windows\\system32\\winlogon.exe
(SourceImage!=C:\\Windows\\system32\\svchost.exe AND SourceImage!=C:\\Windows\\system32\\lsass.exe
AND SourceImage!=C:\\Windows\\system32\\LogonUI.exe AND SourceImage!=C:\\Windows\\system32\\smss.exe
AND SourceImage!=C:\\Windows\\system32\\wbem\\wmiprvse.exe) | stats count min(_time)
as firstTime max(_time) as lastTime by Computer, SourceImage, SourceProcessId, TargetImage,
TargetProcessId, EventCode, GrantedAccess | rename Computer as dest | `security_content_ctime(firstTime)`|
as firstTime max(_time) as lastTime by dest, SourceImage, SourceProcessId, TargetImage,
TargetProcessId, EventCode, GrantedAccess | `security_content_ctime(firstTime)`|
`security_content_ctime(lastTime)` | `rubeus_kerberos_ticket_exports_through_winlogon_access_filter`'
how_to_implement: This search needs Sysmon Logs and a sysmon configuration, which
includes EventCode 10. This search uses an input macro named `sysmon`. We strongly
@@ -63,7 +63,7 @@ tags:
- EventCode
- TargetImage
- CallTrace
- Computer
- dest
- TargetProcessId
- SourceImage
- SourceProcessId
@@ -13,7 +13,7 @@ data_source:
- Sysmon Event ID 8
search: '`sysmon` EventCode=8 SourceImage = "*\\rundll32.exe" TargetImage = "*.exe"
| stats count min(_time) as firstTime max(_time) as lastTime by SourceImage TargetImage
TargetProcessId SourceProcessId StartAddress EventCode Computer | `security_content_ctime(firstTime)`
TargetProcessId SourceProcessId StartAddress EventCode dest | `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)` | `rundll32_create_remote_thread_to_a_process_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting
logs with the SourceImage, TargetImage, and EventCode executions from your endpoints
@@ -30,11 +30,11 @@ tags:
confidence: 80
impact: 70
message: rundl32 process $SourceImage$ create a remote thread to process $TargetImage$
in host $Computer$
in host $dest$
mitre_attack_id:
- T1055
observable:
- name: Computer
- name: dest
type: Hostname
role:
- Victim
@@ -54,7 +54,7 @@ tags:
- SourceProcessId
- StartAddress
- EventCode
- Computer
- dest
risk_score: 56
security_domain: endpoint
tests:

Some files were not shown because too many files have changed in this diff Show More