@@ -170,6 +170,19 @@ def __init__(self):
170170 {"name" : "Command & Control" , "generators" : ["sentinelone_endpoint" , "paloalto_firewall" ], "duration" : 1 },
171171 {"name" : "Detection & Response" , "generators" : ["proofpoint" , "sentinelone_endpoint" ], "duration" : 1 }
172172 ]
173+ },
174+ "identity_theft_ransomware" : {
175+ "id" : "identity_theft_ransomware" ,
176+ "name" : "Cross-Platform Identity Theft & Ransomware" ,
177+ "description" : "Advanced identity-led attack: esentutl.exe LOLBin credential theft, stolen OAuth refresh-token abuse through Okta, C2 via ScreenConnect/ngrok/AnyDesk, AD recon (SharpHound, ADRecon), LSASS dump + Okta privilege escalation, and ALPHV/BlackCat ransomware execution with VSS deletion." ,
178+ "phases" : [
179+ {"name" : "Initial Access / Credential Theft" , "generators" : ["sentinelone_endpoint" , "microsoft_windows_eventlog" , "okta_authentication" ], "duration" : 10 },
180+ {"name" : "Command & Control" , "generators" : ["sentinelone_endpoint" , "paloalto_firewall" ], "duration" : 5 },
181+ {"name" : "Endpoint Discovery & Staging" , "generators" : ["sentinelone_endpoint" ], "duration" : 10 },
182+ {"name" : "Credential & Privilege Abuse" , "generators" : ["sentinelone_endpoint" , "microsoft_windows_eventlog" , "okta_authentication" ], "duration" : 10 },
183+ {"name" : "Ransomware Preparation" , "generators" : ["sentinelone_endpoint" ], "duration" : 10 },
184+ {"name" : "Ransomware Execution / Impact" , "generators" : ["sentinelone_endpoint" , "microsoft_windows_eventlog" ], "duration" : 10 }
185+ ]
173186 }
174187 }
175188 self ._load_json_scenarios ()
@@ -249,6 +262,12 @@ async def list_scenarios(
249262
250263 # Add metadata
251264 for scenario in scenarios :
265+ data_sources = sorted ({
266+ generator
267+ for phase in scenario .get ("phases" , [])
268+ for generator in phase .get ("generators" , [])
269+ })
270+ scenario ["data_sources" ] = data_sources
252271 scenario ["phase_count" ] = len (scenario .get ("phases" , []))
253272 scenario ["estimated_duration_minutes" ] = sum (
254273 phase .get ("duration" , 0 ) for phase in scenario .get ("phases" , [])
@@ -302,7 +321,7 @@ async def start_correlation_scenario(
302321 dry_run : bool = False ,
303322 overwrite_parser : bool = False ,
304323 suppress_alerts : bool = False ,
305- strip_helios_prefix : bool = False ,
324+ include_helios_prefix : bool = False ,
306325 background_tasks = None
307326 ) -> str :
308327 """Start correlation scenario execution with SIEM context and trace ID support"""
@@ -321,7 +340,7 @@ async def start_correlation_scenario(
321340 "tag_trace" : tag_trace ,
322341 "overwrite_parser" : overwrite_parser ,
323342 "suppress_alerts" : suppress_alerts ,
324- "strip_helios_prefix " : strip_helios_prefix ,
343+ "include_helios_prefix " : include_helios_prefix ,
325344 "progress" : 0
326345 }
327346
@@ -335,7 +354,7 @@ async def start_correlation_scenario(
335354 tag_phase ,
336355 tag_trace ,
337356 suppress_alerts ,
338- strip_helios_prefix
357+ include_helios_prefix
339358 )
340359
341360 return execution_id
@@ -349,7 +368,7 @@ async def _execute_correlation_scenario(
349368 tag_phase : bool = True ,
350369 tag_trace : bool = True ,
351370 suppress_alerts : bool = False ,
352- strip_helios_prefix : bool = False
371+ include_helios_prefix : bool = False
353372 ):
354373 """Execute correlation scenario with SIEM context and trace ID support"""
355374 import sys
@@ -371,13 +390,19 @@ async def _execute_correlation_scenario(
371390 os .environ ['S1_TRACE_ID' ] = trace_id
372391 os .environ ['S1_TAG_PHASE' ] = '1' if tag_phase else '0'
373392 os .environ ['S1_TAG_TRACE' ] = '1' if tag_trace else '0'
393+ os .environ ['SCENARIO_INCLUDE_HELIOS_PREFIX' ] = 'true' if include_helios_prefix else 'false'
374394
375395 # Import and run the scenario
376- module = __import__ (scenario_id )
377- scenario_result = module .generate_apollo_ransomware_scenario (
396+ scenario_module_map = {
397+ 'apollo_ransomware_scenario' : ('apollo_ransomware_scenario' , 'generate_apollo_ransomware_scenario' ),
398+ 'identity_theft_ransomware' : ('identity_theft_ransomware_scenario' , 'generate_identity_theft_ransomware_scenario' ),
399+ }
400+ module_name , function_name = scenario_module_map .get (scenario_id , (scenario_id , f'generate_{ scenario_id } ' ))
401+ module = __import__ (module_name )
402+ scenario_func = getattr (module , function_name )
403+ scenario_result = scenario_func (
378404 siem_context = siem_context ,
379- suppress_alerts = suppress_alerts ,
380- strip_helios_prefix = strip_helios_prefix ,
405+ include_helios_prefix = include_helios_prefix ,
381406 )
382407
383408 # Update execution status
@@ -400,6 +425,8 @@ async def _execute_correlation_scenario(
400425 os .environ .pop ('S1_TRACE_ID' , None )
401426 os .environ .pop ('S1_TAG_PHASE' , None )
402427 os .environ .pop ('S1_TAG_TRACE' , None )
428+ os .environ .pop ('SCENARIO_INCLUDE_HELIOS_PREFIX' , None )
429+
403430
404431 async def _execute_scenario (self , execution_id : str , scenario : Dict [str , Any ]):
405432 """Execute scenario in background"""
0 commit comments