Nos encontramos con un servidor HTTP corriendo en el puerto 5000 sobre Werkzeug 3.0.1 y Python 3.12.3, del escaneo nada más salta a la vista, así que vamos a echarle un vistazo a la página web. Nos encontramos con un formulario de registro que pide los siguientes campos: nombre, cumpleaños, email y teléfono.
El único campo que hace algún cambio relevante es el de nombre, al clicar en Save te redirige a /greet, donde leemos un mensaje que lee Hola nombre que hemos puesto en el campo! Con esta información lo que podríamos probar es distintos payloads de XSS o SQLi, mientras tanto dejaré fuzzing trabajando a ver si encuentra alguna ruta interesante.
Explotación
XSS
Con tan solo probar el segundo payload ya vemos que el formulario es efectivamente vulnerable a XSS, al probar esto <script>alert(1)</script> en el campo del nombre, nos salta una alerta del navegador, confirmando la vulnerabilidad. Además, el FFUF ha dado con la ruta /console, pero al tratar de acceder a ella nos solicita un PIN que no tenemos.
SSTI
Después de leer y probar un rato distintas cosas con XSS, finalmente obtengo un error probando payloads de SSTI. Hago las pruebas correspondientes siguiendo las instrucciones de PayLoadsAllTheThings:
Ponemos en el input que sospechamos vulnerable un payload comodín que hace saltar un error en la mayoría de ocasiones en casi cualquier template engine. ${{>%[%'"}}%\.
Probamos distintos payloads con el fin de obtener el template engine que está corriendo en el servidor web, en este caso, ya con el primer payload {{7*7}} sabemos que es Jinja2
Con esa información en mente, podemos, con esta línea, ejecutar un comando a nivel de sistema {{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}
Una vez esa línea nos devuelve el siguiente output Hello uid=1001(pinguinazo) gid=1001(pinguinazo) groups=1001(pinguinazo),100(users) ! podemos ir a por la reverse shell introduciendo este payload:
Post explotación
Escalada de privilegios
Al lanzar sudo -l, vemos que el usuario puede ejecutar el binario java con permisos root
Ya que en GTFObins no encuentro nada, voy directo a RevShells, de donde saco una reverse shell de java. Desde mi máquina levanto un servidor HTTP con python3 -m http.sever y con curl lo descargo desde la otra revshell activa, una vez la shell esta instalada, me pongo en escucha en una nueva terminal y ejecuto el comando como root: sudo /usr/bin/java rev.java, cuando tabulo hacia mi otra consola, veo que ya soy root.
pinguinazo@29a22f0dc193:~/flask_ssti_lab$ sudo -l
sudo -l
Matching Defaults entries for pinguinazo on 29a22f0dc193:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
use_pty
User pinguinazo may run the following commands on 29a22f0dc193:
(ALL) NOPASSWD: /usr/bin/java