9200 - Pentesting Elasticsearch

Support 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 API REST semplici. Costruito su Apache Lucene, è stato rilasciato per la prima volta nel 2010 da Elasticsearch N.V. (ora conosciuta come Elastic). Elasticsearch è il componente principale dell'Elastic Stack, una raccolta di strumenti open source per l'ingestione, l'arricchimento, l'archiviazione, l'analisi e la visualizzazione dei dati. Questo stack, comunemente chiamato ELK Stack, include anche Logstash e Kibana, e ora ha agenti di spedizione dati leggeri chiamati Beats.

Cos'è un indice Elasticsearch?

Un indice Elasticsearch è una raccolta di documenti correlati memorizzati come JSON. Ogni documento è composto da chiavi e dai loro corrispondenti 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 unica 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 dell'indice viene utilizzata per aggiungere o aggiornare documenti JSON all'interno di un indice specifico.

Porta predefinita: 9200/tcp

Enumerazione manuale

Il protocollo utilizzato per accedere a Elasticsearch è HTTP. Quando lo accedi tramite HTTP troverai alcune informazioni interessanti: http://10.10.10.115:9200/

Se non vedi quella risposta accedendo a /, consulta la sezione seguente.

Autenticazione

Per impostazione predefinita, Elasticsearch non ha l'autenticazione abilitata, quindi per impostazione predefinita puoi accedere a tutto ciò che si trova all'interno del database senza utilizzare alcuna credenziale.

Puoi 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 simile alla 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 qualsiasi informazione da elasticsearch. Poi, puoi provare a fare bruteforce (utilizza l'autenticazione di base HTTP, quindi qualsiasi cosa che possa fare BF HTTP basic auth può essere utilizzata). Qui hai un elenco di nomi utente predefiniti: elastic (superuser), 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 Utenti di Base

#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

Ecco alcuni endpoint che puoi accedere tramite GET per ottenere alcune 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 trovare di più. Inoltre, se accedi a /_cat, la risposta conterrà gli endpoint /_cat/* supportati dall'istanza.

In /_security/user (se l'autenticazione è abilitata) puoi vedere quale utente ha il ruolo di superuser.

Indices

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 che tipo di dati sono salvati all'interno di un indice puoi accedere a: http://host:9200/<index> dall'esempio in questo caso http://10.10.10.115:9200/bank

Dump index

Se vuoi dumpare tutti i contenuti di un indice puoi accedere a: http://host:9200/<index>/_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 dumpare tutti indicando il numero di voci che vuoi dumpare nel parametro size: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000asd Nota: Se indichi un numero maggiore, tutte le voci saranno comunque dumpate, ad esempio potresti indicare size=9999 e sarebbe strano se ci fossero più voci (ma dovresti controllare).

Dump all

Per dumpare 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 usare il parametro size per dumpare una maggiore quantità di risultati. Leggi la sezione precedente per ulteriori informazioni.

Se stai cercando alcune informazioni puoi fare una ricerca raw su tutti gli indici andando a http://host:9200/_search?pretty=true&q=<search_term> come in http://10.10.10.115:9200/_search?pretty=true&q=Rockwell

Se vuoi solo cercare in un indice puoi semplicemente specificarlo nel percorso: http://host:9200/<index>/_search?pretty=true&q=<search_term>

Nota che il parametro q usato per cercare contenuti supporta le espressioni regolari

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

Write permissions

Puoi controllare i tuoi permessi di scrittura provando a creare un nuovo documento all'interno di un nuovo indice eseguendo qualcosa come il seguente:

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

Quella cmd 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 appare ora nella lista:

E nota le proprietà create automaticamente:

Enumerazione Automatica

Al alcuni strumenti otterranno alcuni dei dati presentati prima:

msf > use auxiliary/scanner/elasticsearch/indices_enum

Shodan

  • port:9200 elasticsearch

Supporta HackTricks

Last updated