Skip to content

Commit bb16d97

Browse files
committed
add support for the entire mitre
group object that is returned.
1 parent 44ef8d9 commit bb16d97

File tree

2 files changed

+54
-10
lines changed

2 files changed

+54
-10
lines changed

contentctl/enrichments/attack_enrichment.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import logging
88
from pydantic import BaseModel, Field
99
from dataclasses import field
10-
from typing import Annotated
10+
from typing import Annotated,Any
1111
from contentctl.objects.mitre_attack_enrichment import MitreAttackEnrichment
1212
from contentctl.objects.config import validate
1313
logging.getLogger('taxii2client').setLevel(logging.CRITICAL)
@@ -34,20 +34,21 @@ def getEnrichmentByMitreID(self, mitre_id:Annotated[str, Field(pattern=r"^T\d{4}
3434
raise Exception(f"Error, Unable to find Mitre Enrichment for MitreID {mitre_id}")
3535

3636

37-
def addMitreID(self, technique:dict, tactics:list[str], groups:list[str])->None:
37+
def addMitreID(self, technique:dict, tactics:list[str], groups:list[dict[str,Any]])->None:
3838

3939
technique_id = technique['technique_id']
4040
technique_obj = technique['technique']
4141
tactics.sort()
42-
groups.sort()
42+
group_names_only:list[str] = sorted([group['group'] for group in groups])
43+
4344

4445
if technique_id in self.data:
4546
raise Exception(f"Error, trying to redefine MITRE ID '{technique_id}'")
46-
4747
self.data[technique_id] = MitreAttackEnrichment(mitre_attack_id=technique_id,
4848
mitre_attack_technique=technique_obj,
4949
mitre_attack_tactics=tactics,
50-
mitre_attack_groups=groups)
50+
mitre_attack_groups=group_names_only,
51+
mitre_attack_group_objects=groups)
5152

5253

5354
def get_attack_lookup(self, input_path: str, store_csv: bool = False, force_cached_or_offline: bool = False, skip_enrichment:bool = False) -> dict:
@@ -86,12 +87,13 @@ def get_attack_lookup(self, input_path: str, store_csv: bool = False, force_cach
8687
progress_percent = ((index+1)/len(all_enterprise_techniques)) * 100
8788
if (sys.stdout.isatty() and sys.stdin.isatty() and sys.stderr.isatty()):
8889
print(f"\r\t{'MITRE Technique Progress'.rjust(23)}: [{progress_percent:3.0f}%]...", end="", flush=True)
89-
apt_groups = []
90+
apt_groups:list[dict[str,Any]] = []
9091
for relationship in enterprise_relationships:
9192
if (relationship['target_object'] == technique['id']) and relationship['source_object'].startswith('intrusion-set'):
9293
for group in enterprise_groups:
9394
if relationship['source_object'] == group['id']:
94-
apt_groups.append(group['group'])
95+
apt_groups.append(group)
96+
#apt_groups.append(group['group'])
9597

9698
tactics = []
9799
if ('tactic' in technique):

contentctl/objects/mitre_attack_enrichment.py

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from __future__ import annotations
2-
from pydantic import BaseModel, Field, ConfigDict
2+
from pydantic import BaseModel, Field, ConfigDict, HttpUrl
33
from typing import List, Annotated
44
from enum import StrEnum
5-
5+
import datetime
66

77
class MitreTactics(StrEnum):
88
RECONNAISSANCE = "Reconnaissance"
@@ -20,13 +20,55 @@ class MitreTactics(StrEnum):
2020
EXFILTRATION = "Exfiltration"
2121
IMPACT = "Impact"
2222

23+
from enum import StrEnum
24+
class AttackGroupMatrix(StrEnum):
25+
mitre_attack = "mitre-attack"
26+
27+
28+
class AttackGroupType(StrEnum):
29+
intrusion_set = "intrusion-set"
30+
31+
class MitreDomain(StrEnum):
32+
intrusion_set = "enterprise-attack"
33+
mobile_attack = "mobile-attack"
34+
ics_attack = "ics-attack"
35+
36+
class MitreExternalReference(BaseModel):
37+
model_config = ConfigDict(extra='forbid')
38+
source_name: str
39+
external_id: None | str = None
40+
url: None | HttpUrl = None
41+
description: None | str = None
42+
43+
44+
class MitreAttackGroup(BaseModel):
45+
model_config = ConfigDict(extra='forbid')
46+
created: datetime.datetime
47+
created_by_ref: str
48+
external_references: list[MitreExternalReference]
49+
group: str
50+
group_aliases: list[str]
51+
group_description: str
52+
id: str
53+
matrix: AttackGroupMatrix
54+
modified: datetime.datetime
55+
object_marking_refs: list[str]
56+
type: AttackGroupType
57+
url: HttpUrl
58+
x_mitre_attack_spec_version: None | str = None
59+
x_mitre_deprecated: None | bool = None
60+
x_mitre_domains: list[MitreDomain]
61+
x_mitre_modified_by_ref: str
62+
x_mitre_version: str
63+
contributors: list[str] = []
64+
2365

2466
class MitreAttackEnrichment(BaseModel):
2567
ConfigDict(use_enum_values=True)
2668
mitre_attack_id: Annotated[str, Field(pattern=r"^T\d{4}(.\d{3})?$")] = Field(...)
2769
mitre_attack_technique: str = Field(...)
2870
mitre_attack_tactics: List[MitreTactics] = Field(...)
2971
mitre_attack_groups: List[str] = Field(...)
30-
72+
mitre_attack_group_objects: list[MitreAttackGroup] = Field(...)
3173
def __hash__(self) -> int:
3274
return id(self)

0 commit comments

Comments
 (0)