Apache HTTP सर्वर में संस्करण 2.4.0 से 2.4.55 तक कुछ mod_proxy कॉन्फ़िगरेशन HTTP Request Smuggling (हमले की तकनीक जो वेबसाइट द्वारा एक या अधिक उपयोगकर्ताओं से प्राप्त HTTP अनुरोध श्रृंखलाओं को संसाधित करने की प्रक्रिया में हस्तक्षेप करती है) हमले की अनुमति देते हैं।
ये कॉन्फ़िगरेशन तब प्रभावित होते हैं जब mod_proxy कुछ प्रकार के RewriteRule या ProxyPassMatch के साथ सक्षम होता है, जिसमें दूरस्थ हमलावर प्रॉक्सी सर्वर में एक्सेस नियंत्रण उपायों को बायपास करने के लिए इस भेद्यता का शोषण कर सकता है, जिससे मूल सर्वर को अनचाहे URL अधिकृत हो जाते हैं।
यह भेद्यता हमलावर को प्रॉक्सी द्वारा छिपाए गए आंतरिक अनुप्रयोगों को लक्षित करने और एक्सेस करने की अनुमति देती है, संभावित रूप से अनधिकृत एक्सेस, डेटा रिसाव या सिस्टम में गहरा शोषण हो सकता है।
CVE-2023-25690 का प्रयोग
हमलावर मशीन के रूप में Windows मशीन का उपयोग करें।
backend-server और proxy-server को Kali Linux मशीन पर Docker के माध्यम से तैनात किया जाता है।
लैब फ़ाइल संरचना:
प्रयोग मॉडल
Windows 10 मशीन का IP पता: 192.168.1.177
Kali Linux मशीन का IP पता: 192.168.27.139
Backend-Server का IP पता: 172.18.0.2
Proxy-Server का IP पता: 172.18.0.3
जब Windows 10 मशीन Kali मशीन के पोर्ट 80 पर होस्ट किए गए Apache HTTP Server तक पहुँचती है, तो ट्रैफ़िक Proxy-Server के पोर्ट 80 पर फॉरवर्ड किया जाता है और पोर्ट 8080 के माध्यम से Backend-Server तक अग्रेषित किया जाता है।
सिस्टम आवश्यकताएँ
हमलावर मशीन:
Windows 10 ऑपरेटिंग सिस्टम
उपकरण स्थापित करें: PyCharm, BurpSuite, VScode
FireFox ब्राउज़र का उपयोग करें और प्रॉक्सी कॉन्फ़िगर करने के लिए FoxyProxy एक्सटेंशन स्थापित करें
शोषण लक्ष्य: HTTP Request Smuggling भेद्यता का लाभ उठाकर प्रॉक्सी सर्वर की सीमाओं को पार करना और admin.php पृष्ठ पर छिपे फ़ंक्शन तक पहुँचना
प्रयोग की तैनाती:
अनुरोधों को इंटरसेप्ट और संपादित करने के लिए BurpSuite Community को प्रॉक्सी के रूप में कॉन्फ़िगर करें।
ब्राउज़र में FoxyProxy एक्सटेंशन डाउनलोड करें और प्रॉक्सी के बारे में जानकारी जोड़ें:
टूलबार पर FoxyProxy चालू करें (ब्राउज़र के एक्सटेंशन अनुभाग में) इसे Turn Off से BurpSuite Community में बदलें:
BurpSuite में, पैकेट इंटरसेप्ट करने के लिए intercept को on पर सेट करें:
Kali मशीन पर, docker-composer.yml फ़ाइल वाली लैब निर्देशिका में जाने के लिए cd कमांड का उपयोग करें और docker composer को कमांड के साथ चलाएँ: docker-composer up --build
CRLF Injection की जाँच:
पहले, हम नियंत्रण वर्णों (CRLF) वाला एक अनुरोध सिस्टम पर भेजते हैं: HTTP/1.1\r\nFoo: baarr\r\r\n\n और URL को एन्कोड करते हैं: %20HTTP/1.1%0d%0aFoo:%20baarr
=> यह देखा जा सकता है कि, जब हम CRLF वर्ण (%0d%0a) डालते हैं, सर्वर हमारे अनुरोध को बिना किसी त्रुटि या प्रतिबंध के संसाधित करता है, यह दर्शाता है कि हम CRLF वर्णों को पूरी तरह से डाल सकते हैं।
HTTP Request Smuggling की जाँच:
इसके बाद, हमारे पास निम्न URI है:
/categories/1 HTTP/1.1\r\nHost: Localhost\r\n\r\nGET /SMUGGLED, URL एन्कोड करने पर हमें मिलता है: /categories/1%20HTTP/1.1%0d%0aHost:%20localhost%0d%0a%0d%0aGET%20/SMUGGLED/
RewriteRule लागू करने के बाद, यह देखा जा सकता है कि URL पार्स किया जाएगा और प्रॉक्सी से गुजरने के बाद हमारे द्वारा भेजा गया अनुरोध निम्न प्रारूप में बदल जाएगा:
यह देखा जा सकता है कि, हमारे द्वारा भेजे गए एक अनुरोध के साथ, सर्वर को 2 प्रतिक्रियाएँ प्राप्त होती हैं और लौटाता है, एक GET /categories की और एक GET /SMUGGLED की।
HTTP Request Smuggling का शोषण:
मान लीजिए, httpd.conf फ़ाइल में हम Proxy-Server को /admin/ पृष्ठ तक पहुँच को ब्लॉक करने के लिए कॉन्फ़िगर करते हैं।
हम apache-proxy की जाँच तंत्र को बायपास करने के लिए निम्न अनुरोध के साथ HTTP Request Smuggling का लाभ उठा सकते हैं:
लॉग की जाँच करने पर, हम देखते हैं कि हमने सफलतापूर्वक apache-proxy को बायपास किया, /admin को अनुरोध सफलतापूर्वक भेजा और backend ने GET /admin के लिए status code 200 भी लौटाया।
मान लीजिए, admin.php फ़ाइल में एक फ़ंक्शन है जो किसी भी डोमेन को क्वेरी करने के लिए nslookup सिस्टम कमांड निष्पादित करता है, हमारा लक्ष्य प्रॉक्सी तंत्र को बायपास करना और इस छिपे हुए फ़ंक्शन तक पहुँचकर किसी भी डोमेन को DNS क्वेरी भेजना है, यहाँ हम अपनी ही Kali मशीन को क्वेरी करते हैं।
हमारे पास शोषण कोड है (फ़ाइल CVE-2023-25690.py) - और फ़ाइल pre.txt (जिसमें वह smuggled अनुरोध है जिसे हम Proxy-Server के माध्यम से सिस्टम को अनुरोध भेजने के लिए बायपास करना चाहते हैं, यहाँ /admin.php है), यह कोड हमारे इच्छित अनुरोध के साथ एक request smuggling बनाएगा जो pre.txt फ़ाइल में है और इसे सर्वर की ओर भेजेगा। साथ ही अनुरोध और प्रतिक्रिया के परिणाम को दो संबंधित फ़ाइलों req.txt और res.txt में रिकॉर्ड करेगा।
साथ ही Kali मशीन पर पोर्ट 53 पर DNS पैकेट कैप्चर करने के लिए tcpdump का उपयोग करें।
यह देखा जा सकता है कि, हमारे द्वारा भेजा गया अनुरोध प्रॉक्सी को पार कर गया, प्रॉक्सी इसे एक वैध अनुरोध मानता है। लेकिन backend-server पर, अनुरोध को नियंत्रण वर्णों सहित पार्स किया जाता है, इसलिए एक अनुरोध से, backend-server ने उस अनुरोध को 3 अनुरोधों में विभाजित किया, एक GET /categories.php?id=1, दूसरा GET /admin.php?secret=192.168.1.194 और अंतिम GET /abc है।
परिशिष्ट
Backend फ़ोल्डर में DockerFile फ़ाइल का कॉन्फ़िगरेशन
यह कॉन्फ़िगरेशन फ़ाइल निर्दिष्ट करती है कि, Backend-Server की ओर PHP 7.4-apache इमेज का उपयोग किया जाता है, यह एक इमेज है जिसमें PHP 7.4 और Apache Web Server शामिल है।
दूसरा कमांड src/ फ़ोल्डर की सभी सामग्री को /var/www/html फ़ोल्डर में कॉपी करता है - यह वह डिफ़ॉल्ट फ़ोल्डर है जिसका उपयोग Apache वेब सामग्री बनाने के लिए करता है या इस फ़ोल्डर को web root भी कहा जाता है।
तीसरा कमांड sed का उपयोग करके सभी 80 फ़ील्ड को 8080 से बदल देता है। यह Backend-Server में Apache के डिफ़ॉल्ट पोर्ट को 80 से 8080 में बदलने की अनुमति देता है।
और अंतिम कमांड कंटेनर चलने पर निष्पादित होता है, यह Apache Web Server चलाने के लिए apache का उपयोग करने वाला कमांड है।
Frontend फ़ोल्डर में DockerFile फ़ाइल का कॉन्फ़िगरेशन
यह फ़ाइल Frontend फ़ोल्डर में httpd.conf फ़ाइल को /tmp/httpd.conf फ़ाइल में कॉपी करेगी और अंत में उस httpd.conf फ़ाइल की सामग्री को /usr/local/apache2/conf/httpd.conf फ़ाइल में डाल देगी।
httpd.conf फ़ाइल apache HTTP सर्वर की मुख्य कॉन्फ़िगरेशन फ़ाइल है, यह फ़ाइल सर्वर में कॉन्फ़िगरेशन सेटिंग्स या संचालन को परिभाषित करती है - यहाँ यह Proxy-Server है।
httpd.conf फ़ाइल आमतौर पर /usr/local/apache2/conf/httpd.conf पथ पर स्थापित होती है, इसलिए हमें सामग्री को /usr/local/apache2/conf/httpd.conf पथ पर रखना होगा, और Frontend फ़ोल्डर में एक httpd.conf फ़ाइल बनाना है ताकि apache को अधिक लचीले ढंग से कॉन्फ़िगर किया जा सके (httpd.conf फ़ाइल को फिर से लिखने के लिए उस पथ तक cd करने की आवश्यकता नहीं है)।
docker-compose.yml फ़ाइल का कॉन्फ़िगरेशन:
यहाँ एप्लिकेशन चलाने के लिए आवश्यक services, network आदि परिभाषित किए जाते हैं।
यहाँ हम 2 मुख्य services घोषित करते हैं: apache-proxy और backend-server:
Apache-Proxy: ./frontend/DockerFile फ़ाइल पर आधारित है और network backend-network (bridge) है, इसके अलावा, depends_on: backend-server कॉन्फ़िगरेशन यह निर्दिष्ट करने के लिए है कि Apache-Proxy Backend-Server के पूरी तरह शुरू होने के बाद ही शुरू होगा। अंत में ports: "80:80" पोर्ट फॉरवर्डिंग निर्दिष्ट करता है, होस्ट मशीन के पोर्ट 80 पर आने वाला ट्रैफ़िक कंटेनर के पोर्ट 80 पर फॉरवर्ड किया जाएगा।
Backend-Server: ./backend/DockerFile फ़ाइल पर आधारित है, network backend-network के साथ ताकि वे एक दूसरे के साथ संवाद कर सकें, कॉन्फ़िगरेशन expose पोर्ट 8080 खोलता है ताकि Apache-Proxy इस पोर्ट के माध्यम से Backend-Server को ट्रैफ़िक फॉरवर्ड कर सके, और अंत में कुछ सुरक्षा सुविधाएँ जैसे उपयोगकर्ता को नई अनुमतियाँ बनाने की अनुमति न देना (फ़ाइलें जोड़ना, संशोधित करना, हटाना, process या network के साथ अनुमतियाँ जोड़ना आदि) और किसी प्रोग्राम द्वारा किए गए system call को फ़िल्टर करना।
httpd.conf फ़ाइल का कॉन्फ़िगरेशन
पहला है दो पथों पर लॉग संग्रहीत करने का कॉन्फ़िगरेशन: /use/local/apache2/logs/error.log और /use/local/apache2/logs/access.log
इसके बाद Rewrite Rule (पुनर्लेखन नियम) लागू करने के लिए आवश्यक modules लोड करना है।
इसके बाद DocumentRoot निर्दिष्ट करना है, यह फ़ाइल apache कॉन्फ़िगरेशन फ़ाइल में पैरामीटर निर्दिष्ट करेगी जो यह निर्धारित करती है कि सर्वर की डेटा फ़ाइलें कहाँ स्थित हैं।
इसके बाद /categories/ और /admin/ के पथ के लिए पुनर्लेखन नियम लागू करना है।
और अंत में /admin/ को अनुरोध भेजने से रोकना है -> उद्देश्य यह है कि हम प्रॉक्सी को बायपास करने और इस पृष्ठ तक पहुँचने के लिए लैब बनाएँ।
इस प्रकार हमने /admin.php को सफलतापूर्वक अनुरोध भेजा, जहाँ प्रॉक्सी हमें अनुरोध भेजने की अनुमति नहीं देता।
=> tcpdump की जाँच करने पर हम देखते हैं कि, tcpdump ने भेजे गए DNS पैकेट कैप्चर किए -> /admin.php में छिपे फ़ंक्शन को सफलतापूर्वक निष्पादित किया गया।