13 KiB
9200 - Pentesting Elasticsearch
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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:
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=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:
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
{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}
Shodan
port:9200 elasticsearch
{% hint style="success" %}
Impara e pratica Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.