Overpass - TryHackMe
SUMMARY
Debemos encontrar dos banderas en la maquina Overpass. Donde a partir del escaneo de puertos con Nmap pude saber que hay un servidor SSH y un servidor web local que ha sido levantado utilizando el intérprete Goland. Además, con un script de Nmap supe que había una página web, que pertenecía a una aplicación web. Luego, realice fuerza bruta de directorios con Wfuzz sobre el directorio raíz del servidor web, encontrando un login, y un archivo JavaScript, utilizado para establecer las cookies de sesión, y que presentaba una debilidad en su código, logrando crear una cookie de sesión para omitir la autenticación del login. Luego, me encontré con una clave privada SSH encriptada, que logre crackear con JohnThe Ripper, luego inicie sesión en el sistema destino mediante la clave privada y siendo el usuario james. Luego, para la escalada privilegios vertical encontré dos maneras, explotando la vulnerabilidad Baron Samedit o a traves de una tarea cron ejecutada por root.
FASE RECONOCIMIENTO ACTIVO
En este caso debemos acceder al sistema destino y obtener las banderas. Para ello empezaremos utilizando el comando openvpn con el fin de establecer una conexión VPN con la red virtual dónde está la máquina Overpass 1. Para ello utilizaremos el archivo de configuración, que lo podemos descargar en la plataforma de Tryhackme, que puede incluir información como la dirección del servidor VPN, los certificados y claves de seguridad, la configuración de encriptación, etc.
Luego de que se establece la conexión VPN se crea una interfaz virtual de red en nuestra máquina. Donde se enruta todo el tráfico de red a través de esa interfaz.
Además, la plataforma de Tryhackme nos muestra la dirección ip de la máquina Overpass 1.
FASE ESCANEO Y ENUMERACION
Luego pasaremos a la fase de Escaneo y Enumeración con el fin de poder escanear los puertos del nodo. Además, obtendremos los servicios que se han levantado en los puertos abiertos, las versiones de los servicios, y el sistema operativo de la máquina Overpass 1. Para ello utilizaremos Nmap
. Donde le pasaremos los siguientes parámetros:
- El parámetro -sC o –script=”default” para utilizar todos los scripts de la categoría default con el fin de realizar un escaneo y detección de los puertos de manera avanzada.
- El parámetros -sV con el fin de conocer las versiones de los servicios levantados en los puertos abiertos.
- El parámetro -n para evitar la resolución DNS, y el parámetro –max-rate para indicarle el número máximo de paquetes por segundo que va a utilizar Nmap para el escaneo con el fin de evitar sobrecargar la red con el tráfico generado por la herramienta.
- El parámetro -p- para realizar un escaneo de los 65535 puertos del nodo y el parámetro –open con el fin de que nos muestre información solo de los puertos abiertos.
Los resultados que obtuvimos del escaneo vienen a ser:
- Un servidor web levantado en el puerto 80, y que ha sido levantado utilizando el lenguaje de programación Golang. Además, a partir del script http-title, se puedo saber que hay una pagina web con la etiqueta title igual a Overpass.
- Un servicio SSH levantado en el puerto 22, y el programa servidor web que esta corriendo, y la versión del programa servidor.
Ahora accederemos a la página web desde mi navegador web.
Podemos observar que se trata de una aplicacion web, almacenado en el servidor web.
Ahora realizaremos fuerza bruta de directorios con Gobuster sobre el directorio raíz del servidor web con el fin de encontrar mas recursos escondidos sobre la aplicacion web.
Podemos observar que llegamos a observar un recurso llamado admin, y varios archivos JavaScript, que probablemente son utilizados para la creación de la aplicación web o implementar alguna interactividad en ella.
Ahora accederemos al recurso admin a través de mi navegador web.
Podemos observar que el recurso admin se trata de una pagina web que consta de un formulario. Además, si observamos el código fuente de la pagina web, nos podemos encontrar con etiquetas script con el fin de añadir archivos JavaScript, que encontramos anteriormente. Esto nos da a suponer que el proceso de autenticación ha sido elaborado utilizando código Javascript.
Ahora analizaremos los archivos Javascript.
main.js:
Podemos observar que este archivo JavaScript solo contiene la función console.log con el fin de imprimir el mensaje “Hello , Wolrd!” a través del navegador web.
cookie.js:
Podemos observar que el archivo javascript esta comprimido y ofuscado. Además, define una biblioteca llamada js-cookie, que es utilizada para gestionar y configurar cookies de sesión en una aplicación web.
login.js:
Podemos observar que este archivo JavaScript, contiene la función login, que va a ser utilizada en la autenticación y para establecer las cookies de sesión en la aplicación web.
Ahora desglosaremos los comandos de la función login con el fin de entender los procesos back-end que se llevan a cabo durante el método de autenticación y establecimiento de las cookies de sesión.
- Primero se utiliza la función querySelector para seleccionar los campos o parámetros username,password, loginStatus del formulario HTML o login, y almacenarlos en las variables usernameBox, passwordBox, loginStatus.
- Luego, se crea un objeto llamado creds, que almacenaran los valores, digitado por el usuario, de los parámetros o campos username y password.
- Luego, se invoca a la función postData, que va a utilizar la función fetch para realizar una solicitud POST con los parametros username y password y sus respectivos valores. Además, esta función devuelve el valor la respuesta HTTP, y se almacena en la variable response.
- Luego, se utiliza el método text sobre la variable response para obtener el cuerpo o body de la respuesta HTTP, y almacenarla en la variable StatusOrCookie.
- Luego, se utiliza las condicionales if y else para verificar si el cuerpo de la respuesta HTTP es igual al mensaje Incorrect Credentials. Si es así, se modifica el contenido del texto almacenado en el elemento HTML loginStatus por Incorrect Credentials. Pero, si sucede lo contrario, se establecerá una cookie de sesión con el nombre SessionToken y con el valor igual al cuerpo de la respuesta HTTP. Luego, se le redirige al usuario a la ruta admin.
A partir del análisis que hemos hecho, podemos deducir que el establecimiento de las cookies de sesión presenta vulnerabilidades ya que podemos crear una cookie de sesión en nuestro navegador web con el nombre SessionToken y darle cualquier valor menos Incorrect Credentials, y nos permitirá omitir la autenticación.
FASE HACKING O EXPLOTACION O GANAR ACCESO
Ahora utilizaremos las herramientas integradas en nuestro navegador web para establecer la cookie de sesión y omitir la autenticación.
Podemos observar que se llegó a omitir la autenticación, y nos redirigió a la ruta admin, que viene a ser una pagina web que nos muestra el contenido de una clave privada SSH, pero encriptada y que pertenece al usuario james.
Ahora utilizaremos John The Ripper para crackear la clave que protege a esta clave privada SSH.
Podemos observar que la herramienta llego a encontrar la clave que protege a la clave privada SSH.
Ahora iniciaremos sesión en el sistema destino mediante la clave privada SSH siendo el usuario james.
Podemos observar que llegamos acceder al sistema destino siendo el usuario james.
FASE ESCALADA PRIVILEGIOS
Ahora debemos buscar un vector de escalada de privilegios con el fin de ser un usuario con privilegios más elevados. Para ello revisaremos la versión del archivo binario ejecutable sudo con el fin de saber si su versión cae dentro del rango de versiones vulnerables a la vulnerabilidad CVE-2021-3156 o Sudo Baron Samedit.
Podemos observar que la versión de sudo en el sistema destino si caen dentro de las versiones vulnerables, pero para estar seguro utilizaremos los siguientes comandos obtenidas de una PoC (o Prueba de Concepto): https://github.com/lockedbyte/CVE-Exploits/tree/master/CVE-2021-3156
Podemos observar que la versión del sudo si es vulnerable.
Ahora utilizaremos el siguiente exploit https://github.com/blasty/CVE-2021-3156 para explotar la vulnerabilidad y llegar a obtener a una Shell con los privilegios del usuario root.
De esta manera podemos realizar una escalada de privilegios vertical, explotando la vulnerabilidad Sudo Baron Samedit. Otra manera que pudimos haber optado para realizar una escalada privilegios, seria revisando el contenido del archivo crontab del sistema, que esta ubicado en la ruta /etc/crontab.
Podemos observar que el usuario root ha programado una tarea cron. Donde se va a ejecutar el comando curl overpass.thm/downloads/src/buildscript.sh | bash
de manera periódica y con los privilegios del usuario root.
Además, si analizamos la ruta hacia donde se va a realizar una solicitud GET HTTP con el comando, podemos notar que la ruta empieza con un nombre de dominio igual que el nombre de la aplicación web. Además, para que el sistema destino puede realizar solicitudes GET especificando el nombre de dominio de la aplicación web que almacena, debe haber especificado en su archivo /etc/hosts, el nombre de dominio asociado con su dirección localhost.
Ahora, comprobaremos esta suposición.
Podemos verificar que nuestra suposición está en la correcto. Además, al archivo /etc/hosts se le ha asignado el permiso de escritura para los usuarios que no pertenecen al grupo root.
Aprovecharemos esto, para asociar el nombre de dominio overpass.thm con la dirección IP de nuestra maquina con el fin de que la solicitud GET, realizada por el comando curl, sea realizada hacia mi máquina. Donde levantaremos un servidor web local con el módulo http.server de Python sobre un directorio downloads, que crearemos y que contendrá el subdirectorio src, que va contener un script llamado buildscript.sh, y que contendrá un comando que nos generara una reverse Shell.
Ahora solo esperaremos que el sistema destino ejecute el comando de la tarea cron para tener una Shell con los privilegios del usuario root, pero antes habilitaremos el puerto 1500 en nuestro sistema para que este en modo listening y esperando la conexión entrante de la reverse Shell.
De esta manera realizamos otra manera de escalada privilegios vertical.
Ahora buscaremos las banderas en los archivos user.txt y root.txt.