Codify
Last updated
Last updated
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.
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
Revisando el sitio web encontramos un sitio en el que nos explica que se tiene un editor de código para node js.
Revisando encontramos que tiene ciertas limitaciones con algunos módulos de node js
Vemos a continuación el editor de código:
La versión que se hace uso es 3.9.16
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
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
Enumerando los directorios encontraremos una base de datos tickets.db
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.
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
Enumerando los permisos del usuario joshua
podremos ver que este usuario puede ejecutar de manera privilegiada un script
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
Vemos que se ejecuto correctamente y además podemos observar la contraseña en texto plano.
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"
Observamos que obtuvimos la contraseña y podemos escalar privilegios como el usuario root
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 que te lleva a cierta versión
Me encontré con algo interesante donde encontraras varias maneras de bypasear o burlar ciertas condicionales. En nuestro caso lo podemos realizar con *
, vamos a ponerlo a prueba.
Observamos que funciona y para ver la credenciales haremos uso de y asi ver los procesos que se ejecutaron o ejecutan