Ir al contenido

JinjaCare

Autor
Santiago Chavarro

Jinjacare is a web app for managing COVID-19 vaccination records, allowing users to view history and generate digital certificates. You’re invited to identify security vulnerabilities in the system and retrieve the hidden flag from the application.

En primera instancia tenemos la pagina web anterior encontré tres subdirectorios, pero de estos solo en dos creo que se pueda hacer algo debido a que nos permite ingresar datos.

Certificados
#

En esta pagina intente hacer varias cosas básicas como un XSS o un SSTI tomando como base el nombre del reto y la descripción que me indican que esta usando Jinja. Pero nada de esto sirvio.

Login
#

Acá trate de crear una cuenta con el nombre siendo algún one-liner que mostrara si había un SSTI pero la pagina decía que solo aceptaba letras y espacios para el nombre por lo cual no me permitía usar ninguno. Por lo que cree la cuenta de manera normal para averiguar a que funcionabilidades podía acceder.

Crear certificado
#

Lo primero que vemos cuando iniciamos sesión vemos que podemos descargar un pdf con el certificado de vacunación del usuario, acá claramente se ve la posibilidad de que haya un SSTI por la template que usa para el certificado.

Modificar información
#

Acá podemos modificar la información personal, por lo que si esta usando una template y en ella imprime el nombre podemos probar a ver si hay un SSTI con ese parámetro, por lo que lo modifique haciendo que de nombre tenga {{2+2}} y en el momento de descargar el nuevo pdf vemos que esta haciendo la operación:

Con esto confirmamos la vulnerabilidad por lo que voy a listar una clase que nos permitirá ejecutar comandos remotamente con el siguiente comando:

{% for c in ''.__class__.__mro__[1].__subclasses__() %}  
	{% if 'Popen' in c.__name__ %}  
		{{ loop.index0 }} - {{ c }}  
	{% endif %}  
{% endfor %}

Con esto puedo confirmar que tengo acceso a la clase popen y podre usar el siguiente one-liner para ejecutar comandos y de esa forma hallar la flag:

{{ cycler.__init__.__globals__.os.popen('id').read() }}

Con esto nos damos cuenta que somos root, por lo que tenemos acceso a todo el sistema, si listamos el directorio raíz con el siguiente comando veremos la flag:

{{ cycler.__init__.__globals__.os.popen('ls /').read() }}

Y finalmente podemos leer la flag con:

{{ cycler.__init__.__globals__.os.popen('cat /flag.txt').read() }}

Referencias
#