mirror of
https://github.com/splunk/security_content
synced 2026-06-08 17:32:49 +00:00
Merge branch 'develop' into dependabot/pip/azure-mgmt-compute-23.0.0
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
ansible==3.1.0
|
||||
ansible==4.2.0
|
||||
ansible-runner==1.4.7
|
||||
apipkg==1.5
|
||||
aspy.yaml==1.3.0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
ansible==2.9.20
|
||||
ansible==4.2.0
|
||||
ansible-runner==1.4.4
|
||||
attackcti==0.3.4.3
|
||||
boto3==1.11.0
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
ansible==3.4.0
|
||||
ansible-runner==1.4.7
|
||||
ansible-runner==2.0.2
|
||||
apipkg==1.5
|
||||
aspy.yaml==1.3.0
|
||||
atomicwrites==1.4.0
|
||||
@@ -7,13 +7,13 @@ attackcti==0.3.4.3
|
||||
attrs==21.2.0
|
||||
azure-common==1.1.27
|
||||
azure-core==1.18.0
|
||||
azure-identity==1.6.0
|
||||
azure-mgmt-compute==23.0.0
|
||||
azure-identity==1.6.1
|
||||
azure-mgmt-core==1.2.1
|
||||
azure-mgmt-network==19.0.0
|
||||
azure-mgmt-resource==17.0.0
|
||||
bcrypt==3.2.0
|
||||
boto3==1.17.104
|
||||
boto3==1.18.38
|
||||
botocore==1.20.105
|
||||
certifi==2021.5.30
|
||||
cffi==1.14.5
|
||||
@@ -45,8 +45,8 @@ path==15.1.2
|
||||
path.py==12.5.0
|
||||
pexpect==4.8.0
|
||||
pluggy==0.13.1
|
||||
pre-commit==2.13.0
|
||||
protobuf==3.17.0
|
||||
pre-commit==2.15.0
|
||||
protobuf==3.18.1
|
||||
psutil==5.8.0
|
||||
ptyprocess==0.7.0
|
||||
py==1.10.0
|
||||
|
||||
+87
-13
@@ -9,6 +9,18 @@ from jinja2 import Environment, FileSystemLoader
|
||||
import datetime
|
||||
from stix2 import FileSystemSource
|
||||
from stix2 import Filter
|
||||
from pycvesearch import CVESearch
|
||||
|
||||
CVESSEARCH_API_URL = 'https://cve.circl.lu'
|
||||
|
||||
def get_cve_enrichment_new(cve_id):
|
||||
cve = CVESearch(CVESSEARCH_API_URL)
|
||||
result = cve.id(cve_id)
|
||||
cve_enriched = dict()
|
||||
cve_enriched['id'] = cve_id
|
||||
cve_enriched['cvss'] = result['cvss']
|
||||
cve_enriched['summary'] = result['summary']
|
||||
return cve_enriched
|
||||
|
||||
def get_all_techniques(projects_path):
|
||||
path_cti = path.join(projects_path,'cti/enterprise-attack')
|
||||
@@ -109,11 +121,6 @@ def generate_doc_stories(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, attack, sorted_de
|
||||
sto_to_kill_chain_phases[story] = set(detection['tags']['kill_chain_phases'])
|
||||
|
||||
if 'mitre_attacks' in detection:
|
||||
if story in sto_to_mitre_attacks.keys():
|
||||
for mitre_attack in detection['mitre_attacks']:
|
||||
if mitre_attack not in sto_to_mitre_attacks[story]:
|
||||
sto_to_mitre_attacks[story].append(mitre_attack)
|
||||
else:
|
||||
sto_to_mitre_attacks[story] = detection['mitre_attacks']
|
||||
|
||||
# add the enrich objects to the story
|
||||
@@ -198,14 +205,6 @@ def generate_doc_stories(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, attack, sorted_de
|
||||
f.write(output)
|
||||
messages.append("doc_gen.py wrote _page for: {0} structure to: {1}".format(category['name'], output_path))
|
||||
|
||||
# write index updated metrics
|
||||
template = j2_env.get_template('doc_index_markdown.j2')
|
||||
output_path = path.join(OUTPUT_DIR + '/index.markdown')
|
||||
output = template.render(detection_count=len(sorted_detections), story_count=len(sorted_stories))
|
||||
with open(output_path, 'w', encoding="utf-8") as f:
|
||||
f.write(output)
|
||||
messages.append("doc_gen.py wrote site index page to: {0}".format(output_path))
|
||||
|
||||
# write stories listing markdown
|
||||
template = j2_env.get_template('doc_story_page_markdown.j2')
|
||||
output_path = path.join(OUTPUT_DIR + '/_pages/stories.md')
|
||||
@@ -267,6 +266,14 @@ def generate_doc_detections(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, attack, messag
|
||||
mitre_attacks.append(mitre_attack)
|
||||
detection_yaml['mitre_attacks'] = mitre_attacks
|
||||
|
||||
# enrich the cve object
|
||||
cves = []
|
||||
if 'cve' in detection_yaml['tags']:
|
||||
for cve_id in detection_yaml['tags']['cve']:
|
||||
cve = get_cve_enrichment_new(cve_id)
|
||||
cves.append(cve)
|
||||
detection_yaml['cve'] = cves
|
||||
|
||||
# grab the kind
|
||||
detection_yaml['kind'] = manifest_file.split('/')[-2]
|
||||
|
||||
@@ -329,6 +336,71 @@ def generate_doc_detections(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, attack, messag
|
||||
messages.append("doc_gen.py wrote {0} detections documentation in mediawiki to: {1}".format(len(detections),output_path))
|
||||
|
||||
return sorted_detections, messages
|
||||
|
||||
def generate_doc_playbooks(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, sorted_detections, messages, VERBOSE):
|
||||
manifest_files = []
|
||||
for root, dirs, files in walk(REPO_PATH + '/playbooks/'):
|
||||
for file in files:
|
||||
if file.endswith(".yml"):
|
||||
manifest_files.append((path.join(root, file)))
|
||||
|
||||
playbooks = []
|
||||
for manifest_file in manifest_files:
|
||||
detection_yaml = dict()
|
||||
if VERBOSE:
|
||||
print("processing manifest {0}".format(manifest_file))
|
||||
|
||||
with open(manifest_file, 'r') as stream:
|
||||
try:
|
||||
object = list(yaml.safe_load_all(stream))[0]
|
||||
except yaml.YAMLError as exc:
|
||||
print(exc)
|
||||
print("Error reading {0}".format(manifest_file))
|
||||
sys.exit(1)
|
||||
|
||||
playbooks.append(object)
|
||||
|
||||
sorted_playbooks = sorted(playbooks, key=lambda i: i['name'])
|
||||
|
||||
j2_env = Environment(loader=FileSystemLoader(TEMPLATE_PATH), # nosemgrep
|
||||
trim_blocks=False, autoescape=True)
|
||||
|
||||
# write markdown
|
||||
template = j2_env.get_template('doc_playbooks_markdown.j2')
|
||||
for playbook in sorted_playbooks:
|
||||
file_name = playbook['name'].lower().replace(" ","_") + '.md'
|
||||
output_path = path.join(OUTPUT_DIR + '/_playbooks/' + file_name)
|
||||
output = template.render(playbook=playbook, 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} playbook documentation in markdown to: {1}".format(len(sorted_playbooks),OUTPUT_DIR + '/_playbooks/'))
|
||||
|
||||
# write markdown detection page
|
||||
template = j2_env.get_template('doc_playbooks_page_markdown.j2')
|
||||
output_path = path.join(OUTPUT_DIR + '/_pages/playbooks.md')
|
||||
output = template.render(playbooks=sorted_playbooks, 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 playbooks.md page to: {0}".format(output_path))
|
||||
|
||||
return sorted_playbooks, messages
|
||||
|
||||
|
||||
def generate_doc_index(OUTPUT_DIR, TEMPLATE_PATH, sorted_detections, sorted_stories, sorted_playbooks, messages, VERBOSE):
|
||||
|
||||
j2_env = Environment(loader=FileSystemLoader(TEMPLATE_PATH), # nosemgrep
|
||||
trim_blocks=False, autoescape=True)
|
||||
|
||||
# write index updated metrics
|
||||
template = j2_env.get_template('doc_index_markdown.j2')
|
||||
output_path = path.join(OUTPUT_DIR + '/index.markdown')
|
||||
output = template.render(detection_count=len(sorted_detections), story_count=len(sorted_stories), playbook_count=len(sorted_playbooks))
|
||||
with open(output_path, 'w', encoding="utf-8") as f:
|
||||
f.write(output)
|
||||
messages.append("doc_gen.py wrote site index page to: {0}".format(output_path))
|
||||
|
||||
return messages
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# grab arguments
|
||||
@@ -355,6 +427,8 @@ if __name__ == "__main__":
|
||||
messages = []
|
||||
sorted_detections, messages = generate_doc_detections(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, techniques, messages, VERBOSE)
|
||||
sorted_stories, messages = generate_doc_stories(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, techniques, sorted_detections, messages, VERBOSE)
|
||||
sorted_playbooks, messages = generate_doc_playbooks(REPO_PATH, OUTPUT_DIR, TEMPLATE_PATH, sorted_detections, messages, VERBOSE)
|
||||
messages = generate_doc_index(OUTPUT_DIR, TEMPLATE_PATH, sorted_detections, sorted_stories, sorted_playbooks, messages, VERBOSE)
|
||||
|
||||
# print all the messages from generation
|
||||
for m in messages:
|
||||
|
||||
+11
-11
@@ -67,7 +67,7 @@ def generate_transforms_conf(lookups, TEMPLATE_PATH, OUTPUT_PATH):
|
||||
utc_time = datetime.datetime.utcnow().replace(microsecond=0).isoformat()
|
||||
|
||||
j2_env = Environment(loader=FileSystemLoader(TEMPLATE_PATH), # nosemgrep
|
||||
trim_blocks=True)
|
||||
trim_blocks=True)
|
||||
template = j2_env.get_template('transforms.j2')
|
||||
output_path = path.join(OUTPUT_PATH, 'default/transforms.conf')
|
||||
output = template.render(lookups=sorted_lookups, time=utc_time)
|
||||
@@ -230,7 +230,7 @@ def get_deployments(object, deployments):
|
||||
for deployment in deployments:
|
||||
|
||||
for tag in object['tags'].keys():
|
||||
|
||||
|
||||
if tag in deployment['tags'].keys():
|
||||
if type(object['tags'][tag]) is str:
|
||||
tag_array = [object['tags'][tag]]
|
||||
@@ -325,7 +325,7 @@ def add_annotations(detection):
|
||||
# changes to this data structure separate from the mappings generation
|
||||
# @todo expose the JSON data structure for newer risk type
|
||||
|
||||
annotation_keys = ['mitre_attack', 'kill_chain_phases', 'cis20', 'nist', 'analytic_story', 'observable', 'context', 'impact', 'confidence']
|
||||
annotation_keys = ['mitre_attack', 'kill_chain_phases', 'cis20', 'nist', 'analytic_story', 'observable', 'context', 'impact', 'confidence', 'cve']
|
||||
savedsearch_annotations = {}
|
||||
for key in annotation_keys:
|
||||
if key == 'mitre_attack':
|
||||
@@ -364,7 +364,7 @@ def add_rba(detection):
|
||||
|
||||
# determine if is a user type, create risk
|
||||
if entity['type'].lower() in risk_object_user_types:
|
||||
|
||||
|
||||
for r in entity['role']:
|
||||
if 'attacker' == r.lower() or 'victim' ==r.lower():
|
||||
|
||||
@@ -376,10 +376,10 @@ def add_rba(detection):
|
||||
|
||||
# determine if is a system type, create risk
|
||||
elif entity['type'].lower() in risk_object_system_types:
|
||||
|
||||
|
||||
for r in entity['role']:
|
||||
if 'attacker' == r.lower() or 'victim' ==r.lower():
|
||||
|
||||
|
||||
risk_object['risk_object_type'] = 'system'
|
||||
risk_object['risk_object_field'] = entity['name']
|
||||
risk_object['risk_score'] = detection['tags']['risk_score']
|
||||
@@ -393,12 +393,12 @@ def add_rba(detection):
|
||||
continue
|
||||
|
||||
detection['risk'] = risk_objects
|
||||
|
||||
|
||||
return detection
|
||||
|
||||
def add_playbook(detection, playbooks):
|
||||
preface = " The following Splunk SOAR playbook can be used to respond to this detection: "
|
||||
|
||||
|
||||
for playbook in playbooks:
|
||||
if detection['name'] in playbook['tags']['detections']:
|
||||
detection['how_to_implement'] = detection['how_to_implement'] + preface + playbook['name']
|
||||
@@ -456,7 +456,7 @@ def prepare_detections(detections, deployments, playbooks, OUTPUT_PATH):
|
||||
if key in detection['tags']:
|
||||
mappings[key] = detection['tags'][key]
|
||||
detection['mappings'] = mappings
|
||||
|
||||
|
||||
detection = add_annotations(detection)
|
||||
detection = add_rba(detection)
|
||||
detection = add_playbook(detection, playbooks)
|
||||
@@ -698,7 +698,7 @@ if __name__ == "__main__":
|
||||
parser.add_argument("-v", "--verbose", required=False, default=False, action='store_true', help="prints verbose output")
|
||||
parser.add_argument("--product", required=True, default="ESCU", help="package type")
|
||||
|
||||
|
||||
|
||||
# parse them
|
||||
args = parser.parse_args()
|
||||
REPO_PATH = args.path
|
||||
@@ -706,4 +706,4 @@ if __name__ == "__main__":
|
||||
VERBOSE = args.verbose
|
||||
PRODUCT = args.product
|
||||
|
||||
main(REPO_PATH, OUTPUT_PATH, PRODUCT, VERBOSE)
|
||||
main(REPO_PATH, OUTPUT_PATH, PRODUCT, VERBOSE)
|
||||
|
||||
@@ -8,12 +8,12 @@ sidebar:
|
||||
nav: "detections"
|
||||
---
|
||||
|
||||
| Name | Technique | Tactic | Type |
|
||||
| ----------- | ----------- |--------------| --------------|
|
||||
| Name | Technique | Type |
|
||||
| --------| --------- |------------|
|
||||
{%- for detection in detections -%}
|
||||
{% if detection.mitre_attacks %}
|
||||
| [{{ detection.name }}](/{{ detection.kind }}/{{ detection.name | lower | replace(' ', '_') }}/) | {% for attack in detection.mitre_attacks -%} [{{ attack.technique }}](/tags/#{{ attack.technique | lower | replace(" ", "-") }}){% if not loop.last -%}, {% endif -%}{%- endfor %} | [{{ detection.mitre_attacks[0].tactic[0] }}](/tags/#{{ detection.mitre_attacks[0].tactic[0] | lower | replace(" ", "-") }}) | {{ detection.type }} |
|
||||
| [{{ detection.name }}](/{{ detection.kind }}/{{ detection.name | lower | replace(' ', '_') }}/) | {% for attack in detection.mitre_attacks -%} [{{ attack.technique }}](/tags/#{{ attack.technique | lower | replace(" ", "-") }}){% if not loop.last -%}, {% endif -%}{%- endfor %} | {{ detection.type }} |
|
||||
{%- else %}
|
||||
| [{{ detection.name }}]() | None | None | {{ detection.type }} |
|
||||
| [{{ detection.name }}]() | None | {{ detection.type }} |
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
|
||||
@@ -10,6 +10,7 @@ categories:
|
||||
- {{detection.kind|capitalize}}
|
||||
last_modified_at: {{detection.date}}
|
||||
toc: true
|
||||
toc_label: ""
|
||||
tags:
|
||||
- {{ detection.type }}
|
||||
{%- for attack in detection.mitre_attacks %}
|
||||
@@ -22,6 +23,9 @@ tags:
|
||||
{%- for product in detection.tags.product %}
|
||||
- {{ product }}
|
||||
{%- endfor -%}
|
||||
{%- for cve in detection.cve %}
|
||||
- {{ cve.id }}
|
||||
{%- endfor -%}
|
||||
{%- for datamodel in detection.datamodel %}
|
||||
- {{ datamodel }}
|
||||
{%- endfor -%}
|
||||
@@ -49,20 +53,21 @@ We have not been able to test, simulate or build datasets for it, use at your ow
|
||||
- **ID**: {{ detection.id }}
|
||||
|
||||
{% if detection.mitre_attacks %}
|
||||
#### ATT&CK
|
||||
#### [ATT&CK](https://attack.mitre.org/)
|
||||
|
||||
| ID | Technique | Tactic |
|
||||
| ----------- | ----------- |--------------|
|
||||
| ID | Technique | Tactic |
|
||||
| ----------- | ----------- | ----------- |
|
||||
{% for attack in detection.mitre_attacks -%}
|
||||
{% if attack.technique_id -%}
|
||||
{%- set sub_technique = attack.technique_id.split('.') -%}{%- if sub_technique | length > 1 -%}
|
||||
{% set sub_technique = attack.technique_id.split('.') -%}
|
||||
{% if sub_technique | length > 1 -%}
|
||||
| [{{ attack.technique_id }}](https://attack.mitre.org/techniques/{{sub_technique[0]}}/{{sub_technique[1]}}/) | {{ attack.technique }} | {{ attack.tactic|join(', ') }} |
|
||||
{%- else -%}
|
||||
{% else -%}
|
||||
| [{{ attack.technique_id }}](https://attack.mitre.org/techniques/{{attack.technique_id}}/) | {{ attack.technique }} | {{ attack.tactic|join(', ') }} |
|
||||
{% endif -%}
|
||||
{%- endif -%}
|
||||
{%- endfor %}
|
||||
{% endif %}
|
||||
{% endif -%}
|
||||
{% endfor %}
|
||||
{% endif -%}
|
||||
|
||||
#### Search
|
||||
|
||||
@@ -91,14 +96,22 @@ We have not been able to test, simulate or build datasets for it, use at your ow
|
||||
#### Known False Positives
|
||||
{{ detection.known_false_positives}}
|
||||
|
||||
|
||||
{% if detection.tags.observable %}
|
||||
#### RBA
|
||||
|
||||
| Risk Score | Impact | Confidence | Message |
|
||||
| ----------- | ----------- |--------------|--------------|
|
||||
| {{(detection.tags.impact * detection.tags.confidence)/100}} | {{ detection.tags.impact }} | {{ detection.tags.confidence }} | {{detection.tags.message}} |
|
||||
{% endif %}
|
||||
|
||||
{% if detection.cve %}
|
||||
#### CVE
|
||||
|
||||
| ID | Summary | [CVSS](https://nvd.nist.gov/vuln-metrics/cvss) |
|
||||
| ----------- | ----------- | -------------- |
|
||||
{% for cve in detection.cve -%}
|
||||
| [{{ cve.id }}](https://nvd.nist.gov/vuln/detail/{{cve.id}}) | {{ cve.summary }} | {{ cve.cvss }} |
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
#### Reference
|
||||
|
||||
@@ -9,7 +9,7 @@ header:
|
||||
actions:
|
||||
- label: "Download"
|
||||
url: "https://splunkbase.splunk.com/app/3449/"
|
||||
excerpt: "Get the latest **FREE** Enterprise Security Content Update (ESCU) App with over 400+ detections for Splunk."
|
||||
excerpt: "Get the latest **FREE** Enterprise Security Content Update (ESCU) App with **{{ detection_count }}** detections for Splunk."
|
||||
feature_row:
|
||||
- image_path: /static/feature_detection.png
|
||||
alt: "customizable"
|
||||
@@ -28,7 +28,7 @@ feature_row:
|
||||
- image_path: /static/feature_playbooks.png
|
||||
alt: "100% free"
|
||||
title: "Playbooks"
|
||||
excerpt: "See all **2** sets of steps 🐾 to automatically response to a threat."
|
||||
excerpt: "See all **{{ playbook_count }}** sets of steps 🐾 to automatically response to a threat."
|
||||
url: "/playbooks"
|
||||
btn_class: "btn--primary"
|
||||
btn_label: "Explore"
|
||||
@@ -44,9 +44,9 @@ This project gives you access to our repository of Analytic Stories that are sec
|
||||
[Try in Splunk Security Cloud](https://www.splunk.com/en_us/cyber-security.html){: .btn .btn--success}
|
||||
|
||||
## [Detection Coverage](https://mitremap.splunkresearch.com/) 🗺
|
||||
Below is a snapshot in time of what technique we currently have some detection coverage for. The darker the shade of blue the more detections we have for this particular technique. This map is automatically updated on every release and generated from the [generate-coverage-map.py](https://github.com/splunk/security_content/blob/develop/bin/generate-coverage-map.py).
|
||||
Below is a snapshot in time of what technique we currently have some detection coverage for. The darker the shade of blue the more detections we have for this particular technique.
|
||||
|
||||

|
||||
[](https://mitremap.splunkresearch.com/)
|
||||
|
||||
## View Our Content 🔎
|
||||
|
||||
|
||||
@@ -37,3 +37,10 @@ stories:
|
||||
- title: {{ category }}
|
||||
url: /stories/{{ category | lower | replace(" ", "_") }}/
|
||||
{%- endfor %}
|
||||
playbooks:
|
||||
- title: "Type"
|
||||
children:
|
||||
- title: "Response"
|
||||
url: /tags/#response/
|
||||
- title: "Investigation"
|
||||
url: /tags/#investigation/
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: "{{playbook.name}}"
|
||||
last_modified_at: {{playbook.date}}
|
||||
toc: true
|
||||
toc_label: ""
|
||||
tags:
|
||||
- {{ playbook.type }}
|
||||
{%- for product in playbook.tags.product %}
|
||||
- {{ product }}
|
||||
{%- endfor -%}
|
||||
{%- for app in playbook.app_list %}
|
||||
- {{ app }}
|
||||
{%- endfor %}
|
||||
---
|
||||
|
||||
[Try in Splunk SOAR](https://www.splunk.com/en_us/software/splunk-security-orchestration-and-automation.html){: .btn .btn--success}
|
||||
|
||||
#### Description
|
||||
|
||||
{{ playbook.description }}
|
||||
|
||||
- **Type**: {{ playbook.type }}
|
||||
- **Product**: {{ playbook.tags.product|join(', ') }}
|
||||
- **Apps**: {% for app in playbook.app_list %}[{{ app }}](https://splunkbase.splunk.com/apps/#/search/{{ app }}/product/soar){% if not loop.last %}, {% endif %}{%-endfor %}
|
||||
- **Last Updated**: {{ playbook.date }}
|
||||
- **Author**: {{playbook.author}}
|
||||
- **ID**: {{ playbook.id }}
|
||||
|
||||
#### Associated Detections
|
||||
{% for detection in playbook.tags.detections -%}
|
||||
{% for d in detections -%}
|
||||
{% if d.name == detection -%}
|
||||
* [{{ detection }}](/detections/{{ d.type }}/{{detection|lower|replace(" ", "_")}})
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
||||
#### How To Implement
|
||||
{{ playbook.how_to_implement}}
|
||||
|
||||
#### Playbooks
|
||||
}}.png)
|
||||
|
||||
#### Required field
|
||||
{% for field in playbook.tags.playbook_fields -%}
|
||||
* {{ field }}
|
||||
{% endfor %}
|
||||
|
||||
#### Reference
|
||||
{% if playbook.references %}
|
||||
{% for reference in playbook.references -%}
|
||||
* [{{ reference }}]({{ reference }})
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
|
||||
[*source*](https://github.com/splunk/security_content/tree/develop/playbooks/{{ playbook.name | lower | replace (" ", "_") }}.yml) \| *version*: **{{playbook.version}}**
|
||||
@@ -0,0 +1,19 @@
|
||||
---
|
||||
title: "Playbooks"
|
||||
layout: collection
|
||||
author_profile: false
|
||||
permalink: /playbooks/
|
||||
classes: wide
|
||||
sidebar:
|
||||
nav: "playbooks"
|
||||
---
|
||||
|
||||
| Name | Detections | Type |
|
||||
| --------| ---------- | ----------- |
|
||||
{% for playbook in playbooks -%}
|
||||
{% if playbook.tags.detections -%}
|
||||
| [{{ playbook.name }}](/playbooks/{{ playbook.name|lower|replace(' ', '_') }}/)|{% for detection in playbook.tags.detections -%}{% for d in detections -%}{% if d.name == detection -%}[{{ detection }}](/detections/{{ d.type }}/{{detection|lower|replace(" ", "_")}}){% endif -%}{%- endfor -%}{%- endfor -%} | {{ playbook.type }} |
|
||||
{% else -%}
|
||||
| [{{ playbook.name }}](/playbooks/{{ playbook.name|lower|replace(' ', '_') }}/)| None | {{ playbook.type }} |
|
||||
{% endif -%}
|
||||
{%- endfor -%}
|
||||
@@ -2,6 +2,7 @@
|
||||
title: "{{story.name}}"
|
||||
last_modified_at: {{story.date}}
|
||||
toc: true
|
||||
toc_label: ""
|
||||
tags:
|
||||
{%- for product in story.tags.product %}
|
||||
- {{ product }}
|
||||
|
||||
@@ -44,6 +44,7 @@ tags:
|
||||
of $expected_upper_threshold$ with the following command $command$.
|
||||
mitre_attack_id:
|
||||
- T1078.004
|
||||
- T1078
|
||||
nist:
|
||||
- DE.DP
|
||||
- DE.CM
|
||||
|
||||
@@ -49,6 +49,7 @@ tags:
|
||||
command $command$.
|
||||
mitre_attack_id:
|
||||
- T1078.004
|
||||
- T1078
|
||||
nist:
|
||||
- DE.DP
|
||||
- DE.CM
|
||||
|
||||
@@ -46,6 +46,7 @@ tags:
|
||||
in their account
|
||||
mitre_attack_id:
|
||||
- T1078.004
|
||||
- T1078
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -43,6 +43,7 @@ tags:
|
||||
from this IP $src$
|
||||
mitre_attack_id:
|
||||
- T1136.003
|
||||
- T1136
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -46,6 +46,7 @@ tags:
|
||||
and did a console login from this IP $src_ip$
|
||||
mitre_attack_id:
|
||||
- T1136.003
|
||||
- T1136
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -37,6 +37,7 @@ tags:
|
||||
message: Vulnerabilities with severity high found in image $image$
|
||||
mitre_attack_id:
|
||||
- T1204.003
|
||||
- T1204
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -36,6 +36,7 @@ tags:
|
||||
message: Vulnerabilities with severity high found in repository $repositoryName$
|
||||
mitre_attack_id:
|
||||
- T1204.003
|
||||
- T1204
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -35,6 +35,7 @@ tags:
|
||||
message: Vulnerabilities with severity high found in image $image$
|
||||
mitre_attack_id:
|
||||
- T1204.003
|
||||
- T1204
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -33,6 +33,7 @@ tags:
|
||||
message: Container uploaded outside business hours from $user$
|
||||
mitre_attack_id:
|
||||
- T1204.003
|
||||
- T1204
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -33,6 +33,7 @@ tags:
|
||||
message: Container uploaded from unknown user $user$
|
||||
mitre_attack_id:
|
||||
- T1204.003
|
||||
- T1204
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -42,6 +42,7 @@ tags:
|
||||
mitre_attack_id:
|
||||
- T1069.003
|
||||
- T1098
|
||||
- T1069
|
||||
observable:
|
||||
- name: src
|
||||
type: IP Address
|
||||
|
||||
@@ -46,6 +46,7 @@ tags:
|
||||
CIDR $requestParameters.cidrBlock$
|
||||
mitre_attack_id:
|
||||
- T1562.007
|
||||
- T1562
|
||||
nist:
|
||||
- DE.DP
|
||||
- DE.AE
|
||||
|
||||
@@ -41,6 +41,7 @@ tags:
|
||||
$eventName$), such that the instance is accessible from anywhere
|
||||
mitre_attack_id:
|
||||
- T1562.007
|
||||
- T1562
|
||||
nist:
|
||||
- DE.DP
|
||||
- DE.AE
|
||||
|
||||
@@ -45,6 +45,7 @@ tags:
|
||||
event $eventName$ for updating the the default policy version
|
||||
mitre_attack_id:
|
||||
- T1078.004
|
||||
- T1078
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -39,6 +39,7 @@ tags:
|
||||
user $user_arn$ more access privilleges
|
||||
mitre_attack_id:
|
||||
- T1136.003
|
||||
- T1136
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -44,6 +44,7 @@ tags:
|
||||
message: User $user$ is creating a new instance $dest$ for the first time
|
||||
mitre_attack_id:
|
||||
- T1078.004
|
||||
- T1078
|
||||
nist:
|
||||
- ID.AM
|
||||
observable:
|
||||
|
||||
@@ -44,6 +44,7 @@ tags:
|
||||
message: User $user$ is modifying an instance $dest$ for the first time.
|
||||
mitre_attack_id:
|
||||
- T1078.004
|
||||
- T1078
|
||||
nist:
|
||||
- ID.AM
|
||||
observable:
|
||||
|
||||
@@ -27,6 +27,7 @@ tags:
|
||||
message: Correlation triggered for user $user$
|
||||
mitre_attack_id:
|
||||
- T1204.003
|
||||
- T1204
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -27,6 +27,7 @@ tags:
|
||||
message: Correlation triggered for user $user$
|
||||
mitre_attack_id:
|
||||
- T1204.003
|
||||
- T1204
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -23,7 +23,7 @@ references:
|
||||
- https://www.redhat.com/en/topics/devops/what-is-devsecops
|
||||
tags:
|
||||
analytic_story:
|
||||
- DevSecOps
|
||||
- Dev Sec Ops
|
||||
automated_detection_testing: passed
|
||||
confidence: 30
|
||||
context:
|
||||
|
||||
@@ -22,7 +22,7 @@ references:
|
||||
- https://www.redhat.com/en/topics/devops/what-is-devsecops
|
||||
tags:
|
||||
analytic_story:
|
||||
- DevSecOps
|
||||
- Dev Sec Ops
|
||||
automated_detection_testing: passed
|
||||
confidence: 30
|
||||
context:
|
||||
|
||||
@@ -33,6 +33,7 @@ tags:
|
||||
message: Vulnerabilities found in packages used by GitHub repository $repository$
|
||||
mitre_attack_id:
|
||||
- T1195.001
|
||||
- T1195
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -33,6 +33,7 @@ tags:
|
||||
message: Vulnerabilities found in packages used by GitHub repository $repository$
|
||||
mitre_attack_id:
|
||||
- T1195.001
|
||||
- T1195
|
||||
nist:
|
||||
- PR.DS
|
||||
- PR.AC
|
||||
|
||||
@@ -19,14 +19,14 @@ search: '`gsuite_drive` NOT (email IN("", "null")) | rex field=parameters.owner
|
||||
| `gsuite_drive_share_in_external_email_filter`'
|
||||
how_to_implement: To successfully implement this search, you need to be ingesting
|
||||
logs related to gsuite having the file attachment metadata like file type, file
|
||||
extension, source email, destination email, num of attachment and etc.
|
||||
extension, source email, destination email, num of attachment and etc. In order for the search to work for your environment, please edit the query to use your company specific email domain instead of `internal_test_email.com`.
|
||||
known_false_positives: network admin or normal user may share files to customer and
|
||||
external team.
|
||||
references:
|
||||
- https://www.redhat.com/en/topics/devops/what-is-devsecops
|
||||
tags:
|
||||
analytic_story:
|
||||
- DevSecOps
|
||||
- Dev Sec Ops
|
||||
confidence: 90
|
||||
context:
|
||||
- Source:Endpoint
|
||||
@@ -41,11 +41,12 @@ tags:
|
||||
message: suspicious share gdrive from $parameters.owner$ to $email$ namely as $parameters.doc_title$
|
||||
mitre_attack_id:
|
||||
- T1567.002
|
||||
- T1567
|
||||
observable:
|
||||
- name: parameters.owner
|
||||
type: User
|
||||
role:
|
||||
- attacker
|
||||
- Attacker
|
||||
- name: email
|
||||
type: User
|
||||
role:
|
||||
@@ -66,3 +67,4 @@ tags:
|
||||
- parameters.doc_type
|
||||
risk_score: 72
|
||||
security_domain: endpoint
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ references:
|
||||
- https://www.redhat.com/en/topics/devops/what-is-devsecops
|
||||
tags:
|
||||
analytic_story:
|
||||
- DevSecOps
|
||||
- Dev Sec Ops
|
||||
confidence: 70
|
||||
context:
|
||||
- Source:Endpoint
|
||||
@@ -41,6 +41,7 @@ tags:
|
||||
message: suspicious email from $source.address$ to $destination{}.address$
|
||||
mitre_attack_id:
|
||||
- T1566.001
|
||||
- T1566
|
||||
observable:
|
||||
- name: source.address
|
||||
type: User
|
||||
|
||||
@@ -35,7 +35,7 @@ references:
|
||||
- https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-top-spear-phishing-words.pdf
|
||||
tags:
|
||||
analytic_story:
|
||||
- DevSecOps
|
||||
- Dev Sec Ops
|
||||
automated_detection_testing: passed
|
||||
confidence: 50
|
||||
context:
|
||||
@@ -49,6 +49,7 @@ tags:
|
||||
message: suspicious email from $source.address$ to $destination{}.address$
|
||||
mitre_attack_id:
|
||||
- T1566.001
|
||||
- T1566
|
||||
product:
|
||||
- Splunk Enterprise
|
||||
- Splunk Enterprise Security
|
||||
|
||||
@@ -26,7 +26,7 @@ references:
|
||||
- https://news.sophos.com/en-us/2021/07/22/malware-increasingly-targets-discord-for-abuse/
|
||||
tags:
|
||||
analytic_story:
|
||||
- DevSecOps
|
||||
- Dev Sec Ops
|
||||
automated_detection_testing: passed
|
||||
confidence: 50
|
||||
context:
|
||||
@@ -40,6 +40,7 @@ tags:
|
||||
message: suspicious email from $source.address$ to $destination{}.address$
|
||||
mitre_attack_id:
|
||||
- T1566.001
|
||||
- T1566
|
||||
product:
|
||||
- Splunk Enterprise
|
||||
- Splunk Enterprise Security
|
||||
|
||||
@@ -27,7 +27,7 @@ references:
|
||||
- https://www.redhat.com/en/topics/devops/what-is-devsecops
|
||||
tags:
|
||||
analytic_story:
|
||||
- DevSecOps
|
||||
- Dev Sec Ops
|
||||
confidence: 30
|
||||
context:
|
||||
- Source:Endpoint
|
||||
@@ -40,6 +40,7 @@ tags:
|
||||
message: suspicious email from $source.address$ to $destination{}.address$
|
||||
mitre_attack_id:
|
||||
- T1048.003
|
||||
- T1048
|
||||
observable:
|
||||
- name: source.address
|
||||
type: User
|
||||
|
||||
@@ -24,7 +24,7 @@ search: '`gsuite_drive` parameters.owner_is_team_drive=false "parameters.doc_tit
|
||||
| `gsuite_suspicious_shared_file_name_filter`'
|
||||
how_to_implement: To successfully implement this search, you need to be ingesting
|
||||
logs related to gsuite having the file attachment metadata like file type, file
|
||||
extension, source email, destination email, num of attachment and etc.
|
||||
extension, source email, destination email, num of attachment and etc. In order for the search to work for your environment, please edit the query to use your company specific email domain instead of `internal_test_email.com`.
|
||||
known_false_positives: normal user or normal transaction may contain the subject and
|
||||
file type attachment that this detection try to search
|
||||
references:
|
||||
@@ -32,7 +32,7 @@ references:
|
||||
- https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-top-spear-phishing-words.pdf
|
||||
tags:
|
||||
analytic_story:
|
||||
- DevSecOps
|
||||
- Dev Sec Ops
|
||||
automated_detection_testing: passed
|
||||
confidence: 70
|
||||
context:
|
||||
@@ -46,6 +46,7 @@ tags:
|
||||
message: suspicious share gdrive from $parameters.owner$ to $email$ namely as $parameters.doc_title$
|
||||
mitre_attack_id:
|
||||
- T1566.001
|
||||
- T1566
|
||||
observable:
|
||||
- name: parameters.owner
|
||||
type: User
|
||||
|
||||
@@ -41,6 +41,7 @@ tags:
|
||||
Address $ActorIpAddress$
|
||||
mitre_attack_id:
|
||||
- T1136.003
|
||||
- T1136
|
||||
observable:
|
||||
- name: ActorIpAddress
|
||||
type: IP Address
|
||||
|
||||
@@ -44,6 +44,7 @@ tags:
|
||||
service principal credentials from IP Address $ActorIpAddress$
|
||||
mitre_attack_id:
|
||||
- T1136.003
|
||||
- T1136
|
||||
observable:
|
||||
- name: ActorIpAddress
|
||||
type: IP Address
|
||||
|
||||
@@ -45,6 +45,7 @@ tags:
|
||||
list of trusted IPs to bypass MFA
|
||||
mitre_attack_id:
|
||||
- T1562.007
|
||||
- T1562
|
||||
observable:
|
||||
- name: ip_addresses_new_added
|
||||
type: IP Address
|
||||
|
||||
@@ -44,6 +44,7 @@ tags:
|
||||
$OrganizationName$
|
||||
mitre_attack_id:
|
||||
- T1136.003
|
||||
- T1136
|
||||
observable:
|
||||
- name: OrganizationName
|
||||
type: Other
|
||||
|
||||
@@ -39,6 +39,7 @@ tags:
|
||||
the same destination $ForwardingAddress$
|
||||
mitre_attack_id:
|
||||
- T1114.003
|
||||
- T1114
|
||||
nist:
|
||||
- DE.DP
|
||||
- DE.AE
|
||||
|
||||
@@ -38,6 +38,7 @@ tags:
|
||||
that allow access to sensitive
|
||||
mitre_attack_id:
|
||||
- T1114.002
|
||||
- T1114
|
||||
nist:
|
||||
- DE.DP
|
||||
- DE.AE
|
||||
|
||||
@@ -39,6 +39,7 @@ tags:
|
||||
a forwarding rule to same destination $ForwardingSmtpAddress$
|
||||
mitre_attack_id:
|
||||
- T1114.003
|
||||
- T1114
|
||||
nist:
|
||||
- DE.DP
|
||||
- DE.AE
|
||||
|
||||
@@ -35,3 +35,5 @@ tags:
|
||||
required_fields:
|
||||
- _time
|
||||
security_domain: network
|
||||
cve:
|
||||
- CVE-2016-4859
|
||||
|
||||
@@ -36,3 +36,5 @@ tags:
|
||||
required_fields:
|
||||
- _time
|
||||
security_domain: endpoint
|
||||
cve:
|
||||
- CVE-2017-5753
|
||||
|
||||
@@ -42,3 +42,6 @@ tags:
|
||||
required_fields:
|
||||
- _time
|
||||
security_domain: network
|
||||
cve:
|
||||
- CVE-2018-11409
|
||||
|
||||
@@ -44,6 +44,7 @@ tags:
|
||||
$dest$
|
||||
mitre_attack_id:
|
||||
- T1560.001
|
||||
- T1560
|
||||
observable:
|
||||
- name: dest
|
||||
type: Hostname
|
||||
|
||||
@@ -43,6 +43,7 @@ tags:
|
||||
Service (LSASS).
|
||||
mitre_attack_id:
|
||||
- T1003.001
|
||||
- T1003
|
||||
nist:
|
||||
- DE.CM
|
||||
observable:
|
||||
|
||||
@@ -47,6 +47,7 @@ tags:
|
||||
message: Suspicious $process_name$ usage detected on endpoint $dest$ by user $user$.
|
||||
mitre_attack_id:
|
||||
- T1087.002
|
||||
- T1087
|
||||
observable:
|
||||
- name: user
|
||||
type: User
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
name: Active Setup Registry Autostart
|
||||
id: f64579c0-203f-11ec-abcc-acde48001122
|
||||
version: 1
|
||||
date: '2021-09-28'
|
||||
author: Teoderick Contreras, Splunk
|
||||
type: TTP
|
||||
datamodel:
|
||||
- Endpoint
|
||||
description: This analytic is to detect a suspicious modification of the active setup
|
||||
registry for persistence and privilege escalation. This technique was seen in several
|
||||
malware (poisonIvy), adware and APT to gain persistence to the compromised machine
|
||||
upon boot up. This TTP is a good indicator to further check the process id that
|
||||
do the modification since modification of this registry is not commonly done. check
|
||||
the legitimacy of the file and process involve in this rules to check if it is a
|
||||
valid setup installer that creating or modifying this registry.
|
||||
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime
|
||||
max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_value_name
|
||||
= "StubPath" Registry.registry_key_name = "*\\SOFTWARE\\Microsoft\\Active Setup\\Installed
|
||||
Components*" by Registry.dest Registry.user Registry.registry_path Registry.registry_key_name
|
||||
Registry.registry_value_name | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)`
|
||||
| `drop_dm_object_name(Registry)` | `active_setup_registry_autostart_filter`'
|
||||
how_to_implement: To successfully implement this search, you must be ingesting data
|
||||
that records registry activity from your hosts to populate the endpoint data model
|
||||
in the registry node. This is typically populated via endpoint detection-and-response
|
||||
product, such as Carbon Black or endpoint data sources, such as Sysmon. The data
|
||||
used for this search is typically generated via logs that report reads and writes
|
||||
to the registry.
|
||||
known_false_positives: Active setup installer may add or modify this registry.
|
||||
references:
|
||||
- https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Backdoor%3aWin32%2fPoisonivy.E
|
||||
- https://attack.mitre.org/techniques/T1547/014/
|
||||
tags:
|
||||
analytic_story:
|
||||
- Windows Persistence Techniques
|
||||
- Windows Privilege Escalation
|
||||
dataset:
|
||||
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/t1547.014/active_setup_stubpath/sysmon.log
|
||||
kill_chain_phases:
|
||||
- Exploitation
|
||||
mitre_attack_id:
|
||||
- T1547.014
|
||||
- T1547
|
||||
product:
|
||||
- Splunk Enterprise
|
||||
- Splunk Enterprise Security
|
||||
- Splunk Cloud
|
||||
required_fields:
|
||||
- _time
|
||||
- Registry.dest
|
||||
- Registry.user
|
||||
- Registry.registry_path
|
||||
- Registry.registry_key_name
|
||||
- Registry.registry_value_name
|
||||
security_domain: endpoint
|
||||
impact: 80
|
||||
confidence: 80
|
||||
risk_score: 64
|
||||
context:
|
||||
- source:endpoint
|
||||
- stage:Privilege Escalation Persistence
|
||||
message: modified/added/deleted registry entry $Registry.registry_path$ in $dest$
|
||||
observable:
|
||||
- name: dest
|
||||
type: Hostname
|
||||
role:
|
||||
- Victim
|
||||
- name: user
|
||||
type: user
|
||||
role:
|
||||
- Victim
|
||||
automated_detection_testing: passed
|
||||
@@ -42,6 +42,7 @@ tags:
|
||||
to prepare autoadminlogon
|
||||
mitre_attack_id:
|
||||
- T1552.002
|
||||
- T1552
|
||||
observable:
|
||||
- name: dest
|
||||
type: Endpoint
|
||||
|
||||
@@ -38,6 +38,7 @@ tags:
|
||||
message: powershell process having commandline $Message$ for user enumeration
|
||||
mitre_attack_id:
|
||||
- T1087.002
|
||||
- T1087
|
||||
observable:
|
||||
- name: ComputerName
|
||||
type: Hostname
|
||||
|
||||
@@ -36,6 +36,7 @@ tags:
|
||||
- Exploitation
|
||||
mitre_attack_id:
|
||||
- T1562.007
|
||||
- T1562
|
||||
product:
|
||||
- Splunk Enterprise
|
||||
- Splunk Enterprise Security
|
||||
|
||||
@@ -42,6 +42,7 @@ tags:
|
||||
$dest$ by user $user$.
|
||||
mitre_attack_id:
|
||||
- T1021.001
|
||||
- T1021
|
||||
observable:
|
||||
- name: user
|
||||
type: User
|
||||
|
||||
@@ -38,6 +38,7 @@ tags:
|
||||
user $user$.
|
||||
mitre_attack_id:
|
||||
- T1021.001
|
||||
- T1021
|
||||
observable:
|
||||
- name: user
|
||||
type: User
|
||||
|
||||
@@ -38,6 +38,7 @@ tags:
|
||||
- Exploitation
|
||||
mitre_attack_id:
|
||||
- T1562.007
|
||||
- T1562
|
||||
product:
|
||||
- Splunk Enterprise
|
||||
- Splunk Enterprise Security
|
||||
|
||||
@@ -47,6 +47,7 @@ tags:
|
||||
of 7zip.
|
||||
mitre_attack_id:
|
||||
- T1560.001
|
||||
- T1560
|
||||
observable:
|
||||
- name: user
|
||||
type: User
|
||||
|
||||
@@ -47,6 +47,7 @@ tags:
|
||||
on endpoint $dest$ by user $user$. This behavior identifies the use of DownloadFile
|
||||
within PowerShell.
|
||||
mitre_attack_id:
|
||||
- T1059
|
||||
- T1059.001
|
||||
observable:
|
||||
- name: user
|
||||
|
||||
@@ -44,6 +44,7 @@ tags:
|
||||
on endpoint $dest$ by user $user$. This behavior identifies the use of DownloadString
|
||||
within PowerShell.
|
||||
mitre_attack_id:
|
||||
- T1059
|
||||
- T1059.001
|
||||
observable:
|
||||
- name: user
|
||||
|
||||
@@ -51,8 +51,9 @@ tags:
|
||||
on host $dest$ by User $user$. This process $process_name$ is known to do- $description$
|
||||
mitre_attack_id:
|
||||
- T1036.005
|
||||
- T1595
|
||||
- T1036
|
||||
- T1003
|
||||
- T1595
|
||||
nist:
|
||||
- ID.AM
|
||||
- PR.DS
|
||||
|
||||
@@ -46,6 +46,7 @@ tags:
|
||||
attempting to add a certificate to the store on endpoint $dest$ by user $user$.
|
||||
mitre_attack_id:
|
||||
- T1553.004
|
||||
- T1553
|
||||
nist:
|
||||
- PR.PT
|
||||
- DE.CM
|
||||
|
||||
@@ -49,6 +49,7 @@ tags:
|
||||
attempting to disable security services on endpoint $dest$ by user $user$.
|
||||
mitre_attack_id:
|
||||
- T1562.001
|
||||
- T1562
|
||||
nist:
|
||||
- PR.PT
|
||||
- DE.CM
|
||||
|
||||
@@ -47,6 +47,7 @@ tags:
|
||||
on endpoint $dest$ by user $user$ attempting to export the registry keys.
|
||||
mitre_attack_id:
|
||||
- T1003.002
|
||||
- T1003
|
||||
nist:
|
||||
- DE.CM
|
||||
observable:
|
||||
|
||||
@@ -42,6 +42,7 @@ tags:
|
||||
to prepare autoadminlogon
|
||||
mitre_attack_id:
|
||||
- T1552.002
|
||||
- T1552
|
||||
observable:
|
||||
- name: dest
|
||||
type: Endpoint
|
||||
|
||||
@@ -50,6 +50,7 @@ tags:
|
||||
message: A file - $file_name$ was written to system32 has occurred on endpoint $dest$
|
||||
by user $user$.
|
||||
mitre_attack_id:
|
||||
- T1204
|
||||
- T1204.002
|
||||
nist:
|
||||
- PR.PT
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
name: Change Default File Association
|
||||
id: 462d17d8-1f71-11ec-ad07-acde48001122
|
||||
version: 1
|
||||
date: '2021-09-27'
|
||||
author: Teoderick Contreras, Splunk
|
||||
type: TTP
|
||||
datamodel:
|
||||
- Endpoint
|
||||
description: This analytic is developed to detect suspicious registry modification
|
||||
to change the default file association of windows to malicious payload. This techninique
|
||||
was seen in some APT where it modify the default process to run file association,
|
||||
like .txt to notepad.exe. Instead notepad.exe it will point to a Script or other
|
||||
payload that will load malicious command to the compromised host.
|
||||
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime
|
||||
max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path
|
||||
="*\\shell\\open\\command\\*" Registry.registry_path = "*HKCR\\*" by Registry.dest Registry.user
|
||||
Registry.registry_path Registry.registry_key_name Registry.registry_value_name |
|
||||
`security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `drop_dm_object_name(Registry)`
|
||||
| `change_default_file_association_filter`'
|
||||
how_to_implement: To successfully implement this search, you must be ingesting data
|
||||
that records registry activity from your hosts to populate the endpoint data model
|
||||
in the registry node. This is typically populated via endpoint detection-and-response
|
||||
product, such as Carbon Black or endpoint data sources, such as Sysmon. The data
|
||||
used for this search is typically generated via logs that report reads and writes
|
||||
to the registry.
|
||||
known_false_positives: unknown
|
||||
references:
|
||||
- https://dmcxblue.gitbook.io/red-team-notes-2-0/red-team-techniques/privilege-escalation/untitled-3/accessibility-features
|
||||
tags:
|
||||
analytic_story:
|
||||
- Windows Persistence Techniques
|
||||
- Windows Privilege Escalation
|
||||
dataset:
|
||||
- https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1546.001/txtfile_reg/sysmon.log
|
||||
kill_chain_phases:
|
||||
- Exploitation
|
||||
mitre_attack_id:
|
||||
- T1546.001
|
||||
- T1546
|
||||
product:
|
||||
- Splunk Enterprise
|
||||
- Splunk Enterprise Security
|
||||
- Splunk Cloud
|
||||
required_fields:
|
||||
- _time
|
||||
- Registry.dest
|
||||
- Registry.user
|
||||
- Registry.registry_path
|
||||
- Registry.registry_key_name
|
||||
- Registry.registry_value_name
|
||||
security_domain: endpoint
|
||||
impact: 80
|
||||
confidence: 100
|
||||
risk_score: 80
|
||||
context:
|
||||
- source:endpoint
|
||||
- stage:Privilege Escalation Persistence
|
||||
message: modified/added/deleted registry entry $Registry.registry_path$ in $dest$
|
||||
observable:
|
||||
- name: dest
|
||||
type: Hostname
|
||||
role:
|
||||
- Victim
|
||||
- name: user
|
||||
type: user
|
||||
role:
|
||||
- Victim
|
||||
automated_detection_testing: passed
|
||||
@@ -40,6 +40,7 @@ tags:
|
||||
of a specific disk.
|
||||
mitre_attack_id:
|
||||
- T1070.004
|
||||
- T1070
|
||||
observable:
|
||||
- name: user
|
||||
type: User
|
||||
|
||||
@@ -44,8 +44,10 @@ tags:
|
||||
on endpoint $dest$ by user $user$ potentially performing privilege escalation
|
||||
using named pipes related to Cobalt Strike and other frameworks.
|
||||
mitre_attack_id:
|
||||
- T1059
|
||||
- T1059.003
|
||||
- T1543.003
|
||||
- T1543
|
||||
observable:
|
||||
- name: user
|
||||
type: User
|
||||
|
||||
@@ -44,6 +44,7 @@ tags:
|
||||
message: parent process name $parent_process_name$ with child process $process_name$
|
||||
to execute commandline tool in $dest$
|
||||
mitre_attack_id:
|
||||
- T1059
|
||||
- T1059.007
|
||||
observable:
|
||||
- name: dest
|
||||
|
||||
@@ -38,6 +38,7 @@ tags:
|
||||
message: The following module $ImageLoaded$ was loaded by a non-standard application
|
||||
on endpoint $Computer$ by user $user$.
|
||||
mitre_attack_id:
|
||||
- T1218
|
||||
- T1218.003
|
||||
observable:
|
||||
- name: user
|
||||
|
||||
@@ -47,6 +47,7 @@ tags:
|
||||
message: An instance of $parent_process_name$ spawning $process_name$ was identified
|
||||
on endpoint $dest$ by user $user$ attempting to load a suspicious file from disk.
|
||||
mitre_attack_id:
|
||||
- T1218
|
||||
- T1218.002
|
||||
observable:
|
||||
- name: user
|
||||
@@ -83,3 +84,5 @@ tags:
|
||||
- Processes.parent_process_id
|
||||
risk_score: 80
|
||||
security_domain: endpoint
|
||||
cve:
|
||||
- CVE-2021-40444
|
||||
|
||||
@@ -46,6 +46,7 @@ tags:
|
||||
group.
|
||||
mitre_attack_id:
|
||||
- T1136.001
|
||||
- T1136
|
||||
nist:
|
||||
- PR.PT
|
||||
- DE.CM
|
||||
|
||||
@@ -42,6 +42,7 @@ tags:
|
||||
message: An instance of $parent_process_name$ spawning $process_name$ was identified
|
||||
on endpoint $dest$ by user $user$ enumerating Windows file shares.
|
||||
mitre_attack_id:
|
||||
- T1070
|
||||
- T1070.005
|
||||
nist:
|
||||
- PR.PT
|
||||
|
||||
@@ -41,6 +41,7 @@ tags:
|
||||
behavior is indicative of credential dumping and should be investigated.
|
||||
mitre_attack_id:
|
||||
- T1003.001
|
||||
- T1003
|
||||
nist:
|
||||
- DE.CM
|
||||
observable:
|
||||
|
||||
@@ -36,6 +36,7 @@ tags:
|
||||
message: A service $Service_File_Name$ was created from a non-standard path using
|
||||
$Service_Name$, potentially leading to a privilege escalation.
|
||||
mitre_attack_id:
|
||||
- T1569
|
||||
- T1569.002
|
||||
observable:
|
||||
- name: Service_File_Name
|
||||
|
||||
@@ -47,6 +47,7 @@ tags:
|
||||
to disk. This behavior is related to dumping credentials via Task Manager.
|
||||
mitre_attack_id:
|
||||
- T1003.001
|
||||
- T1003
|
||||
nist:
|
||||
- DE.CM
|
||||
observable:
|
||||
|
||||
@@ -45,6 +45,7 @@ tags:
|
||||
offline password cracking.
|
||||
mitre_attack_id:
|
||||
- T1003.003
|
||||
- T1003
|
||||
nist:
|
||||
- DE.CM
|
||||
observable:
|
||||
|
||||
@@ -43,6 +43,7 @@ tags:
|
||||
offline password cracking.
|
||||
mitre_attack_id:
|
||||
- T1003.003
|
||||
- T1003
|
||||
nist:
|
||||
- DE.CM
|
||||
observable:
|
||||
|
||||
@@ -45,6 +45,7 @@ tags:
|
||||
password cracking.
|
||||
mitre_attack_id:
|
||||
- T1003.003
|
||||
- T1003
|
||||
nist:
|
||||
- DE.CM
|
||||
observable:
|
||||
|
||||
@@ -43,6 +43,7 @@ tags:
|
||||
to grab credentials.
|
||||
mitre_attack_id:
|
||||
- T1003.003
|
||||
- T1003
|
||||
nist:
|
||||
- DE.CM
|
||||
observable:
|
||||
|
||||
@@ -38,6 +38,7 @@ tags:
|
||||
message: The following $EventCode$ occurred on $dest$ by $user$ with Logon Type
|
||||
3, which may be indicative of the pass the hash technique.
|
||||
mitre_attack_id:
|
||||
- T1550
|
||||
- T1550.002
|
||||
nist:
|
||||
- PR.PT
|
||||
|
||||
@@ -42,10 +42,12 @@ tags:
|
||||
on endpoint $dest$ by user $user$ using AzureHound to enumerate AzureAD.
|
||||
mitre_attack_id:
|
||||
- T1087.002
|
||||
- T1087.001
|
||||
- T1482
|
||||
- T1069.002
|
||||
- T1069.001
|
||||
- T1482
|
||||
- T1087.001
|
||||
- T1087
|
||||
- T1069.002
|
||||
- T1069
|
||||
observable:
|
||||
- name: user
|
||||
type: User
|
||||
|
||||
@@ -45,10 +45,12 @@ tags:
|
||||
a AzureAD enumeration utility, has occurred on endpoint $dest$ by user $user$.
|
||||
mitre_attack_id:
|
||||
- T1087.002
|
||||
- T1087.001
|
||||
- T1482
|
||||
- T1069.002
|
||||
- T1069.001
|
||||
- T1482
|
||||
- T1087.001
|
||||
- T1087
|
||||
- T1069.002
|
||||
- T1069
|
||||
observable:
|
||||
- name: user
|
||||
type: User
|
||||
|
||||
@@ -67,3 +67,5 @@ tags:
|
||||
- user
|
||||
risk_score: 49
|
||||
security_domain: endpoint
|
||||
cve:
|
||||
- CVE-2020-1472
|
||||
|
||||
@@ -49,6 +49,7 @@ tags:
|
||||
$ComputerName$ by user $user$.
|
||||
mitre_attack_id:
|
||||
- T1003.002
|
||||
- T1003
|
||||
observable:
|
||||
- name: user
|
||||
type: User
|
||||
@@ -71,3 +72,5 @@ tags:
|
||||
- EventCode
|
||||
risk_score: 80
|
||||
security_domain: endpoint
|
||||
cve:
|
||||
- CVE-2021-36934
|
||||
|
||||
@@ -47,6 +47,7 @@ tags:
|
||||
investigated.
|
||||
mitre_attack_id:
|
||||
- T1003.001
|
||||
- T1003
|
||||
nist:
|
||||
- PR.IP
|
||||
- PR.AC
|
||||
|
||||
@@ -51,6 +51,7 @@ tags:
|
||||
message: The following behavior was identified and typically related to PowerShell-Empire
|
||||
on $ComputerName$ by $User$.
|
||||
mitre_attack_id:
|
||||
- T1059
|
||||
- T1059.001
|
||||
observable:
|
||||
- name: User
|
||||
|
||||
@@ -49,6 +49,7 @@ tags:
|
||||
message: Multiple accounts have been locked out. Review $dest$ and results related
|
||||
to $user$.
|
||||
mitre_attack_id:
|
||||
- T1078
|
||||
- T1078.002
|
||||
nist:
|
||||
- PR.IP
|
||||
|
||||
@@ -38,6 +38,7 @@ tags:
|
||||
message: Multiple accounts have been locked out. Review $nodename$ and $result$
|
||||
related to $user$.
|
||||
mitre_attack_id:
|
||||
- T1078
|
||||
- T1078.003
|
||||
nist:
|
||||
- PR.IP
|
||||
|
||||
@@ -65,6 +65,7 @@ tags:
|
||||
previously performed by HAFNIUM. Review further file modifications on endpoint
|
||||
$dest$ by user $user$.
|
||||
mitre_attack_id:
|
||||
- T1505
|
||||
- T1505.003
|
||||
observable:
|
||||
- name: user
|
||||
|
||||
@@ -53,6 +53,7 @@ tags:
|
||||
message: The following $process_name$ has been identified as renamed, spawning from
|
||||
$parent_process_name$.
|
||||
mitre_attack_id:
|
||||
- T1218
|
||||
- T1218.001
|
||||
nist:
|
||||
- PR.PT
|
||||
|
||||
@@ -53,6 +53,7 @@ tags:
|
||||
on endpoint $dest$ by user $user$ spawning a child process, typically not normal
|
||||
behavior.
|
||||
mitre_attack_id:
|
||||
- T1218
|
||||
- T1218.001
|
||||
nist:
|
||||
- PR.PT
|
||||
|
||||
@@ -57,6 +57,7 @@ tags:
|
||||
on endpoint $dest$ by user $user$ contacting a remote destination to potentally
|
||||
download a malicious payload.
|
||||
mitre_attack_id:
|
||||
- T1218
|
||||
- T1218.001
|
||||
nist:
|
||||
- PR.PT
|
||||
|
||||
@@ -58,6 +58,7 @@ tags:
|
||||
message: $process_name$ has been identified using Infotech Storage Handlers to load
|
||||
a specific file within a CHM on $dest$ under user $user$.
|
||||
mitre_attack_id:
|
||||
- T1218
|
||||
- T1218.001
|
||||
nist:
|
||||
- PR.PT
|
||||
|
||||
@@ -48,6 +48,7 @@ tags:
|
||||
to credential dumping on $Computer$. Review for further details.
|
||||
mitre_attack_id:
|
||||
- T1003.001
|
||||
- T1003
|
||||
nist:
|
||||
- DE.AE
|
||||
- DE.CM
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user