@@ -161,6 +161,19 @@ def __init__(self):
161161 {"name" : "Command & Control" , "generators" : ["sentinelone_endpoint" , "paloalto_firewall" ], "duration" : 1 },
162162 {"name" : "Detection & Response" , "generators" : ["proofpoint" , "sentinelone_endpoint" ], "duration" : 1 }
163163 ]
164+ },
165+ "identity_theft_ransomware" : {
166+ "id" : "identity_theft_ransomware" ,
167+ "name" : "Cross-Platform Identity Theft & Ransomware" ,
168+ "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." ,
169+ "phases" : [
170+ {"name" : "Initial Access / Credential Theft" , "generators" : ["sentinelone_endpoint" , "microsoft_windows_eventlog" , "okta_authentication" ], "duration" : 10 },
171+ {"name" : "Command & Control" , "generators" : ["sentinelone_endpoint" , "paloalto_firewall" ], "duration" : 5 },
172+ {"name" : "Endpoint Discovery & Staging" , "generators" : ["sentinelone_endpoint" ], "duration" : 10 },
173+ {"name" : "Credential & Privilege Abuse" , "generators" : ["sentinelone_endpoint" , "microsoft_windows_eventlog" , "okta_authentication" ], "duration" : 10 },
174+ {"name" : "Ransomware Preparation" , "generators" : ["sentinelone_endpoint" ], "duration" : 10 },
175+ {"name" : "Ransomware Execution / Impact" , "generators" : ["sentinelone_endpoint" , "microsoft_windows_eventlog" ], "duration" : 10 }
176+ ]
164177 }
165178 }
166179 self ._load_json_scenarios ()
@@ -240,6 +253,12 @@ async def list_scenarios(
240253
241254 # Add metadata
242255 for scenario in scenarios :
256+ data_sources = sorted ({
257+ generator
258+ for phase in scenario .get ("phases" , [])
259+ for generator in phase .get ("generators" , [])
260+ })
261+ scenario ["data_sources" ] = data_sources
243262 scenario ["phase_count" ] = len (scenario .get ("phases" , []))
244263 scenario ["estimated_duration_minutes" ] = sum (
245264 phase .get ("duration" , 0 ) for phase in scenario .get ("phases" , [])
@@ -293,7 +312,7 @@ async def start_correlation_scenario(
293312 dry_run : bool = False ,
294313 overwrite_parser : bool = False ,
295314 suppress_alerts : bool = False ,
296- strip_helios_prefix : bool = False ,
315+ include_helios_prefix : bool = False ,
297316 background_tasks = None
298317 ) -> str :
299318 """Start correlation scenario execution with SIEM context and trace ID support"""
@@ -312,7 +331,7 @@ async def start_correlation_scenario(
312331 "tag_trace" : tag_trace ,
313332 "overwrite_parser" : overwrite_parser ,
314333 "suppress_alerts" : suppress_alerts ,
315- "strip_helios_prefix " : strip_helios_prefix ,
334+ "include_helios_prefix " : include_helios_prefix ,
316335 "progress" : 0
317336 }
318337
@@ -326,7 +345,7 @@ async def start_correlation_scenario(
326345 tag_phase ,
327346 tag_trace ,
328347 suppress_alerts ,
329- strip_helios_prefix
348+ include_helios_prefix
330349 )
331350
332351 return execution_id
@@ -340,7 +359,7 @@ async def _execute_correlation_scenario(
340359 tag_phase : bool = True ,
341360 tag_trace : bool = True ,
342361 suppress_alerts : bool = False ,
343- strip_helios_prefix : bool = False
362+ include_helios_prefix : bool = False
344363 ):
345364 """Execute correlation scenario with SIEM context and trace ID support"""
346365 import sys
@@ -362,13 +381,19 @@ async def _execute_correlation_scenario(
362381 os .environ ['S1_TRACE_ID' ] = trace_id
363382 os .environ ['S1_TAG_PHASE' ] = '1' if tag_phase else '0'
364383 os .environ ['S1_TAG_TRACE' ] = '1' if tag_trace else '0'
384+ os .environ ['SCENARIO_INCLUDE_HELIOS_PREFIX' ] = 'true' if include_helios_prefix else 'false'
365385
366386 # Import and run the scenario
367- module = __import__ (scenario_id )
368- scenario_result = module .generate_apollo_ransomware_scenario (
387+ scenario_module_map = {
388+ 'apollo_ransomware_scenario' : ('apollo_ransomware_scenario' , 'generate_apollo_ransomware_scenario' ),
389+ 'identity_theft_ransomware' : ('identity_theft_ransomware_scenario' , 'generate_identity_theft_ransomware_scenario' ),
390+ }
391+ module_name , function_name = scenario_module_map .get (scenario_id , (scenario_id , f'generate_{ scenario_id } ' ))
392+ module = __import__ (module_name )
393+ scenario_func = getattr (module , function_name )
394+ scenario_result = scenario_func (
369395 siem_context = siem_context ,
370- suppress_alerts = suppress_alerts ,
371- strip_helios_prefix = strip_helios_prefix ,
396+ include_helios_prefix = include_helios_prefix ,
372397 )
373398
374399 # Update execution status
@@ -391,6 +416,8 @@ async def _execute_correlation_scenario(
391416 os .environ .pop ('S1_TRACE_ID' , None )
392417 os .environ .pop ('S1_TAG_PHASE' , None )
393418 os .environ .pop ('S1_TAG_TRACE' , None )
419+ os .environ .pop ('SCENARIO_INCLUDE_HELIOS_PREFIX' , None )
420+
394421
395422 async def _execute_scenario (self , execution_id : str , scenario : Dict [str , Any ]):
396423 """Execute scenario in background"""
0 commit comments