Grafana path traversal (CVE-2021-43798)
CVE-2021-43798 es una vulnerabilidad de lectura arbitraria de ficheros en Grafana (versiones 8.0.0 a 8.3.0), explotable sin autenticación. Grafana sirve los recursos estáticos de cada plugin bajo la ruta /public/plugins/<plugin-id>/, pero no normaliza los .. del camino solicitado, de modo que se puede salir del directorio del plugin y leer cualquier fichero que el proceso de Grafana pueda abrir.
La condición es usar un id de plugin que exista (los que vienen de serie sirven: alertlist, graph, table, text, dashlist...). A partir de ahí se retrocede con ../ hasta la raíz:
curl --path-as-is \
'http://<ip>:3000/public/plugins/alertlist/../../../../../../../../etc/passwd'--path-as-is evita que curl colapse los ../ antes de enviarlos. Los objetivos más rentables en una caja con Grafana:
/etc/grafana/grafana.ini: configuración conadmin_user/admin_passwordy lasecret_key./var/lib/grafana/grafana.db: base SQLite con usuarios, hashes y, sobre todo, las datasources (conexiones a bases de datos externas, a menudo con credenciales).- Ficheros del sistema (
/etc/passwd, claves SSH, etc.) según permisos del proceso.
Por qué es tan útil. No da ejecución directa, pero suele encadenar: con las credenciales del admin se entra en Grafana y se consulta /api/datasources, que revela las contraseñas de las bases conectadas (MySQL, PostgreSQL...), abriendo el siguiente pivote. Es una lectura de ficheros que, en la práctica, funciona como puerta a las credenciales.
Cómo detectarlo. En el log de acceso de Grafana aparecen peticiones no autenticadas a /public/plugins/<id>/ seguidas de ../../ sin normalizar y de rutas absolutas conocidas (/etc/grafana/grafana.ini, /var/lib/grafana/grafana.db, /etc/passwd). Como un cliente legítimo nunca pide recursos de plugin con ../, su presencia es la firma; un mismo origen leyendo varios ficheros sensibles o probando distintos ids de plugin delata el barrido, y cualquier WAF marca el traversal. La lectura de grafana.ini/grafana.db seguida de un login de admin y una consulta a /api/datasources cierra la cadena.
Defensa. Actualizar Grafana a 8.3.1 o superior, no exponer el puerto 3000 a Internet, y rotar cualquier secreto que haya podido leerse (secret_key, contraseñas de datasources). Es un caso concreto del path traversal / LFI genérico.
Máquinas donde se aplica
- AmbassadorHackTheBox
- BigPivotingDockerLabs
- FanatasticProving Grounds Practice