Codify

20240720224910.png

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.

Enumeración

Iniciamos enumerando los puertos abiertos con la herramienta de nmap

Luego de obtener los puertos abiertos procederemos a enumerar los servicios y versiones que se tiene corriendo en los puertos abiertos.

Los puertos que encontramos son el 22, 80 y 3000 que se ejecutan los servicios ssh y http en los dos últimos

Sitio Web

Revisando el sitio web encontramos un sitio en el que nos explica que se tiene un editor de código para node js.

20240721001301.png

Revisando encontramos que tiene ciertas limitaciones con algunos módulos de node js

20240721001338.png

Vemos a continuación el editor de código:

20240721001607.png

Shell - SVC

En este punto intente muchas cosas con los módulos que tenia a disposición, esto porque no lei el acerca de que hacen uso. Esto me enseño a ponerle mas atención. Vemos que hacen uso de vm2arrow-up-right que te lleva a cierta versión

20240721001359.png

La versión que se hace uso es 3.9.16

20240721001414.png

Investigando un poco sobre esta versión encontraremos que es vulnerable y podemos ejecutar comandos.

En siguiente código veremos una muestra de el código que debemos ingresar para ejecutar comandos.

Corremos el código anterior y observamos que efectivamente podemos ejecutar comandos

20240721001533.png

Ahora debemos obtener una revershell y para ello yo use el siguiente comando de bash:

Para luego correr el código nuevamente pero con la revershell y obtendremos una shell como el usuario svc

20240721001742.png

Shell - Joshua

Enumerando los directorios encontraremos una base de datos tickets.db

20240721002940.png

Para poder revisarlo yo me descargue a mi maquina atacante haciendo uso de python: python3 -m http.server 8888, con ello podrás iniciar un servidor web y descargártelo sin problemas.

Luego de descargártelo podremos acceder a la base de datos con sqlite3 y ver las tablas que se tiene.

20240721003002.png

La tabla que me llamo la atención fue users y efectivamente tenia credenciales del usuario joshua. La credencial que encontramos esta encriptada y para obtener en texto plano haremos uso de john the ripper.

Luego de crackear la password obtendremos las siguientes credenciales:

Y haciendo uso de estas credenciales podremos inicar sesión como el usuario joshua

20240721003058.png

Shell - Root

Enumerando los permisos del usuario joshua podremos ver que este usuario puede ejecutar de manera privilegiada un script

20240721003147.png

El script que puede ejecutar es el siguiente:

El contenido de dicho script es :

Al parecer este script hace una copia de la base de datos, pero para ello se necesita la contraseña del usario root.

Investigando un poco acerca de como poder bypassear la parte de la condicional

Me encontré con algo interesante Bash Pïtfallsarrow-up-right donde encontraras varias maneras de bypasear o burlar ciertas condicionales. En nuestro caso lo podemos realizar con *, vamos a ponerlo a prueba.

20240721022139.png

Observamos que funciona y para ver la credenciales haremos uso de pspy32arrow-up-right y asi ver los procesos que se ejecutaron o ejecutan

20240721022225.png

Vemos que se ejecuto correctamente y además podemos observar la contraseña en texto plano.

Brute Force

Tenemos otra opción para poder obtener la contraseña en texto plano y la verdad me gusta mas, para ello me hice una copia del script con las líneas de comparaciones de credenciales en mi maquina atacante.

Teniendo este script fue escribir un script que me ejecutara teniendo en cuenta que $DB_PASS == $USER_PASS si yo ingreso p* debería de obtener Password confirmed! como salida y si es otra letra Password confirmation failed!, pero esto no nos ayuda mucho y en lo que debemos de prestar mas atención es en el estado de ejecución.

Vemos que luego de imprimir Password confirmation failed! tenemos un status 1, por lo que nos ayudaremos de esto para nuestro script.

Luego de que nuestro script funciona en local pasamos a la maquina victima, antes cambiando el comando a ejecutar command = f"echo '{password}{w}*' | ./test.sh" a command = f"echo '{password}{w}*' | sudo /opt/scripts/mysql-backup.sh"

20240721022426.png

Observamos que obtuvimos la contraseña y podemos escalar privilegios como el usuario root

20240721022501.png

Last updated