XUT_ / MACHINES / CTF

0100

Companion API

CTFMACHINENONEMEDIUM
CTFTalent ArenaWebDockerAPIJWT

Introduction

Companion API - CTF Challenge

Welcome, Hacker!

You've been hired as a security consultant to assess Companion API, a mobile backend API for a major event management platform. The organizers want to ensure their attendee management system is secure before the big event.

Your mission: Find the vulnerabilities in this API and retrieve the flag.

The Scenario

Companion API is a REST API that handles:

  • Attendee authentication
  • Ticket management for event sessions
  • Internal staff tools

The development team claims the API is "production ready." Prove them wrong.

Getting Started

Prerequisites

  • Docker and Docker Compose installed
  • A REST client (curl, Postman, Burp Suite, etc.)
  • Your hacking skills

Running the Challenge

  1. Extract the challenge files:

    unzip web-challenge.zip

  2. Start the service:

    ./START.sh

  3. The API is now available at: http://127.0.0.1:8080

To stop the challenge:

bash
docker compose down

Rules of Engagement

  • This is an API hacking challenge - focus on the REST endpoints

  • The flag format is: MWC{...}

  • To finalize the challenge there is an endpoint to get the full flag: /api/v1/finalize

    • POST request with the following data:

    "fragment_1": "<FRAGMENT_2003>", "fragment_2": "<FRAGMENT_2>", "fragment_3": "<FRAGMENT_3>",

    • If data is correct you will get the flag.

Objective

Find and submit the flag. The flag proves you've successfully identified and exploited all the intended vulnerabilities in the chain.


Companion API - Reto CTF

Bienvenido, Hacker!

Te han contratado como consultor de seguridad para evaluar Companion API, una API de backend móvil para una importante plataforma de gestión de eventos. Los organizadores quieren garantizar la seguridad de su sistema de gestión de asistentes antes del gran evento.

Tu misión: Encontrar las vulnerabilidades en esta API y detectarlas.

El Esenario

La API complementaria es una API REST que gestiona:

  • Autenticación de asistentes
  • Gestión de tickets para sesiones de eventos
  • Herramientas internas para el personal

El equipo de desarrollo afirma que la API está lista para producción. Demuéstrales que se equivocan.

Getting Started

Pre-requisitos

  • Docker y Docker Compose instalados
  • Un cliente REST (curl, Postman, Burp Suite, etc.)
  • Tus habilidades de hacking

Ejecutar el Reto

  1. Extraiga los archivos del desafío:

    unzip web-challenge.zip

  2. Inicie el servicio:

    ./START.sh

  3. La API ya está disponible en: http://127.0.0.1:8080

Para detener el desafío:

bash
docker compose down

Reglas del Engagement

Este es un desafío de hacking de API: se centra en los endpoints REST.

  • El formato de la bandera es: MWC{...}.

  • Para finalizar el desafío, hay un endpoint para obtener la bandera completa: /api/v1/finalize.

  • Solicitud POST con los siguientes datos:

"fragment_1": "<FRAGMENT_2003>", "fragment_2": "<FRAGMENT_2>", "fragment_3": "<FRAGMENT_3>",

  • Si los datos son correctos, se obtendrá la bandera.

Objectivo

Encuentra y envía la bandera. Esta bandera demuestra que has identificado y explotado con éxito todas las vulnerabilidades previstas en la cadena.

¡Buena suerte, hacker!

Companion API

  1. Vamos a la dirección de la API donde encontramos las siguientes instrucciones: web
  2. Realizamos la petición por cURL. web Guardamos este token en una variable de entorno.
  3. Vamos a intentar encontrar endpoints.
    1. Trasteando por la página encontramos lo siguiente: web Esto significa que conocemos los endpoints:

      • /api/v1/auth web
      • /api/v1/tickets web
      • /api/v1/users web
    2. Vamos a buscar ahora fuzzeando. Nosotros sabemos que muy seguramente haya algún endpoint para admin, por lo que vamos a fuzzear ahí. web Parece que hemos encontrado otro endpoint: /api/v1/admin/console.

      En total tenemos los siguientes endpoints para investigar:

      • /api/v1/auth/login
      • /api/v1/users/me
      • /api/v1/tickets
      • /api/v1/admin/console
  4. Vamos a comenzar la investigación de los endpoints.
    1. Empezaremos por ver que opciones de método tiene cada uno de ellos.
      1. /api/v1/auth/login: web
      2. /api/v1/users/me: web
      3. /api/v1/tickets: web Parece que este endpoint necesita un id para obtener el ticket, lo investigaremos más adelante.
      4. /api/v1/admin/console: web
    2. Teniendo ya todos los métodos parece que podemos ver que todos son GET o POST menos uno. En /api/v1/users/me está permitido el método PATCH. web Parece que podemos haber encontrado un método para modificar algún parámetro importante.
  5. Para seguir investigando endpoints, vamos a ver si podemos obtener algún ticket, aprovechándonos de que este id iba metido en el propio endpoint.
    1. Para ello vamos a crear una lista con una secuencia de números de 0000 a 9999. web
    2. Una vez creada vamos a fuzzear el endpoint /api/v1/tickets/numero. web
    3. Parece que hemos encontrado ciertos tickets a los que se puede acceder. Vamos a hacer peticiones y observar los resultados. web Parece que acabamos de encontrar el primer fragmento (referido en las instrucciones del reto como FRAGMENT_2003): zWSPcwMG3Y1M.
  6. Hemos observado también una ruta: /api/v1/dev/panel. Vamos a probar a entrar. web Parece que sólo staff puede verlo.
  7. Además de encontrar el primer fragmento, hemos podido observar que hay al menos un rol más: staff. Si vamos a ver lo que nos devuelve el endpoint /api/v1/users/me: web
  8. Recordamos que en este endpoint podemos usar el método PATCH, por lo que vamos a probar a cambiarnos el parámetro role. web Parece que ha funcionado.
  9. Vamos a obtener un nuevo token, ahora como staff, gracias al método PATCH. Metemos el token en una nueva variable de entorno. web
  10. Con dicho token intentamos volver a acceder al panel de staff. web Parece que acabamos de encontrar el segundo fragmento: lYE3tlwIp_Mk. Además parece que hay otra ruta.
  11. Vamos a ver qué hay en dicha ruta. web Parece que acabamos de encontrar la clave de firmado de los JWTs.
  12. En JWT.io podemos comprobar que efectivamente lo es. web
  13. Si le damos a la opción de JWT Encoder, en lugar de JWT Decoder podemos modificar el contenido del token. web
  14. Antes de proceder a comprobar si funciona, vamos a intentar acceder al endpoint /api/v1/admin/console con el token actual para comprobar que no funciona. web
  15. Si guardamos el token de administrador y hacemos otra petición: web Efectivamente obtenemos el fragmento tres: 3bvyvMCM0StL.
  16. Pero el reto no se acaba aquí, como dice en las instrucciones debemos hacer una última petición a /api/v1/finalize con los tres fragmentos encontrados para obtener la flag. web