@@ -41,33 +41,45 @@ class SplunkDeferredORRegularExpression(DeferredTextQueryExpression):
41
41
}
42
42
43
43
def __init__ (self , state , field , arg ) -> None :
44
- SplunkDeferredORRegularExpression .add_field (field )
45
- index_suffix = SplunkDeferredORRegularExpression .get_index_suffix (field )
46
- self .template = (
47
- 'rex field={field} "(?<{field}Match'
48
- + index_suffix
49
- + '>{value})"\n | eval {field}Condition'
50
- + index_suffix
51
- + "=if(isnotnull({field}Match"
52
- + index_suffix
53
- + '), "true", "false")'
44
+ self .add_field (field )
45
+ field_condition = self .get_field_condition (field )
46
+ field_match = self .get_field_match (field )
47
+ self .template = 'rex field={{field}} "(?<{field_match}>{{value}})"\n | eval {field_condition}=if(isnotnull({field_match}), "true", "false")' .format (
48
+ field_match = field_match , field_condition = field_condition
54
49
)
55
50
return super ().__init__ (state , field , arg )
56
51
52
+ @staticmethod
53
+ def clean_field (field ):
54
+ # splunk does not allow dots in regex group, so we need to clean variables
55
+ return re .sub (".*\\ ." , "" , field )
56
+
57
57
@classmethod
58
58
def add_field (cls , field ):
59
59
cls .field_counts [field ] = (
60
60
cls .field_counts .get (field , 0 ) + 1
61
61
) # increment the field count
62
62
63
63
@classmethod
64
- def get_index_suffix (cls , field ):
65
-
66
- index_suffix = cls .field_counts .get (field , 0 )
64
+ def get_field_suffix (cls , field ):
65
+ index_suffix = cls .field_counts .get (field , "" )
67
66
if index_suffix == 1 :
68
- # return nothing for the first field use
69
- return ""
70
- return str (index_suffix )
67
+ index_suffix = ""
68
+ return index_suffix
69
+
70
+ @classmethod
71
+ def construct_field_variable (cls , field , variable ):
72
+ cleaned_field = cls .clean_field (field )
73
+ index_suffix = cls .get_field_suffix (field )
74
+ return f"{ cleaned_field } { variable } { index_suffix } "
75
+
76
+ @classmethod
77
+ def get_field_match (cls , field ):
78
+ return cls .construct_field_variable (field , "Match" )
79
+
80
+ @classmethod
81
+ def get_field_condition (cls , field ):
82
+ return cls .construct_field_variable (field , "Condition" )
71
83
72
84
@classmethod
73
85
def reset (cls ):
@@ -248,9 +260,7 @@ def convert_condition_field_eq_val_re(
248
260
).postprocess (None , cond )
249
261
250
262
cond_true = ConditionFieldEqualsValueExpression (
251
- cond .field
252
- + "Condition"
253
- + str (SplunkDeferredORRegularExpression .get_index_suffix (cond .field )),
263
+ SplunkDeferredORRegularExpression .get_field_condition (cond .field ),
254
264
SigmaString ("true" ),
255
265
)
256
266
# returning fieldX=true
@@ -381,13 +391,11 @@ def finalize_query_data_model(
381
391
cim_fields = " " .join (
382
392
splunk_sysmon_process_creation_cim_mapping .values ()
383
393
)
384
-
394
+
385
395
elif rule .logsource .category == "proxy" :
386
396
data_model = "Web"
387
397
data_set = "Proxy"
388
- cim_fields = " " .join (
389
- splunk_web_proxy_cim_mapping .values ()
390
- )
398
+ cim_fields = " " .join (splunk_web_proxy_cim_mapping .values ())
391
399
392
400
try :
393
401
data_model_set = state .processing_state ["data_model_set" ]
0 commit comments