9200 - Pentesting Elasticsearch

Support HackTricks

Basic information

Elasticsearch είναι μια κατανεμημένη, ανοιχτού κώδικα μηχανή αναζήτησης και ανάλυσης για όλους τους τύπους δεδομένων. Είναι γνωστή για την ταχύτητά της, κλιμακωσιμότητα και απλές REST APIs. Χτισμένη πάνω στον Apache Lucene, κυκλοφόρησε για πρώτη φορά το 2010 από την Elasticsearch N.V. (τώρα γνωστή ως Elastic). Το Elasticsearch είναι το βασικό συστατικό του Elastic Stack, μιας συλλογής εργαλείων ανοιχτού κώδικα για την εισαγωγή, εμπλουτισμό, αποθήκευση, ανάλυση και οπτικοποίηση δεδομένων. Αυτή η στοίβα, που αναφέρεται συνήθως ως ELK Stack, περιλαμβάνει επίσης το Logstash και το Kibana, και τώρα έχει ελαφριούς πράκτορες αποστολής δεδομένων που ονομάζονται Beats.

What is an Elasticsearch index?

Ένας δείκτης Elasticsearch είναι μια συλλογή σχετικών εγγράφων που αποθηκεύονται ως JSON. Κάθε έγγραφο αποτελείται από κλειδιά και τις αντίστοιχες τιμές τους (αλφαριθμητικά, αριθμούς, boolean, ημερομηνίες, πίνακες, γεωγραφικές τοποθεσίες, κ.λπ.).

Το Elasticsearch χρησιμοποιεί μια αποδοτική δομή δεδομένων που ονομάζεται αντεστραμμένος δείκτης για να διευκολύνει τις γρήγορες αναζητήσεις πλήρους κειμένου. Αυτός ο δείκτης καταγράφει κάθε μοναδική λέξη στα έγγραφα και προσδιορίζει τα έγγραφα στα οποία εμφανίζεται κάθε λέξη.

Κατά τη διαδικασία ευρετηρίασης, το Elasticsearch αποθηκεύει τα έγγραφα και κατασκευάζει τον αντεστραμμένο δείκτη, επιτρέποντας σχεδόν αναζητήσεις σε πραγματικό χρόνο. Η API δείκτη χρησιμοποιείται για την προσθήκη ή την ενημέρωση εγγράφων JSON εντός ενός συγκεκριμένου δείκτη.

Προεπιλεγμένη θύρα: 9200/tcp

Manual Enumeration

Το πρωτόκολλο που χρησιμοποιείται για την πρόσβαση στο Elasticsearch είναι το HTTP. Όταν το προσπελάσετε μέσω HTTP, θα βρείτε κάποιες ενδιαφέρουσες πληροφορίες: http://10.10.10.115:9200/

Αν δεν δείτε αυτή την απάντηση προσπελάζοντας το /, δείτε την επόμενη ενότητα.

Authentication

Από προεπιλογή, το Elasticsearch δεν έχει ενεργοποιημένη την αυθεντικοποίηση, οπότε από προεπιλογή μπορείτε να έχετε πρόσβαση σε όλα μέσα στη βάση δεδομένων χωρίς να χρησιμοποιήσετε διαπιστευτήρια.

Μπορείτε να επιβεβαιώσετε ότι η αυθεντικοποίηση είναι απενεργοποιημένη με ένα αίτημα προς:

curl -X GET "ELASTICSEARCH-SERVER:9200/_xpack/security/user"
{"error":{"root_cause":[{"type":"exception","reason":"Security must be explicitly enabled when using a [basic] license. Enable security by setting [xpack.security.enabled] to [true] in the elasticsearch.yml file and restart the node."}],"type":"exception","reason":"Security must be explicitly enabled when using a [basic] license. Enable security by setting [xpack.security.enabled] to [true] in the elasticsearch.yml file and restart the node."},"status":500}

Ωστόσο, αν στείλετε ένα αίτημα στο / και λάβετε μια απάντηση όπως η παρακάτω:

{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}

