
कैक्टि 1.2.22 बिना प्रमाणीकरण के कमांड इंजेक्शन
| फ़ील्ड | विवरण |
|---|
| उत्पाद | Cacti |
| प्रभावित संस्करण | 1.2.22 |
| भेद्यता | अनप्रमाणित OS कमांड इंजेक्शन |
| CVE | CVE-2022-46169 |
| CWE | CWE-77 — कमांड इंजेक्शन |
| गंभीरता | क्रिटिकल |
| CVSS v3.1 | 9.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 — प्राधिकरण बायपास
Cacti का remote_agent.php सामान्य प्रमाणीकरण के बिना अनुरोध स्वीकार करता है, लेकिन यह निर्धारित करने का प्रयास करता है कि अनुरोधकर्ता एक अधिकृत पोलर है या नहीं।
प्राधिकरण प्रवाह प्रभावी रूप से यह करता है:
HTTP अनुरोध
│
▼
remote_agent.php
│
▼
remote_client_authorized()
│
▼
get_client_addr()
│
▼
gethostbyaddr()
│
▼
पोलर तालिका होस्टनाम तुलना
समस्या get_client_addr() है।
1.2.22 में यह कई HTTP-व्युत्पन्न सर्वर चरों की जांच करता है, जिसमें फॉरवर्डेड-क्लाइंट-IP हेडर शामिल हैं। सलाह बताती है कि हमलावर-नियंत्रित HTTP_* मान इस फ़ंक्शन द्वारा लौटाए गए IP को प्रभावित कर सकते हैं। (GitHub)
इसका मतलब है कि एप्लिकेशन को यह विश्वास करने के लिए धोखा दिया जा सकता है:
हमलावर
↓
"मेरा IP Cacti सर्वर है"
↓
gethostbyaddr()
↓
Cacti सर्वर होस्टनाम
↓
पोलर तालिका से मेल खाता है
↓
अधिकृत
इसलिए हमलावर को वैध Cacti खाते की आवश्यकता नहीं है।
प्राधिकरण जांच को बायपास करने के बाद, दिलचस्प एंडपॉइंट कार्यक्षमता polldata क्रिया है।
प्रासंगिक निष्पादन पथ लगभग है:
remote_agent.php
│
▼
polldata
│
▼
poll_for_data()
│
├── host_id
├── local_data_ids
└── poller_id
│
▼
poller_item लुकअप
│
▼
POLLER_ACTION_SCRIPT_PHP
│
▼
proc_open()
│
▼
OS कमांड निष्पादन
महत्वपूर्ण गलती poller_id की हैंडलिंग है।
एप्लिकेशन इसे इसका उपयोग करके प्राप्त करता है:
get_nfilter_request_var()
बजाय यह सुनिश्चित करने के कि यह एक पूर्णांक है।
वह हमलावर-नियंत्रित मान अंततः PHP के proc_open() को पारित किए गए कमांड का हिस्सा बन जाता है। आधिकारिक सलाह स्पष्ट रूप से इसे कमांड-इंजेक्शन प्रिमिटिव के रूप में पहचानती है। (GitHub)
अवधारणात्मक रूप से:
हमलावर-नियंत्रित इनपुट
↓
poller_id
↓
स्ट्रिंग संयोजन
↓
proc_open()
↓
ऑपरेटिंग-सिस्टम कमांड
यह भेद्यता का महत्वपूर्ण हिस्सा है।
आपके 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)
आपके PoC को इसे स्पष्ट रूप से प्रलेखित करना चाहिए क्योंकि यह एक महत्वपूर्ण विश्लेषणात्मक विवरण है।
लक्ष्य को इसके साथ कॉन्फ़िगर किए गए उपयुक्त poller_item की आवश्यकता है:
POLLER_ACTION_SCRIPT_PHP
Cacti सलाह नोट करती है कि यह उत्पादन इंस्टॉलेशन पर सामान्य है क्योंकि पूर्वनिर्धारित टेम्पलेट जैसे Device - Uptime और Device - Polling Time ये प्रविष्टियाँ बना सकते हैं। (GitHub)
इसलिए यह न लिखें:
"हर Cacti 1.2.22 इंस्टॉलेशन स्वचालित रूप से शोषण योग्य है।"
अधिक तकनीकी रूप से सटीक कथन है:
Cacti 1.2.22 भेद्य है, और सफल कमांड निष्पादन उपयुक्त
poller_itemकॉन्फ़िगरेशन की उपस्थिति पर निर्भर करता है।
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)
सार्वजनिक PoC के लिए, मैं इस पूर्वापेक्षा को छिपाने के बजाय स्पष्ट रूप से प्रदर्शित करने की अनुशंसा करता हूँ।
आपके द्वारा प्रकाशित की जाने वाली चीज़ के लिए, मैं अनुशंसा करता हूँ कि PoC पाठकों को हथियारबंद रिवर्स-शेल पेलोड दिए बिना कमांड निष्पादन प्रदर्शित करे।
उदाहरण के लिए, अपने प्रदर्शन को इस प्रकार संरचित करें:
1. एक अलग VM में Cacti 1.2.22 तैनात करें
2. POLLER_ACTION_SCRIPT_PHP का उपयोग करके poller_item कॉन्फ़िगर करें
3. पुष्टि करें कि remote_agent.php पहुंच योग्य है
4. प्राधिकरण निर्णय को प्रभावित होते हुए प्रदर्शित करें
5. polldata निष्पादन पथ तक पहुँचें
6. एक हानिरहित कमांड-निष्पादन मार्कर का उपयोग करें
7. परिणामी एप्लिकेशन/लॉग साक्ष्य कैप्चर करें
8. 1.2.23 में अपग्रेड करें
9. परीक्षण दोहराएं
10. प्रदर्शित करें कि भेद्यता अब शोषण योग्य नहीं है
यह आपको एक वैध भेद्यता प्रदर्शन देता है बिना राइट-अप को तैयार इंटरनेट RCE हथियार में बदले।
आप भेद्य कोड को तीन क्षेत्रों में विभाजित कर सकते हैं।
remote_agent.phpरिमोट-एजेंट कार्यक्षमता को उजागर करने और अनुरोधित क्रिया को भेजने के लिए जिम्मेदार।
remote_agent.php
│
└── action = polldata
│
▼
poll_for_data()
lib/functions.phpइसमें get_client_addr() शामिल है।
समस्याग्रस्त डिज़ाइन अनुरोधकर्ता के वास्तविक नेटवर्क पते का निर्णय करते समय HTTP-व्युत्पन्न मानों पर भरोसा करना है।
आधिकारिक सलाह वास्तविक रिमोट पते पर वापस आने से पहले कई HTTP-संबंधित चरों की सूची देती है जिनकी जांच की जाती है। (GitHub)
proc_open()अंतिम खतरनाक सिंक proc_open() के माध्यम से निष्पादित PHP कमांड का निर्माण है।
सलाह भेद्य प्रवाह की पहचान इस प्रकार करती है:
poller_id
↓
get_nfilter_request_var()
↓
कमांड निर्माण
↓
proc_open()
(GitHub)
Cacti सलाह दो महत्वपूर्ण सुधार उपायों की पहचान करती है।
पहला, poller_id को पूर्णांक के रूप में माना जाना चाहिए:
get_nfilter_request_var()
↓
get_filter_request_var()
दूसरा, मान को कमांड में शामिल करने से पहले अतिरिक्त रूप से शेल-एस्केप किया जाना चाहिए:
escapeshellarg($poller_id)
सलाह विशेष रूप से दोनों उपायों की अनुशंसा करती है। (GitHub)
प्राधिकरण पक्ष को भी हमलावर को प्राधिकरण के लिए उपयोग किए जाने वाले क्लाइंट IP को मनमाने ढंग से प्रभावित करने से रोकने की आवश्यकता है। (GitHub)
Cacti 1.2.22
│
├── भेद्य
├── प्राधिकरण बायपास
├── कमांड इंजेक्शन
└── संभावित अनप्रमाणित RCE
Cacti 1.2.23
│
└── CVE-2022-46169 पैच किया गया
विक्रेता सलाह 1.2.22 को प्रभावित और 1.2.23 को पैच किया गया 1.2.x रिलीज़ के रूप में सूचीबद्ध करती है। (GitHub)
Amazon का सुरक्षा सलाह स्वतंत्र रूप से इस मुद्दे को एक अनप्रमाणित हमलावर को मनमाने कमांड निष्पादित करने की अनुमति देने के रूप में वर्णित करता है और इसे 9.8 CVSS स्कोर देता है। (AWS Training and Certification)
मैं कुछ इस तरह उपयोग करूँगा:
CVE-2022-46169 — Cacti 1.2.22 में अनप्रमाणित कमांड इंजेक्शन / RCE
या अधिक तकनीकी:
CVE-2022-46169: Cacti 1.2.22 रिमोट एजेंट प्राधिकरण बायपास और कमांड इंजेक्शन श्रृंखला का विश्लेषण
और आपका भेद्यता सारांश यह कह सकता है:
Cacti 1.2.22 में रिमोट-एजेंट कार्यक्षमता में एक क्रिटिकल भेद्यता श्रृंखला है। एक हमलावर रिमोट-एजेंट प्राधिकरण जांच को बायपास करने के लिए क्लाइंट-पता निर्धारण लॉजिक में हेरफेर कर सकता है। एक बार
polldataकार्यक्षमता तक पहुँचने के बाद,poller_idपैरामीटर का अपर्याप्त सत्यापन हमलावर-नियंत्रित डेटा कोproc_open()के माध्यम से निष्पादित कमांड तक पहुँचने की अनुमति देता है।POLLER_ACTION_SCRIPT_PHPपोलर आइटम वाले कॉन्फ़िगरेशन के तहत, यह अनप्रमाणित रिमोट कमांड निष्पादन का परिणाम हो सकता है। यह मुद्दा Cacti 1.2.23 में ठीक किया गया था। (GitHub)
आपके शोध के लिए एक महत्वपूर्ण सुधार: इसे CVE-2023-39362 के साथ भ्रमित न करें। वह बाद का Cacti RCE 1.2.24 को प्रभावित करता है और 1.2.25 में ठीक किया गया था, इसलिए यह 1.2.22 PoC के लिए आप जो भेद्यता चाहते हैं वह नहीं है। (NVD)