Skip to main content

Writeup de Fetch the Flag CTF 2022: Containers are ACE

Escrito por
feature ctf containers are ace

9 de noviembre de 2022

0 minutos de lectura

¡Gracias por jugar Fetch con nosotros!Felicitaciones a los miles de jugadores que participaron en Fetch the Flag CTF. ¡Y muchísimas gracias a los Snykers que crearon, probaron y documentaron los desafíos!

El nivel de dificultad del desafío Containers are ACE de Fetch the Flag CTF de este año es bastante bajo. Requiere conocimientos básicos de Burp y de algunos comandos del sistema operativo. También hay que hacer un poco de trabajo de análisis e investigación para identificar el vector de ataque.

Guía paso a paso

Investigación inicial

Antes de comenzar la investigación propiamente dicha, cada detective debe reunir las pistas y conectarlas. Este desafío nos ofrece varias pistas valiosas, como puedes ver a continuación.

Pista #1: Instala Snyk CLI https://docs.snyk.io/snyk-cli/install-the-snyk-cli

No hay nada especial en este paso. Podemos instalar Snyk CLI de varias maneras; sin embargo, instalémoslo con NPM (asegúrate de tener NPM instalado; de lo contrario, puedes instalarlo desde aquí). 

Ejecuta sudo npm install snyk -g y tendrás todo listo para el siguiente paso.

Pista #2: Ejecuta este comando: snyk container test pasapples/apjctf-todo-java-app:latest --app-vulns --exclude-base-image-vulns

Aquí es donde Snyk CLI resulta útil, ya que ejecutará una serie de instrucciones al ejecutar el comando anterior (encontrarás más información en la documentación de Snyk CLI):

  1. Descarga la imagen si aún no está disponible localmente en tu daemon de Docker

  2. Determina qué software está instalado en la imagen

  3. Envía esa lista de materiales al servicio de Snyk

  4. Devuelve una lista de las vulnerabilidades de tu imagen

Snyk analizará la imagen en busca de vulnerabilidades y nos mostrará los resultados junto con una solución recomendada.

La salida de la terminal enumera vulnerabilidades de seguridad de Apache Struts y recomienda actualizar de la versión 2.3.20 a la 2.5.30.

Pista #3: Más información aquí https://docs.snyk.io/products/snyk-container/getting-around-the-snyk-container-ui/detecting-application-vulnerabilities-in-container-images#ap[…]lag

Esta pista ofrece información útil si queremos profundizar un poco más en el funcionamiento de Snyk Container.

Pista #4: Containers are ACE

El título también contiene una pista que será crucial para resolver este desafío. ACE suele usarse como abreviatura de Arbitrary Code/Command Execution (ejecución arbitraria de código o comandos).

Un paso atrás

Ya completamos la fase de recopilación de información y ahora buscaremos un vector de ataque que nos permita entrar en la aplicación. En el paso anterior, Snyk Container identificó muchas vulnerabilidades. ¡Tenemos que encontrar una manera de filtrarlas!

Intentaremos identificar vulnerabilidades de gravedad elevada, como CriticalY cuyo tipo sea Arbitrary Command/Code Execution. Al aplicar estos criterios, limitamos los resultados a las siguientes vulnerabilidades:

Salida de terminal que enumera vulnerabilidades de seguridad críticas en Apache Struts 2.3.20, incluida la ejecución remota y arbitraria de código.

Tras analizar brevemente cada una, vemos que CVE-2017-5638 tiene una puntuación CVSS de 10 y varios exploits disponibles públicamente. Con base en esto, podemos suponer que es muy probable que se pueda explotar esta vulnerabilidad. ¡Intentémoslo!

Manos a la obra

Podemos explotar la vulnerabilidad creando un script de exploit basado en las cargas útiles disponibles públicamente, o intentarlo mediante Burp. Seguiremos la segunda opción, ya que no requiere instalar bibliotecas ni crear archivos y, en general, es más ordenada.

Después de iniciar Burp, iremos a la pestaña Proxy, haremos clic en el botón Open Browser y accederemos a la aplicación web vulnerable. A partir de ese momento, todas las solicitudes se enviarán primero a Burp.

Ahora iremos a la sección de inicio de sesión de la aplicación web y empezaremos a interceptar solicitudes. Es obvio que intentar iniciar sesión con un correo electrónico y una contraseña aleatorios no funcionará, pero enviemos esta solicitud al repetidor.

Ventana de interceptación de Burp Suite que muestra una solicitud POST de inicio de sesión capturada y el menú Action con la opción «Send to Repeater» resaltada.
Paneles de solicitud y respuesta HTTP que muestran un intento fallido de inicio de sesión, con un error de correo electrónico o contraseña no válidos en el HTML devuelto

Ahora intentemos modificar la solicitud POST e incluir una carga útil disponible públicamente que puedes encontrar en GitHub.

Solicitud y respuesta HTTP mostradas una junto a la otra en una herramienta de depuración web. Se ve una solicitud POST y una respuesta 200 OK.

¡Bingo! Recibimos una respuesta diferente. Al inspeccionarla más de cerca, vemos que el resultado recibido proviene de este comando:

Fragmento de código que muestra una solicitud multipart/form-data con una carga útil de ejecución de comandos OGNL y una cadena de User-Agent de Chrome

Ahora podemos modificar el comando e intentar buscar en archivos y directorios para ver si encontramos algo; sin embargo, llegamos a un callejón sin salida. 

Solicitud de inicio de sesión HTTP y respuesta del servidor Apache Tomcat 8.5 mostradas lado a lado en una herramienta para desarrolladores

Como sabemos que el formato de la bandera es SNYK{...}, podemos buscar en todos los archivos para ver si encontramos resultados ejecutando #cmd='grep -r -e SNYK'. ¡Encontramos la bandera!

Fragmento de código que muestra un flag de webapps/todolist que contiene una cadena de token SNYK.

Como alternativa, podemos buscar archivos que contengan la palabra clave flag ejecutando ​​#cmd='find . -name *flag*'  y luego leer el archivo con #cmd='cat ./webapps/todolist/flag'

Interfaz de pruebas de seguridad web que muestra una solicitud POST de inicio de sesión con encabezados y datos del formulario, junto a una respuesta 200 que redirige a una página de lista de tareas con una bandera.

Cómo superamos el desafío ACE

  • Hicimos un reconocimiento básico del objetivo para preparar los siguientes pasos.

  • Identificamos el vector de ataque mediante la priorización de vulnerabilidades con

    Critical

    gravedad.

  • Interceptamos una solicitud válida y la modificamos al incluir una carga útil maliciosa.

  • Buscamos la bandera mediante técnicas de enumeración comunes.

¿Quieres saber cómo encontramos las demás banderas? Visita nuestra página de soluciones de Fetch the Flag para descubrir cómo lo hicimos.

Seguridad de contenedores centrada en los desarrolladores

Snyk encuentra y corrige automáticamente vulnerabilidades en imágenes de contenedores y cargas de trabajo de Kubernetes.