Αυτό σημαίνει ότι η αυθεντικοποίηση είναι ρυθμισμένη και χρειάζεστε έγκυρα διαπιστευτήρια για να αποκτήσετε οποιαδήποτε πληροφορία από το elasticsearch. Στη συνέχεια, μπορείτε να δοκιμάσετε να το σπάσετε (χρησιμοποιεί HTTP basic auth, οπότε οτιδήποτε μπορεί να σπάσει το HTTP basic auth μπορεί να χρησιμοποιηθεί). Εδώ έχετε μια λίστα με προεπιλεγμένα ονόματα χρήστη: elastic (superuser), remote_monitoring_user, beats_system, logstash_system, kibana, kibana_system, apm_system, _anonymous_._ Οι παλαιότερες εκδόσεις του Elasticsearch έχουν τον προεπιλεγμένο κωδικό πρόσβασης changeme για αυτόν τον χρήστη.

curl -X GET http://user:password@IP:9200/

Βασική Καταμέτρηση Χρηστών

#List all roles on the system:
curl -X GET "ELASTICSEARCH-SERVER:9200/_security/role"

#List all users on the system:
curl -X GET "ELASTICSEARCH-SERVER:9200/_security/user"

#Get more information about the rights of an user:
curl -X GET "ELASTICSEARCH-SERVER:9200/_security/user/<USERNAME>"

Elastic Info

Here are some endpoints that you can access via GET to obtain some information about elasticsearch:

_cat/_cluster/_security

/_cat/segments

/_cluster/allocation/explain

/_security/user

/_cat/shards

/_cluster/settings

/_security/privilege

/_cat/repositories

/_cluster/health

/_security/role_mapping

/_cat/recovery

/_cluster/state

/_security/role

/_cat/plugins

/_cluster/stats

/_security/api_key

/_cat/pending_tasks

/_cluster/pending_tasks

/_cat/nodes

/_nodes

/_cat/tasks

/_nodes/usage

/_cat/templates

/_nodes/hot_threads

/_cat/thread_pool

/_nodes/stats

/_cat/ml/trained_models

/_tasks

/_cat/transforms/_all

/_remote/info

/_cat/aliases

/_cat/allocation

/_cat/ml/anomaly_detectors

/_cat/count

/_cat/ml/data_frame/analytics

/_cat/ml/datafeeds

/_cat/fielddata

/_cat/health

/_cat/indices

/_cat/master

/_cat/nodeattrs

/_cat/nodes

