Skip to content

Commit d9651bf

Browse files
author
aandersonl
committed
FIX: Integritity monitoring error
1 parent d8f6b54 commit d9651bf

File tree

3 files changed

+46
-20
lines changed

3 files changed

+46
-20
lines changed

.gitignore

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
__pycache__/
2+
.vscode/
23
attckenv/
4+
sdk/
35
*.pyc
46
vendor/*
57
*.json
6-
*.conf
8+
*.zip
9+
10+
ds.conf

ds.conf

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,4 @@
22
host = https://app.deepsecurity.trendmicro.com/api
33
#or your local DSM
44

5-
api_key =
6-
#Your api key
5+
api_key =

dsattck.py

+40-17
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818

1919
class DSAttck:
2020
def __init__(self):
21+
self.INTEGRIY_MONITORING = 'Integriy Monitoring'
22+
self.INTRUSION_PREVENSION = 'Intrusion Prevention'
23+
self.valid_modules = {
24+
self.INTEGRIY_MONITORING: True ,
25+
self.INTRUSION_PREVENSION: True
26+
}
27+
2128
self.attck_navigator = {
2229
"name": "Deep Security ATT&CK",
2330
"version": "3.0",
@@ -58,11 +65,12 @@ def __init__(self):
5865
"selectSubtechniquesWithParent": False
5966
}
6067

61-
self.used_ruleset = {}
6268
self.used_attck_rules = {}
6369

6470
def process_rules(self,rules, module_name, update = True):
65-
self.used_attck_rules = {}
71+
if module_name not in self.valid_modules:
72+
raise Exception("Invalid module {}".format(module_name))
73+
6674

6775
if not update:
6876
self.attck_navigator['techniques'].clear()
@@ -77,7 +85,8 @@ def process_rules(self,rules, module_name, update = True):
7785
rule_match['rules'] = search.group()[len('ATT&CK')+2:-1].split(',')
7886
rule_match['description'] = module_rule.description
7987
rule_match['module_name'] = module_name
80-
self.used_attck_rules[module_rule.id] = rule_match
88+
self.used_attck_rules.setdefault(module_name, {})
89+
self.used_attck_rules[module_name][module_rule.id] = rule_match
8190

8291
for techID in rule_match['rules']:
8392
self.attck_navigator['techniques'].append({
@@ -90,26 +99,38 @@ def process_rules(self,rules, module_name, update = True):
9099
return self.used_attck_rules
91100

92101
def get_used_rules(self,computers, to_json=True):
102+
103+
integrity_monitoring_rules = self.used_attck_rules.get(self.INTEGRIY_MONITORING, {})
104+
intrusion_prevention_rules = self.used_attck_rules.get(self.INTRUSION_PREVENSION, {})
93105
module_id_rules = {}
106+
matched_rules = {} # Avoid duplicates
107+
94108
for c in computers:
95109
if c.integrity_monitoring.rule_ids is not None:
96110
for comp_rule in c.integrity_monitoring.rule_ids:
97-
if comp_rule not in module_id_rules and comp_rule in self.used_attck_rules:
98-
module_id_rules[comp_rule] = True
111+
if comp_rule not in matched_rule and comp_rule in integrity_monitoring_rules:
112+
module_id_rules.setdefault(self.INTEGRIY_MONITORING, [])
113+
module_id_rules[self.INTEGRIY_MONITORING].append(comp_rule)
114+
matched_rules[comp_rule] = None
99115

100116
if c.intrusion_prevention.rule_ids is not None:
101117
for comp_rule in c.intrusion_prevention.rule_ids:
102-
if comp_rule not in module_id_rules and comp_rule in self.used_attck_rules:
103-
module_id_rules[comp_rule] = True
118+
if comp_rule not in matched_rules and comp_rule in intrusion_prevention_rules:
119+
module_id_rules.setdefault(self.INTRUSION_PREVENSION, [])
120+
module_id_rules[self.INTRUSION_PREVENSION].append(comp_rule)
121+
matched_rules[comp_rule] = None
104122

105-
for valid_rule in module_id_rules.keys():
106-
for rule in self.used_attck_rules[valid_rule]['rules']:
107-
self.attck_navigator['techniques'].append({
108-
"techniqueID": rule,
109-
"comment": "{} Rule applied by {}".format(self.used_attck_rules[valid_rule]['description'], self.used_attck_rules[valid_rule]['module_name']),
110-
"color": "#31a354",
111-
"enabled": True
112-
})
123+
124+
for module_name, applied_rules in module_id_rules.items():
125+
for valid_rule in applied_rules:
126+
for rule in self.used_attck_rules[module_name][valid_rule]['rules']:
127+
description = self.used_attck_rules[module_name][valid_rule]['description']
128+
self.attck_navigator['techniques'].append({
129+
"techniqueID": rule,
130+
"comment": "{} Rule applied by {}".format(description, module_name),
131+
"color": "#31a354",
132+
"enabled": True
133+
})
113134

114135

115136
raw_json = json.dumps(self.attck_navigator, indent=4) if to_json else self.attck_navigator
@@ -126,6 +147,8 @@ def get_all_rules(self, to_json = True):
126147

127148

128149
CONF_NAME = "ds.conf"
150+
ENV_FILE = "environment.json"
151+
APPLIED_FILE = "applied_rules.json"
129152

130153

131154
if __name__ == '__main__':
@@ -167,8 +190,8 @@ def get_all_rules(self, to_json = True):
167190

168191
print("Processing rules...")
169192

170-
attck_ds.process_rules(ips_rules, module_name = "Integrity Monitor")
171-
attck_ds.process_rules(im_rules, module_name = "Intrusion Prevension")
193+
attck_ds.process_rules(ips_rules, module_name = attck_ds.INTRUSION_PREVENSION)
194+
attck_ds.process_rules(im_rules, module_name = attck_ds.INTEGRIY_MONITORING)
172195

173196
print("Requesting all computers...")
174197
computers = api_client.request_computers()

0 commit comments

Comments
 (0)