#Requires -Version 5.1 <# .SYNOPSIS Ejercicio COMPLETO en un solo comando: exfiltracion simulada + cifrado simulado. .DESCRIPTION Encadena las dos fases del ejercicio, en el orden realista (primero se roba, despues se cifra, que es lo que hace el ransomware de verdad): 1. Vector 1: generar los canarios, plantarlos y exfiltrarlos al C2 por HTTPS 2. Vector 2: el impacto reversible en el activo (ficheros, fondo, nota, registro) Cada fase usa SU alcance. Los dos viajan dentro del payload, asi que estan en el mismo directorio que este script (el stage): scope.vector1.json y scope.json. IMPORTANTE, y no es un detalle menor: esto es para el LABORATORIO y para la demostracion. En el ejercicio real las dos fases van SEPARADAS en el tiempo, porque los canarios se plantan con antelacion a la ventana de observacion. Si se exfiltra un canario recien creado, no hay ventana, nadie puede detectarlo y el ejercicio no mide nada. Aqui se encadenan para poder ver el circuito completo de una sola vez, y el propio script lo avisa por pantalla. .PARAMETER ScopePath Alcance principal. Se acepta por compatibilidad con el stager: las fases usan sus propios alcances y solo se recurre a este si alguno no esta en el stage. .PARAMETER Execute Segunda llave, como en todo el arnes. Sin ella, todo corre en simulacion. .EXAMPLE .\Invoke-EjercicioCompleto.ps1 -ScopePath ..\scope.json -Execute #> [CmdletBinding()] param( [Parameter(Mandatory)][string]$ScopePath, [switch]$Execute ) $ErrorActionPreference = 'Stop' # OJO: este script vive en \harness\bin, asi que el stage esta DOS # niveles mas arriba. Con un solo Split-Path apuntaba a \harness, no # encontraba scope.json, y el respaldo usaba el alcance del Vector 1: el # impacto salia con .crypto y sin fondo, sin nota y sin registro. Medido. $hbin = $PSScriptRoot $stage = Split-Path -Parent (Split-Path -Parent $hbin) # FALTA UN NIVEL # Cada fase tiene su alcance, y los dos viajan en el payload. $scopeV1 = Join-Path $stage 'scope.vector1.json' $scopeV2 = Join-Path $stage 'scope.json' if (-not (Test-Path -LiteralPath $scopeV1)) { $scopeV1 = $ScopePath } if (-not (Test-Path -LiteralPath $scopeV2)) { $scopeV2 = $ScopePath } Write-Host '' Write-Host '=== EJERCICIO COMPLETO: exfiltracion + cifrado simulado ===' -ForegroundColor Cyan Write-Host "Alcance Vector 1: $scopeV1" Write-Host "Alcance Vector 2: $scopeV2" Write-Host "Modo : $(if ($Execute) { 'EJECUCION REAL' } else { 'SIMULACION (falta -Execute)' })" Write-Host '' Write-Host 'AVISO: las dos fases van encadenadas para la demostracion. En el ejercicio real se' -ForegroundColor Yellow Write-Host 'lanzan separadas: los canarios se plantan ANTES de la ventana de observacion.' -ForegroundColor Yellow Write-Host 'El orden es el realista: primero se exfiltra, despues se cifra.' -ForegroundColor Yellow Write-Host '' $pasos = @( @{ Nombre = 'Vector 1: canarios + plantado + exfiltracion'; Script = 'Invoke-Vector1Ciclo.ps1'; Alcance = $scopeV1; Args = @() } @{ Nombre = 'Vector 2: impacto reversible en el activo'; Script = 'Invoke-RansomSim.ps1'; Alcance = $scopeV2; Args = @() } ) $fallos = 0 foreach ($p in $pasos) { $scriptPath = Join-Path $hbin ([string]$p.Script) if (-not (Test-Path -LiteralPath $scriptPath)) { throw "Falta $($p.Script) en $hbin" } Write-Host ("--- {0} ({1})" -f $p.Nombre, $p.Script) -ForegroundColor Cyan $childArgs = @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', $scriptPath, '-ScopePath', $p.Alcance) + @($p.Args) if ($Execute) { $childArgs += '-Execute' } & powershell.exe @childArgs if ($LASTEXITCODE -ne 0) { $fallos++ Write-Host (" FALLO en '{0}' (exit {1}): se detiene el ejercicio" -f $p.Nombre, $LASTEXITCODE) -ForegroundColor Red break } Write-Host '' } Write-Host '===========================================================' -ForegroundColor Cyan if ($fallos -eq 0) { Write-Host 'Ejercicio completo terminado sin errores.' -ForegroundColor Green Write-Host 'Recuerda: los datos del C2 estan en C:\RT\c2-storage\resumen.html' -ForegroundColor Green } else { Write-Host 'Ejercicio detenido por un fallo.' -ForegroundColor Red exit 1 }