These endpoints were taken from the documentation where you can find more. Also, if you access /_cat the response will contain the /_cat/* endpoints supported by the instance.

In /_security/user (if auth enabled) you can see which user has role superuser.

Indices

You can gather all the indices accessing http://10.10.10.115:9200/_cat/indices?v

health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .kibana 6tjAYZrgQ5CwwR0g6VOoRg   1   0          1            0        4kb            4kb
yellow open   quotes  ZG2D1IqkQNiNZmi2HRImnQ   5   1        253            0    262.7kb        262.7kb
yellow open   bank    eSVpNfCfREyYoVigNWcrMw   5   1       1000            0    483.2kb        483.2kb

Για να αποκτήσετε πληροφορίες σχετικά με το ποιο είδος δεδομένων αποθηκεύεται μέσα σε έναν δείκτη μπορείτε να αποκτήσετε πρόσβαση: http://host:9200/<index> από το παράδειγμα σε αυτή την περίπτωση http://10.10.10.115:9200/bank

Dump index

Αν θέλετε να εξάγετε όλα τα περιεχόμενα ενός δείκτη μπορείτε να αποκτήσετε πρόσβαση: http://host:9200/<index>/_search?pretty=true όπως http://10.10.10.115:9200/bank/_search?pretty=true

Πάρτε μια στιγμή για να συγκρίνετε τα περιεχόμενα κάθε εγγράφου (καταχώριση) μέσα στον δείκτη bank και τα πεδία αυτού του δείκτη που είδαμε στην προηγούμενη ενότητα.

Έτσι, σε αυτό το σημείο μπορεί να παρατηρήσετε ότι υπάρχει ένα πεδίο που ονομάζεται "total" μέσα σε "hits" που υποδεικνύει ότι βρέθηκαν 1000 έγγραφα μέσα σε αυτόν τον δείκτη αλλά μόνο 10 ανακτήθηκαν. Αυτό συμβαίνει επειδή κατά προεπιλογή υπάρχει όριο 10 εγγράφων. Αλλά, τώρα που ξέρετε ότι αυτός ο δείκτης περιέχει 1000 έγγραφα, μπορείτε να εξάγετε όλα αυτά υποδεικνύοντας τον αριθμό των καταχωρίσεων που θέλετε να εξάγετε στην παράμετρο size: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000asd Σημείωση: Αν υποδείξετε μεγαλύτερο αριθμό, όλες οι καταχωρίσεις θα εξαχθούν ούτως ή άλλως, για παράδειγμα θα μπορούσατε να υποδείξετε size=9999 και θα ήταν περίεργο αν υπήρχαν περισσότερες καταχωρίσεις (αλλά θα πρέπει να ελέγξετε).

Dump all

Για να εξάγετε όλα μπορείτε απλά να πάτε στο ίδιο μονοπάτι όπως πριν αλλά χωρίς να υποδείξετε κανέναν δείκτη http://host:9200/_search?pretty=true όπως http://10.10.10.115:9200/_search?pretty=true Θυμηθείτε ότι σε αυτή την περίπτωση θα εφαρμοστεί το προεπιλεγμένο όριο των 10 αποτελεσμάτων. Μπορείτε να χρησιμοποιήσετε την παράμετρο size για να εξάγετε μια μεγαλύτερη ποσότητα αποτελεσμάτων. Διαβάστε την προηγούμενη ενότητα για περισσότερες πληροφορίες.

Αν ψάχνετε για κάποιες πληροφορίες μπορείτε να κάνετε μια ακατέργαστη αναζήτηση σε όλους τους δείκτες πηγαίνοντας στο http://host:9200/_search?pretty=true&q=<search_term> όπως στο http://10.10.10.115:9200/_search?pretty=true&q=Rockwell

Αν θέλετε απλά να αναζητήσετε σε έναν δείκτη μπορείτε απλά να τον προσδιορίσετε στο μονοπάτι: http://host:9200/<index>/_search?pretty=true&q=<search_term>

Σημειώστε ότι η παράμετρος q που χρησιμοποιείται για την αναζήτηση περιεχομένου υποστηρίζει κανονικές εκφράσεις

Μπορείτε επίσης να χρησιμοποιήσετε κάτι όπως https://github.com/misalabs/horuz για να κάνετε fuzz σε μια υπηρεσία elasticsearch.

Write permissions

Μπορείτε να ελέγξετε τα δικαιώματα εγγραφής σας προσπαθώντας να δημιουργήσετε ένα νέο έγγραφο μέσα σε έναν νέο δείκτη εκτελώντας κάτι όπως το παρακάτω:

curl -X POST '10.10.10.115:9200/bookindex/books' -H 'Content-Type: application/json' -d'
{
"bookId" : "A00-3",
"author" : "Sankaran",
"publisher" : "Mcgrahill",
"name" : "how to get a job"
}'

Αυτή η εντολή θα δημιουργήσει έναν νέο δείκτη με το όνομα bookindex με ένα έγγραφο τύπου books που έχει τα χαρακτηριστικά "bookId", "author", "publisher" και "name"

Παρατηρήστε πώς ο νέος δείκτης εμφανίζεται τώρα στη λίστα:

Και σημειώστε τις αυτόματα δημιουργημένες ιδιότητες:

Αυτόματη Αρίθμηση

Ορισμένα εργαλεία θα αποκτήσουν κάποια από τα δεδομένα που παρουσιάστηκαν προηγουμένως:

msf > use auxiliary/scanner/elasticsearch/indices_enum

Shodan

  • port:9200 elasticsearch

Υποστήριξε το HackTricks

Last updated