hacktricks/network-services-pentesting/9200-pentesting-elasticsearch.md

13 KiB

9200 - Test di penetrazione su Elasticsearch

Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Informazioni di base

Elasticsearch è un motore di ricerca e analisi distribuito, open source per tutti i tipi di dati. È noto per la sua velocità, scalabilità e semplici API REST. Costruito su Apache Lucene, è stato rilasciato per la prima volta nel 2010 da Elasticsearch N.V. (ora conosciuta come Elastic). Elasticsearch è il componente principale dello stack Elastic, una collezione di strumenti open source per l'ingestione, l'arricchimento, lo storage, l'analisi e la visualizzazione dei dati. Questo stack, comunemente chiamato ELK Stack, include anche Logstash e Kibana, e ora ha agenti leggeri di invio dati chiamati Beats.

Cos'è un indice Elasticsearch?

Un indice Elasticsearch è una raccolta di documenti correlati memorizzati come JSON. Ogni documento è composto da chiavi e i relativi valori (stringhe, numeri, booleani, date, array, geolocalizzazioni, ecc.).

Elasticsearch utilizza una struttura dati efficiente chiamata indice invertito per facilitare ricerche full-text veloci. Questo indice elenca ogni parola univoca nei documenti e identifica i documenti in cui appare ciascuna parola.

Durante il processo di indicizzazione, Elasticsearch memorizza i documenti e costruisce l'indice invertito, consentendo ricerche quasi in tempo reale. L'API di indicizzazione viene utilizzata per aggiungere o aggiornare documenti JSON all'interno di un indice specifico.

Porta predefinita: 9200/tcp

Enumerazione Manuale

Banner

Il protocollo utilizzato per accedere a Elasticsearch è HTTP. Quando si accede tramite HTTP si troveranno alcune informazioni interessanti: http://10.10.10.115:9200/

Se non si vede quella risposta accedendo a /, vedere la sezione seguente.

Autenticazione

Per impostazione predefinita Elasticsearch non ha l'autenticazione abilitata, quindi di default è possibile accedere a tutto all'interno del database senza utilizzare alcuna credenziale.

È possibile verificare che l'autenticazione sia disabilitata con una richiesta a:

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}

Tuttavia, se invii una richiesta a / e ricevi una risposta come quella seguente:

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

Questo significa che l'autenticazione è configurata e hai bisogno di credenziali valide per ottenere informazioni da Elasticsearch. Quindi, puoi provare a eseguire un attacco di forza bruta (utilizza l'autenticazione di base HTTP, quindi qualsiasi strumento per il BF dell'autenticazione di base HTTP può essere utilizzato).
Qui hai un elenco di nomi utente predefiniti: elastic (superutente), remote_monitoring_user, beats_system, logstash_system, kibana, kibana_system, apm_system, _anonymous_._ Le versioni più vecchie di Elasticsearch hanno la password predefinita changeme per questo utente.

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

Enumerazione di base degli utenti

#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>"

Informazioni su Elastic

Ecco alcuni endpoint a cui puoi accedere tramite GET per ottenere informazioni su 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

Questi endpoint sono stati presi dalla documentazione dove puoi trovarne altri.
In /_security/user (se l'autenticazione è abilitata) puoi vedere quale utente ha il ruolo superuser.

Indici

Puoi raccogliere tutti gli indici accedendo a 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

Per ottenere informazioni su quale tipo di dati è salvato all'interno di un indice puoi accedere a: http://host:9200/<indice> ad esempio in questo caso http://10.10.10.115:9200/bank

Dump dell'indice

Se desideri scaricare tutti i contenuti di un indice puoi accedere a: http://host:9200/<indice>/_search?pretty=true come http://10.10.10.115:9200/bank/_search?pretty=true

Prenditi un momento per confrontare i contenuti di ciascun documento (voce) all'interno dell'indice bank e i campi di questo indice che abbiamo visto nella sezione precedente.

Quindi, a questo punto potresti notare che c'è un campo chiamato "total" all'interno di "hits" che indica che sono stati trovati 1000 documenti all'interno di questo indice ma solo 10 sono stati recuperati. Questo perché per impostazione predefinita c'è un limite di 10 documenti.
Ma, ora che sai che questo indice contiene 1000 documenti, puoi scaricarli tutti indicando il numero di voci che desideri scaricare nel parametro size: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000

Nota: Se indichi un numero maggiore, tutte le voci verranno comunque scaricate, ad esempio potresti indicare size=9999 e sarebbe strano se ci fossero più voci (ma dovresti controllare).

Dump di tutti

Per scaricare tutto puoi semplicemente andare al stesso percorso di prima ma senza indicare alcun indice http://host:9200/_search?pretty=true come http://10.10.10.115:9200/_search?pretty=true
Ricorda che in questo caso verrà applicato il limite predefinito di 10 risultati. Puoi utilizzare il parametro size per scaricare una quantità maggiore di risultati. Leggi la sezione precedente per ulteriori informazioni.

Ricerca

Se stai cercando informazioni puoi effettuare una ricerca grezza su tutti gli indici andando su http://host:9200/_search?pretty=true&q=<termine_di_ricerca> come in http://10.10.10.115:9200/_search?pretty=true&q=Rockwell

Se desideri effettuare una ricerca su un indice puoi semplicemente specificarlo nel percorso: http://host:9200/<indice>/_search?pretty=true&q=<termine_di_ricerca>

Nota che il parametro q utilizzato per cercare il contenuto supporta le espressioni regolari

Puoi anche utilizzare qualcosa come https://github.com/misalabs/horuz per fuzzare un servizio Elasticsearch.

Autorizzazioni di scrittura

Puoi verificare le tue autorizzazioni di scrittura cercando di creare un nuovo documento all'interno di un nuovo indice eseguendo qualcosa del genere:

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

Quel comando creerà un nuovo indice chiamato bookindex con un documento di tipo books che ha gli attributi "bookId", "author", "publisher" e "name"

Nota come il nuovo indice ora appare nell'elenco:

E nota le proprietà create automaticamente:

Enumerazione Automatica

Alcuni strumenti otterranno alcuni dei dati presentati in precedenza:

msf > use auxiliary/scanner/elasticsearch/indices_enum

{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}

Shodan

  • port:9200 elasticsearch
Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks: