Battery - TryHackMe
SUMMARY
Debemos encontrar tres banderas. Donde a partir de un escaneo de puertos pude saber que hay un servicio Web y SSH. Luego, realicé una fuerza bruta de directorios, logrando encontrar recursos de una aplicación web como un registro y un login. Además, logre descargar un archivo binario ejecutable, cuyo contenido contenía una lista de posibles usernames válidos. Luego, me percate que el campo username del registro solo permitía 12 caracteres como máximo, logrando realizar un ataque SQL Truncation que me permitió autenticarme en el panel de administración siendo el usuario admin@bank.a . Luego, observe el contenido de archivos sensibles del sistema destino mediante una entidad XML externa en un documento XML de una solicitud POST realizada por una de las secciones de la aplicación web. Luego, para la escalada privielgio vertical, suplante un script en Python, que era ejecutado con los privilegiosdel usuario root, logrando crear una nueva instancia de 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 battery. 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 battery.
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 Web ejecutado en el puerto 80. Además, gracias a un script de Nmap, se puede observar la etiqueta title de la página web que viene por defecto al momento de instalar el programa servidor HTTP.
- 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 codigo de estado HTTP 302 que nos redirigen al recurso admin.php. Además, encontramos otros recursos interesantes con código de estado HTTP 200.
Ahora observaremos los recursos traves de mi navegador web.
Podemos observar que no podemos observar los recursos acc.php y forms.php sin tener los privilegios de administrador. Además, podemos observar que los recursos register.php y admin.php vienen a ser un registro y un formulario HTML o login con el fin de poder crear una cuenta y autenticarnos al login. Además, si accedemos al recurso report a traves del navegador web, se nos descargara el siguiente archivo binario ejecutable.
Podemos observar que, si ejecutamos el archivo binario, nos solicitaran unas credenciales.
Ahora utilizaremos el comando strings sobre el archivo ejecutable con el fin de observar strings legibles para el ser humano dentro del contenido del archivo ejecutable.
Podemos observar en los strings legibles, una lista de usernames que podemos utilizar en el registro del recurso register.php con el fin de saber cuáles pueden ser usernames válidos, que podemos utilizar en la autenticación del login del recurso admin.php.
FASE GANAR ACCESO O EXPLOTACION O HACKING
Podemos observar que hay un límite en el número de caracteres que podemos ingresar en el campo Username del registro, que viene a ser 12 caracteres. Además, si intentamos registrar el usuario admin@bank.a, que viene a ser 11 caracteres, nos aparece un mensaje emergente con cierta recomendación. Por tanto, inferimos que si hay un usuario registrado con el username admin@bank.a.
Ahora probaremos si la aplicación web es vulnerable a un ataque SQL Truncation que consiste en realizar una solicitud HTTP con un valor mayor a 12 caracteres en el parámetro asociado con el campo username con el fin de que si la aplicación web no filtra o valida adecuadamente se produzca un truncamiento por parte de la base de datos sobre el dato ingresado para que tenga una longitud de 12 caracteres, que viene a ser la longitud máxima definida en la columna donde se almacenaran los usernames de los usuarios registrados. Además, el dato que ingresaremos en el campo username para el truncamiento va a ser admin@bank.a#####.
Podemos observar que, con el script en Python, elaborado manualmente, pudimos realizar la solicitud HTTP con las especificaciones indicadas anteriormente y logramos registrar un usuario con el username admin@bank.a#### pero debido a la falla en la configuración(truncamiento) del DBMS, que utiliza la aplicación web, se creara un registro en la base de datos con el username admin@bank.a y contraseña eduardo. De esta manera logramos acceder al portal de administración de la aplicación web, cuyo nombre de dominio debe ser bank.a.
Podemos que la sección command del panel de administración de la aplicación web, presenta un formulario HTML donde los valores que ingresemos en sus dos campos van a ser procesados por una función escrita en JavaScript que realizara una solicitud POST que va a contener en su cuerpo un documento XML. Podemos utilizar esto para interceptar una solicitud HTTP e insertar una entidad XML externa que apunte hacia archivos sensibles del sistema destino con el fin de poder observarlos en el cuerpo de la respuesta HTTP.
Podemos observar que hay dos usuarios locales en el sistema destino que se le han asignado una Shell.
Ahora aprovecharemos que podemos utilizar entidades XML externas para observar el contenido del archivo acc.php correspondiente a la sección Command del panel de administración, ya que a traves de su formulario solo nos permite ejecutar los comandos whoami, e id. Por lo tanto, queremos observar que filtros al lado del servidor se han configurado, y de esa manera crear un payload adecuado para generar una reverse shell. Además, haremos uso de un filtro PHP para observar el contenido del archivo acc.php codificado en base64 con el fin de evitar que el servidor web ejecute su contenido.
Si decodificamos el contenido del archivo acc.php codificado en la respuesta HTTP de la aplicación web, nos toparemos con unas credenciales perteneciente al usuario local cyber. Además, si observamos la lógica del filtro al lado del servidor, nos daremos cuenta de que iba a ser imposible crear un payload adecuado para generar una reverse Shell debido al operador condicional de igualdad estricta.
Ahora, utilizaremos estas credenciales para iniciar sesión en el sistema destino mediante el servidor SSH.
Podemos observar que logramos acceder al sistema destino siendo el usuario root. Además, logramos encontrar la primera bandera en el directorio home del usuario local cyber.
FASE ESCALADA PRIVILEGIOS
Ahora buscaremos vectores de escalada privilegio. Para ello enumeraremos los programas que puede ejecutar el usuario local cyber con los privilegios de otro usuario mediante el comando sudo.
Podemos observar que el usuario puede ejecutar un script en Python con los privilegios del usuarioroot. Además, no tenemos los permisos de escritura, ejecución, edición sobre el script. Pero debido a que ha sido creado en el directorio home del usuario local cyber, si podemos eliminarlo ya que tenemos el permiso de escritura sobre el directorio home. Además, crearemos un script en Python con el nombre de run, que nos generara una nueva instancia de Shell Bash,
De esta manera logramos realizar una escalada privilegio vertical y encontramos las dos banderas restantes.