hacktricks/network-services-pentesting/9200-pentesting-elasticsearch.md
2024-02-10 13:03:23 +00:00

15 KiB

9200 - Pentesting Elasticsearch

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

Altri modi per supportare HackTricks:

Informazioni di base

Elasticsearch è un motore di ricerca e analisi distribuito e 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 di Elastic Stack, una collezione di strumenti open source per l'ingestione, l'arricchimento, la memorizzazione, l'analisi e la visualizzazione dei dati. Questo stack, comunemente chiamato ELK Stack, include anche Logstash e Kibana, e ora dispone di agenti leggeri per l'invio dei dati chiamati Beats.

Cos'è un indice Elasticsearch?

Un indice Elasticsearch è una collezione 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 unica nei documenti e identifica i documenti in cui appare ogni 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 questa risposta accedendo a /, vedere la sezione seguente.

Autenticazione

Per impostazione predefinita Elasticsearch non ha l'autenticazione abilitata, quindi di default è possibile accedere a tutto il 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 la 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}

Ciò significa che l'autenticazione è configurata e è necessario disporre di credenziali valide per ottenere informazioni da Elasticsearch. Quindi, puoi provare a forzarla (utilizza l'autenticazione di base HTTP, quindi puoi utilizzare qualsiasi strumento che forzi l'autenticazione di base HTTP).
Qui hai una lista 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 base degli utenti

To begin the enumeration process, we can use the _cat API to retrieve information about the available indices and nodes in the Elasticsearch cluster. This can be done by sending a GET request to the /_cat endpoint.

Per iniziare il processo di enumerazione, possiamo utilizzare l'API _cat per recuperare informazioni sugli indici e sui nodi disponibili nel cluster Elasticsearch. Ciò può essere fatto inviando una richiesta GET all'endpoint /_cat.

GET /_cat

This will return a list of available endpoints that can be further explored for enumeration purposes.

Ciò restituirà un elenco di endpoint disponibili che possono essere ulteriormente esplorati per scopi di enumerazione.

Enumerating Indices

To enumerate the available indices, we can use the _cat/indices endpoint. This will provide us with information such as the index name, number of documents, and size of each index.

Per enumerare gli indici disponibili, possiamo utilizzare l'endpoint _cat/indices. Ciò ci fornirà informazioni come il nome dell'indice, il numero di documenti e la dimensione di ciascun indice.

GET /_cat/indices

Enumerating Nodes

To enumerate the available nodes in the Elasticsearch cluster, we can use the _cat/nodes endpoint. This will provide us with information such as the node name, IP address, and role of each node.

Per enumerare i nodi disponibili nel cluster Elasticsearch, possiamo utilizzare l'endpoint _cat/nodes. Ciò ci fornirà informazioni come il nome del nodo, l'indirizzo IP e il ruolo di ciascun nodo.

GET /_cat/nodes

By enumerating the available indices and nodes, we can gather valuable information about the Elasticsearch cluster, which can be useful for further enumeration and exploitation.

Enumerando gli indici e i nodi disponibili, possiamo raccogliere informazioni preziose sul cluster Elasticsearch, che possono essere utili per ulteriori operazioni di enumerazione e sfruttamento.

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

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 sul tipo di dati salvati 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 vuoi scaricare tutti i contenuti di un indice puoi accedere a: http://host:9200/<indice>/_search?pretty=true come ad esempio http://10.10.10.115:9200/bank/_search?pretty=true

Prenditi un momento per confrontare i contenuti di ogni 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=1000asd
Nota: Se indichi un numero più grande, 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 gli indici

Per scaricare tutti gli indici puoi semplicemente andare allo stesso percorso di prima ma senza indicare alcun indice http://host:9200/_search?pretty=true come ad esempio 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 delle informazioni puoi effettuare una ricerca grezza su tutti gli indici andando su http://host:9200/_search?pretty=true&q=<termine_di_ricerca> come ad esempio http://10.10.10.115:9200/_search?pretty=true&q=Rockwell

Se vuoi semplicemente effettuare una ricerca su un indice puoi 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.

Permessi di scrittura

Puoi verificare i tuoi permessi di scrittura provando a 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 di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks: