5984,6984 - Pentesting CouchDB
Βασικές Πληροφορίες
Το CouchDB είναι μια ευέλικτη και ισχυρή βάση δεδομένων προσανατολισμένη σε έγγραφα που οργανώνει τα δεδομένα χρησιμοποιώντας μια δομή χάρτη-κλειδί εντός κάθε έγγραφου. Τα πεδία μέσα στο έγγραφο μπορούν να αναπαρασταθούν ως ζεύγη κλειδιού/τιμής, λίστες ή χάρτες, παρέχοντας ευελιξία στην αποθήκευση και ανάκτηση δεδομένων.
Κάθε έγγραφο που αποθηκεύεται στο CouchDB ανατίθεται ένας μοναδικός αναγνωριστικός αριθμός (_id
) στο επίπεδο του εγγράφου. Επιπλέον, κάθε τροποποίηση που γίνεται και αποθηκεύεται στη βάση δεδομένων ανατίθεται ένας αριθμός αναθεώρησης (_rev
). Αυτός ο αριθμός αναθεώρησης επιτρέπει την αποτελεσματική παρακολούθηση και διαχείριση των αλλαγών, διευκολύνοντας την εύκολη ανάκτηση και συγχρονισμό των δεδομένων εντός της βάσης δεδομένων.
Προεπιλεγμένη θύρα: 5984(http), 6984(https)
Αυτόματη Απαρίθμηση
Χειροκίνητη Απαρίθμηση
Μπάνερ
Κατά την χειροκίνητη απαρίθμηση, ένας από τους πρώτους τρόπους για να αποκτήσουμε πληροφορίες για ένα CouchDB σύστημα είναι να εξάγουμε το μπάνερ του. Αυτό μπορεί να γίνει με την αποστολή ενός HTTP αιτήματος GET στην αρχική διεύθυνση του CouchDB. Οι πληροφορίες που μπορούμε να αντλήσουμε από το μπάνερ περιλαμβάνουν την έκδοση του CouchDB, το όνομα του συστήματος, το λειτουργικό σύστημα και άλλες σημαντικές πληροφορίες. Αυτές οι πληροφορίες μπορούν να μας βοηθήσουν να κατανοήσουμε καλύτερα το σύστημα και να εντοπίσουμε πιθανές ευπάθειες.
Για να εξάγουμε το μπάνερ του CouchDB, μπορούμε να χρησιμοποιήσουμε την εντολή curl
ως εξής:
Αντικαταστήστε το <target_ip>
με την πραγματική διεύθυνση IP του στόχου. Αν η απάντηση περιέχει πληροφορίες για το CouchDB, τότε έχουμε επιτύχει την εξαγωγή του μπάνερ.
Αυτό εκδίδει ένα αίτημα GET στην εγκατεστημένη περίπτωση του CouchDB. Η απάντηση θα πρέπει να μοιάζει με μία από τις παρακάτω:
Σημειώστε ότι αν έχετε πρόσβαση στη ρίζα του couchdb και λάβετε ένα 401 Unauthorized
με κάτι τέτοιο: {"error":"unauthorized","reason":"Authentication required."}
δεν θα μπορέσετε να έχετε πρόσβαση στο banner ή οποιοδήποτε άλλο endpoint.
Ενημέρωση Απαρίθμησης
Αυτά είναι τα 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
Λίστα Βάσεων Δεδομένων
Εάν αυτό το αίτημα απαντά με ένα 401 μη εξουσιοδοτημένο, τότε χρειάζεστε κάποια έγκυρα διαπιστευτήρια για να αποκτήσετε πρόσβαση στη βάση δεδομένων:
Για να βρείτε έγκυρα διαπιστευτήρια, μπορείτε να προσπαθήσετε να δοκιμάσετε brute force στην υπηρεσία.
Αυτό είναι ένα παράδειγμα από μια απάντηση του couchdb όταν έχετε επαρκή δικαιώματα για να εμφανίσετε τις βάσεις δεδομένων (Είναι απλά μια λίστα με τις βάσεις δεδομένων):
Πληροφορίες Βάσης Δεδομένων
Μπορείτε να αποκτήσετε ορισμένες πληροφορίες για τη βάση δεδομένων (όπως αριθμός αρχείων και μεγέθη) αποκτώντας πρόσβαση στο όνομα της βάσης δεδομένων:
Λίστα Εγγράφων
Αναφέρει κάθε καταχώρηση μέσα σε μια βάση δεδομένων
Ανάγνωση Εγγράφου
Διαβάστε το περιεχόμενο ενός εγγράφου μέσα σε μια βάση δεδομένων:
Ανόδος Προνομίων στο CouchDB CVE-2017-12635
Χάρη στις διαφορές μεταξύ των αναλυτών JSON της Erlang και της JavaScript, μπορείτε να δημιουργήσετε έναν διαχειριστή χρήστη με διαπιστευτήρια hacktricks:hacktricks
με το ακόλουθο αίτημα:
Περισσότερες πληροφορίες για αυτήν την ευπάθεια εδώ.
CouchDB RCE
Επισκόπηση Ασφάλειας Μπισκότου Erlang
Παράδειγμα από εδώ.
Στην τεκμηρίωση του CouchDB, ειδικότερα στην ενότητα που αφορά τη ρύθμιση του cluster (σύνδεσμος), συζητείται η χρήση θυρών από το CouchDB σε κατάσταση cluster. Αναφέρεται ότι, όπως και σε αυτόνομη κατάσταση, χρησιμοποιείται η θύρα 5984
. Επιπλέον, η θύρα 5986
είναι για τις τοπικές διεπαφές των κόμβων και, σημαντικότερο, η Erlang απαιτεί την TCP θύρα 4369
για τον Erlang Port Mapper Daemon (EPMD), που διευκολύνει την επικοινωνία των κόμβων σε ένα Erlang cluster. Αυτή η ρύθμιση δημιουργεί ένα δίκτυο όπου κάθε κόμβος συνδέεται με κάθε άλλο κόμβο.
Μια κρίσιμη ασφαλείας ειδοποίηση αναφέρεται για τη θύρα 4369
. Εάν αυτή η θύρα είναι προσβάσιμη μέσω του Διαδικτύου ή οποιουδήποτε μη αξιόπιστου δικτύου, η ασφάλεια του συστήματος εξαρτάται σε μεγάλο βαθμό από ένα μοναδικό αναγνωριστικό που ονομάζεται "μπισκότο" (cookie). Αυτό το μπισκότο λειτουργεί ως προστασία. Για παράδειγμα, σε μια δεδομένη λίστα διεργασιών, μπορεί να παρατηρηθεί το μπισκότο με το όνομα "monster", που υποδηλώνει τον λειτουργικό του ρόλο στο πλαίσιο ασφαλείας του συστήματος.
Για όσους ενδιαφέρονται να κατανοήσουν πώς αυτό το "cookie" μπορεί να εκμεταλλευτεί για την εκτέλεση απομακρυσμένου κώδικα (RCE) στο πλαίσιο των συστημάτων Erlang, υπάρχει μια αφιερωμένη ενότητα για περαιτέρω ανάγνωση. Αναλύονται οι μεθοδολογίες για την εκμετάλλευση των cookies Erlang με μη εξουσιοδοτημένο τρόπο για την απόκτηση ελέγχου πάνω σε συστήματα. Μπορείτε να εξερευνήσετε τον λεπτομερή οδηγό για την κατάχρηση των cookies Erlang για RCE εδώ.
Εκμεταλλευόμενοι το CVE-2018-8007 μέσω τροποποίησης του local.ini
Παράδειγμα από εδώ.
Μια πρόσφατα αποκαλυφθείσα ευπάθεια, CVE-2018-8007, που επηρεάζει το Apache CouchDB, εξερευνήθηκε, αποκαλύπτοντας ότι η εκμετάλλευση απαιτεί δικαιώματα εγγραφής στο αρχείο local.ini
. Παρόλο που δεν είναι άμεσα εφαρμόσιμο στο αρχικό σύστημα στόχο λόγω περιορισμών ασφαλείας, έγιναν τροποποιήσεις για να παραχωρηθεί πρόσβαση εγγραφής στο αρχείο local.ini
για σκοπούς εξερεύνησης. Παρέχονται λεπτομερείς βήματα και παραδείγματα κώδικα παρακάτω, που δείχνουν τη διαδικασία.
Πρώτα, προετοιμάζουμε το περιβάλλον εξασφαλίζοντας ότι το αρχείο local.ini
είναι εγγράψιμο, επαληθεύοντας τα δικαιώματα πρόσβασης:
Για να εκμεταλλευτείτε την ευπάθεια, εκτελείται ένας εντολή curl, προστίθεται στον στόχο cors/origins
της διαμόρφωσης local.ini
. Αυτό εισάγει ένα νέο προέλευσης μαζί με επιπλέον εντολές στην ενότητα [os_daemons]
, με σκοπό την εκτέλεση αυθαίρετου κώδικα:
Ο επόμενος έλεγχος επιβεβαιώνει την εισαγωγή της διαμόρφωσης στο local.ini
, συγκρίνοντάς το με ένα αντίγραφο ασφαλείας για να επισημάνει τις αλλαγές:
Αρχικά, το αναμενόμενο αρχείο (/tmp/0xdf
) δεν υπάρχει, υποδηλώνοντας ότι η εντολή που εισήχθη δεν έχει εκτελεστεί ακόμα. Περαιτέρω έρευνα αποκαλύπτει ότι εκτελούνται διεργασίες που σχετίζονται με το CouchDB, συμπεριλαμβανομένης μίας που θα μπορούσε ενδεχομένως να εκτελέσει την εισαγόμενη εντολή:
Τερματίζοντας την εντοπισμένη διεργασία του CouchDB και επιτρέποντας στο σύστημα να την επανεκκινήσει αυτόματα, ενεργοποιείται η εκτέλεση της ενθετωμένης εντολής, όπως επιβεβαιώνεται από την ύπαρξη του προηγουμένως απουσιάζοντος αρχείου:
Η εξερεύνηση αυτή επιβεβαιώνει την εφαρμοσιμότητα της εκμετάλλευσης 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 και την επιβεβαίωση της απουσίας της αναμενόμενης διαδρομής των διακομιστών ερωτημάτων.
Για να προσαρμοστεί στην έκδοση 2.0 του CouchDB, χρησιμοποιείται ένα νέο μονοπάτι:
Οι προσπάθειες για προσθήκη και εκτέλεση ενός νέου διακομιστή ερωτημάτων αντιμετωπίστηκαν με σφάλματα που σχετίζονται με τα δικαιώματα, όπως φαίνεται από την παρακάτω έξοδο:
Περαιτέρω έρευνα αποκάλυψε προβλήματα άδειας με το αρχείο local.ini
, το οποίο δεν ήταν εγγράψιμο. Με τροποποίηση των δικαιωμάτων αρχείου με ρίζα ή πρόσβαση homer, έγινε δυνατή η συνέχιση:
Οι επόμενες προσπάθειες για προσθήκη του διακομιστή ερωτημάτων επιτεύχθηκαν, όπως αποδεικνύεται από την απουσία μηνυμάτων σφάλματος στην απόκριση. Η επιτυχής τροποποίηση του αρχείου local.ini
επιβεβαιώθηκε μέσω σύγκρισης αρχείων:
Η διαδικασία συνεχίστηκε με τη δημιουργία μιας βάσης δεδομένων και ενός εγγράφου, ακολουθούμενη από μια προσπάθεια εκτέλεσης κώδικα μέσω μιας προσαρμοσμένης προβολής που αντιστοιχεί στον νεοπροσταθέντα διακομιστή ερωτήσεων:
Ένα σύνοψη με έναν εναλλακτικό φορτίο παρέχει περαιτέρω εισαγωγή στην εκμετάλλευση του CVE-2017-12636 υπό συγκεκριμένες συνθήκες. Χρήσιμοι πόροι για την εκμετάλλευση αυτής της ευπάθειας περιλαμβάνουν:
Shodan
port:5984 couchdb
Αναφορές
Last updated