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:
- Se vuoi vedere la tua azienda pubblicizzata in HackTricks o scaricare HackTricks in PDF Controlla i PACCHETTI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di NFT esclusivi
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @carlospolopm.
- Condividi i tuoi trucchi di hacking inviando PR a HackTricks e HackTricks Cloud github repos.
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=1000
asd
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:
- Se vuoi vedere la tua azienda pubblicizzata in HackTricks o scaricare HackTricks in PDF Controlla i PACCHETTI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di esclusive NFT
- Unisciti al 💬 gruppo Discord o al gruppo Telegram o seguici su Twitter 🐦 @carlospolopm.
- Condividi i tuoi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud github repos.