Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2022-46169 — Cacti 1.2.22 حقن أوامر بدون مصادقة | Kitploit
أدوات/GitHubGitHub/k4pxd/cve-2022-46169
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالتعلم والتعليمالفريق الأحمر
GitHubk4pxd/cve-2022-46169

CVE-2022-46169

Cacti 1.2.22 حقن أوامر بدون مصادقة

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2022-46169 — Cacti 1.2.22 حقن أوامر غير مصادق عليه


الحقلالتفاصيل
المنتجCacti
الإصدار المتأثر1.2.22
الثغرةحقن أوامر نظام تشغيل غير مصادق عليه
CVECVE-2022-46169
CWECWE-77 — حقن الأوامر
الخطورةحرجة
CVSS v3.19.8
ناقل الهجومالشبكة
المصادقةلا شيء
تفاعل المستخدملا شيء
التأثيرالسرية / السلامة / التوفر
الإصدار المُصلَح1.2.23
المكوّن المعرَّض للخطرremote_agent.php
مكوّن إضافيlib/functions.php
الإجراء الرئيسي المعرَّض للخطرpolldata

ناقل CVSS المنشور هو:

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

يصنّف الاستشارة الرسمية الخطورة عند 9.8 حرجة. ([GitHub][1])

1. السبب الجذري

في الواقع هناك ثغرتان مترابطتان معًا.

المرحلة 1 — تجاوز التفويض

يقبل remote_agent.php في Cacti الطلبات دون مصادقة عادية، لكنه يحاول تحديد ما إذا كان الطالب هو مُلقِّم استطلاع (poller) مصرحًا به.

مسار التفويض يعمل فعليًا على النحو التالي:

HTTP request
     │
     ▼
remote_agent.php
     │
     ▼
remote_client_authorized()
     │
     ▼
get_client_addr()
     │
     ▼
gethostbyaddr()
     │
     ▼
مقارنة اسم المضيف في جدول poller

المشكلة تكمن في get_client_addr().

في الإصدار 1.2.22، يفحص هذا الدالة متغيرات خادم متعددة مشتقة من HTTP، بما في ذلك ترويسات عنوان IP المُمرَّر من العميل. يوضح الاستشارة أن قيم HTTP_* التي يتحكم فيها المهاجم يمكن أن تؤثر على عنوان IP الذي تُرجعه هذه الدالة. ([GitHub][1])

هذا يعني أن التطبيق يمكن خداعه ليعتقد أن:

المهاجم
   ↓
"عنوان IP الخاص بي هو خادم Cacti"
   ↓
gethostbyaddr()
   ↓
اسم مضيف خادم Cacti
   ↓
يطابق جدول poller
   ↓
مصرح به

لذا لا يحتاج المهاجم إلى حساب Cacti شرعي.


2. الثغرة الثانية — حقن الأوامر

بعد تجاوز فحص التفويض، فإن وظيفة النقطة الطرفية المثيرة للاهتمام هي إجراء polldata.

مسار التنفيذ ذو الصلة هو تقريبًا:

remote_agent.php
      │
      ▼
    polldata
      │
      ▼
 poll_for_data()
      │
      ├── host_id
      ├── local_data_ids
      └── poller_id
              │
              ▼
       البحث في poller_item
              │
              ▼
 POLLER_ACTION_SCRIPT_PHP
              │
              ▼
          proc_open()
              │
              ▼
       تنفيذ أوامر نظام التشغيل

الخطأ المهم هو التعامل مع poller_id.

يسترجعه التطبيق باستخدام:

get_nfilter_request_var()

بدلاً من فرض كونه عددًا صحيحًا.

تلك القيمة التي يتحكم فيها المهاجم تصبح في النهاية جزءًا من أمر يُمرَّر إلى proc_open() في PHP. يحدد الاستشارة الرسمية هذا صراحةً كأساس لحقن الأوامر. ([GitHub][1])

من الناحية المفاهيمية:

إدخال يتحكم فيه المهاجم
        ↓
     poller_id
        ↓
 سلسلة نصية مدمجة
        ↓
     proc_open()
        ↓
 أمر نظام التشغيل

هذا هو الجزء الحرج من الثغرة.


3. لماذا تتحول إلى RCE

الشيء المثير للاهتمام في تحليل PoC الخاص بك هو أن أيًا من الثغرتين بمفردها ليست القصة الكاملة.

إنها سلسلة ثغرات:

        ┌──────────────────────────┐
        │ مهاجم غير مصادق عليه │
        └────────────┬─────────────┘
                     │
                     ▼
          remote_agent.php
                     │
                     ▼
        تجاوز التفويض
          عبر منطق عنوان IP للعميل
                     │
                     ▼
              polldata
                     │
                     ▼
            البحث في poller_item
                     │
                     ▼
       POLLER_ACTION_SCRIPT_PHP
                     │
                     ▼
             إدخال المهاجم
              → poller_id
                     │
                     ▼
                proc_open()
                     │
                     ▼
              تنفيذ الأوامر
                     │
                     ▼
                    RCE

هذا تمييز مهم جدًا يجب توضيحه في تقريرك:

