Flasky DockerLabs (Intermediate)
Contexto de la maquina
Trayectoria Flasky

Descripción
Flasky es una máquina basada en Linux que expone una aplicación web desarrollada en Python con Flask. El reto combina vulnerabilidades en la gestión de sesiones web con configuraciones inseguras a nivel de sistema, permitiendo encadenar múltiples fallos hasta obtener acceso como root.
El ataque comienza con la manipulación de cookies de sesión firmadas, seguido de acceso SSH con credenciales expuestas y varias escaladas de privilegios mediante configuraciones incorrectas de sudo.
Objetivo del reto
Comprometer completamente la máquina obteniendo:
Acceso inicial mediante la aplicación web
Acceso al sistema vía SSH
Escalada de privilegios hasta root
Recuperación de las flags (
user.txtyroot.txt)
Tipo de máquina
Web + Linux
Escalada de privilegios local
Gestión de sesiones insegura
Habilidades y técnicas evaluadas
Enumeración de servicios
Análisis de aplicaciones Flask
Manipulación y cracking de cookies firmadas
Uso de herramientas como
flask-unsignAcceso SSH con credenciales obtenidas
Escalada de privilegios mediante
sudoExplotación de wildcard en rutas
Abuso de binarios con permisos elevados
Análisis de vulnerabilidades





Instalación
Cuando obtenemos el .zip nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.
Nos lo descomprimira y despues montamos la maquina de la siguiente forma.
Respuesta:
Por lo que cuando terminemos de hackearla, le damos a Ctrl+C y nos eliminara la maquina para que no se queden archivos basura.
Escaneo de puertos
Respuesta:
Observamos que hay dos puertos abiertos:
22/tcp → Servicio SSH
5000/tcp → Servicio HTTP servido por Werkzeug (Python)
El puerto 5000 es especialmente interesante, ya que comúnmente se utiliza en aplicaciones desarrolladas con Flask, por lo que probablemente estemos ante una aplicación web en Python.
Accedemos al servicio web:
Respuesta:

Nos encontramos con un panel de login aparentemente sencillo. Sin embargo, también existe la opción “INITIALIZE NEW USER”, que nos permite registrar un nuevo usuario introduciendo credenciales básicas (usuario:password).
Tras registrar un usuario e iniciar sesión, accedemos al panel:

Aquí podemos ver información de nuestro usuario, incluyendo que tenemos el rol USER. Nuestro objetivo será escalar privilegios hasta obtener un rol con mayores permisos, como ADMIN.
Escalate user peter
Crack / Manipulación de Cookie

Tras realizar varias pruebas, una idea interesante es analizar la cookie de sesión, ya que muchas aplicaciones Flask utilizan cookies firmadas para almacenar información del usuario.
Decidimos decodificar la cookie para entender su estructura interna.
decodeTOKEN.py
Ejecutamos el script:
Info:
Esto confirma que la cookie contiene un payload serializado (JSON) con información del usuario, incluyendo el campo profile.
Una vez identificada la estructura, intentamos modificar el valor de profile a admin y reutilizar la cookie. Sin embargo, esto no funciona debido a que la cookie está firmada criptográficamente, por lo que cualquier modificación invalida la firma.
Fuerza bruta del secreto de firma
Para resolver esto, utilizamos la herramienta flask-unsign, que permite:
Decodificar cookies Flask
Realizar fuerza bruta sobre la clave secreta
Firmar nuevas cookies válidas
Instalamos la herramienta:
Una vez instalada, utilizamos nuestra cookie de sesión original como entrada y le proporcionamos una wordlist (por ejemplo rockyou.txt) para intentar descubrir la clave secreta con la que está firmada.
Respuesta:
Tras varios intentos, la herramienta consigue recuperar la clave secreta utilizada para firmar la cookie:
Conociendo esta clave, ya es posible generar una cookie válida manipulada, en este caso suplantando al usuario con rol admin.
Respuesta:
A continuación, sustituimos el valor de la cookie en el navegador (desde las herramientas de desarrollador, pestaña Storage → Cookies, campo session):

Una vez modificada, recargamos la página:

Observamos que la manipulación ha sido exitosa, ya que ahora disponemos de privilegios de administrador. Esto nos permite acceder a información sensible, entre ella las credenciales del usuario peter para acceso por SSH.

SSH (peter)
Metemos como contraseña e6okFUI4...
Accedemos correctamente al sistema como el usuario peter, por lo que leeremos la flag del usuario.
user.txt
Escalate user pan

Si hacemos sudo -l veremos lo siguiente:
Esto indica que el usuario peter puede ejecutar como el usuario pan cualquier archivo dentro de /home/pan/ utilizando bash, sin necesidad de contraseña.
Un detalle crítico aquí es el uso del comodín (*), ya que permite expandir rutas de forma amplia. Esto incluye no solo archivos dentro del directorio, sino también referencias relativas como . y ...
Aprovechando esto, podemos realizar un path traversal para escapar del directorio /home/pan y ejecutar un script arbitrario desde otra ubicación, como /tmp.
Primero, creamos un script que nos proporcione una shell:
A continuación, lo ejecutamos aprovechando el wildcard y la ruta relativa:
Respuesta:
Con esto conseguimos escalar correctamente al usuario pan.
Escalate privileges

Si hacemos sudo -l veremos lo siguiente:
Este comportamiento no es normal, por lo que es probable que se esté manipulando el comando sudo mediante configuración del entorno, típicamente a través de .bashrc.
Comprobamos el contenido del archivo:
Respuesta:
Aquí se está redefiniendo la función sudo para inutilizarla, lo cual impide su uso normal.
Bypass del bloqueo de sudo
Dado que no disponemos de editores como nano, utilizamos sed para comentar las líneas que implementan esta restricción:
Verificamos que el contenido ha sido correctamente comentado:
Ahora eliminamos la función sudo cargada en memoria:
Al ejecutar nuevamente sudo -l, obtenemos el comportamiento esperado:
Abuso de sudo sobre mv
mv
Observamos que podemos ejecutar el binario mv como root sin contraseña. Esto es crítico, ya que mv permite sobrescribir archivos del sistema.
Primero, inspeccionamos el archivo /etc/passwd:
Respuesta:
El campo x indica que la contraseña está almacenada en /etc/shadow. Si eliminamos este valor, el usuario root quedará sin contraseña.
Modificación de /etc/passwd
/etc/passwdCreamos una copia modificada del archivo en /tmp, eliminando la x del usuario root:
(Se mantiene el resto del contenido igual)
Una vez creado, sobrescribimos el archivo original utilizando mv con privilegios de root:
Verificamos el cambio:
Respuesta:
Ahora la entrada de root aparece sin contraseña:
Escalada a root
Finalmente, accedemos como root sin necesidad de contraseña:
Respuesta:
Con esto obtenemos acceso completo al sistema como root, por lo que leeremos la flag del mismo.
root.txt
Last updated