Sploitus

Exploit for CVE-2022-46169

kitploit · 2026-08-25

Exploit Code

MARKDOWN82 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-0XN7Y-CVE-2022-46169
# CVE-2022-46169

استغلال ثغرة CVE-2022-46169 في إصدارات Cacti قبل 1.2.3

هنا تتحقق الدالة `remote_client_authorized` من اسم مضيف العميل في جدول `poller` عند الإدخال

root@kitploit:~
    
    
    function remote_client_authorized() {
       // ...
       $client_addr = get_client_addr();
       // ...
       $client_name = gethostbyaddr($client_addr);
       // ...
       $pollers = db_fetch_assoc('SELECT * FROM poller', true, $poller_db_cnn_id);
       foreach($pollers as $poller) {
          if (remote_agent_strip_domain($poller['hostname']) == $client_name) {
             return true;
          // ...
    

تُستخدم الدالة `get_client_addr` للحصول على عنوان العميل، والذي يمكن للمهاجم تعديله عند تحديد عنوان IP. تستخدم IP لحله إلى اسم المضيف المقابل وتتحقق مما إذا كان جدول `poller` يحتوي على إدخال بهذا الاسم المضيف لتأكيد العميل.

root@kitploit:~
    
    
    <?php
    // ...
    function get_client_addr($client_addr = false) {
       $http_addr_headers = array(
           // ...
           'HTTP_X_FORWARDED',
           'HTTP_X_FORWARDED_FOR',
           'HTTP_X_CLUSTER_CLIENT_IP',
           'HTTP_FORWARDED_FOR',
           'HTTP_FORWARDED',
           'HTTP_CLIENT_IP',
           'REMOTE_ADDR',
       );
    
       $client_addr = false;
       foreach ($http_addr_headers as $header) {
          // ...
          $header_ips = explode(',', $_SERVER[$header]);
          foreach ($header_ips as $header_ip) {
             // ...
             $client_addr = $header_ip;
             break 2;
          }
       }
       return $client_addr;
    }
    

لذا فإن تعديل رأس الطلب يسمح لنا بتجاوز المصادقة

وهنا يتم استخدام إدخال المستخدم غير المنقى لتنفيذ أمر خارجي

root@kitploit:~
    
    
    // ... retrieve poller items from database ...
    
    foreach($items as $item) {
       switch ($item['action']) {
       // ...
       case POLLER_ACTION_SCRIPT_PHP: /* script (php script server) */
          // ...
          $cactiphp = proc_open(read_config_option('path_php_binary') . ' -q ' . $config['base_path'] . '/script_server.php realtime ' . $poller_id, $cactides, $pipes);
    

# الإصلاح

## تجاوز المصادقة

قم بتكوين رؤوس HTTP التي يجب استخدامها عند تحديد عنوان IP للعميل

## rec

نظرًا لأن قيمة `poller_id` يجب أن تكون عددًا صحيحًا، يجب التحقق من صحتها قبل تمريرها إلى `proc_open`