9200 - Pentesting Elasticsearch
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
Banner
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:
Tuttavia, se invii una richiesta a /
e ricevi una risposta simile alla seguente:
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.
Enumerazione di Utenti di Base
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
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=1000
asd
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.
Search
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:
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:
Shodan
port:9200 elasticsearch
Last updated