flagFlag Hunters PicoCTF (Easy)

Contexto de la maquina

Trayectoria Flag Hunters

Descripción

Flag Hunters es un reto de explotación de scripts en Python enfocado en la identificación y explotación de una inyección de comandos lógica dentro del flujo de ejecución de un parser personalizado. El programa simula la lectura de una canción estructurada mediante etiquetas, permitiendo al usuario influir en el control de flujo mediante una entrada no validada.

Objetivo del reto

Forzar la ejecución de una sección oculta del programa (secret_intro) que contiene la flag, manipulando el flujo del parser mediante una entrada maliciosa.

Tipo de reto

  • Script / Aplicación

  • Command Injection (lógica)

  • Control Flow Manipulation

Habilidades y técnicas evaluadas

  • Análisis de código fuente en Python

  • Comprensión de flujos de control personalizados

  • Identificación de inyecciones lógicas

  • Explotación local y remota mediante netcat

  • Razonamiento sobre parsers inseguros

Análisis de vulnerabilidades

Despliegue del CTF

En la propia pagina buscaremos el CTF, dentro veremos un boton llamado Launch Instance, una ves desplegado nos aparecera here donde se encuentra el dominio junto con el puerto asociado al mismo.

El objetivo de estos CTFs es encontrar la flag final.

Command Injection

El reto nos proporciona directamente el script vulnerable, junto con su código fuente, el cual podemos descargar mediante wget una vez generada la URL correspondiente:

El enfoque será explotar primero el script en local, con el objetivo de entender completamente su funcionamiento y validar la técnica de explotación. Una vez confirmada, replicaremos el mismo ataque contra el servicio remoto del reto.

El propio desafío nos indica cómo interactuar con el servicio:

El mensaje nos da una pista clara: existe un fragmento oculto del texto que no se imprime por defecto y que contiene algo de valor (la flag). Para acceder a él, debemos analizar el código fuente y forzar su ejecución.

Explotación en local

Analizamos el script lyric-reader.py para identificar el flujo de ejecución y el contenido oculto.

lyric-reader.py

Observamos que la variable secret_intro contiene el texto oculto, y además concatena directamente el contenido del archivo flag.txt. Esta sección no se imprime durante la ejecución normal del programa, por lo que nuestro objetivo será redirigir el flujo de ejecución hacia esta parte.

Para poder probar la explotación en local, creamos un archivo flag.txt de prueba:

Identificación de la vulnerabilidad

Durante el análisis del flujo del programa, detectamos una vulnerabilidad de inyección de comandos lógicos (control flow injection) en la parte donde se procesa la entrada del usuario bajo el marcador CROWD.

Código vulnerable:

¿Por qué es vulnerable?

  1. El input del usuario (crowd) se concatena sin validación a una línea del script.

  2. Esa línea se almacena en song_lines[lip].

  3. En la siguiente iteración, la línea se procesa con:

Esto permite al usuario inyectar nuevas instrucciones internas del parser utilizando el carácter ;.

Análisis del parser interno

El script interpreta las siguientes palabras clave:

  • REFRAIN → Salta al estribillo

  • RETURN X → Salta a la línea X

  • CROWD → Solicita input del usuario

  • END → Finaliza la ejecución

Esto nos permite controlar el flujo si conseguimos inyectar un comando RETURN.

Flujo de explotación

Payload utilizado:

payload

Paso a paso:

El uso de RETURN 0 es clave, ya que el contenido oculto (secret_intro) se encuentra al inicio del texto.

Ejecutamos el script:

Respuesta:

Esto confirma que la explotación funciona correctamente en local y que conseguimos imprimir la sección oculta con la flag.

Explotación contra el servidor remoto

Una vez validada la técnica, replicamos exactamente el mismo proceso contra el servicio real del reto:

Respuesta:

Con esto completamos el reto, explotando una inyección de control de flujo mediante input no sanitizado, que nos permite redirigir la ejecución del parser interno y acceder a contenido oculto que no se imprime de forma normal.

flag.txt

Last updated