Opacity - TryHackMe

SUMMARY

Debemos encontrar dos banderas en la maquina Opacity2. Donde a partir del escaneo de puertos de Nmap pude saber que hay un servicio HTTP, SSH. Samba. Además, con un script de Nmap que había una página web, que constaba con un login, en el servidor web. Luego, realice fuerza bruta de directorios con Wfuzz para encontrar recursos escondidos en el directorio raíz del servidor web. Luego, me encontré con una aplicación web vulnerable a File Upload y que constaba de un analizador de extensiones, permitiéndome subir un archivo PHP que me genero una reverse shell. Luego, en la escalada de privilegios horizontal me encontré con un archivo cifrado del programa KeePass, logrando crackear su clave mediante John the Ripper, y obteniendo las credenciales del usuario sysadmin. Luego, para la escalada de privilegios vertical descubrí, que un script PHP era ejecutado por el usuario root de manera periódica, mediante el script pspy, y modificando uno de los archivos PHP incluidos en el script PHP, para generar una reverse Shell.

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 Opacity2. 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 Opacity2.

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 Opacity2. 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:

  • Hay un servicio HTTP levantado en el puerto 80, y el programa servidor HTTP que se está corriendo. Además, la versión del programa servidor.
  • Además, se pudo saber que hay una página web almacenado en el servidor web, cuya etiqueta tittle es Login, y consta de un formulario HTML o login.
  • Hay un servicio SSH que se está levantado en el puerto 22, y el programa servidor SSH que se está corriendo. Además, la versión del programa servidor SSH.
  • Hay un servicio Samba levantado en el puerto 139 y 445.

Ahora observaremos la pagina web desde nuestro navegador web.

Podemos observar que el formulario HTML o login no es vulnerable a SQLi, y no podemos omitir la autenticación del formulario.

Ahora realizaremos una fuerza bruta de directorios con Wfuzz sobre el directorio raíz del servidor web con el fin de encontrar recursos escondidos.

Podemos observar que llegamos a encontrar dos recursos escondidos, cuyos códigos HTTP vienen a ser 301.

Ahora accederemos al recurso cloud a través de mi navegador web.

Podemos observar que se trata de una aplicación web que nos permite cargar archivos en el servidor web destino desde una ruta externa al directorio raíz del servidor web. Para ello hemos levantado un servidor web local en nuestro sistema con el módulo http.server de Python. Además, podemos observar que el desarrollador de la aplicación ha configurado un analizador de extensiones para que solo se permita subir imágenes, es decir, archivos con extensión jph, png, gif, etc. Además, si logramos cargar un archivo imagen, se nos mostrara la ruta donde se almaceno la imagen cargada en el servidor web. Además, nos damos cuenta de que después de ciertos segundos se borra la imagen cargada en el servidor web es por ello que nos sale código HTTP 404, si intentamos acceder a la ruta del recurso cargado.

FASE HACKING O EXPLOTACION O GANAR ACCESO

Ahora utilizaremos la siguiente carga útil: http://10.8.123.194/reverse.php#.jpg con el fin de burlar al analizador de extensión de la aplicación web. Para ello es que utilizamos el símbolo # en nuestro payload, con el fin de que la extensión .jpg sea el fragmento de la URL, y no se envié como parte de la solicitud GET HTTP que realiza el servidor web destino hacia mi servidor web local para obtener el archivo PHP. Además, el analizar de extensión va permitir que el servidor web destino realice la solicitud GET HTTP ya que su extensión es jpg.

Podemos observar que llegamos acceder al sistema destino aprovechándonos de la vulnerabilidad File Upload debido a que el analizador de extensiones configurado en la aplicación web no valida adecuadamente la entrada del usuario.

Además, podemos observar que al usuario www-data se le ha configurado para que utilice la Shell nologin cuando inicie sesión en el sistema destino. Esta Shell viene a ser no interactiva e inestable. Por lo tanto, realizaremos un tratamiento de la tty para tener una Shell estable e interactiva.

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 realizaremos una enumeración manual sobre los archivos, cuyo propietario pertenece al grupo primario sysadmin.

Podemos observar un archivo con extensión kdbx, que viene un base de datos encriptada creada por el programa KeePass, que viene a ser un administrador de contraseñas que permite a los usuarios almacenar y organizar de manera segura sus contraseñas y otra información confidencial.

Ahora intentaremos observar el contenido de este archivo usando el programa KeePass, y poder verificar si esta cifrado y protegido por una clave, pero primero levantaremos una servidor web local con el modulo http.server de Python en el sistema destino con el fin de descargarlo en mi sistema.

Podemos observar que nos solicitan una clave para observar el contenido descifrado del archivo.

Ahora utilizaremos el complemento keepass2john de John the Ripper con el fin de extraer el hash de la clave del archivo dataset.dkbx en un formato compatible a John the Ripper. Luego, crackearemos el hash utilizando John the Ripper.

Podemos observar que la herramienta llego a crackear el hash de la clave.

Ahora accederemos al contenido del archivo dataset.kdbx utilizando el programa KeePass.

Podemos observar las credenciales del usuario local sysadmin en el archivo dataset.

Ahora nos autenticaremos con estas credenciales en el sistema destino.

De esta manera realizamos una escalada de privilegios horizontal en el sistema destino siendo el usuario sysadmin.

Ahora debemos buscar otro vector de escalada de privilegios con el fin de ser un usuario con privilegios más elevados. Para ello realizaremos una enumeración manual sobre los archivos del directorio home del usuario sysadmin.

Podemos observar que llegamos a encontrar un script PHP. Donde podemos observar que una parte de su código es utilizado para eliminar archivos del directorio images, y si nos acordamos de nuestra aplicación web que era vulnerable a File Upload, este presentaba el comportamiento de borrar los archivos que íbamos cargando en el directorio images. Por lo tanto, este script viene a ser como una tarea automatizada que se ejecutara de manera periódica cuando carguemos un archivo en la aplicación web.

Ahora debemos averiguar que usuario local esta ejecutando este script de manera periódica. Para ello utilizaremos el script pspy para monitorear los procesos que se ejecutan en tiempo real en el sistema destino. A través de este enlace: https://github.com/DominicBreuker/pspy/releases/tag/v1.2.1 puede obtener el script pspy.

Podemos observar que el usuario root (UID=0) esta ejecutando el script PHP de manera periódica.

Ahora teniendo en cuenta que el script PHP utiliza la función require_once para incluir el archivo backup.inc.php en script. php, es decir, PHP va a ejecutar el archivo backup.inc.php con el fin de que se pueda utilizar todas sus funciones, variables, y clases declaradas dentro del script.php. Además, aprovecharemos de que el archivo backup.inc.php está en el directorio home del usuario local sysadmin, para modificar su contenido por una reverse Shell.

De esta manera realizamos la escalada de privilegios vertical siendo el superusuario root.

Ahora buscaremos las dos banderas contenidas en los archivos proof.txt y local.txt.