contentctl 4.3.4__py3-none-any.whl → 4.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- contentctl/actions/build.py +1 -0
- contentctl/actions/detection_testing/GitService.py +10 -10
- contentctl/actions/detection_testing/infrastructures/DetectionTestingInfrastructure.py +68 -38
- contentctl/actions/detection_testing/infrastructures/DetectionTestingInfrastructureContainer.py +5 -1
- contentctl/actions/detection_testing/views/DetectionTestingViewWeb.py +10 -8
- contentctl/actions/initialize.py +28 -12
- contentctl/actions/inspect.py +191 -91
- contentctl/actions/new_content.py +10 -2
- contentctl/actions/validate.py +3 -6
- contentctl/api.py +1 -1
- contentctl/contentctl.py +3 -0
- contentctl/enrichments/attack_enrichment.py +49 -81
- contentctl/enrichments/cve_enrichment.py +6 -7
- contentctl/helper/splunk_app.py +141 -10
- contentctl/input/director.py +19 -24
- contentctl/input/new_content_questions.py +9 -42
- contentctl/objects/abstract_security_content_objects/detection_abstract.py +155 -13
- contentctl/objects/abstract_security_content_objects/security_content_object_abstract.py +17 -9
- contentctl/objects/atomic.py +51 -77
- contentctl/objects/base_test_result.py +7 -7
- contentctl/objects/baseline.py +12 -18
- contentctl/objects/baseline_tags.py +2 -5
- contentctl/objects/config.py +154 -26
- contentctl/objects/constants.py +34 -1
- contentctl/objects/correlation_search.py +79 -114
- contentctl/objects/dashboard.py +100 -0
- contentctl/objects/deployment.py +20 -5
- contentctl/objects/detection_metadata.py +71 -0
- contentctl/objects/detection_stanza.py +79 -0
- contentctl/objects/detection_tags.py +28 -26
- contentctl/objects/drilldown.py +70 -0
- contentctl/objects/enums.py +26 -24
- contentctl/objects/errors.py +187 -0
- contentctl/objects/investigation.py +23 -15
- contentctl/objects/investigation_tags.py +4 -3
- contentctl/objects/lookup.py +8 -1
- contentctl/objects/macro.py +16 -7
- contentctl/objects/notable_event.py +6 -5
- contentctl/objects/risk_analysis_action.py +4 -4
- contentctl/objects/risk_event.py +8 -7
- contentctl/objects/savedsearches_conf.py +196 -0
- contentctl/objects/story.py +4 -16
- contentctl/objects/throttling.py +46 -0
- contentctl/output/conf_output.py +4 -0
- contentctl/output/conf_writer.py +24 -4
- contentctl/output/new_content_yml_output.py +4 -9
- contentctl/output/templates/analyticstories_detections.j2 +2 -2
- contentctl/output/templates/analyticstories_investigations.j2 +5 -5
- contentctl/output/templates/analyticstories_stories.j2 +1 -1
- contentctl/output/templates/savedsearches_baselines.j2 +2 -3
- contentctl/output/templates/savedsearches_detections.j2 +12 -7
- contentctl/output/templates/savedsearches_investigations.j2 +3 -4
- contentctl/templates/detections/endpoint/anomalous_usage_of_7zip.yml +10 -1
- {contentctl-4.3.4.dist-info → contentctl-4.4.0.dist-info}/METADATA +6 -5
- {contentctl-4.3.4.dist-info → contentctl-4.4.0.dist-info}/RECORD +58 -57
- {contentctl-4.3.4.dist-info → contentctl-4.4.0.dist-info}/WHEEL +1 -1
- contentctl/objects/ssa_detection.py +0 -157
- contentctl/objects/ssa_detection_tags.py +0 -138
- contentctl/objects/unit_test_old.py +0 -10
- contentctl/objects/unit_test_ssa.py +0 -31
- contentctl/output/templates/finding_report.j2 +0 -30
- {contentctl-4.3.4.dist-info → contentctl-4.4.0.dist-info}/LICENSE.md +0 -0
- {contentctl-4.3.4.dist-info → contentctl-4.4.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from pydantic import BaseModel, Field, field_validator
|
|
2
|
+
from typing import Annotated
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
# Alert Suppression/Throttling settings have been taken from
|
|
6
|
+
# https://docs.splunk.com/Documentation/Splunk/9.2.2/Admin/Savedsearchesconf
|
|
7
|
+
class Throttling(BaseModel):
|
|
8
|
+
fields: list[str] = Field(..., description="The list of fields to throttle on. These fields MUST occur in the search.", min_length=1)
|
|
9
|
+
period: Annotated[str,Field(pattern="^[0-9]+[smh]$")] = Field(..., description="How often the alert should be triggered. "
|
|
10
|
+
"This may be specified in seconds, minutes, or hours. "
|
|
11
|
+
"For example, if an alert should be triggered once a day,"
|
|
12
|
+
" it may be specified in seconds (86400s), minutes (1440m), or hours import (24h).")
|
|
13
|
+
|
|
14
|
+
@field_validator("fields")
|
|
15
|
+
def no_spaces_in_fields(cls, v:list[str])->list[str]:
|
|
16
|
+
for field in v:
|
|
17
|
+
if ' ' in field:
|
|
18
|
+
raise ValueError("Spaces are not presently supported in 'alert.suppress.fields' / throttling fields in conf files. "
|
|
19
|
+
"The field '{field}' has a space in it. If this is a blocker, please raise this as an issue on the Project.")
|
|
20
|
+
return v
|
|
21
|
+
|
|
22
|
+
def conf_formatted_fields(self)->str:
|
|
23
|
+
'''
|
|
24
|
+
TODO:
|
|
25
|
+
The field alert.suppress.fields is defined as follows:
|
|
26
|
+
alert.suppress.fields = <comma-delimited-field-list>
|
|
27
|
+
* List of fields to use when suppressing per-result alerts. This field *must*
|
|
28
|
+
be specified if the digest mode is disabled and suppression is enabled.
|
|
29
|
+
|
|
30
|
+
In order to support fields with spaces in them, we may need to wrap each
|
|
31
|
+
field in "".
|
|
32
|
+
This function returns a properly formatted value, where each field
|
|
33
|
+
is wrapped in "" and separated with a comma. For example, the fields
|
|
34
|
+
["field1", "field 2", "field3"] would be returned as the string
|
|
35
|
+
|
|
36
|
+
"field1","field 2","field3
|
|
37
|
+
|
|
38
|
+
However, for now, we will error on fields with spaces and simply
|
|
39
|
+
separate with commas
|
|
40
|
+
'''
|
|
41
|
+
|
|
42
|
+
return ",".join(self.fields)
|
|
43
|
+
|
|
44
|
+
# The following may be used once we determine proper support
|
|
45
|
+
# for fields with spaces
|
|
46
|
+
#return ",".join([f'"{field}"' for field in self.fields])
|
contentctl/output/conf_output.py
CHANGED
contentctl/output/conf_writer.py
CHANGED
|
@@ -8,6 +8,7 @@ from xmlrpc.client import APPLICATION_ERROR
|
|
|
8
8
|
from jinja2 import Environment, FileSystemLoader, StrictUndefined
|
|
9
9
|
import pathlib
|
|
10
10
|
from contentctl.objects.security_content_object import SecurityContentObject
|
|
11
|
+
from contentctl.objects.dashboard import Dashboard
|
|
11
12
|
from contentctl.objects.config import build
|
|
12
13
|
import xml.etree.ElementTree as ET
|
|
13
14
|
|
|
@@ -34,7 +35,10 @@ class ConfWriter():
|
|
|
34
35
|
# Failing to do so will result in an improperly formatted conf files that
|
|
35
36
|
# cannot be parsed
|
|
36
37
|
if isinstance(obj,str):
|
|
37
|
-
|
|
38
|
+
# Remove leading and trailing characters. Conf parsers may erroneously
|
|
39
|
+
# Parse fields if they have leading or trailing newlines/whitespace and we
|
|
40
|
+
# probably don't want that anyway as it doesn't look good in output
|
|
41
|
+
return obj.strip().replace(f"\n"," \\\n")
|
|
38
42
|
else:
|
|
39
43
|
return obj
|
|
40
44
|
|
|
@@ -58,7 +62,7 @@ class ConfWriter():
|
|
|
58
62
|
j2_env = ConfWriter.getJ2Environment()
|
|
59
63
|
template = j2_env.get_template(template_name)
|
|
60
64
|
|
|
61
|
-
output = template.render(objects=objects,
|
|
65
|
+
output = template.render(objects=objects, app=config.app, currentDate=datetime.datetime.now(datetime.UTC).date().isoformat())
|
|
62
66
|
|
|
63
67
|
output_path = config.getPackageDirectoryPath()/app_output_path
|
|
64
68
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -91,7 +95,7 @@ class ConfWriter():
|
|
|
91
95
|
j2_env = ConfWriter.getJ2Environment()
|
|
92
96
|
template = j2_env.get_template(template_name)
|
|
93
97
|
|
|
94
|
-
output = template.render(objects=objects,
|
|
98
|
+
output = template.render(objects=objects, app=config.app)
|
|
95
99
|
|
|
96
100
|
output_path = config.getPackageDirectoryPath()/app_output_path
|
|
97
101
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -104,6 +108,22 @@ class ConfWriter():
|
|
|
104
108
|
|
|
105
109
|
|
|
106
110
|
|
|
111
|
+
@staticmethod
|
|
112
|
+
def writeDashboardFiles(config:build, dashboards:list[Dashboard])->set[pathlib.Path]:
|
|
113
|
+
written_files:set[pathlib.Path] = set()
|
|
114
|
+
for dashboard in dashboards:
|
|
115
|
+
output_file_path = dashboard.getOutputFilepathRelativeToAppRoot(config)
|
|
116
|
+
# Check that the full output path does not exist so that we are not having an
|
|
117
|
+
# name collision with a file in app_template
|
|
118
|
+
if (config.getPackageDirectoryPath()/output_file_path).exists():
|
|
119
|
+
raise FileExistsError(f"ERROR: Overwriting Dashboard File {output_file_path}. Does this file exist in {config.getAppTemplatePath()} AND {config.path/'dashboards'}?")
|
|
120
|
+
|
|
121
|
+
ConfWriter.writeXmlFileHeader(output_file_path, config)
|
|
122
|
+
dashboard.writeDashboardFile(ConfWriter.getJ2Environment(), config)
|
|
123
|
+
ConfWriter.validateXmlFile(config.getPackageDirectoryPath()/output_file_path)
|
|
124
|
+
written_files.add(output_file_path)
|
|
125
|
+
return written_files
|
|
126
|
+
|
|
107
127
|
|
|
108
128
|
@staticmethod
|
|
109
129
|
def writeXmlFileHeader(app_output_path:pathlib.Path, config: build) -> None:
|
|
@@ -139,7 +159,7 @@ class ConfWriter():
|
|
|
139
159
|
j2_env = ConfWriter.getJ2Environment()
|
|
140
160
|
|
|
141
161
|
template = j2_env.get_template(template_name)
|
|
142
|
-
output = template.render(objects=objects,
|
|
162
|
+
output = template.render(objects=objects, app=config.app)
|
|
143
163
|
|
|
144
164
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
145
165
|
with open(output_path, 'a') as f:
|
|
@@ -39,11 +39,8 @@ class NewContentYmlOutput():
|
|
|
39
39
|
.replace('.','_') \
|
|
40
40
|
.replace('/','_') \
|
|
41
41
|
.lower()
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
file_name = 'ssa___' + file_name + '.yml'
|
|
45
|
-
else:
|
|
46
|
-
file_name = file_name + '.yml'
|
|
42
|
+
|
|
43
|
+
file_name = file_name + '.yml'
|
|
47
44
|
return file_name
|
|
48
45
|
|
|
49
46
|
|
|
@@ -54,8 +51,6 @@ class NewContentYmlOutput():
|
|
|
54
51
|
.replace('.','_') \
|
|
55
52
|
.replace('/','_') \
|
|
56
53
|
.lower()
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
else:
|
|
60
|
-
file_name = file_name + '.test.yml'
|
|
54
|
+
|
|
55
|
+
file_name = file_name + '.test.yml'
|
|
61
56
|
return file_name
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
|
|
4
4
|
{% for detection in objects %}
|
|
5
5
|
{% if (detection.type == 'TTP' or detection.type == 'Anomaly' or detection.type == 'Hunting' or detection.type == 'Correlation') %}
|
|
6
|
-
[savedsearch://{{
|
|
6
|
+
[savedsearch://{{ detection.get_conf_stanza_name(app) }}]
|
|
7
7
|
type = detection
|
|
8
8
|
asset_type = {{ detection.tags.asset_type.value }}
|
|
9
9
|
confidence = medium
|
|
10
|
-
explanation = {{ detection.description | escapeNewlines() }}
|
|
10
|
+
explanation = {{ (detection.explanation if detection.explanation else detection.description) | escapeNewlines() }}
|
|
11
11
|
{% if detection.how_to_implement is defined %}
|
|
12
12
|
how_to_implement = {{ detection.how_to_implement | escapeNewlines() }}
|
|
13
13
|
{% else %}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
|
|
2
2
|
### RESPONSE TASKS ###
|
|
3
3
|
|
|
4
|
-
{% for
|
|
5
|
-
{% if (
|
|
6
|
-
[savedsearch://{{
|
|
4
|
+
{% for investigation in objects %}
|
|
5
|
+
{% if (investigation.type == 'Investigation') %}
|
|
6
|
+
[savedsearch://{{ investigation.get_response_task_name(app) }}]
|
|
7
7
|
type = investigation
|
|
8
8
|
explanation = none
|
|
9
|
-
{% if
|
|
10
|
-
how_to_implement = {{
|
|
9
|
+
{% if investigation.how_to_implement is defined %}
|
|
10
|
+
how_to_implement = {{ investigation.how_to_implement | escapeNewlines() }}
|
|
11
11
|
{% else %}
|
|
12
12
|
how_to_implement = none
|
|
13
13
|
{% endif %}
|
|
@@ -10,7 +10,7 @@ version = {{ story.version }}
|
|
|
10
10
|
references = {{ story.getReferencesListForJson() | tojson }}
|
|
11
11
|
maintainers = [{"company": "{{ story.author_company }}", "email": "{{ story.author_email }}", "name": "{{ story.author_name }}"}]
|
|
12
12
|
spec_version = 3
|
|
13
|
-
searches = {{ story.storyAndInvestigationNamesWithApp(
|
|
13
|
+
searches = {{ story.storyAndInvestigationNamesWithApp(app) | tojson }}
|
|
14
14
|
description = {{ story.description | escapeNewlines() }}
|
|
15
15
|
{% if story.narrative is defined %}
|
|
16
16
|
narrative = {{ story.narrative | escapeNewlines() }}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
### {{
|
|
3
|
+
### {{app.label}} BASELINES ###
|
|
4
4
|
|
|
5
5
|
{% for detection in objects %}
|
|
6
6
|
{% if (detection.type == 'Baseline') %}
|
|
7
|
-
[{{
|
|
7
|
+
[{{ detection.get_conf_stanza_name(app) }}]
|
|
8
8
|
action.escu = 0
|
|
9
9
|
action.escu.enabled = 1
|
|
10
10
|
action.escu.search_type = support
|
|
11
|
-
action.escu.full_search_name = {{APP_NAME}} - {{ detection.name }}
|
|
12
11
|
description = {{ detection.description | escapeNewlines() }}
|
|
13
12
|
action.escu.creation_date = {{ detection.date }}
|
|
14
13
|
action.escu.modification_date = {{ detection.date }}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
### {{
|
|
1
|
+
### {{app.label}} DETECTIONS ###
|
|
2
2
|
|
|
3
3
|
{% for detection in objects %}
|
|
4
4
|
{% if (detection.type == 'TTP' or detection.type == 'Anomaly' or detection.type == 'Hunting' or detection.type == 'Correlation') %}
|
|
5
|
-
[{{
|
|
5
|
+
[{{ detection.get_conf_stanza_name(app) }}]
|
|
6
6
|
action.escu = 0
|
|
7
7
|
action.escu.enabled = 1
|
|
8
8
|
{% if detection.status == "deprecated" %}
|
|
@@ -28,7 +28,6 @@ action.escu.known_false_positives = None
|
|
|
28
28
|
action.escu.creation_date = {{ detection.date }}
|
|
29
29
|
action.escu.modification_date = {{ detection.date }}
|
|
30
30
|
action.escu.confidence = high
|
|
31
|
-
action.escu.full_search_name = {{APP_NAME}} - {{ detection.name }} - Rule
|
|
32
31
|
action.escu.search_type = detection
|
|
33
32
|
{% if detection.tags.product is defined %}
|
|
34
33
|
action.escu.product = {{ detection.tags.product | tojson }}
|
|
@@ -57,7 +56,7 @@ cron_schedule = {{ detection.deployment.scheduling.cron_schedule }}
|
|
|
57
56
|
dispatch.earliest_time = {{ detection.deployment.scheduling.earliest_time }}
|
|
58
57
|
dispatch.latest_time = {{ detection.deployment.scheduling.latest_time }}
|
|
59
58
|
action.correlationsearch.enabled = 1
|
|
60
|
-
action.correlationsearch.label = {{
|
|
59
|
+
action.correlationsearch.label = {{ detection.get_action_dot_correlationsearch_dot_label(app) }}
|
|
61
60
|
action.correlationsearch.annotations = {{ detection.annotations | tojson }}
|
|
62
61
|
action.correlationsearch.metadata = {{ detection.metadata | tojson }}
|
|
63
62
|
{% if detection.deployment.scheduling.schedule_window is defined %}
|
|
@@ -72,7 +71,7 @@ action.notable.param.nes_fields = {{ detection.nes_fields }}
|
|
|
72
71
|
action.notable.param.rule_description = {{ detection.deployment.alert_action.notable.rule_description | custom_jinja2_enrichment_filter(detection) | escapeNewlines()}}
|
|
73
72
|
action.notable.param.rule_title = {% if detection.type | lower == "correlation" %}RBA: {{ detection.deployment.alert_action.notable.rule_title | custom_jinja2_enrichment_filter(detection) }}{% else %}{{ detection.deployment.alert_action.notable.rule_title | custom_jinja2_enrichment_filter(detection) }}{% endif +%}
|
|
74
73
|
action.notable.param.security_domain = {{ detection.tags.security_domain.value }}
|
|
75
|
-
action.notable.param.severity =
|
|
74
|
+
action.notable.param.severity = {{ detection.tags.severity.value }}
|
|
76
75
|
{% endif %}
|
|
77
76
|
{% if detection.deployment.alert_action.email %}
|
|
78
77
|
action.email.subject.alert = {{ detection.deployment.alert_action.email.subject | custom_jinja2_enrichment_filter(detection) | escapeNewlines() }}
|
|
@@ -107,8 +106,14 @@ relation = greater than
|
|
|
107
106
|
quantity = 0
|
|
108
107
|
realtime_schedule = 0
|
|
109
108
|
is_visible = false
|
|
109
|
+
{% if detection.tags.throttling %}
|
|
110
|
+
alert.suppress = true
|
|
111
|
+
alert.suppress.fields = {{ detection.tags.throttling.conf_formatted_fields() }}
|
|
112
|
+
alert.suppress.period = {{ detection.tags.throttling.period }}
|
|
113
|
+
{% endif %}
|
|
110
114
|
search = {{ detection.search | escapeNewlines() }}
|
|
111
|
-
|
|
115
|
+
action.notable.param.drilldown_searches = {{ detection.drilldowns_in_JSON | tojson | escapeNewlines() }}
|
|
112
116
|
{% endif %}
|
|
117
|
+
|
|
113
118
|
{% endfor %}
|
|
114
|
-
### END {{
|
|
119
|
+
### END {{ app.label }} DETECTIONS ###
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
### {{
|
|
3
|
+
### {{app.label}} RESPONSE TASKS ###
|
|
4
4
|
|
|
5
5
|
{% for detection in objects %}
|
|
6
6
|
{% if (detection.type == 'Investigation') %}
|
|
7
7
|
{% if detection.search is defined %}
|
|
8
|
-
[{{
|
|
8
|
+
[{{ detection.get_response_task_name(app) }}]
|
|
9
9
|
action.escu = 0
|
|
10
10
|
action.escu.enabled = 1
|
|
11
11
|
action.escu.search_type = investigative
|
|
12
|
-
action.escu.full_search_name = {{APP_NAME}} - {{ detection.name }} - Response Task
|
|
13
12
|
description = {{ detection.description | escapeNewlines() }}
|
|
14
13
|
action.escu.creation_date = {{ detection.date }}
|
|
15
14
|
action.escu.modification_date = {{ detection.date }}
|
|
@@ -35,4 +34,4 @@ search = {{ detection.search | escapeNewlines() }}
|
|
|
35
34
|
{% endfor %}
|
|
36
35
|
|
|
37
36
|
|
|
38
|
-
### END {{
|
|
37
|
+
### END {{ app.label }} RESPONSE TASKS ###
|
|
@@ -29,6 +29,15 @@ references:
|
|
|
29
29
|
- https://attack.mitre.org/techniques/T1560/001/
|
|
30
30
|
- https://www.microsoft.com/security/blog/2021/01/20/deep-dive-into-the-solorigate-second-stage-activation-from-sunburst-to-teardrop-and-raindrop/
|
|
31
31
|
- https://thedfirreport.com/2021/01/31/bazar-no-ryuk/
|
|
32
|
+
drilldown_searches:
|
|
33
|
+
- name: View the detection results for $user$ and $dest$
|
|
34
|
+
search: '%original_detection_search% | search user = $user$ dest = $dest$'
|
|
35
|
+
earliest_offset: $info_min_time$
|
|
36
|
+
latest_offset: $info_max_time$
|
|
37
|
+
- name: View risk events for the last 7 days for $user$ and $dest$
|
|
38
|
+
search: '| from datamodel Risk.All_Risk | search normalized_risk_object IN ($user$, $dest$) starthoursago=168 endhoursago=1 | stats count min(_time) as firstTime max(_time) as lastTime values(search_name) as "Search Name" values(risk_message) as "Risk Message" values(analyticstories) as "Analytic Stories" values(annotations._all) as "Annotations" values(annotations.mitre_attack.mitre_tactic) as "ATT&CK Tactics" by normalized_risk_object | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`'
|
|
39
|
+
earliest_offset: $info_min_time$
|
|
40
|
+
latest_offset: $info_max_time$
|
|
32
41
|
tags:
|
|
33
42
|
analytic_story:
|
|
34
43
|
- Cobalt Strike
|
|
@@ -80,4 +89,4 @@ tests:
|
|
|
80
89
|
attack_data:
|
|
81
90
|
- data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1560.001/archive_utility/windows-sysmon.log
|
|
82
91
|
source: XmlWinEventLog:Microsoft-Windows-Sysmon/Operational
|
|
83
|
-
sourcetype: xmlwineventlog
|
|
92
|
+
sourcetype: xmlwineventlog
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: contentctl
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.4.0
|
|
4
4
|
Summary: Splunk Content Control Tool
|
|
5
5
|
License: Apache 2.0
|
|
6
6
|
Author: STRT
|
|
@@ -10,10 +10,11 @@ Classifier: License :: Other/Proprietary License
|
|
|
10
10
|
Classifier: Programming Language :: Python :: 3
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.11
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
13
14
|
Requires-Dist: Jinja2 (>=3.1.4,<4.0.0)
|
|
14
15
|
Requires-Dist: PyYAML (>=6.0.2,<7.0.0)
|
|
15
16
|
Requires-Dist: attackcti (>=0.4.0,<0.5.0)
|
|
16
|
-
Requires-Dist: bottle (>=0.12.25,<0.
|
|
17
|
+
Requires-Dist: bottle (>=0.12.25,<0.14.0)
|
|
17
18
|
Requires-Dist: docker (>=7.1.0,<8.0.0)
|
|
18
19
|
Requires-Dist: gitpython (>=3.1.43,<4.0.0)
|
|
19
20
|
Requires-Dist: pycvesearch (>=1.2,<2.0)
|
|
@@ -22,11 +23,11 @@ Requires-Dist: pygit2 (>=1.15.1,<2.0.0)
|
|
|
22
23
|
Requires-Dist: questionary (>=2.0.1,<3.0.0)
|
|
23
24
|
Requires-Dist: requests (>=2.32.3,<2.33.0)
|
|
24
25
|
Requires-Dist: semantic-version (>=2.10.0,<3.0.0)
|
|
25
|
-
Requires-Dist: setuptools (>=69.5.1,<
|
|
26
|
+
Requires-Dist: setuptools (>=69.5.1,<76.0.0)
|
|
26
27
|
Requires-Dist: splunk-sdk (>=2.0.2,<3.0.0)
|
|
27
28
|
Requires-Dist: tqdm (>=4.66.5,<5.0.0)
|
|
28
29
|
Requires-Dist: tyro (>=0.8.3,<0.9.0)
|
|
29
|
-
Requires-Dist: xmltodict (>=0.13
|
|
30
|
+
Requires-Dist: xmltodict (>=0.13,<0.15)
|
|
30
31
|
Description-Content-Type: text/markdown
|
|
31
32
|
|
|
32
33
|
|
|
@@ -165,7 +166,7 @@ This section is under active development. It will allow you to a [MITRE Map](ht
|
|
|
165
166
|
Choose TYPE {detection, story} to create new content for the Content Pack. The tool will interactively ask a series of questions required for generating a basic piece of content and automatically add it to the Content Pack.
|
|
166
167
|
|
|
167
168
|
### contentctl inspect
|
|
168
|
-
This section is under development.
|
|
169
|
+
This section is under development. The inspect action performs a number of post-build validations. Primarily, it will enable the user to perform an appinspect of the content pack in preparation for deployment onto a Splunk Instance or via Splunk Cloud. It also compares detections in the new build against a prior build, confirming that any changed detections have had their versions incremented (this comparison happens at the savedsearch.conf level, which is why it must happen after the build). Please also note that new versions of contentctl may result in the generation of different savedsearches.conf files without any content changes in YML (new keys at the .conf level which will necessitate bumping of the version in the YML file).
|
|
169
170
|
|
|
170
171
|
### contentctl deploy
|
|
171
172
|
The reason to build content is so that it can be deployed to your environment. However, deploying content to multiple servers and different types of infrastructure can be tricky and time-consuming. contentctl makes this easy by supporting a number of different deployment mechanisms. Deployment targets can be defined in [contentctl.yml](/contentctl/templates/contentctl_default.yml).
|
|
@@ -1,52 +1,53 @@
|
|
|
1
1
|
contentctl/__init__.py,sha256=IMjkMO3twhQzluVTo8Z6rE7Eg-9U79_LGKMcsWLKBkY,22
|
|
2
|
-
contentctl/actions/build.py,sha256=
|
|
2
|
+
contentctl/actions/build.py,sha256=htuFSKjavKOSUMxcjw7y84teLI6XFkG_U7cnLn5eGnA,5173
|
|
3
3
|
contentctl/actions/deploy_acs.py,sha256=mf3uk495H1EU_LNN-TiOsYCo18HMGoEBMb6ojeTr0zw,1418
|
|
4
4
|
contentctl/actions/detection_testing/DetectionTestingManager.py,sha256=zg8JasDjCpSC-yhseEyUwO8qbDJIUJbhlus9Li9ZAnA,8818
|
|
5
|
-
contentctl/actions/detection_testing/GitService.py,sha256=
|
|
5
|
+
contentctl/actions/detection_testing/GitService.py,sha256=cofi7yilcaq_5fugSbRpSmQjFRKFcB8nJmOdUfHVRzc,9045
|
|
6
6
|
contentctl/actions/detection_testing/generate_detection_coverage_badge.py,sha256=N5mznaeErVak3mOBwsd0RDBFJO3bku0EZvpayCyU-uk,2259
|
|
7
|
-
contentctl/actions/detection_testing/infrastructures/DetectionTestingInfrastructure.py,sha256=
|
|
8
|
-
contentctl/actions/detection_testing/infrastructures/DetectionTestingInfrastructureContainer.py,sha256=
|
|
7
|
+
contentctl/actions/detection_testing/infrastructures/DetectionTestingInfrastructure.py,sha256=mcdLt3tZr-xF5xaYnD0q7JQx9qrbRIzPNl6D9MeeB5k,56999
|
|
8
|
+
contentctl/actions/detection_testing/infrastructures/DetectionTestingInfrastructureContainer.py,sha256=WCtyyMKTA17JzPIb10rV8C6vdG-cBzHtFC9T2CuYY2o,7047
|
|
9
9
|
contentctl/actions/detection_testing/infrastructures/DetectionTestingInfrastructureServer.py,sha256=Q1ZfCYOp54O39bgTScZMInkmZiU-bGAM9Hiwr2mq5ms,370
|
|
10
10
|
contentctl/actions/detection_testing/progress_bar.py,sha256=OK9oRnPlzPAswt9KZNYID-YLHxqaYPY821kIE4-rCeA,3244
|
|
11
11
|
contentctl/actions/detection_testing/views/DetectionTestingView.py,sha256=nh9-gBSy-7FFBU71v4K5rwJmPzX2swFivbNfzDOpH-U,7674
|
|
12
12
|
contentctl/actions/detection_testing/views/DetectionTestingViewCLI.py,sha256=v5F3heZ3ZD0ik_-a_zDYSEz6oc5VdVj3e5rSSZ-tK00,2149
|
|
13
13
|
contentctl/actions/detection_testing/views/DetectionTestingViewFile.py,sha256=3mBCQy3hYuX8bNqh3al0nANlMwq9sxbQjkhwA1V5LOA,1090
|
|
14
|
-
contentctl/actions/detection_testing/views/DetectionTestingViewWeb.py,sha256=
|
|
14
|
+
contentctl/actions/detection_testing/views/DetectionTestingViewWeb.py,sha256=Q6p7UqDOYI2VjFl21_1iue76rWVsQmJUzRewtUBF1a8,4755
|
|
15
15
|
contentctl/actions/doc_gen.py,sha256=YNc1VYA0ikL1hWDHYjfEOmUkfhy8PEIdvTyC4ZLxQRY,863
|
|
16
|
-
contentctl/actions/initialize.py,sha256=
|
|
16
|
+
contentctl/actions/initialize.py,sha256=wEO3u8vJYP8Xh2OSJ_HxfMV6mqOdkPyWbUzNGEqMTNA,3055
|
|
17
17
|
contentctl/actions/initialize_old.py,sha256=0qXbW_fNDvkcnEeL6Zpte8d-hpTu1REyzHsXOCY-YB8,9333
|
|
18
|
-
contentctl/actions/inspect.py,sha256=
|
|
19
|
-
contentctl/actions/new_content.py,sha256=
|
|
18
|
+
contentctl/actions/inspect.py,sha256=dXV020g_GwwspSgiS6jQxW0JEVr_nublJBevwZ79mZo,17424
|
|
19
|
+
contentctl/actions/new_content.py,sha256=Mz70StFt0bbuUYUHzQ1NINAbPqPsM4deUdlxgQ5S7-k,6481
|
|
20
20
|
contentctl/actions/release_notes.py,sha256=akkFfLhsJuaPUyjsb6dLlKt9cUM-JApAjTFQMbYoXeM,13115
|
|
21
21
|
contentctl/actions/reporting.py,sha256=MJEmvmoA1WnSFZEU9QM6daL_W94oOX0WXAcX1qAM2As,1583
|
|
22
22
|
contentctl/actions/test.py,sha256=jv12UO_PTjZwvo4G-Dr8fE2gsuWvuvAmO2QQM4q7TL0,5917
|
|
23
|
-
contentctl/actions/validate.py,sha256=
|
|
24
|
-
contentctl/api.py,sha256=
|
|
25
|
-
contentctl/contentctl.py,sha256=
|
|
26
|
-
contentctl/enrichments/attack_enrichment.py,sha256=
|
|
27
|
-
contentctl/enrichments/cve_enrichment.py,sha256=
|
|
23
|
+
contentctl/actions/validate.py,sha256=eVxXf67b65ywe4yXYqaTXJShvqbzG9vd6jlkq-YVzy8,5538
|
|
24
|
+
contentctl/api.py,sha256=O0dNE3-WkWs2zuOeAQnIicgOtBX5s2bGBhRVo3j69-8,6327
|
|
25
|
+
contentctl/contentctl.py,sha256=CLYQ1kpVcUkOXPGrGyE7SwAkEtvjq2kHENWyy81gwsM,10400
|
|
26
|
+
contentctl/enrichments/attack_enrichment.py,sha256=i0p5ud7EqA2SMB7Gc8JQdIonUTjAeDN-hxKBV4XV-Rg,6391
|
|
27
|
+
contentctl/enrichments/cve_enrichment.py,sha256=aXpv_kCS0XP6JpC_ZEOeBPgrl38t_vkKZe9Ay35lRi4,2347
|
|
28
28
|
contentctl/enrichments/splunk_app_enrichment.py,sha256=zDNHFLZTi2dJ1gdnh0sHkD6F1VtkblqFnhacFcCMBfc,3418
|
|
29
29
|
contentctl/helper/link_validator.py,sha256=-XorhxfGtjLynEL1X4hcpRMiyemogf2JEnvLwhHq80c,7139
|
|
30
30
|
contentctl/helper/logger.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
|
-
contentctl/helper/splunk_app.py,sha256=
|
|
31
|
+
contentctl/helper/splunk_app.py,sha256=5KoacltgQ2J1BdxqvZYhr6GCXFl2tsy8TEWNc2gXkqw,14187
|
|
32
32
|
contentctl/helper/utils.py,sha256=8ICRvE7DUiNL9BK4Hw71hCLFbd3R2u86OwKeDOdaBTY,19454
|
|
33
|
-
contentctl/input/director.py,sha256=
|
|
34
|
-
contentctl/input/new_content_questions.py,sha256=
|
|
33
|
+
contentctl/input/director.py,sha256=U7jrhqP7IbfaSLXGIVtKrVvGTwIrmI1roW2X1jmZZ8Q,10841
|
|
34
|
+
contentctl/input/new_content_questions.py,sha256=p-rop4YpCjyg0RYKQ7Cvk9-7uaa5GDELNVeeUlxk6ks,4191
|
|
35
35
|
contentctl/input/yml_reader.py,sha256=hyVUYhx4Ka8C618kP2D_E3sDUKEQGC6ty_QZQArHKd4,1489
|
|
36
|
-
contentctl/objects/abstract_security_content_objects/detection_abstract.py,sha256=
|
|
37
|
-
contentctl/objects/abstract_security_content_objects/security_content_object_abstract.py,sha256=
|
|
36
|
+
contentctl/objects/abstract_security_content_objects/detection_abstract.py,sha256=L9ePzkwjkN2wfAM4su-fXJusIeryK7RqKgdqT4ViZwc,45722
|
|
37
|
+
contentctl/objects/abstract_security_content_objects/security_content_object_abstract.py,sha256=VUTNG6LvYf5D1L8UA5uciBBI0VfB432-6TCe2hP-_YE,10324
|
|
38
38
|
contentctl/objects/alert_action.py,sha256=E9gjCn5C31h0sN7k90KNe4agRxFFSnMW_Z-Ri_3YQss,1335
|
|
39
39
|
contentctl/objects/annotated_types.py,sha256=jnX02BQT4dHbd_DCIjik0PNN3kgsvb7sxAz_1Jy8TOY,259
|
|
40
|
-
contentctl/objects/atomic.py,sha256=
|
|
40
|
+
contentctl/objects/atomic.py,sha256=L9QSmwmmSFFfvUykPk_nXwz9XDz-Gn6e0rrDxxRO8uY,7292
|
|
41
41
|
contentctl/objects/base_test.py,sha256=qUtKQJrqCto_fwCBdiH68_tXqokhcv9ceu2fQlBxsjA,1045
|
|
42
|
-
contentctl/objects/base_test_result.py,sha256=
|
|
43
|
-
contentctl/objects/baseline.py,sha256=
|
|
44
|
-
contentctl/objects/baseline_tags.py,sha256=
|
|
45
|
-
contentctl/objects/config.py,sha256=
|
|
46
|
-
contentctl/objects/constants.py,sha256=
|
|
47
|
-
contentctl/objects/correlation_search.py,sha256=
|
|
42
|
+
contentctl/objects/base_test_result.py,sha256=pr-rwr80bJej8hHNhiVBvw49FZmRuPfOIChLJjY22lY,5205
|
|
43
|
+
contentctl/objects/baseline.py,sha256=cnJQt1z-PQDH6mbDU-eqo-l41LSWsaKmqU0IxuJWnGk,2139
|
|
44
|
+
contentctl/objects/baseline_tags.py,sha256=fyfH2KZqUhPGCwfverYw2_ZGXQIjgkT3P7hiYDPnN4Y,1599
|
|
45
|
+
contentctl/objects/config.py,sha256=Y_l7A_Ku0TEtMmWBT3-Pdu_Vo1zUGvJPkqw1RoVYPLI,50328
|
|
46
|
+
contentctl/objects/constants.py,sha256=scKaQlubfjkW5n2AztY5zneAgjVLXbnyK0ZBALxPUV8,5529
|
|
47
|
+
contentctl/objects/correlation_search.py,sha256=_BlHgLmmY5OdrV3f301radrH1cE2Gpr1GqVTmCxWP44,46272
|
|
48
|
+
contentctl/objects/dashboard.py,sha256=GKb_YqZMSP98Y97AlKffJrtVUufZzJag-zdmqRePLZ4,4114
|
|
48
49
|
contentctl/objects/data_source.py,sha256=aRr6lHu-EtGmi6J2nXKD7i2ozUPtp7X-vDkQiutvD3I,1545
|
|
49
|
-
contentctl/objects/deployment.py,sha256=
|
|
50
|
+
contentctl/objects/deployment.py,sha256=9iFo3iwvBVmBMlW-VhwX4ikbh2shl5cumSPOFMdqT2Q,3044
|
|
50
51
|
contentctl/objects/deployment_email.py,sha256=Zu9cXZdfOP6noa_mZpiK1GrYCTgi3Mim94iLGjE674c,147
|
|
51
52
|
contentctl/objects/deployment_notable.py,sha256=QhOI7HEkUuuqk0fum9SD8IpYBlbwIsJUff8s3kCKKj4,198
|
|
52
53
|
contentctl/objects/deployment_phantom.py,sha256=EmRlPKpEij4vqUJgACqK_zcGBmHV8xXczkJi-FxMDio,207
|
|
@@ -54,55 +55,56 @@ contentctl/objects/deployment_rba.py,sha256=YFLSKzLU7s8Bt1cJkSBWlfCsc_2MfgiwyaDi
|
|
|
54
55
|
contentctl/objects/deployment_scheduling.py,sha256=bQjbJHNaUGdU1VAGV8-nFOHzHutbIlt7FZpUvR1CV4Y,198
|
|
55
56
|
contentctl/objects/deployment_slack.py,sha256=P6z8OLHDKcDWx7nbKWasqBc3dFRatGcpO2GtmxzVV8I,135
|
|
56
57
|
contentctl/objects/detection.py,sha256=3W41cXf3ECjWuPqWrseqSLC3PAA7O5_nENWWM6MPK0Y,620
|
|
57
|
-
contentctl/objects/
|
|
58
|
-
contentctl/objects/
|
|
59
|
-
contentctl/objects/
|
|
58
|
+
contentctl/objects/detection_metadata.py,sha256=eCsru2cymc3VINjt9MpDyGw2zXa2HyVEPv-XiGAcAeQ,2236
|
|
59
|
+
contentctl/objects/detection_stanza.py,sha256=842fHPfGDdddHF5UzgftYr8OlYblWhMWZxPQsTu2wKg,3066
|
|
60
|
+
contentctl/objects/detection_tags.py,sha256=iozG-McM6VRYuqWHhQXvKD_iVyug2rdofuTf4jeUaG4,11208
|
|
61
|
+
contentctl/objects/drilldown.py,sha256=k_U0-vXKBCKeoUKszQ_0FdYQMq9c9mJ3PsHe6rM2lAA,3914
|
|
62
|
+
contentctl/objects/enums.py,sha256=wwPC9IWOMxdZrFhXM-nDEnSvMvY8nN9Md5Mt9ELiYG0,14241
|
|
63
|
+
contentctl/objects/errors.py,sha256=WURmJCqhy2CZNXXCypXVtwnjSBx-VIcB6W9oFJmzoFk,5762
|
|
60
64
|
contentctl/objects/event_source.py,sha256=G9P7rtcN5hcBNQx6DG37mR3QyQufx--T6kgQGNqQuKk,415
|
|
61
65
|
contentctl/objects/integration_test.py,sha256=UBBx85f517MpQXOM7-iEasACEQ0-Ia7W4rDChOHZfno,1319
|
|
62
66
|
contentctl/objects/integration_test_result.py,sha256=9oVWka57alIVPiCDbNgy-OmJcBicyYbrr6anL52Wgks,278
|
|
63
|
-
contentctl/objects/investigation.py,sha256=
|
|
64
|
-
contentctl/objects/investigation_tags.py,sha256=
|
|
65
|
-
contentctl/objects/lookup.py,sha256=
|
|
66
|
-
contentctl/objects/macro.py,sha256=
|
|
67
|
+
contentctl/objects/investigation.py,sha256=UCiKvTW3SQrjbbVAdYxmtJb_DT3-wuVgxZvT9nudvnw,3236
|
|
68
|
+
contentctl/objects/investigation_tags.py,sha256=mwjIyWtQflF_sjzKOmfcXj-DkPsgwX0jSN7_weearM4,1304
|
|
69
|
+
contentctl/objects/lookup.py,sha256=vy-4JVswguJGIniIwkPG_WAeo5JlCrHUTV9FOyksRII,7516
|
|
70
|
+
contentctl/objects/macro.py,sha256=nEIWRVCMQiTfSD5ajg-39laf-JH85zKE9uIFnljQTyE,3293
|
|
67
71
|
contentctl/objects/manual_test.py,sha256=YNquEQ0UCzZGJ0uvHBgJ3Efho-F80ZG885ABLtqB7TI,1022
|
|
68
72
|
contentctl/objects/manual_test_result.py,sha256=C4AYW3jlMsxVzCPzCA5dpAcbKgCpmDO43JmptFm--Q4,155
|
|
69
73
|
contentctl/objects/mitre_attack_enrichment.py,sha256=4_9hvrxCXnGfyWqoj7C-0pCfGXEBJXfhrcSfb1cmPjs,3387
|
|
70
74
|
contentctl/objects/notable_action.py,sha256=ValkblBaG-60TF19y_vSnNzoNZ3eg48wIfr0qZxyKTA,1605
|
|
71
|
-
contentctl/objects/notable_event.py,sha256=
|
|
75
|
+
contentctl/objects/notable_event.py,sha256=YlmI5CbTeu2hrj1yhmvu6ma4RY_6RFvIuq8aEtrn4z8,703
|
|
72
76
|
contentctl/objects/observable.py,sha256=pw0Ehi_KMb7nXzw2kuw1FnCknpD8zDkCAqBTa-M_F28,1313
|
|
73
77
|
contentctl/objects/playbook.py,sha256=hSYYpdMhctgpp7uwaPciFqu1yuFI4M1NHy1WBBLyvzM,2469
|
|
74
78
|
contentctl/objects/playbook_tags.py,sha256=NrhTGcgoYSGEZggrfebko0GBOXN9x05IadRUUL_CVfQ,1436
|
|
75
|
-
contentctl/objects/risk_analysis_action.py,sha256=
|
|
76
|
-
contentctl/objects/risk_event.py,sha256=
|
|
79
|
+
contentctl/objects/risk_analysis_action.py,sha256=OeatdTFXa6801JZIyvfN7c0B0rTnXpdVh1PXHCmQsz0,4275
|
|
80
|
+
contentctl/objects/risk_event.py,sha256=wPVQPwvA3u_2CTeZwy7xLHrIH98mWpvBunEsQLGlb-Y,14106
|
|
77
81
|
contentctl/objects/risk_object.py,sha256=yY4NmEwEKaRl4sLzCRZb1n8kdpV3HzYbQVQ1ClQWYHw,904
|
|
82
|
+
contentctl/objects/savedsearches_conf.py,sha256=tCyZHqAQ9azgwIyySViY2BdM4To5Cb_GeYEEHPwR4Zc,8604
|
|
78
83
|
contentctl/objects/security_content_object.py,sha256=j8KNDwSMfZsSIzJucC3NuZo0SlFVpqHfDc6y3-YHjHI,234
|
|
79
|
-
contentctl/objects/
|
|
80
|
-
contentctl/objects/ssa_detection_tags.py,sha256=9aRwbpQHi79NIS9rofjgxDJpw7cWXqG534_kSbvHJh8,5220
|
|
81
|
-
contentctl/objects/story.py,sha256=FXe11LV19xJTtCgx7DKdvV9cL0gKeryUnE3yjpnDmrU,4957
|
|
84
|
+
contentctl/objects/story.py,sha256=9q8_WosIZwq5cWIUbl_0IErV4fWc9VA18YBuJeflXn0,4823
|
|
82
85
|
contentctl/objects/story_tags.py,sha256=cOL8PUzdlFdLPQHc54_-9sdI8nCE1D04oKY7KriOssI,2293
|
|
83
86
|
contentctl/objects/test_attack_data.py,sha256=9OgErjdPR4S-SJpQePt0uwBLPYHYPtqKDd-auhjz7Uc,430
|
|
84
87
|
contentctl/objects/test_group.py,sha256=DCtm4ChGYksOwZQVHsioaweOvI37CSlTZJzKvBX-jbY,2586
|
|
85
88
|
contentctl/objects/threat_object.py,sha256=S8B7RQFfLxN_g7yKPrDTuYhIy9JvQH3YwJ_T5LUZIa4,711
|
|
89
|
+
contentctl/objects/throttling.py,sha256=om0pGOMStr6sTwm5uZ7rBcSHhRLpaX6TS5x-aaPGsR0,2369
|
|
86
90
|
contentctl/objects/unit_test.py,sha256=eMFehpHhmZA5WYBqhWUNRF_LpxuLM9VooAxjXeNbrxY,1144
|
|
87
91
|
contentctl/objects/unit_test_baseline.py,sha256=XHvOm7qLYfqrP6uC5U_pfgw_pf8-S2RojuNmbo6lXlM,227
|
|
88
|
-
contentctl/objects/unit_test_old.py,sha256=IfvytHG4ZnUhsvXgdczECZbiwv6YLViYdsk9AqeDBjQ,199
|
|
89
92
|
contentctl/objects/unit_test_result.py,sha256=POQfvvPpSw-jQzINBz1_IszUMJ4Wbopu8HRS1Qe6P2M,2940
|
|
90
|
-
contentctl/objects/unit_test_ssa.py,sha256=RURqXb3e0CuI5nNX8PvFucxatAvMmGSUDngVbqNpoiY,653
|
|
91
93
|
contentctl/output/api_json_output.py,sha256=n3OTd5z-Vkmsn7ny6QCAar_jSMNuuJfzAQa7xq_9if4,9085
|
|
92
94
|
contentctl/output/attack_nav_output.py,sha256=95iKV8U9BMMgqh6cCOw1S89Ln73xmJGgJPHTYR0L7hA,2304
|
|
93
95
|
contentctl/output/attack_nav_writer.py,sha256=64ILZLmNbh2XLmbopgENkeo6t-4SRRG8xZXBmtpNd4g,2219
|
|
94
|
-
contentctl/output/conf_output.py,sha256=
|
|
95
|
-
contentctl/output/conf_writer.py,sha256=
|
|
96
|
+
contentctl/output/conf_output.py,sha256=gmO180RpPPB1H1_tkNpQERkai--l0iRS7qV-kMtFir0,10136
|
|
97
|
+
contentctl/output/conf_writer.py,sha256=o0lpCGKuOtFrf_7uV4Qq8nCBL69fivCkEavmxGXFuvs,9575
|
|
96
98
|
contentctl/output/data_source_writer.py,sha256=ubFjm6XJ4T2d3oqfKwDFasITHeDj3HFmegqVN--5_ME,1635
|
|
97
99
|
contentctl/output/detection_writer.py,sha256=AzxbssNLmsNIOaYKotew5-ONoyq1cQpKSGy3pe191B0,960
|
|
98
100
|
contentctl/output/doc_md_output.py,sha256=gf7osH1uSrC6js3D_I72g4uDe9TaB3tsvtqCHi5znp0,3238
|
|
99
101
|
contentctl/output/jinja_writer.py,sha256=bdiqr9FaXYxth4wZ1A52zTMAS5stHNGpezTkaS5pres,1119
|
|
100
102
|
contentctl/output/json_writer.py,sha256=Z-iVLnZb8tzYATxbQtXax0dz572lVPFMNVTx-vWbnog,1007
|
|
101
|
-
contentctl/output/new_content_yml_output.py,sha256=
|
|
103
|
+
contentctl/output/new_content_yml_output.py,sha256=KvP0FffQBPznSKqJyRQMtehf4XYEVK5jiPlUwnkekUc,2061
|
|
102
104
|
contentctl/output/svg_output.py,sha256=T2p4S085MKj5VPZKvo4tWBVOmYme32J9L7kMEBm3SwQ,2751
|
|
103
|
-
contentctl/output/templates/analyticstories_detections.j2,sha256=
|
|
104
|
-
contentctl/output/templates/analyticstories_investigations.j2,sha256=
|
|
105
|
-
contentctl/output/templates/analyticstories_stories.j2,sha256=
|
|
105
|
+
contentctl/output/templates/analyticstories_detections.j2,sha256=TZHnWEPWWwMjGgPswMoT9Dcfqs2X2E1lJCVXYwqveHY,970
|
|
106
|
+
contentctl/output/templates/analyticstories_investigations.j2,sha256=kqy9lR6W3avqETCM2tSZ8WWOlfiyOtFv6G5N4SZWSaQ,527
|
|
107
|
+
contentctl/output/templates/analyticstories_stories.j2,sha256=4rS-oN6JHAVKF3ToMxzHqK7asytw1R4OQmZGtzdRRBI,663
|
|
106
108
|
contentctl/output/templates/app.conf.j2,sha256=Y9vDwdU1yRTQZ7jBQWLFo0XAEerN_6IXrkXdS3xkcuM,737
|
|
107
109
|
contentctl/output/templates/app.manifest.j2,sha256=n9TBpikEOD-HQzsad4Fmd0iH5cosRQ12SiXXYZhcO0g,1063
|
|
108
110
|
contentctl/output/templates/collections.j2,sha256=rDpAcqM6hRiyCQPgfRh8KcL41Mrqsc97krQ-JPFhSBQ,181
|
|
@@ -119,13 +121,12 @@ contentctl/output/templates/doc_stories.j2,sha256=0J3dAbfSZz-Ma1-C9B6vYPKGwrxoZr
|
|
|
119
121
|
contentctl/output/templates/doc_story_page.j2,sha256=jrf-As8GbqLarRoiDipfM9ZUVRl_bhdNsy-XaCrBaXE,874
|
|
120
122
|
contentctl/output/templates/es_investigations_investigations.j2,sha256=M4beFAFrkdhOIda2uYOXOxm9eBTdtSrTg07ke8FcELs,1013
|
|
121
123
|
contentctl/output/templates/es_investigations_stories.j2,sha256=3_adGXuyMR6v-k3uc6_ht13UqX1AI4HagRdokwW0tqk,388
|
|
122
|
-
contentctl/output/templates/finding_report.j2,sha256=DS9ElRGeyz7UFPiTXiqbhUzOrT4eN8oetdBheQJRFck,1753
|
|
123
124
|
contentctl/output/templates/header.j2,sha256=3usV7jm1q6J-QNnQrZzII9cN0XEGQjg_eVKrEQwfOG0,201
|
|
124
125
|
contentctl/output/templates/macros.j2,sha256=SLcQQ5X7TZS8j-2qP06BTXqdIcnwoYqTAaBLX2Dge7Y,390
|
|
125
126
|
contentctl/output/templates/panel.j2,sha256=Cw_W6p-14n6UivVfpS75KKJiJ2VpdGsSBceYsUYe9gk,221
|
|
126
|
-
contentctl/output/templates/savedsearches_baselines.j2,sha256=
|
|
127
|
-
contentctl/output/templates/savedsearches_detections.j2,sha256=
|
|
128
|
-
contentctl/output/templates/savedsearches_investigations.j2,sha256=
|
|
127
|
+
contentctl/output/templates/savedsearches_baselines.j2,sha256=BfpNrApucyByZHYW-Az63NO7hXBRYtlQCZcgBcLDv60,1683
|
|
128
|
+
contentctl/output/templates/savedsearches_detections.j2,sha256=WEpY9C81cifCM0ZC_pubn9pNIXcnPPhQGSrmr79j1aI,6672
|
|
129
|
+
contentctl/output/templates/savedsearches_investigations.j2,sha256=3jWg3OEwnexZxebpyP9_7lbZI407e5rlx1-epRs1Kpc,1170
|
|
129
130
|
contentctl/output/templates/transforms.j2,sha256=-cSoie0LgJwibtW-GMhc9BQlmS6h1s1Vykm9O2M0f9Y,1456
|
|
130
131
|
contentctl/output/templates/workflow_actions.j2,sha256=DFoZVnCa8dMRHjW2AdpoydBC0THgiH_W-Nx7WI4-uR4,925
|
|
131
132
|
contentctl/output/yml_output.py,sha256=xtTD3f_WWy8O6Joi4S8gG9paot8JpQFRlwt17_ek5B4,2682
|
|
@@ -160,14 +161,14 @@ contentctl/templates/deployments/escu_default_configuration_hunting.yml,sha256=h
|
|
|
160
161
|
contentctl/templates/deployments/escu_default_configuration_ttp.yml,sha256=1D-pvzaH1v3_yCZXaY6njmdvV4S2_Ak8uzzCOsnj9XY,548
|
|
161
162
|
contentctl/templates/detections/application/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
162
163
|
contentctl/templates/detections/cloud/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
163
|
-
contentctl/templates/detections/endpoint/anomalous_usage_of_7zip.yml,sha256=
|
|
164
|
+
contentctl/templates/detections/endpoint/anomalous_usage_of_7zip.yml,sha256=AwAjsSuNAEux-_P4Co_Rf73IzSQF6XNhVcCzgU_bGT0,4189
|
|
164
165
|
contentctl/templates/detections/network/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
165
166
|
contentctl/templates/detections/web/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
166
167
|
contentctl/templates/macros/security_content_ctime.yml,sha256=Gg1YNllHVsX_YB716H1SJLWzxXZEfuJlnsgB2fuyoHU,159
|
|
167
168
|
contentctl/templates/macros/security_content_summariesonly.yml,sha256=9BYUxAl2E4Nwh8K19F3AJS8Ka7ceO6ZDBjFiO3l3LY0,162
|
|
168
169
|
contentctl/templates/stories/cobalt_strike.yml,sha256=rlaXxMN-5k8LnKBLPafBoksyMtlmsPMHPJOjTiMiZ-M,3063
|
|
169
|
-
contentctl-4.
|
|
170
|
-
contentctl-4.
|
|
171
|
-
contentctl-4.
|
|
172
|
-
contentctl-4.
|
|
173
|
-
contentctl-4.
|
|
170
|
+
contentctl-4.4.0.dist-info/LICENSE.md,sha256=hQWUayRk-pAiOZbZnuy8djmoZkjKBx8MrCFpW-JiOgo,11344
|
|
171
|
+
contentctl-4.4.0.dist-info/METADATA,sha256=t549QwVJvw3Mh33Z1UlOWrdGfWdbSqU9KWkhSdvmIiw,21536
|
|
172
|
+
contentctl-4.4.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
173
|
+
contentctl-4.4.0.dist-info/entry_points.txt,sha256=5bjZ2NkbQfSwK47uOnA77yCtjgXhvgxnmCQiynRF_-U,57
|
|
174
|
+
contentctl-4.4.0.dist-info/RECORD,,
|