Codify es una sencilla máquina Linux que cuenta con una aplicación web que permite a los usuarios probar el código Node.js. La aplicación utiliza una biblioteca vm2 vulnerable, que se aprovecha para obtener la ejecución remota de código. Al enumerar el objetivo se revela una base de datos SQLite que contiene un hash que, una vez descifrado, otorga acceso SSH al equipo. Finalmente, se puede ejecutar un script Bash vulnerable con privilegios elevados para revelar la contraseña del usuario root, lo que genera acceso privilegiado a la máquina.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Codify. Este resultado lo almacenaremos en un archivo llamado allPorts.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache, un framework de Node.js y el servicio de SSH.
Transformaremos el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts.
Initial Foothold
Web Enumeration
Accederemos a y verificaremos que se trate de una aplicación web que permite probar código Node.js sin necesidad de ninguna configuración o instalación. Esta aplicación web utiliza por detrás una sandbox para ejecutar el código en un entorno seguro y protegido, sin ningún acceso al sistema subyacente.
Realizaremos una enumeración de directorios y páginas web a través de dirsearch. Nos devuelve el siguiente resultado.
Al acceder a , nos encontramos con una página en la cual podemos inyectar el código Node.js y al darle a la opción de Run se nos mostrará el resultado en la zona derecha.
Revisando la página web , nos encontramos con la siguiente información.
Sandbox Escape in vm2@3.9.16 - Command Injection (Remote Code Execution)
Al hacer hovering sobre el hipervínculo de vm2, se nos indica lo que parece ser la versión exacta que utiliza la página web de Codify.
Realizando una búsqueda por Internet de posibles vulnerabilidades de la biblioteca vm2, nos encontramos con el siguiente repositorio de GitHub.
En el repositorio de GitHub, se nos proporciona un PoC para realizar la explotación de la vulnerabilidad y poder escapar del Sandbox de la aplicación web de Codify. En este caso, lo que realizará es mostrar el resultado del binario /usr/bin/id.
Al inyectar el siguiente código malicioso y darle a la opción de Run, comprobamos que en el resultado que nos muestra el servidor, nos aparece el resultado de la ejecución del comando echo /usr/bin/id. Con lo cual, parece ser que podemos llegar a inyectar comandos y lograr finalmente unRemote Code Execution, además comprobamos que el usuario que ha ejecutado el comando es svc.
Teniendo esto presente, el siguiente paso será lograr obtener acceso al sistema. Con lo cual, con la herramienta de nc nos pondremos en escucha para recibir la Reverse Shell.
En Codify, inyectaremos el siguiente código malicioso que nos permitirá ejecutar la Reverse Shell.
Verificamos que hemos conseguido el acceso a la máquina víctima con el usuario svc.
Information Leakage
Revisaremos los grupos a os que formamos parte a través del usuario svc, por otro lado, intentamos comprobar si disponemos de permisos de sudoers pero nos requiere proporcionar credenciales que no disponemos.
Revisamos el archivo /etc/passwd y comprobamos los usuarios del sistema que disponen de bash.
Enumerando el directorio de /var/www/contact nos encontramos con el archivo tickets.db de una base de datos de SQLite. Al analizar el archivo, comprobamos que se nos muestran las credenciales del usuario joshua.
Intentaremos crackear el hash obtenido a través de hashcaty finalmente logramos obtener las credenciales en texto plano.
Dado que el servicio de SSH se encuentra expuesto, nos conectaremos directamente al equipo y finalmente logramos visualizar la flag de user.txt.
Privilege Escalation
Abusing sudoers privilege
Revisaremos los grupos que forma parte este nuevo usuario que disponemos pero comprobamos que no dispone de ningún grupo interesante.
Al revisar los permisos de sudoers nos encontramos que podemos ejecutar como usuario sudo el script localizado en /opt/scripts/mysql-backup.sh.
mysql-backup.sh Script Vulnerabilities
Revisaremos el contenido del script mysql-backup.sh.
Este script en Bash realiza las siguientes acciones.
Tratamos de ejecutar el script para verificar el funcionamiento, pero nos pide proporcionar las credenciales del usuario root del MySQL.
Bypass + Monitor (Pspy)
El script original verifica la contraseña de MySQL con la siguiente condición en Bash:
Sin embargo, esta validación puede ser vulnerable a un bypass cuando se utiliza el carácter * en la variable DB_PASS. En Bash, el * es un comodín que coincide con cualquier valor, lo que hace que la comparación del if siempre sea verdadera, independientemente del valor de la contraseña ingresada.
Por ejemplo, si un atacante inserta * en la variable USER_PASS, la condición if se evaluará como verdadera, permitiendo el bypass de la verificación.
Posible Exposición de Contraseña a través de Procesos
Tras realizar el bypass, un atacante podría intentar observar los procesos en ejecución para obtener las credenciales. Si el script está interactuando con la base de datos o realizando operaciones donde la contraseña esté presente en los parámetros o el entorno del proceso, es posible que la contraseña se pueda ver revisando los procesos del sistema como Pspy.
En este caso, intentamos realizar el Bypass descrito y verificamos que logramos ejecutar el script correctamente ingresando * como credenciales.
En nuestro equipo loca, deberemos de compartir el binario de pspy64.
En el equipo víctima, nos descargaremos pspy64y le daremos los permisos correspondientes.
Ejecutaremos en una terminal el pspy64 para analizar todos los procesos que se vayan ejecutando a tiempo real.
Ejecutaremos el script comosudo desde otra terminal distinta(nos conectamos con otra terminal con el usuario joshua).
Después de ejecutar 2-3 veces el script, verificamos que la herramienta de pspy64 logra obtener el proceso de acceder al MySQL con las credenciales que se encuentran en /root/.creds
Intentamos revisar si estas credenciales se reutilizan para el usuario root, logramos convertirnos y visualizar la flag de root.txt.