mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
173 lines
16 KiB
Markdown
173 lines
16 KiB
Markdown
# 9200 - Pentesting Elasticsearch
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## 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**. Κάθε έγγραφο αποτελείται από **κλειδιά** και τις αντίστοιχες **τιμές** τους (αλφαριθμητικά, αριθμούς, booleans, ημερομηνίες, πίνακες, γεωτοποθεσίες, κ.λπ.).
|
||
|
||
Το Elasticsearch χρησιμοποιεί μια αποδοτική δομή δεδομένων που ονομάζεται **αντεστραμμένος δείκτης** για να διευκολύνει τις γρήγορες αναζητήσεις πλήρους κειμένου. Αυτός ο δείκτης καταγράφει κάθε μοναδική λέξη στα έγγραφα και προσδιορίζει τα έγγραφα στα οποία εμφανίζεται κάθε λέξη.
|
||
|
||
Κατά τη διαδικασία ευρετηρίασης, το Elasticsearch αποθηκεύει τα έγγραφα και κατασκευάζει τον αντεστραμμένο δείκτη, επιτρέποντας σχεδόν αναζητήσεις σε πραγματικό χρόνο. Η **index API** χρησιμοποιείται για την προσθήκη ή την ενημέρωση εγγράφων JSON εντός ενός συγκεκριμένου δείκτη.
|
||
|
||
**Default port**: 9200/tcp
|
||
|
||
## Manual Enumeration
|
||
|
||
### Banner
|
||
|
||
Το πρωτόκολλο που χρησιμοποιείται για την πρόσβαση στο Elasticsearch είναι το **HTTP**. Όταν το προσπελάσετε μέσω HTTP, θα βρείτε κάποιες ενδιαφέρουσες πληροφορίες: `http://10.10.10.115:9200/`
|
||
|
||
.png>)
|
||
|
||
Αν δεν δείτε αυτή την απάντηση προσπελάζοντας το `/`, δείτε την επόμενη ενότητα.
|
||
|
||
### Authentication
|
||
|
||
**Από προεπιλογή, το Elasticsearch δεν έχει ενεργοποιημένη την αυθεντικοποίηση**, οπότε από προεπιλογή μπορείτε να έχετε πρόσβαση σε όλα τα δεδομένα της βάσης χωρίς να χρησιμοποιήσετε διαπιστευτήρια.
|
||
|
||
Μπορείτε να επιβεβαιώσετε ότι η αυθεντικοποίηση είναι απενεργοποιημένη με ένα αίτημα προς:
|
||
```bash
|
||
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}
|
||
```
|
||
**Ωστόσο**, αν στείλετε ένα αίτημα στο `/` και λάβετε μια απάντηση όπως η παρακάτω:
|
||
```bash
|
||
{"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. Στη συνέχεια, μπορείτε να [**δοκιμάσετε να το σπάσετε**](../generic-hacking/brute-force.md#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/
|
||
```
|
||
### Βασική Αριθμητική Χρηστών
|
||
```bash
|
||
#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
|
||
|
||
Εδώ είναι μερικά endpoints που μπορείτε να **πρόσβαση μέσω GET** για να **αποκτήσετε** κάποιες **πληροφορίες** σχετικά με το 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 | | |
|
||
|
||
Αυτά τα endpoints [**λήφθηκαν από την τεκμηρίωση**](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) όπου μπορείτε να **βρείτε περισσότερα**.\
|
||
Επίσης, αν αποκτήσετε πρόσβαση στο `/_cat`, η απάντηση θα περιέχει τα `/_cat/*` endpoints που υποστηρίζονται από την εγκατάσταση.
|
||
|
||
Στο `/_security/user` (αν είναι ενεργοποιημένη η αυθεντικοποίηση) μπορείτε να δείτε ποιος χρήστης έχει ρόλο `superuser`.
|
||
|
||
### Indices
|
||
|
||
Μπορείτε να **συγκεντρώσετε όλους τους δείκτες** αποκτώντας πρόσβαση στο `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`
|
||
|
||
.png>)
|
||
|
||
### Dump index
|
||
|
||
Αν θέλετε να **εξάγετε όλα τα περιεχόμενα** ενός δείκτη μπορείτε να αποκτήσετε πρόσβαση: `http://host:9200/<index>/_search?pretty=true` όπως `http://10.10.10.115:9200/bank/_search?pretty=true`
|
||
|
||
.png>)
|
||
|
||
_Πάρτε μια στιγμή για να συγκρίνετε τα περιεχόμενα κάθε εγγράφου (καταχώριση) μέσα στον δείκτη bank και τα πεδία αυτού του δείκτη που είδαμε στην προηγούμενη ενότητα._
|
||
|
||
Έτσι, σε αυτό το σημείο μπορεί να παρατηρήσετε ότι **υπάρχει ένα πεδίο που ονομάζεται "total" μέσα σε "hits"** που υποδεικνύει ότι **βρέθηκαν 1000 έγγραφα** μέσα σε αυτόν τον δείκτη αλλά μόνο 10 ανακτήθηκαν. Αυτό συμβαίνει επειδή **κατά προεπιλογή υπάρχει όριο 10 εγγράφων**.\
|
||
Αλλά, τώρα που ξέρετε ότι **αυτός ο δείκτης περιέχει 1000 έγγραφα**, μπορείτε να **εξάγετε όλα αυτά** υποδεικνύοντας τον αριθμό των καταχωρίσεων που θέλετε να εξάγετε στην παράμετρο **`size`**: `http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`asd\
|
||
\_Σημείωση: Αν υποδείξετε μεγαλύτερο αριθμό, όλες οι καταχωρίσεις θα εξαχθούν ούτως ή άλλως, για παράδειγμα, θα μπορούσατε να υποδείξετε `size=9999` και θα ήταν περίεργο αν υπήρχαν περισσότερες καταχωρίσεις (αλλά θα πρέπει να ελέγξετε)._
|
||
|
||
### Dump all
|
||
|
||
Για να εξάγετε όλα μπορείτε απλά να πάτε στον **ίδιο δρόμο όπως πριν αλλά χωρίς να υποδείξετε κανέναν δείκτη** `http://host:9200/_search?pretty=true` όπως `http://10.10.10.115:9200/_search?pretty=true`\
|
||
Θυμηθείτε ότι σε αυτή την περίπτωση θα εφαρμοστεί το **προεπιλεγμένο όριο των 10** αποτελεσμάτων. Μπορείτε να χρησιμοποιήσετε την παράμετρο `size` για να εξάγετε μια **μεγαλύτερη ποσότητα αποτελεσμάτων**. Διαβάστε την προηγούμενη ενότητα για περισσότερες πληροφορίες.
|
||
|
||
### Search
|
||
|
||
Αν ψάχνετε για κάποιες πληροφορίες μπορείτε να κάνετε μια **ακατέργαστη αναζήτηση σε όλους τους δείκτες** πηγαίνοντας στο `http://host:9200/_search?pretty=true&q=<search_term>` όπως στο `http://10.10.10.115:9200/_search?pretty=true&q=Rockwell`
|
||
|
||
.png>)
|
||
|
||
Αν θέλετε απλά να **αναζητήσετε σε έναν δείκτη** μπορείτε απλά να **τον προσδιορίσετε** στο **μονοπάτι**: `http://host:9200/<index>/_search?pretty=true&q=<search_term>`
|
||
|
||
_Σημειώστε ότι η παράμετρος q που χρησιμοποιείται για την αναζήτηση περιεχομένου **υποστηρίζει κανονικές εκφράσεις**_
|
||
|
||
Μπορείτε επίσης να χρησιμοποιήσετε κάτι όπως [https://github.com/misalabs/horuz](https://github.com/misalabs/horuz) για να κάνετε fuzz σε μια υπηρεσία elasticsearch.
|
||
|
||
### Write permissions
|
||
|
||
Μπορείτε να ελέγξετε τις άδειες εγγραφής σας προσπαθώντας να δημιουργήσετε ένα νέο έγγραφο μέσα σε έναν νέο δείκτη εκτελώντας κάτι όπως το παρακάτω:
|
||
```bash
|
||
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_"
|
||
|
||
Παρατηρήστε πώς το **νέο ευρετήριο εμφανίζεται τώρα στη λίστα**:
|
||
|
||
.png>)
|
||
|
||
Και σημειώστε τις **αυτόματα δημιουργημένες ιδιότητες**:
|
||
|
||
.png>)
|
||
|
||
## Αυτόματη Αρίθμηση
|
||
|
||
Ορισμένα εργαλεία θα αποκτήσουν κάποια από τα δεδομένα που παρουσιάστηκαν προηγουμένως:
|
||
```bash
|
||
msf > use auxiliary/scanner/elasticsearch/indices_enum
|
||
```
|
||
{{#ref}}
|
||
https://github.com/theMiddleBlue/nmap-elasticsearch-nse
|
||
{{#endref}}
|
||
|
||
## Shodan
|
||
|
||
- `port:9200 elasticsearch`
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|