Expose - TryHackMe

SUMMARY

Debemos encontrar 2 banderas en la maquina Expose. Donde a partir del escaneo de puertos, pude saber que hay un servidor HTTP, SSH, FTP, DNS y Mosquitto. Luego, realice fuerza bruta de directorios sobre el directorio raíz del servidor web, encontrando una página web que contenía un formulario vulnerable a SQLi, permitiéndome volcar los registros de la bases de datos, llegando a encontrar dos recursos, uno de ellos estaba asociado a un hash que logre crackear con CrackStation, permitiéndome acceder al recurso y explotar la vulnerabilidad LFI, permitiéndome observar el nombre de un usuario local contenido en el archivo passwd y que era la clave para acceder al otro recurso, que presentaba la vulnerabilidad File Upload, logrando cargar un archivo PHP para acceder al sistema destino. Luego, realice una escalada privilegio horizontal a partir de una credencial encontrada en un archivo. Luego, para ser root, utilice el comando find que tenia el bit SUID habilitado.

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

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 exposev6. 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 servicio HTTP o web levantado en el puerto 1337, y el programa servidor web que está corriendo, y la versión del programa servidor. Además, gracias al script http-title se puedo obtener el valor de la etiqueta title de una página web almacenada en el servidor web.
  • Un servicio DNS levantado en el puerto 53, y el programa servidor que está corriendo, y la versión del programa servidor.
  • Un servicio SSH levantado en el puerto 22, y el programa servidor que está corriendo, y la versión del programa servidor.
  • Un servidor FTP levando en el puerto 21, y el programa servidor que está corriendo, y la versión del programa servidor. Además, gracias al script ftp-anon, podemos saber que permite iniciar sesión de manera anónima.
  • Un servidor Mosquitto o servidor de mensajería MQTT con su versión.

Ahora accederemos al servidor FTP mediante una conexión anónima, es decir, sin proveer credenciales.

Podemos observar que no encontramos ningún recurso compartido en el servidor FTP.

Ahora observaremos la página web a través de nuestro navegador web.

Podemos observar que la pagina web solo contiene la etiqueta title con el contenido igual a EXPOSED.

Ahora realizaremos fuerza bruta de directorios con Gobuster sobre el directorio raíz del servidor web.

Podemos observar varios recursos encontrados por la herramienta.

Ahora observaremos los recursos a través de mi navegador web.

Recurso admin:

Podemos observar que viene a ser una pagina web que supuestamente consta de un formulario HTML o login, pero si analizamos su código fuente, no llegamos a encontrar ni una etiqueta HTML form, que es utilizado para crear un formulario que permite a los usuarios ingresar datos que luego pueden enviarse al servidor web para su procesamiento, o un script Javascript para la autenticación de los usuarios.

Recurso admin_101:

Podemos observar que este recurso viene a ser una pagina web y si analizamos su código fuente, nos topamos con un script JavaScript, que desglosaremos a continuación con el fin de entender su funcionamiento.

  • Primero se ha asociado un manejador de eventos al elemento HTML, que tiene el atributo id igual a login, y que viene a ser el botón que presionamos cuando realizamos la autenticación. Además, cuando se dé un clic a ese elemento HTML, se ejecutará una función.
  • Luego, dentro de la función, se ejecutará una solicitud POST hacia el archivo user_login.php para que sea procesada nuestras credenciales ingresadas. Además, esta solicitud POST contendrá el objeto data que va a contener las claves email y passowrd, que van a contener los valores almacenados en los elementos HTML email y password. Además, la solicitud POST va a ser también una solicitud AJAX por lo que no se necesitará recargar o actualizar la pagina web para observar los resultados de la ejecución de la función.
  • Luego, dentro de la función, se ejecutará la función success, donde se imprimirá los pares clave-valor del objeto data recibido en la respuesta HTTP del servidor, y se utilizara la condicionales if and else para comprobar si la clave status, dentro del objeto data, contiene el valor de success u otro.
  • Si tiene el valor de success, se redirige al usuario al recurso chat.php, caso contrario, se emite un mensaje en el naveagdor web del usuario con el valor que tomo la clave status.

Ahora que ya entendemos funcionamiento, procederemos a autenticarnos con unas credenciales cualquiera, con el fin de saber qué valor tomala clave status del objeto data recibido en la respuesta HTTP del servidor web.

Podemos observar la ventana emergente con el mensaje error. Por lo tanto, el valor que toma clave status del objeto data, recibido por en la respuesta del servidor, es error. Además, si utilizamos la herramienta Network integrada en nuestro navegador web, podremos observar el objeto data contenida en la respuesta HTTP del servidor web. Donde podemos observar otra clave llamada messages, cuyo valor viene a ser una consulta SQL. Además, observar que el valor ingresado en el parámetro email se concatena directamente a la consulta SQL que se realiza para la autenticación, por lo tanto, puede ser vulnerable a SQLi.

FASE GANAR ACCESO O EXPLOTACION O HACKING

Ahora, utilizaremos Burp Suite con el fin de capturar la solicitud POST HTTP, y almacenarla como un archivo en mi sistema.

Ahora utilizaremos este archivo con la herramienta sqlmap, e indicando el parámetro email como vulnerable a SQLi.

Podemos observar que la herramienta llego a explotar la vulnerabilidad SQLi, llegando a enumerar las bases de datos gestionadas por el DBMS en el sistema destino.

