Page cover

🟢Capture the Flag - Talent Arena 2026

En esta ocasión vamos a hacer el writeup del hackatón Capture the Flag del Talent Arena 2026


Introducción - Flag 1

Active Phishing Campaign — "SpainPost Express"

1. SITUATION

An organized fraud ring is operating a large-scale SMS phishing campaign targeting mobile users across Europe. Victims receive fraudulent text messages impersonating a postal delivery service. The messages direct victims to a payment portal that harvests financial credentials.

Law enforcement has intercepted the following SMS sample from a compromised device:

2. YOUR MISSION

You are part of a cybersecurity task force assigned to dismantle this operation. Your objectives:

  • Investigate the phishing infrastructure

  • Identify the threat actors and their tools

  • Gain access to their operational server

  • Collect evidence of their criminal activity

There are 5 flags hidden throughout the investigation. Each flag follows the format:

3. RULES OF ENGAGEMENT

Only the target URL provided above is in scope Your assigned target instance IP will be provided via mail No attacks against CTF infrastructure, other teams, or external systems All standard tools and techniques are permitted Internet access is available for tool downloads and research

4. EVIDENCE COLLECTION

Submit each flag to the CTF scoreboard as you find it.

5. OPERATIONAL NOTES

GOOD LUCK. THE CLOCK IS TICKING.

— Cyber Crimes Unit, Talent Arena 2026


Enumeración

Añadimos la IP al /etc/hosts

Escaneo de Puertos

Encontramos puertos comunes (22 y 80) abiertos, y el dominio vinculado de AWS, que también añadiremos al /etc/hosts. Nos centraremos en el servicio web.

Acceso Web

Accedemos a la web y observamos que es una web de phising para robar datos bancarios de los usuarios que acceden a esta web.

La única funcionalidad de la web es trackear un número de seguimiento (que está bloqueado porque dicen que faltan de pagar unas tasas) y abajo del todo nos encontramos el botón para acceder a la página de pago /payment.html

Prueba de envío de datos

Probaremos a enviar datos fake para ver cómo se comporta la web e intentar descubrir cómo funciona internamente:

Al capturar la petición con BurpSuite vemos que los datos se envían en formato JSON y nos devuelve el número de tracking original y el status igualmente en formato JSON.

Al hacer el Forward vemos que la petición se envía correctamente.

Podríamos probar alguna técnica para manipular la petición con BurpSuite pero antes vamos a enumerar más la web


Fuzzing de Directorios

Encontramos un GIT expuesto, por lo que procederemos a dumpearlo en local.

Git Dumper

La estructura de archivos es la siguiente:

Credential Hunting

En la siguiente ruta encontramos un archivo llamado master que contiene usuarios y 3 commits de GitHub:

Tenemos 2 usuarios y 3 commits.

Análisis de commits

Info del último commit

Análisis de los archivos

bot.py

Bingo! Obtenemos el BOT_TOKEN

notifyer.py

Hemos obtenido:

Testeo del bot

Al hacer el curl nos devuelve true, lo que nos indica que el bot está activo y es accesible, por lo que lo buscamos en telegram y efectivamente existe:

En la URL vemos el ID del bot, que efectivamente coindice con el inicio del BOT_TOKEN:

Obtener info del bot

El resultado del comando es correcto: "result": [] significa que no hay actualizaciones pendientes para el bot. Esto indica que hasta ahora nadie ha interactuado con él (no se han enviado mensajes de notificación) o que ya se han leído y borrado.

Ahora podemos provocar nosotros mismos que el bot envíe un mensaje.

Basándonos en el código actual de notifier.py (que vimos en el commit, aunque ahora use variables de entorno), el mensaje se construye así:

El campo name se inserta directamente en el mensaje. Si logramos que name sea el resultado de leer un archivo, ese contenido viajará al chat del atacante. Nosotros no vemos ese chat, pero podemos leerlo usando el token del bot, como ya intentamos con getUpdates.


Explotación

Al hacer la siguiente llamada:

Recibimos una clave SSH en el Bot de Telegram:

Guardamos la key e intentamos acceder:

ssh2john nos confirma lo que sospechábamos: la clave no tiene passphrase. El problema es otro: el usuario operator no existe en el servidor o su clave pública no está autorizada.

Análisis del error SSH

El error:

Nos indica que:

  • La clave privada es válida

  • El servidor acepta autenticación por clave pública

  • Pero la clave pública correspondiente no está autorizada para el usuario operator

En los commits vimos dos usuarios relevantes:

  • darkfish92

  • xxpanteraxx

Y en el log de Git aparece repetidamente darkfish92@proton.me.

Es muy probable que el usuario real del sistema coincida con el alias del desarrollador.

Acceso SSH

Probamos con el usuario descubierto en Git:

Y esta vez:

💥 Acceso concedido y leemos la flag 1!

Última actualización