Debemos encontrar dos banderas.
Donde a partir de un escaneo de puertos pude
saber que hay un servicio Web, SSH. Además, gracias a un script de Nmap, logre
determinar que hay una página web de un sitio web, que contenía el nombre de
dominio asociado al sitio web, y dos páginas web para registrarse y autenticarse.
Luego, accedí a un portal de administración donde encontré la funcionalidad de
cambiar contraseñas, pero debido a que el sitio web no realiza una correcta
verificación en uno de los campos es que pude cambiar las contraseñas del usuario
admin, logrando acceder al portal siendo el usuario admin. Luego, accedí al sistema
destino mediante la vulnerabilidad File Upload. Luego, para la escalada privilegio
horizontal, encontré unas credenciales en uno de los documentos de una base de
datos MongoDB. Luego, para la escalada vertical, aproveche que la variable de
entorno LD_PRELOAD estaba asignada a la configuración env_keep.
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 Road. 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 Road.
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
Road. 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 Apache levantado en el puerto 80.
Además, gracias al script http-tittle obtuvimos el valor de la etiqueta
HTML title de una pagina web alojada en el servidor web.
Un programa servidor SSH levantado en el puerto 22.
Ahora accederemos a la página web a traves del navegador web.
Podemos observar que se trata de un sitio web que esta aun en desarrollo
ya que la mayoría de sus enlaces nos redirigen a la misma pagina web de
inicio del sitio web, pero consta de dos paginas web para registrarse y para
autenticarse a traves de un formulario. Además, logramos encontrar un
nombre de dominio que podría estar asociado a este sitio web o a otro.
Para averiguar esto asociaremos la dirección IP del servidor con este
nombre de dominio en mi archivo /etc/hosts, e ingresamos dominio a
traves del navegador web.
Podemos observar que el nombre de dominio está asociado al mismo sitio
web. Además, si realizamos una enumeración de subdominios sobre el
dominio con Wfuzz, no logramos encontrar ningún subdominio.
Ahora nos registraremos y nos autenticaremos en el login del sitio web.
Podemos observar que accedimos a un portal de administración donde la
mayoría de sus secciones no han sido desarrollado aun ya que, al hacer clic
en ellas, se nos redirige al mismo portal de administración. Además, si
revisamos nuestro perfil, nos encontramos con la funcionalidad de cargar
archivos, pero solo está habilitado para el admin cuyo correo es
admin@[Link]. Además, podemos observar que el portal consta de la
funcionalidad de cambiar contraseñas. Podemos aprovechar esto para
capturar la solicitud HTTP enviada al servidor web al momento de que
queramos renovar la contraseña de nuestra cuenta. Luego, cambiaremos
el correo del campo Username al correo del admin con el fin de que el
servidor web realice el cambio de contraseña para la cuenta admin al
momento de que reciba la solicitud POST modificada.
Podemos observar que logramos modificar la contraseña del usuario
admin debido a que el sitio web no realiza una correcta verificación de si
un usuario tiene los permisos necesarios para modificar la cuenta de otro
usuario. De esta logramos acceder al panel de administración del sitio web
siendo el usuario admin.
Ahora utilizaremos la funcionalidad de cargar archivos habilitada para el
usuario admin, para cargar un archivo PHP que me genere una reverse
Shell. Además, utilizaremos el submódulo Site map del módulo Target de
Burp Suite para poder saber en que directorio se guardara nuestro archivo
PHP.
Podemos observar que en el mapeo del sitio web, nos encontramos con
un directorio que hace referencia a las imágenes en el perfil. Además, si
accedemos a este directorio, nos encontramos con que el listado de
directorio no está habilitado, pero eso no quita el hecho de que estén
nuestros archivos almacenados en este directorio. Por lo que accederemos
directamente a mi archivo PHP a traves de la URL, para ejecutar la reverse
Shell.
De esta manera logramos acceder al sistema destino mediante la
vulnerabilidad File Upload.
Ahora convertiremos nuestra reverse Shell en una Shell más estable e
interactiva con el fin evitar de que se cierre con errores simples. Luego,
buscaremos vectores de escalada privilegio de manera manual en el
sistema de archivos del sistema destino.
Ahora realizaremos una enumeración automatizada con Linpeas sobre el
sistema de archivos del sistema destino con el fin de buscar vectores de
escalada privilegio.
Podemos observar que en uno de los procesos ejecutados en el sistema
destino, nos encontramos con un comando que ejecuta un DBMS
MongoDB con ciertas configuraciones contenidas en un archivo. Además,
observamos que este servidor MongoDB se ejecuta en el puerto por
defecto 27017 y solo admite conexiones locales es decir provenientes del
mismo sistema.
Ahora accederemos al servidor MongoDB con el cliente mongo. Además,
enumeraremos los documentos de las colecciones de las bases de datos
con el fin de encontrar algún vector de escalada de privilegio.
Podemos observar que la base de datos backup presentaba la colección
user donde constaba de 5 documentos que vienen a ser una variable del
tipo diccionario ya que tienen estructuras de pares clave-valor. Además,
uno de los documentos contiene las credenciales de un usuario local en el
sistema destino. De esta manera logramos realizar una escalada privilegio
horizontal.
Ahora realizaremos una enumeración de los programas o comandos que
podemos ejecutar con los privilegios de otro usuario mediante el comando
sudo con el fin de buscar vectores escalada privilegio.
Podemos observar que podemos ejecutar un archivo binario ejecutable
con los privilegios del usuario root. Además, si utilizamos el comando
strings sobre el con el fin de observar cadenas de caracteres legibles de su
contenido, nos topamos con el comando tar con el fin de comprimir todos
los archivos y subdirectorios del directorio /var/www/html en un archivo
tar, que va a ser comprimido con el formato de compresión gzip.
Ahora utilizaremos la vulnerabilidad Wilcard Injection con el fin de crear
dos archivos en el directorio /var/www/html, con nombres particulares
para que sean tomados como parámetros del comando tar al momento de
que quieran comprimirlos, y nos ejecuten una nueva instancia de Shell con
los privilegios de root.
Podemos observar que fallo el intento de explotar la vulnerabilidad
Wilcard Injection ya que los nombres de los archivos que creamos no
fueron reconocidos como parámetros sino como nombres de archivos que
fueron comprimidos en un archivo tar.
Ahora aprovecharemos que en la salida del comando sudo -l, nos dimos
cuenta de que la configuración env_keep apunta a la variable de entorno
LD_PRELOAD que es utilizada para cargar bibliotecas compartidas antes de
ejecutar un comando o programa. Por lo tanto, podemos ejecutar el
archivo binario ejecutable con el comando sudo y con la variable de
entorno LD_PRELOAD para que se carga una biblioteca compartida que me
generara una nueva instancia de Shell con los privilegios de root.
De esta manera logramos realizar una escalada privilegio vertical.
Ahora buscaremos las dos banderas.