
CVE-2022-46169 के लिए एक्सप्लॉइट
CVE-2022-46169 के लिए शोषण, Cacti संस्करण 1.2.3 से पहले के लिए
यहाँ remote_client_authorized क्लाइंट के होस्टनेम को पोलर तालिका में प्रविष्टि के लिए जाँचता है
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 फ़ंक्शन का उपयोग क्लाइंट का पता प्राप्त करने के लिए किया जाता है, जिसे हमलावर आईपी पता निर्धारित करते समय संशोधित कर सकता है। यह आईपी का उपयोग करके संबंधित होस्टनेम को हल करता है और जाँचता है कि पोलर तालिका में इस होस्टनेम के साथ कोई प्रविष्टि है जो क्लाइंट को अधिकृत करती है।
<?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;
}
इसलिए अनुरोध हेडर को संशोधित करने से हमें प्रमाणीकरण को बायपास करने की अनुमति मिलती है
और यहाँ असुरक्षित उपयोगकर्ता इनपुट का उपयोग बाहरी कमांड को निष्पादित करने के लिए किया जाता है
// ... डेटाबेस से पोलर आइटम प्राप्त करें ...
foreach($items as $item) {
switch ($item['action']) {
// ...
case POLLER_ACTION_SCRIPT_PHP: /* स्क्रिप्ट (php स्क्रिप्ट सर्वर) */
// ...
$cactiphp = proc_open(read_config_option('path_php_binary') . ' -q ' . $config['base_path'] . '/script_server.php realtime ' . $poller_id, $cactides, $pipes);
क्लाइंट के आईपी का निर्धारण करते समय कौन से HTTP हेडर का उपयोग किया जाना चाहिए, इसे कॉन्फ़िगर करें
क्योंकि poller_id मान को पूर्णांक के रूप में आवश्यक है, इसे proc_open में पास करने से पहले मान्य करें