Codify

Publicado: 15 de Mayo de 2025 Autor: Josรฉ Miguel Romero aKa x3m1Sec Dificultad: โญ Easy
๐ Descripciรณn
Codify es una mรกquina Linux de dificultad fรกcil que aloja una aplicaciรณn web que permite a los usuarios ejecutar cรณdigo Node.js en un entorno sandbox. La vulnerabilidad principal se encuentra en la versiรณn desactualizada de la librerรญa vm2 (v3.9.16) utilizada para implementar el sandbox, la cual permite escapar de las restricciones y ejecutar comandos en el sistema operativo subyacente. La escalada de privilegios se logra aprovechando un script de backup de MySQL al que el usuario comprometido tiene acceso sudo, explotando una vulnerabilidad en la validaciรณn de contraseรฑas que permite obtener credenciales de root.
Este laboratorio presenta un recorrido educativo sobre vulnerabilidades en ambientes sandbox, explotaciรณn de aplicaciones web Node.js y tรฉcnicas de escalada de privilegios en sistemas Linux a travรฉs de scripts con validaciones insuficientes.
๐ญ Reconocimiento
Ping para verificaciรณn en base a TTL
๐ก Nota: El TTL cercano a 64 sugiere que probablemente sea una mรกquina Linux.
Escaneo de puertos
Enumeraciรณn de servicios
โ ๏ธ Importante: Detectamos durante la fase de enumeraciรณn con nmap que se estรก realizando virtual hosting. Debemos aรฑadir el siguiente vhost a nuestro fichero /etc/hosts
๐ Enumeraciรณn Web
80 HTTP
http://codify.htb/

Enontramos una aplicaciรณn que permite probar Node.js dentro de un sanbox:

Aunque una secciรณn ya nos avisa de que hay algunas limitaciones:

Tambiรฉn enumeramos la librerรญa que estรกn empleando para crear el sandbox:

Usamos el siguiente payload para intentar escapar del sandbox
Pero nos encontramos con una de las limitaciones:

Volviendo a la versiรณn de la librerรญa vm2 que se estรก utilizando para el sandbox: https://gist.github.com/leesh3288/381b230b04936dd4d74aaf90cc8bb244
๐ป Explotaciรณn
Existe una vulnerabilidad en la desinfecciรณn de excepciones de vm2 para versiones hasta 3.9.16, que permite a los atacantes generar una excepciรณn de host no desinfectada dentro de handleException() que se puede usar para escapar del entorno protegido y ejecutar cรณdigo arbitrario en el contexto del host.
Usaremos el siguiente exploit https://www.exploit-db.com/exploits/51898
Verificamos que la PoC funciona correctamente:

Si reemplazamos el comando por una shell basada en FIFO:
Iniciamos previamente el listener en nuestro host de ataque:
Ganamos acceso a la mรกquina:

Mejora de la shell
Foothold
Enumerando la mรกquina encontramos un fichero de base de datos que contiene un hash de tipo bcrypt del usuario joshua:

Confirmamos que es un hash de tipo bcrypt:

Intentamos crackearlo usando hashcat y rockyou
Obtenemos con รฉxito la contraseรฑa spongebob1 para el usuario joshua.

Nos autenticamos como joshua en el host comprometido y obtenemos la flag:
๐ Escalada de privilegios
Verificamos ahora si joshua puede ejecutar algรบn comando, script o binario como root:
Echamos un ojo al contenido del script
Vemos que el script lo que hace es crear una copia de seguridad de la base de datos, para ello define el usuario que va a utilizar para la conexiรณn (en este caso root) y lee la contraseรฑa del directorio /root/.creds.
A continuaciรณn pide una contraseรฑa al usuario y la compara con la la que hay almacenada en el directorio /root/.creds. SI es correcta crea un archivo llamado mysql directorio en /var/backups/
A continuaciรณn se conecta a la base de datos y crea un backup para cada una de las bases de datos.
Lo mรกs relevante de este script y por donde puede venir nuestro vector de ataque, es que no se estรก sanitizando el parรกmetro DB_PASS introducido por el usuario, simplemente se realiza una comparaciรณn y en caso de no ser iguales sale del script, pero y si buscamos la forma de que no se evalรบe esa condiciรณn, por ejemplo mediante la introducciรณn de algรบn carรกcter especial como: * ? [ podremos hacer que rompa la condiciรณn y el script continรบe y se complete realizando el backup:
En este caso introducimos un wildcard o asterisco como contraseรฑa y vemos que logramos eludir la comprobaciรณn de la contraseรฑa y crear el backup
Nuestro รฉxito es efรญmero ya que descubrimos que el usuario joshua no tiene permisos para leer el contenido de /var/backups/mysql

Otra cosa que podrรญamos hacer es que una vez que ya ha pasado la validaciรณn y usa la variable DB_PASS para conectarse a la base de datos, intentar ver su valor. Para ello podrรญamos usar la herramienta pspy:
Descargamos el binario
Lo transferimos al host comprometido
A continuaciรณn lo ejecutamos

A continuaciรณn desde la otra terminal lanzamos el script volviendo a introducir como contraseรฑa el carรกcter especial * :
Y en la terminal de pspy deberemos ver el contenido de la variable DB_PASS

Verificamos que estรก reutilizando la contraseรฑa para el usuario root de la mรกquina y capturamos la flag:
Last updated