CVE-2022-46169 ليست ببساطة "معامل سيئ في remote_agent.php." إنها سلسلة من تجاوز التفويض + حقن الأوامر.

يؤكد الاستشارة الرسمية أن شرط التنفيذ المعرَّض للخطر يتطلب poller_item يكون إجراءه POLLER_ACTION_SCRIPT_PHP. ([GitHub][1])


4. المتطلب البيئي المسبق

يجب أن يوثّق PoC الخاص بك هذا صراحةً لأنه تفصيل تحليلي مهم.

يحتاج الهدف إلى poller_item مناسب مُهيأ بـ:

POLLER_ACTION_SCRIPT_PHP

يشير استشارة Cacti إلى أن هذا شائع في بيئات الإنتاج لأن القوالب المحددة مسبقًا مثل Device - Uptime و Device - Polling Time يمكن أن تنشئ هذه الإدخالات. ([GitHub][1])

لذا لا تكتب:

"كل تثبيت Cacti 1.2.22 قابل للاستغلال تلقائيًا."

البيان الأكثر دقة تقنيًا هو:

Cacti 1.2.22 معرَّض للخطر، ويعتمد نجاح تنفيذ الأوامر على وجود تكوين poller_item مناسب.


5. لماذا يهم host_id و local_data_id

لا تنفذ poll_for_data() ببساطة poller_id المُقدَّم.

تستعلم أولاً عن poller_item باستخدام قيم تتوافق مع:

host_id
local_data_id

ثم تفحص إجراء العنصر الناتج.

الشرط المعرَّض للخطر هو فعليًا:

host_id
   +
local_data_id
   ↓
poller_item
   ↓
action == POLLER_ACTION_SCRIPT_PHP
   ↓
مسار تنفيذ معرَّض للخطر

يشير الاستشارة الأصلي إلى أن هذه المعرّفات يمكن اكتشافها لأن الإدخالات ذات الصلة موجودة في قاعدة بيانات التطبيق، وأن الإدخالات المناسبة من المرجح أن تكون موجودة في التثبيتات الإنتاجية. ([GitHub][1])

بالنسبة إلى PoC عام، سأوضح هذا المتطلب المسبق صراحةً بدلاً من إخفائه.


6. منهجية PoC آمنة

لشيء تنشره، أوصي بجعل PoC يوضح تنفيذ الأوامر دون منح القراء حمولة ريفيرس شل جاهزة للاستخدام كسلاح.

على سبيل المثال، نظّم عرضك على النحو التالي:

1. انشر Cacti 1.2.22 في جهاز افتراضي معزول
2. هيئ poller_item باستخدام POLLER_ACTION_SCRIPT_PHP
3. تأكد من إمكانية الوصول إلى remote_agent.php
4. وضح التأثير على قرار التفويض
5. وصل إلى مسار تنفيذ polldata
6. استخدم علامة تنفيذ أوامر غير ضارة
7. التقط الأدلة الناتجة من التطبيق/السجلات
8. قم بالترقية إلى 1.2.23
9. أعد الاختبار
10. وضح أن الثغرة لم تعد قابلة للاستغلال

يمنحك ذلك عرضًا شرعيًا للثغرة دون تحويل التقرير إلى سلاح RCE جاهز للاستخدام عبر الإنترنت.


7. تحليل الكود المصدري لتقريرك

يمكنك تقسيم الكود المعرَّض للخطر إلى ثلاث مناطق.

أ. remote_agent.php

مسؤول عن كشف وظيفة الوكيل البعيد وتوجيه الإجراء المطلوب.

remote_agent.php
      │
      └── action = polldata
                 │
                 ▼
            poll_for_data()

ب. lib/functions.php

يحتوي على get_client_addr().

التصميم الإشكالي هو الثقة في القيم المشتقة من HTTP عند تحديد عنوان الشبكة الفعلي للطالب.

يسرد الاستشارة الرسمي متغيرات متعددة متعلقة بـ HTTP يتم فحصها قبل الرجوع إلى العنوان البعيد الفعلي. ([GitHub][1])

ج. proc_open()

الحوض الخطير النهائي هو بناء أمر PHP المنفذ عبر proc_open().

يحدد الاستشارة التدفق المعرَّض للخطر على النحو التالي:

poller_id
    ↓
get_nfilter_request_var()
    ↓
بناء الأمر
    ↓
proc_open()

([GitHub][1])


8. لماذا يصلح التصحيح المشكلة

يحدد استشارة Cacti تغييرين مهمين للعلاج.

أولاً، يجب معاملة poller_id كعدد صحيح:

get_nfilter_request_var()
             ↓
get_filter_request_var()

ثانيًا، يجب أيضًا تهريب القيمة من القشرة (shell-escaped) قبل دمجها في الأمر:

escapeshellarg($poller_id)

يوصي الاستشارة تحديدًا بكلا الإجراءين. ([GitHub][1])

جانب التفويض يحتاج أيضًا إلى التوقف عن السماح للمهاجم بالتأثير بشكل تعسفي على عنوان IP للعميل المستخدم للتفويض. ([GitHub][1])


9. مقارنة الإصدارات

تنزيل الأداة