1919import re
2020
2121from app .translator .core .custom_types .meta_info import SeverityType
22+ from app .translator .core .mitre import MitreConfig
2223from app .translator .core .models .platform_details import PlatformDetails
23- from app .translator .core .models .query_container import MetaInfoContainer , RawQueryContainer
24+ from app .translator .core .models .query_container import MetaInfoContainer , MitreInfoContainer , RawQueryContainer
2425from app .translator .managers import parser_manager
2526from app .translator .platforms .splunk .const import splunk_alert_details
2627from app .translator .platforms .splunk .mapping import SplunkMappings , splunk_alert_mappings
3132class SplunkAlertParser (SplunkQueryParser ):
3233 details : PlatformDetails = splunk_alert_details
3334 mappings : SplunkMappings = splunk_alert_mappings
35+ mitre_config : MitreConfig = MitreConfig ()
3436
3537 def parse_raw_query (self , text : str , language : str ) -> RawQueryContainer :
3638 rule_id : str = ""
3739 rule_name : str = ""
3840 severity : str = ""
39- raw_mitre_attack : list [ str ] = []
41+ mitre_attack_container : MitreInfoContainer = None
4042 if severity_match := re .search (r"alert\.severity\s*=\s*(\d+)" , text ):
4143 level_map = {
4244 "1" : SeverityType .low ,
@@ -46,8 +48,12 @@ def parse_raw_query(self, text: str, language: str) -> RawQueryContainer:
4648 }
4749 severity = level_map .get (str (severity_match .group (1 )), "low" )
4850
49- if mitre_attack_match := re .search (r'"mitre_attack":\s*\[(.*?)\]' , text ):
50- raw_mitre_attack = [attack .strip ().strip ('"' ).lower () for attack in mitre_attack_match .group (1 ).split ("," )]
51+ if mitre_attack_match := re .search (r"'mitre_attack':\s*\[(.*?)\]" , text ):
52+ raw_mitre_attack = [attack .strip ().strip ("'" ) for attack in mitre_attack_match .group (1 ).split ("," )]
53+ mitre_attack_container = self .mitre_config .get_mitre_info (
54+ tactics = [i .lower () for i in raw_mitre_attack if not i .lower ().startswith ("t" )],
55+ techniques = [i .lower () for i in raw_mitre_attack if i .lower ().startswith ("t" )],
56+ )
5157
5258 if rule_id_match := re .search (r"Rule ID:\s*([\w-]+)" , text ):
5359 rule_id = rule_id_match .group (1 )
@@ -64,6 +70,6 @@ def parse_raw_query(self, text: str, language: str) -> RawQueryContainer:
6470 title = rule_name ,
6571 description = description ,
6672 severity = severity ,
67- raw_mitre_attack = raw_mitre_attack ,
73+ mitre_attack = mitre_attack_container ,
6874 ),
6975 )
0 commit comments