Precious

Precious es una máquina Linux de dificultad fácil que se centra en el lenguaje "Ruby". Alberga una aplicación web "Ruby" personalizada que utiliza una biblioteca obsoleta, concretamente pdfkit, que es vulnerable a "CVE-2022-25765", lo que lleva a un shell inicial en la máquina de destino. Después de un pivote que utiliza credenciales de texto sin formato que se encuentran en un archivo "config" del repositorio Gem, el cuadro concluye con un ataque de deserialización inseguro en un script "Ruby" personalizado y obsoleto.


Reconnaissance

Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Precious. Este resultado lo almacenaremos en un archivo llamado allPorts.

A través de la herramienta de extractPorts, la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap. Esta herramienta nos copiará en la clipboard los puertos encontrados.

Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Nginx.

Transformaremos el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.

Accederemos a http://localhost y verificaremos el resultado en un formato más cómodo para su análisis.

Añadiremos la siguiente entrada en nuestro archivo /etc/hosts.

Web Enumeration

Realizaremos una comprobación de las tecnologías que utiliza el sitio web.

Accederemos a http://precious.htb y verificaremos el siguiente contenido. Por lo que parece ser, es un convertidor de una página web a PDF. Se nos proporciona un input en donde indicarle a la aplicación la URL que queramos convertir.

Realizaremos una enumeración de páginas y directorios y no logramos encontrar ninguna información relevante.

Dado que podemos indicarle una URL a la aplicación web, probaremos de levantar un servidor web en nuestro equipo para verificar cómo funciona por detrás la aplicación.

En la página web indicaremos nuestro servidor web y le daremos a la opción de Submit.

Al interceptar la solicitud en BurpSuite para verificar cómo es el funcionamiento, verificamos que lo que se tramita por POST es el siguiente contenido a través de la variable url.

Al tramitar la solicitud, verificamos en la respuesta por parte del servidor que se ha generado un PDF. También podemos revisar en las mismas cabeceras que utiliza Ruby y Phusion Passenger, un servidor de aplicaciones que admite aplicaciones Ruby, Python, Node y Meteor.

Initial Foothold

Pdfkit v0.8.6 Exploitation - Command Injection (CVE-2022-257655)

Verificaremos que se nos ha descargado el PDF de la exportación de nuestro servidor a PDF. Al analizar el archivo a través de exiftool, comprobamos que el PDF se genera a través de pdfkit v0.8.6.

Revisando posibles vulnerabilidades de pdfkit, nos encontramos con el siguiente CVE-2022-25765.

Por otro lado, nos encontramos con el siguiente blog en el cual mencionan con un PoC el cómo se genera esta vulnerabilidad.

Revisando por Internet, nos encontramos con el siguiente repositorio de GitHub que realiza la explotación automáticamente.

En el código del script de la explotación de la vulnerabilidad, verificamos cómo funciona por detrás el payload. Básicamente, si el parámetro proporcionado contiene un carácter codificado en URL y una cadena de sustitución de comando de shell, se incluirá en el comando que PDFKit ejecuta para representar el PDF.

Para recibir acceso a la máquina, nos pondremos en escucha con nc.

Ejecutaremos el exploit del repositorio de GitHub indicado. Indicaremos el target vulnerable y nuestra dirección y puerto dónde recibiremos la Reverse Shell.

Verificamos que hemos ganado acceso correctamente al equipo.

Para probar la explotación manualmente y entender el funcionamiento del exploit anterior, realizamos la siguiente prueba.

Desde la URL vulnerable, le inyectamos el comando id aprovechándonos de la variable name que es la que no sanitiza correctamente lo que introduce el usuario.

Verificaremos que al realizar la conversión de la Web page a PDF, se nos muestra el comando ejecutado en el mismo PDF, esto debido al Command Injection.

Para realizar una Reverse Shell realizando la explotación manual, realizaremos los siguientes pasos. Nos pondremos en escucha con nc para recibir la Reverse Shell.

Desde BurpSuite interceptaremos la solicitud al darle a Submit después de indicarle la URL. Indicaremos el siguiente payload para proporcionarnos la Reverse Shell.

Comprobaremos que hemos conseguido realizar el Command Injection y hemos recibido correctamente la Reverse Shell.

Initial Access

Information Leakage

Nos encontramos actualmente con el usuarioruby, el cual investigando su directorio personal, logramos encontrar un archivo el cual parece contener las credenciales del usuario henry.

Tratamos de acceder con las credenciales obtenidas del usuariohenry y verificamos del correcto acceso y de la visualización de la flag de user.txt.

Privilege Escalation

Abusing sudoers privilege - YAML Desarialization Attack

Revisaremos los grupos de los que forma parte el usuario actual y si disponemos de algún permiso de sudoers. Al verificar los privilegios de sudoers, nos encontramos que podemos ejecutar como sudo sin proporcionar credenciales el script que se encuentra en /opt/update_dependencies.rb.

El script compara las versiones de las dependencias instaladas con las que están definidas en dependencies.yml. Primero, carga la lista del archivo YAML y obtiene la lista de gems locales. Luego, recorre ambas listas y muestra si las versiones coinciden o no

Al analizar posibles vulnerabilidades del script de Ruby, nos encontramos con un problema de deserialización que se explica a continuación.

Lo primero será lograr identificar la versión de Ruby que tiene instalada el equipo víctima.

En la página de PayloadsAllTheThings nos encontramos con diferentes métodos de abusar de esta deserialización en Ruby.

A través del siguiente dependencies.yml malicioso, lo que realizaremos es que consiga ejecutar el comando id para verificar si funciona correctamente el Deserialization Attack.

Al ejecutar el script de Ruby, verificamos que carga el archivo malicioso y finalmente se muestra la ejecución del comando inyectado, y se verifica que el usuario que ejecuta el comando es el usuario root.

Por lo tanto, ya que el usuario que ejecuta el comando es root, lo que trataremos es de realizar lo siguiente.

A través del siguiente archivo dependencies.yml malicioso, lo que realizaremos es modificar el binario de /bin/bash para darle permisos de SUID y así lograr convertirnos en usuario root. Verificaremos los permisos actuales del binario/bin/bash el cual root es propietario.

Una vez modificado nuestro archivo dependencies.yml en el directorio actual, ejecutaremos el script de Ruby. Analizaremos los permisos del binario /bin/bash y comprobaremos que se le han asignado permisos de SUID.

Dado que el binario de /bin/bash dispone de SUID, podemos convertirnos en root como se muestra a continuación. Finalmente logramos visualizar la flag de root.txt.

Última actualización

¿Te fue útil?