Hospital
Última actualización
¿Te fue útil?
Última actualización
¿Te fue útil?
Hospital
es una máquina Windows de dificultad media que aloja un entorno de Active Directory, un servidor web y una instancia de RoundCube
. La aplicación web tiene una vulnerabilidad de carga de archivos que permite la ejecución de código PHP arbitrario, lo que lleva a un shell inverso en la máquina virtual Linux que aloja el servicio. La enumeración del sistema revela un kernel Linux obsoleto que se puede explotar para obtener privilegios de root, a través de [CVE-2023-35001](https://nvd.nist.gov/vuln/detail/CVE-2023-35001)
.
El acceso privilegiado permite leer los hashes de /etc/shadow
y, posteriormente, descifrarlos, lo que genera credenciales para la instancia de RoundCube
. Los correos electrónicos sobre el servicio sugieren el uso de «GhostScript», que expone el objetivo a la explotación a través de «», una vulnerabilidad que se explota creando un archivo Embedded PostScript (EPS) malicioso para lograr la ejecución remota de código en el host de Windows. El acceso al sistema se obtiene de dos formas: utilizando un keylogger para capturar las credenciales de «administrador» o abusando de los permisos «XAMPP» mal configurados.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Hospital.
Lanzaremos una serie de scripts básicos para intentar buscar vulnerabilidades en los puertos que hemos encotrado expuestos.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Verificaremos también a qué tipo de máquina nos enfrentamos a través de netexec.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Comprobamos que se trata de un gestor de correos llamado RoundCube, pero no disponemos de credenciales válidas para acceder.
También hemos visto expuesto el puerto 8080 de un sitio web, en este caso nos aparece la siguiente interfaz para iniciar sesión y registrarnos también.
Procederemos a registrarnos con una cuenta falsa.
Procederemos a iniciar sesión con estas nuevas credenciales que hemos registrado.
El sitio web permite subir archivos, por lo tanto, como también habíamos comprobado que la página interpreta PHP, procederemos a testear a ver si podemos subir un archivo PHP y que interprete el código que le inyectemos.
Crearemos un archivo básico que imprima un "hola".
Interceptaremos la solicitud a través de BurpSuite y FoxyProxy.
Des de BurpSuite comprobaremos que si enviamosla solicitud hace un redirect a una página nombrada "failed.php". Esto parece indicar de que la extensión del archivo no le está gustando y no podemos subir un archivo con extensión PHP
Probaremosde comprobar si con otra extensión que igualmente interprete PHP podemos hacer que el archivo sea subido.
Disponemos de este listado de extensiones PHP que pueden ser interpretadas.
En BurpSuite pasaremos la solicitud al modo Intruder e indicaremos que la extensión "php" sea donde cargaremos el payload. El ataque será de tipo "Sniper"
Cargaremos el listado del payload que queremos establecer de las extensiones PHP
Indicaremos que extraiga el campo de "Location" que es donde nos aparaecía lo de "failed.php".
Lanzaremos el ataque y comprobaremos que existen unas extensiones que si se ha podido subir el archivo sin problemas.
Por otra parte, deberemos de comprobar en que ruta se suben estos archivos, ya que en la solicitud y respuesta no tenemos ninguna pista.
Para ello, utilizaremos gobuster para enumerar directorios del sitio web. Nos encontramos que hay un directorio llamado "uploads".
Otra de las maneras para comprobar el tema de qué extensión nos permite subir a la página web, es haciendo un script en Python3 que realize las mismas acciones que BurpSuite.
Este script probará de subir al sitio web archivos con las extensiones que le hayamos indicado y comprobará si se puede subir o no.
Procederemos de ejecutar el script y comprobaremos de las extensiones que se puden subir sin problemas.
Iremos probando extensiones, algunas de las nos permitía subir el archivo no nos interpretaba el código PHP del archivo.
La extensíón .phar nos interpreta correctamente el código PHP de nuestro archivo subido. Por lo tanto, disponemos de una vía potencial para intentar conseguir un RCE.
Crearemos otro Script para que se encargue de subir únicamente el archivo que tenemos "test.php" y se suba como "test.phar", así nos ahorraremos ir subiendo manualmente cada vez el archivo cada vez que modifiquemos el archivo.
Ya que a partir de ahora, modificaremos "test.php" y ejecutaremos el script y será subido al sitio web..
Modificaremos el contenido de "test.php" y lanzaremos el script.
De esta manera, comprobaremos que se sube correctamente el archivo a través del script de Python.
Modificaremos el archivo "test.php" para tener una ejecución de comandos a través de shell_exec y pasarle nosotros el comando a ejecutar a través de la variable "cmd".
Subiremos el archivo con el script "pharUpload.py".
Comprobaremos que nos funciona el script, esto nos puede indicar que es posible que algunas funciones PHP estén deshabilitadas por seguridad.
Para comprobar que funciones PHP se encuentran deshabilitadas a través de phpinfo().
Procederemos a subir el archivo nuevamente.
Volveremos a acceder a la ruta donde tenemos subido el archivo test.phar y comprobaremos las funcioens que se encuentran deshabilitadas.
Si la función se encuentra habilitada, nos aparecerá el nombre de la función y la palabra "Pwn3d". Subiremos este nuevo archivo a través de pharUpload.py.
Comprobaremos que disponemos de la función popen habilitada, por lo cual, ya tenemos una vía potencial para realizar ejecuciones de comandos a través de esta peligrosa función PHP, para así obtener un RCE.
Modificaremos nuevamente el script "test.php" y a través de la función PHP nombrada "popen" procederemos a realizar que se ejecute el comando "whoami". Subiremos nuevamente nuestro archivo.
Comprobamos que se ha ejecutado correctamente el comando "whoami". Por lo tanto a través de esta función PHP, podemos llegar a obtener un RCE.
Modificaremos el archivo "test.php" para indicar que a través de esta función PHP y la variable "cmd", des de la URL nosotros podamos indicarle el comando a ejecutar, para así no tener que ir modificando el archivo por cada comando que queramos ejecutar.
Subiremos nuestro archivo nuevamente.
Nos pondremos en escucha con nc por el puerto 443.
Le pasaremos el comando para obtener una Reverse Shell des de la variable "cmd" de nuestro archivo subido "test.phar".
Comprobamos que ganamos acceso a la máquina que utiliza el sitio web.
Nos encontramos en una máquina Linux, que parece ser una submáquina del dominio principal, nuestro objetivo será llegar a comprometer el Domain Controller.
Procederemos a través de shred de eliminar el archivo subido "test.phar" para eliminar las pruebas y así dificultar las labores forienses en la recuperación de ese archivo que nos podría incriminar.
Comprobaremos que usuarios diponen de una bash, para así intentar escalar al usuario, ya que somos actualmente "www-data".
Revisando los archivos que se encuentran en /var/www/html nos encontramos un archivo nombrado "config.php" que almacena las credenciales del administrador de la BBDD.
Procederemos a conectarnos a MySQL con las credenciales encontradas.
Revisaremos las tablas y los datos que hay almacenados en la BBDD, y nos encontramos con usuarios y contraseñas hashaedas.
Pero estos usuarios son los que se crean en http://hospital.htb:8080/ al registrarse. Si intentamos crackear las contraseñas no nos servirá para absolutamente nada, por lo tanto descartamos este punto.
Comprobaremos la información sobre la distribución del sistema operativo y los detalles del Kernel y del sistema operativo.
Comprobamos que hemos podido escalar de privilegios de www-data a root.
Como usuario root procederemos a comprobar el archivo /etc/shadow para comprobar los hashes del usuario "root" y del usuario "drwilliams" que son los únicos que disponen de una Bash.
Procederemos con hashcat de crackear los hashes y encontramos la contraseña del usuario "drwilliams".
Podemos comprobar con netexec si las credenciales encontradas son válidas para el dominio.
Ya que disponemos de credenciales válidas, procederemos a enumerar con rpcenum los usuarios válidos del dominio y toda la información importante del dominio.
Ya que disponemos de una lista de usuarios del dominio y unas credenciales válidas de dominio, procedremos a intentar realizar un AS-REP Roasting Attack y Kerberoasting Attack pero no obtenemos el Ticket Granting Ticket (TGT) ni el Ticket Granting Service (TGS).
Verificaremos de acceder con las nuevas credenciales obtenidas del usuario "drwilliams".
Comprobamos que hemos obtenido el acceso al RoundCube con este usuario.
Buscaremos a ver si encontramos algún método de inyectar código malicioso en un archivo .EPS para que sea visualizado en GhostScript.
Comprobaremos el archivo malicioso .EPS que nos ha creado.
Responderemos al correo de drbrown@hospital.htb y le pasaremos el archivo malicioso .EPS que hemos generado con el payload.
Nos pondremos en escucha con nc por el puerto que hemos establecido en la Reverse Shell y comprobamos que al parecer el usuario "drbrown" ha ejecutado el archivo que pare él pensaba que era legítimo pero dentro escondía un payload para otorgarnos una Reverse Shell.
Hemos obtenido una shell de PS.
Ya que tenemos acceso a la terminal, nos otorgaremos una Shell especial para Linux para tener mejor visualización.
Para ello, nos pasaremos el binario de nc.exe y nos lo descargaremos en Windows con certutil.exe.
Nos pondremos en escucha nuevamente por el puerto 443, y des de Windows, procederemos a través de nc.exe de enviarnos una Reverse Shell. Comprobaremos el acceso correctamente.
Comprobaremos que hay uan carpeta XAMPP en el equipo.
Comprobaremos el contenido de index.php y nos damos cuenta que este XAMPP levanta el servicio de RoundCube.
Comprobaremos los permisos que disponemos sobre la carpeta "htdocs" que es el repositorio donde XAMPP almacena las páginas web.
En este caso, comprobamos que el grupo "Users" dispone de permsios de lectura y ejecución. Esto puede ser peligroso debido que dependiendo quien levante el servicio de XAMPP, es posible ganar acceso como el usuario Administrator o hacer pivoting a otro usuario.
Imaginemos que el usuario que levanta el servicio es "Administrator" y logramos subir un archivo PHP que podamos hacer un RCE, el servidor web ejecutará ese archivo PHP como el usuario "Administrator", por lo tanto podríamos llegar a ejecutar comandos como dicho usuario.
Crearemos un archivo de prueba llamado "cmd.php" en el cual contiene la función shell_exec que permite la ejecución de comandos y que ejecute el comando que se pase por la variable "cmd".
Nos la pasaremos con un servidor web y nos lo descargaremos con certutil.exe.
Comprobaremos de realizar una ejecución de comandos a través de la variable del archivo subido y comprobamos que el comando "whoami" nos devuelve que el usuario que ejecuta ese archivo es "NT Authority\System", por lo tanto es el usuario Administrator.
Des de otra terminal nos pondremos en escucha nc y des de la URL haremos que se ejecute el comando para otorgarnos una Reverse Shell. Utilizaremos el binario de "nc.exe" que habíamos descargado anteriormente.
Comprobaremos que ganamos acceso al equipo como usuario "NT Authority\System" y visualizamos la flag de root.txt.
Procederemos a comprobar el sitio web que está con SSL (puerto 443) -
Procederemos a realizar un script que compruebe si de las funciones que nos permiten la ejecución de comandos - .
Revisando exploits, nos encontramos el siguiente que nos permite escalar de privilegios al usuario "root" con la ejecución del exploit.
Procederemos a acceder a y comprobaremos que nos encontramos con la página que habíamos enumerado al principio.
Verificamos que tenemos un correo de "drbrown@hospital.htb" en el cual nos pide que le envíemos un archivo para que él lo pueda visualizar con .
Encontramos el siguiente repositorio en el cual nos indica que podemos inyectar un payload dentro de un archivo .EPS para que cuando sea abierto por GhostScript, sea ejecutado correctamente.
Nos descargaremos el repositorio, y crearemos el payload en formato EPS. El comando que queremos que ejecute es una Reverse Shell en PowerShell encodeado en Base64 des de