18
18
19
19
class DSAttck :
20
20
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
+
21
28
self .attck_navigator = {
22
29
"name" : "Deep Security ATT&CK" ,
23
30
"version" : "3.0" ,
@@ -58,11 +65,12 @@ def __init__(self):
58
65
"selectSubtechniquesWithParent" : False
59
66
}
60
67
61
- self .used_ruleset = {}
62
68
self .used_attck_rules = {}
63
69
64
70
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
+
66
74
67
75
if not update :
68
76
self .attck_navigator ['techniques' ].clear ()
@@ -77,7 +85,8 @@ def process_rules(self,rules, module_name, update = True):
77
85
rule_match ['rules' ] = search .group ()[len ('ATT&CK' )+ 2 :- 1 ].split (',' )
78
86
rule_match ['description' ] = module_rule .description
79
87
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
81
90
82
91
for techID in rule_match ['rules' ]:
83
92
self .attck_navigator ['techniques' ].append ({
@@ -90,26 +99,38 @@ def process_rules(self,rules, module_name, update = True):
90
99
return self .used_attck_rules
91
100
92
101
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 , {})
93
105
module_id_rules = {}
106
+ matched_rules = {} # Avoid duplicates
107
+
94
108
for c in computers :
95
109
if c .integrity_monitoring .rule_ids is not None :
96
110
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
99
115
100
116
if c .intrusion_prevention .rule_ids is not None :
101
117
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
104
122
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
+ })
113
134
114
135
115
136
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):
126
147
127
148
128
149
CONF_NAME = "ds.conf"
150
+ ENV_FILE = "environment.json"
151
+ APPLIED_FILE = "applied_rules.json"
129
152
130
153
131
154
if __name__ == '__main__' :
@@ -167,8 +190,8 @@ def get_all_rules(self, to_json = True):
167
190
168
191
print ("Processing rules..." )
169
192
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 )
172
195
173
196
print ("Requesting all computers..." )
174
197
computers = api_client .request_computers ()
0 commit comments