Saltar al contenido principal

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​

  1. Trabajo individual - No se permite colaboración durante el CTF
  2. Recursos permitidos:
    • Apuntes del curso
    • Documentación de Microsoft
    • Herramientas Sysinternals
  3. Recursos prohibidos:
    • Comunicación con otros estudiantes
    • Soluciones en línea
  4. 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:

  1. Un flag está oculto en las variables de entorno del usuario
  2. 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:

  1. Un flag está oculto en una clave del registro
  2. 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:

  1. Un archivo oculto contiene el flag
  2. Se encuentra en la carpeta Documentos del usuario
  3. 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:

  1. Se ha creado un servicio con una descripción que contiene un flag
  2. El servicio no está iniciado
  3. 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:

  1. Un script de PowerShell se ejecuta en segundo plano
  2. Contiene el flag en sus argumentos de línea de comandos
  3. 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:

  1. Un servidor escucha en un puerto inusual
  2. Conéctese al servidor para obtener el flag
  3. 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íoPuntosDificultad
1. Variables env15Fácil
2. Registro15Fácil
3. ADS15Medio
4. Servicios20Medio
5. Procesos20Difícil
6. Red15Medio
7. Bonus10Difí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