Lab 11.3: Mini-CTF de Síntesis
Introducción
¡Bienvenido al Mini-CTF de síntesis del curso de Sistemas Operativos!
Este desafío integra las competencias adquiridas a lo largo de la sesión:
- Configuración del sistema
- Análisis de procesos y memoria
- Seguridad en Windows
- PowerShell y scripting
- Comunicación entre procesos
- Detección de amenazas
Formato
- Tipo: Capture The Flag (CTF)
- Duración: 90 minutos
- Puntos: 100 puntos en total
- Flags: Formato
FLAG{texto_del_flag}
Reglas
- Trabajo individual - No se permite colaboración durante el CTF
- Recursos permitidos:
- Apuntes del curso
- Documentación de Microsoft
- Herramientas Sysinternals
- Recursos prohibidos:
- Comunicación con otros estudiantes
- Soluciones en línea
- Envío: Copie los flags en el documento de respuestas
Entorno
Usted dispone de una VM Windows preparada con:
- Herramientas Sysinternals instaladas
- PowerShell disponible
- Pistas ocultas en el sistema
¡Asegúrese de tener un snapshot antes de comenzar!
Desafíos
Desafío 1: Reconocimiento del Sistema (15 puntos)
Objetivo: Encontrar información oculta en la configuración del sistema.
Instrucciones:
- Un flag está oculto en las variables de entorno del usuario
- Encuentre la variable que contiene el flag
Pista: El nombre de la variable comienza con "SECRET_"
Configuración para el profesor (a realizar antes del CTF):
# Agregar la variable de entorno
[Environment]::SetEnvironmentVariable("SECRET_CTF", "FLAG{env_vars_reveal_secrets}", "User")
Solución esperada: FLAG{env_vars_reveal_secrets}
Desafío 2: Registro de Windows (15 puntos)
Objetivo: Explorar el registro para encontrar un flag oculto.
Instrucciones:
- Un flag está oculto en una clave del registro
- Busque en HKCU:\Software\
Pista: La clave se llama "CoursSE"
Configuración:
# Crear la clave de registro
New-Item -Path "HKCU:\Software\CoursSE" -Force
Set-ItemProperty -Path "HKCU:\Software\CoursSE" -Name "Flag" -Value "FLAG{registry_hunter_pro}"
Comando útil:
Get-ItemProperty -Path "HKCU:\Software\CoursSE"
Desafío 3: Archivos Ocultos (15 puntos)
Objetivo: Encontrar un archivo oculto en el sistema.
Instrucciones:
- Un archivo oculto contiene el flag
- Se encuentra en la carpeta Documentos del usuario
- El archivo utiliza un Alternate Data Stream (ADS)
Configuración:
# Crear el archivo con ADS
$path = [Environment]::GetFolderPath("MyDocuments")
Set-Content "$path\readme.txt" -Value "Ceci est un fichier normal."
Set-Content "$path\readme.txt:secret" -Value "FLAG{ads_are_sneaky}" -Stream "secret"
Comando útil:
Get-Item "$path\readme.txt" -Stream *
Get-Content "$path\readme.txt" -Stream secret
Desafío 4: Servicio Sospechoso (20 puntos)
Objetivo: Identificar un servicio sospechoso y encontrar su flag.
Instrucciones:
- Se ha creado un servicio con una descripción que contiene un flag
- El servicio no está iniciado
- Encuéntrelo entre los servicios instalados
Configuración:
# Crear un servicio falso (requiere admin)
New-Service -Name "SvcCTF" -BinaryPathName "C:\Windows\System32\cmd.exe" `
-DisplayName "Windows CTF Helper" `
-Description "FLAG{service_enumeration_master}" `
-StartupType Manual
Comandos útiles:
Get-Service | Where-Object { $_.DisplayName -like "*CTF*" }
Get-WmiObject Win32_Service | Where-Object { $_.Description -like "*FLAG*" }
Desafío 5: Procesos y Memoria (20 puntos)
Objetivo: Analizar un proceso para encontrar un flag.
Instrucciones:
- Un script de PowerShell se ejecuta en segundo plano
- Contiene el flag en sus argumentos de línea de comandos
- Utilice las herramientas de análisis para encontrarlo
Configuración:
# Iniciar un proceso con el flag en el argumento
Start-Process powershell -ArgumentList "-NoExit -Command `"Write-Host 'Background process'; while(`$true){Start-Sleep 60}`"" -WindowStyle Hidden
# El flag real estaría en los argumentos
Start-Process powershell -ArgumentList "-NoExit -Command `"`$flag='FLAG{process_forensics_win}'; while(`$true){Start-Sleep 60}`"" -WindowStyle Hidden
Comandos útiles:
Get-WmiObject Win32_Process | Select-Object Name, ProcessId, CommandLine
Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -like "*FLAG*" }
Desafío 6: Red y Conexiones (15 puntos)
Objetivo: Analizar las conexiones de red para encontrar una pista.
Instrucciones:
- Un servidor escucha en un puerto inusual
- Conéctese al servidor para obtener el flag
- El puerto está entre 8000 y 9000
Configuración:
# Script del servidor a ejecutar antes del CTF
$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Loopback, 8888)
$listener.Start()
Write-Host "Servidor CTF escuchando en el puerto 8888"
while ($true) {
$client = $listener.AcceptTcpClient()
$stream = $client.GetStream()
$writer = [System.IO.StreamWriter]::new($stream)
$writer.WriteLine("FLAG{network_detective}")
$writer.Flush()
$client.Close()
}
Comandos útiles:
# Encontrar los puertos en escucha
Get-NetTCPConnection -State Listen | Where-Object { $_.LocalPort -gt 8000 -and $_.LocalPort -lt 9000 }
# Conectarse
$client = New-Object System.Net.Sockets.TcpClient("127.0.0.1", 8888)
$reader = New-Object System.IO.StreamReader($client.GetStream())
$reader.ReadLine()
Desafío Bonus (10 puntos)
Desafío 7: Tarea Programada
Objetivo: Encontrar un flag oculto en una tarea programada.
Configuración:
# Crear una tarea programada con el flag
$action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c echo FLAG{scheduled_task_investigator}"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddYears(1)
Register-ScheduledTask -TaskName "CTF_Task" -Action $action -Trigger $trigger -Description "Hidden CTF challenge"
Comando útil:
Get-ScheduledTask | Where-Object { $_.TaskName -like "*CTF*" }
(Get-ScheduledTask -TaskName "CTF_Task").Actions
Hoja de Respuestas
Nombre: ______________________
Fecha: _______________________
Desafío 1 (15 pts): FLAG{_____________________}
Desafío 2 (15 pts): FLAG{_____________________}
Desafío 3 (15 pts): FLAG{_____________________}
Desafío 4 (20 pts): FLAG{_____________________}
Desafío 5 (20 pts): FLAG{_____________________}
Desafío 6 (15 pts): FLAG{_____________________}
Bonus (10 pts): FLAG{_____________________}
Total: _____ / 110 puntos
Criterios de Evaluación
| Desafío | Puntos | Dificultad |
|---|---|---|
| 1. Variables env | 15 | Fácil |
| 2. Registro | 15 | Fácil |
| 3. ADS | 15 | Medio |
| 4. Servicios | 20 | Medio |
| 5. Procesos | 20 | Difícil |
| 6. Red | 15 | Medio |
| 7. Bonus | 10 | Difícil |
Guía para el Profesor
Preparación de la VM
# Script de configuración completa del CTF
# Ejecutar como administrador antes de comenzar
Write-Host "Configuración del Mini-CTF..." -ForegroundColor Cyan
# Desafío 1 - Variable de entorno
[Environment]::SetEnvironmentVariable("SECRET_CTF", "FLAG{env_vars_reveal_secrets}", "User")
# Desafío 2 - Registro
New-Item -Path "HKCU:\Software\CoursSE" -Force | Out-Null
Set-ItemProperty -Path "HKCU:\Software\CoursSE" -Name "Flag" -Value "FLAG{registry_hunter_pro}"
# Desafío 3 - ADS
$docPath = [Environment]::GetFolderPath("MyDocuments")
Set-Content "$docPath\readme.txt" -Value "Ceci est un fichier normal de documentation."
Set-Content "$docPath\readme.txt:secret" -Value "FLAG{ads_are_sneaky}" -Stream "secret"
# Desafío 4 - Servicio (requiere admin)
if ((New-Service -Name "SvcCTF" -BinaryPathName "C:\Windows\System32\cmd.exe" `
-DisplayName "Windows CTF Helper" `
-Description "FLAG{service_enumeration_master}" `
-StartupType Manual -ErrorAction SilentlyContinue)) {
Write-Host "Servicio creado" -ForegroundColor Green
}
# Desafío 5 - Proceso
Start-Process powershell -ArgumentList "-WindowStyle Hidden -NoExit -Command `"`$flag='FLAG{process_forensics_win}'; while(`$true){Start-Sleep 60}`""
# Desafío 7 - Tarea programada
$action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c echo FLAG{scheduled_task_investigator}"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddYears(1)
Register-ScheduledTask -TaskName "CTF_Task" -Action $action -Trigger $trigger -Description "Hidden CTF" -Force | Out-Null
Write-Host "¡Configuración terminada!" -ForegroundColor Green
Write-Host "No olvide iniciar el servidor de red (Desafío 6) por separado."
Inicio del servidor de red (Desafío 6)
# Ejecutar en una ventana separada
$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Loopback, 8888)
$listener.Start()
Write-Host "Servidor CTF escuchando en el puerto 8888..."
while ($true) {
$client = $listener.AcceptTcpClient()
$stream = $client.GetStream()
$writer = [System.IO.StreamWriter]::new($stream)
$writer.WriteLine("FLAG{network_detective}")
$writer.Flush()
$client.Close()
Write-Host "Cliente atendido."
}
Limpieza después del CTF
# Script de limpieza
[Environment]::SetEnvironmentVariable("SECRET_CTF", $null, "User")
Remove-Item "HKCU:\Software\CoursSE" -Recurse -Force -ErrorAction SilentlyContinue
$docPath = [Environment]::GetFolderPath("MyDocuments")
Remove-Item "$docPath\readme.txt" -Force -ErrorAction SilentlyContinue
Stop-Service "SvcCTF" -ErrorAction SilentlyContinue
sc.exe delete "SvcCTF"
Get-Process powershell | Where-Object { $_.CommandLine -like "*flag=*" } | Stop-Process -Force
Unregister-ScheduledTask -TaskName "CTF_Task" -Confirm:$false -ErrorAction SilentlyContinue
Write-Host "Limpieza terminada." -ForegroundColor Green
Conclusión
Este Mini-CTF pone a prueba su dominio de los conceptos fundamentales:
- Exploración del sistema Windows
- Uso de PowerShell
- Análisis forense básico
- Seguridad y detección
¡Buena suerte! 🎯
Mini-CTF desarrollado en el marco del curso Sistemas Operativos - MÓDULO 11