En este post resolveremos la máquina creada por @takito1812 que fue propuesta en el UPSA CTF 2020.
Es una máquina Linux de nivel sencillo/medio que ha sido bastante entretenida.
La máquina está desplegada en la plataforma TryHackMe por lo que debemos desplegar nuestra instancia. En este caso la IP asignada es: 10.10.217.174.
Comenzaremos realizando un escaneo de puertos para descubrir los servicios desplegados en el servidor.
nmap -sC -sV 10.10.217.174
Encontramos un FTP en el puerto 21, un servidor de correo (SMTP) en el puerto 25, una aplicacion web HTTP corriendo en el puerto 80, una aplicación web HTTPS corriendo en el puerto 443, los puertos 110 y 143 correspondientes al pop3 y el imap del servidor de correo y una base de datos MYSQL en el puerto 3306.
Comenzamos analizando las aplicaciones web. Se esta sirviendo la misma aplicación en el puerto 80 en HTTP que en el 443 por HTTPS.
La página encontrada es estática, sin ningún tipo de formulario. Encontramos un correo electrónico con el dominio de la organización.
Al encontrar un dominio debemos añadirlo a nuestro archivo /etc/host para que resuelva hacia la IP de la máquina a vulnerar. Puede darse el caso de que el dominio tenga un virtualhost en el servidor y encontremos otra aplicación web distinta.
Como primer paso intentaremos localizar directorios o archivos en la aplicación web encontrada mediante un fuzzer web, en este caso se usa ffuf.
ffuf -w /root/Documents/Wordlists/SecLists/Discovery/Web-Content/raft-large-directories.txt -u http://cybox.company/FUZZ
No encontramos nada de utilidad por lo que continuamos enumerando. Al haber encontrado un dominio de la organización decidimos enumerar subdominios que pudieran tener asignado un virtualhost en el servidor web. Para ello utilizaremos ffuf con un diccionario de subdominios e indicándole el tamaño de la respuesta del virtualhost por defecto como filtro.
ffuf -w /root/Documents/Wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u http://cybox.company/ -H "Host: FUZZ.cybox.company" -fs 8513
Hemos encontrado una serie de subdominios. Para poder analizar las aplicaciones servidas en cada uno de ellos debemos añadirlos también a nuestro archivo /etc/host.
register.cybox.company
Aplicación que permite registrar un usuario en el sistema. Obtiene una cuenta de correo y acceso por FTP.
ftp.cybox.company
Un simple cliente FTP para el navegador.
webmail.cybox.company
Un webmail que nos permite acceder con el usuario creado en register.cybox.company
monitor.cybox.company
Una aplicación ad-hoc para el registro de entrada y salida de trabajadores. Permite login y registro.
dev.cybox.company
Lista los archivos del directorio indicando que existe el archivo phpinfo.php que proporciona información del servidor web.
En este punto se analizan las diferentes aplicaciones existentes para encontrar posibles vulnerabilidades.
La web de monitor.cybox.company tiene la típica funcionalidad de olvide la contraseña. Se procede a analizar esta creando una cuenta a través de register.cybox.monitor para utilizar el correo electrónico proporcionado.
Accedemos al webmail con la cuenta registrada y vemos que no se ha recibido ningún mail.
Ahora utilizaremos el correo electrónico del usuario test para crear una cuenta en la web de monitor.cybox.company.
Una vez contamos con la cuenta procedemos a probar la funcionalidad de olvide la contraseña.
Desde el webmail vemos el correo de restablecimiento de la contraseña. Se observa el parametro pasado por GET en el que se indica el correo electrónico para el cambio de contraseña. Como conocemos el email de admin:[email protected] procedemos a intentar realizar el cambio para este usuario.
La aplicación esta mal programada y nos ha permitido modificar la contraseña de una cuenta. Ahora hemos tomado el control de la cuenta de administrador.
Una vez en la cuenta del administrador podemos acceder al panel de administración que parece que esta en construcción.
En el código fuente de esta página vemos que la carga de los estilos CSS se realiza mediante una llamada a un script PHP. Se pasa por GET el parámetro style en el que se indica la hoja de estilos a utilizar.
Esto podría tener una vulnerabilidad LFI ya que parece cargar archivos del sistema. Probamos a cargar un archivo pero parece que se le esta añadiendo la extensión .css al nombre del archivo incluido por lo que no funciona.
Una técnica para saltarse esta restricción es añadir un null byte (%00) al final del nombre del archivo indicando el fin de la cadena y anulando la extensión añadida por el script. Lo probamos logrando incluir un archivo del sistema.
Probamos a incluir alguno de los archivos PHP de la propia pagina web y el código es interpretado por lo que logrando subir o generar algún código PHP de nuestro control podremos conseguir RCE.
Encontramos dos técnicas posibles para lograr esto.
LFI to RCE – Envenenando logs
En esta entrada del blog se explica esta técnica en detalle.
Lo primero que necesitamos es localizar los logs a envenenar y determinar si es posible acceder a ellos desde el LFI. Gracias al phpinfo disponible en dev.cybox.company encontramos la ubicación de los logs del servidor web.
La instalación ha sido realizada con bitnami por lo que consultando su documentación podemos ver que los logs se encuentran en /opt/bitnami/apache2/logs/access_log. Probamos a incluirlos con el LFI obteniendo el contenido.
Como se explica en el post se ha de inyectar el payload PHP en una petición para que aparezca en el archivo de logs. En este caso usaremos el user agent de la petición.
Ahora utilizamos el LFI para incluir el archivo de logs y pasamos el comando a ejecutar a través del parámetro cmd obteniendo RCE.
LFI + phpinfo() to RCE
Esta técnica y el exploit utilizado se encuentran en esta entrada del blog de hackplayers.
Tenemos un LFI y además tenemos acceso al phpinfo por lo que cumplimos los requisitos para hacer uso de esta condición de carrera. Debemos descargar el exploit y realizar una serie de modificaciones.
Se modifica el host de la petición al LFI para que apunte al virtualhost correcto e igual con la que el exploit realiza al phpinfo. También se debe establecer la cookie de sesión ya que el LFI requiere estar autenticado.
Ejecutamos el exploit obteniendo la creación de un fichero PHP con nuestro payload en la carpeta temporal.
Realizamos la petición al LFI para cargar nuestro archivo con el parámetro f indicando el comando a ejecutar.
Una vez tenemos este RCE obtenemos una shell reversa para trabajar en la post-explotación.
En este punto ya podemos conseguir el user.txt.
En uno de los pasos de la enumeración analizamos los ficheros con SUID activado encontrando un fichero sospechoso.
Al acceder a la carpeta donde se encuentra el archivo encontramos el registerlauncher y el register. El binario registerlauncher es el encargado de llamar al código de register.
Este script se encarga de crear un usuario en el sistema.
Analizamos el código en busca de alguna vulnerabilidad que podamos aprovechar para escalar privilegios.
El script crea un usuario con el nombre pasado como parámetro y este se añade al grupo con el mismo nombre. Esto es un fallo ya que podemos crear un usuario con nombre sudo que pertenecera al grupo sudo obteniendo acceso como administrador y consiguiendo la flag de root.
En este CTF participamos @manulqwerty y yo (@ghostpp7) de manera individual logrando un segundo y primer puesto respectivamente.
Leave a Reply