
Shellshock
Shellshock
docker-compose.yml, poc.py फ़ाइलें डाउनलोड करें कृपया pip install requests के माध्यम से requests लाइब्रेरी को डाउनलोड करें!!! यदि आप uv का उपयोग कर रहे हैं, तो कृपया uv के माध्यम से requests लाइब्रेरी को venv के अंदर रखें!!!
| CVE आधिकारिक विवरण |
|---|
| GNU Bash 4.3 से पिछले संस्करणों में, एन्वायरनमेंट वेरिएबल मानों में फ़ंक्शन परिभाषा के बाद आने वाली स्ट्रिंग को संसाधित करने में एक समस्या थी। इस भेद्यता का उपयोग करके, एक दूरस्थ हमलावर हेरफेर किए गए एन्वायरनमेंट के माध्यम से मनमाना कोड निष्पादित कर सकता था। यह भेद्यता OpenSSH sshd के ForceCommand फीचर, Apache HTTP सर्वर के mod_cgi और mod_cgid मॉड्यूल, अनिर्दिष्ट DHCP क्लाइंट्स पर चलने वाली स्क्रिप्ट्स, और कई अन्य स्थितियों में पाई गई जहाँ Bash निष्पादित करने की अनुमति और एन्वायरनमेंट वेरिएबल सेटिंग विभिन्न अनुमति सीमाओं को पार करती है। इसे "ShellShock" भी कहा जाता है। नोट: इस समस्या का प्रारंभिक सुधार गलत था, और गलत सुधार के बाद भी मौजूद इस भेद्यता को हल करने के लिए CVE-2014-7169 निर्दिष्ट किया गया। |

| पर्यावरण सेटअप |
|---|
डॉकर फ़ाइल कॉन्फ़िगरेशन
| os | web server | bash version |
|---|---|---|
| Debian 10 | Apach | 4.2.37(1) |

Dockerfile इस प्रकार लिखें कि जब docker compose up कमांड चलाया जाए तो वेब सर्वर खुला रहे।
चूँकि Dockerfile में OS, Apache आदि सभी बाहरी रिपॉजिटरी से डाउनलोड किए गए थे, इसलिए बिल्ड की गई इमेज को टैग करके डॉकर हब पर push कर दिया गया और फिर उस इमेज को docker-compose.yml फ़ाइल में निर्दिष्ट कर दिया गया, ताकि मूल फ़ाइलें हटा दिए जाने पर भी कोई समस्या न हो।

| भेद्यता की शर्त |
|---|
Shellshock भेद्यता वाले Bash शेल की आवश्यकता है। मैंने bash शेल का 4.2.37(1) संस्करण डाउनलोड करके उपयोग किया।

इसके अलावा, कोड को एन्वायरनमेंट वेरिएबल में रजिस्टर करने के बाद bash को कॉल करना आवश्यक है ताकि कोड निष्पादित हो, इसलिए एक ऐसा प्रोग्राम होना चाहिए जो bash को कॉल कर सके। मैंने CGI प्रोग्राम डाउनलोड किया जो वेब सर्वर पर क्लाइंट अनुरोधों को संसाधित करने के लिए उपयोग किया जाता था। CGI मानक (RFC 3875) के अनुसार, वेब सर्वर ब्राउज़र द्वारा भेजी गई सभी हेडर जानकारी को लिनक्स एन्वायरनमेंट वेरिएबल में डालकर संसाधित करने के लिए डिज़ाइन किया गया है। इस शर्त के तहत, वेब सर्वर एक अनुरोध भेजता है और वह हेडर जानकारी एन्वायरनमेंट वेरिएबल में संग्रहीत हो जाती है (CGI मानक के अनुसार)। CGI द्वारा उस bash शेल को कॉल करने से हमला पूरा होता है जिसमें एन्वायरनमेंट वेरिएबल में फ़ंक्शन परिभाषा के बाद आने वाली स्ट्रिंग को निष्पादित करने की भेद्यता है। अनुरोध (User-Agent हेडर में कोड डालकर भेजना) -> CGI द्वारा bash कॉल -> रिवर्स शेल कनेक्शन
| पुनरुत्पादन प्रक्रिया |
|---|

| प्राप्त परिणाम |
|---|
पुनरुत्पादन प्रक्रिया के चरण 2 में सुनने वाला टर्मिनल कंटेनर के अंदर बैश शेल से जुड़ जाता है, और whoami, id जैसे कमांड निष्पादित कर सकता है।

| भेद्यता का कारण |
|---|
'''
if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
{
string_length = strlen (string);
temp_string = (char *)xmalloc (3 + string_length + char_index);
strcpy (temp_string, name);
temp_string[char_index] = ' ';
strcpy (temp_string + char_index + 1, string);
parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
// 이하 생략
'''
भेद्यता का कारण bash शेल कोड के variables.c फ़ाइल के अंदर initialize_shell_variables फ़ंक्शन में है। यह फ़ंक्शन भी बहुत लंबा है, इसलिए केवल मुख्य भाग काट कर दिखाया गया है।
'''
if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
'''
उपरोक्त if स्टेटमेंट STREQN ("() {", string, 4) के माध्यम से जाँच कर रहा है कि पहले 4 अक्षर "() {" हैं या नहीं। यदि मिलान होता है, तो इसे फ़ंक्शन मान लिया जाता है। आश्चर्यजनक रूप से, इसके बाद string पर कोई फ़िल्टरिंग नहीं है, जिससे समस्या उत्पन्न हुई।
'''
strcpy (temp_string, name);
temp_string[char_index] = ' ';
strcpy (temp_string + char_index + 1, string);
''' उपरोक्त कोड नाम और मान को जोड़ने की प्रक्रिया है। ऊपर जाँचे गए मान के अनुसार, string () { से शुरू होने वाला रूप है और name एन्वायरनमेंट वेरिएबल का नाम होगा। इस प्रकार एन्वायरनमेंट वेरिएबल के नाम और मान को संयोजित करके नीचे दिए गए कोड में पार्स करने के लिए भेजा जाता है। चूँकि फ़िल्टर केवल ऊपर () { की जाँच करने वाला भाग था, इसलिए फ़ंक्शन के बाद whoami, id, pwd जैसे कमांड जोड़ने पर भी वे सभी निष्पादित हो जाते हैं।
'''
parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
'''
| निवारण उपाय |
|---|
| Bash को Shellshock भेद्यता से सुरक्षित संस्करण में अपग्रेड करें। |
| Bash शेल को कॉल करने वाले प्रोग्राम का उपयोग न करें। |