Ahora volcaremos todos los registros de la base de datos expose, que viene a ser probablemente la utilizada para la autenticación.

Podemos observar que la base de datos expose consta de dos tablas. Donde la tabla user contiene una credencial para autenticarnos en el login encontrado anteriormente. Además, la tabla config, contiene la ruta de dos archivos PHP que parecen estar protegidos por un método de autenticación.

Ahora nos autenticaremos en el login de la página web admin_101.

Podemos observar que se trata de una pagina web que aun esta en desarrollo.

Ahora accederemos a los recursos contenidos en los registros de la tabla config de la base de datos expose.

Recurso Index.php :

Podemos observar que el recurso si constaba de un método de autenticación para acceder a él.

Ahora crackearemos el hash especificado en el registro de la tabla config. Para ello utilizaremos la herramienta en línea CrackStation.

Podemos observar que la herramienta llego a crackear el hash fácilmente.

Ahora observaremos el recurso index.php a través de mi navegador web.

Podemos observar que el recurso viene a ser una página web, cuyo código fuente esconde una pista que nos incita a agregar los parámetros GET file or view al URL de la página web.

Ahora agregaremos el parámetro GET file a la URL de la página web y le asignaremos el valor de /etc/passwd, suponiendo que puede ser un LFI y que nos permita observar el contenido de algún archivo sensible del sistema destino.

Podemos observar que nuestra suposición estuvo en lo correcto. Además, en el contenido de archivo passwd, logramos visualizar un usuario local llamado zeamkish en el sistema destino. Además, el nombre de este usuario local empieza con Z por lo que puede ser la clave para acceder al otro recurso mostrado en uno de los registros de la tabla config.

Ahora accederemos al recurso /upload-cv00101011/index.php a través de mi navegador web.

Podemos observar que luego de autenticarnos exitosamente, nos topamos con una pagina web que nos permite cargar archivos en el servidor web, pero se ha implementado un filtrado al lado del cliente que verifica las extensiones del archivo cargado utilizando una lista blanca que contiene las extensiones jpg y png, es decir, solo permite cargar archivos con esas extensiones.

Ahora que sabemos que es un tipo de filtrado al lado del cliente, es decir que se ejecutara en nuestro navegador web, podemos utilizar Burp Suite para cargar de nuevo la página web con la funcionalidad de cargar archivos, pero sin la función JavaScript, que viene a ser el filtrado, con el fin de cargar un archivo PHP al servidor web destino.

Podemos observar que logramos eliminar el filtrado de la respuesta HTTP enviada por el servidor web con Burp Suite, de esta manera la página web, con la funcionalidad de carga archivos, se cargara en nuestro navegador web sin el filtrado. Además, logramos subir nuestro archivo PHP. Además, si revisamos el código fuente de la página web a que se nos redirige después de cargar nuestro archivo, observaremos la ruta donde se cargó nuestro archivo PHP.

Otra manera que pudimos haber implementado para omitir el filtrado al lado del cliente, es cargando un archivo legitimo con el fin de pasar el filtrado, y luego capturar la solicitud POST con Burp Suite y modificar el nombre del archivo y la etiqueta MIME asignada a la cabecera Content-Type.

Ahora que hemos logrado subir nuestro archivo PHP debemos darle clic para que se ejecute la reverse Shell, pero antes habilitemos el puerto 1500 para que este en modo listening y esperando la conexión entrante.

Podemos observar que logramos obtener acceso al sistema destino siendo el usuario www-data.

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 directorios y archivos del sistema destino.

Podemos observar que llegamos a encontrar credenciales de inicio de sesión en el archivo ssh_creds.txt, y que le pertenecen al usuario local zeamkish.

Ahora iniciaremos sesión con estas credenciales siendo el usuario zeamkish.

Podemos observar que logramos autenticarnos exitosamente, y logramos encontrar la primera bandera.

Ahora debemos buscar un vector de escalada de privilegios con el fin de ser un usuario con privilegios más elevados. Para ello enumeraremos todos los archivos binarios ejecutables que se le han asignado el bit SUID.

Podemos observar que al archivo binario ejecutable find se le asigno el bit SUID, por lo tanto, podemos ejecutar comandos con los privilegios del propietario, que es root, a través de él.

Ahora aprovecharemos de que el comando find consta del argumento -exec que nos permite ejecutar comandos en la misma línea de comandos donde se ejecuta el comando find, por lo tanto, ejecutaremos el archivo binario bash con el parámetro p para obtener una Shell bash con los privilegios de root.

De esta manera realizamos una escalada de privilegios vertical siendo el usuario root.

Ahora buscaremos la ultima flag en el archivo flag.txt

DATO EXTRA

Si pensamos en acceder al sistema destino a traves de la vulnerabilidad log poisining, que consiste en insertar payload malicioso en los registros de acceso del servidor web destino a través de la cabecera HTTP User-Agent con el fin de cuando observemos el contenido del registro de acceso con nuestro payload maliciosos, se ejecute y se genere una webshell que nos permita ejecutar comandos remotos en el sistema operativo del sistema destino, nos toparemos con la sorpresa de que no vamos a poder ya que el usuario www-data, quien ejecuto el servidor web Apache, no tiene los permisos de lectura sobre los registros de acceso ni de error como lo puedes observar en la siguiente imagen.