# 9200 - Pentesting Elasticsearch
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! - Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family) - Consigue el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com) - **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
## Información básica Desde la [página principal](https://www.elastic.co/what-is/elasticsearch) se pueden encontrar algunas descripciones útiles: > Elasticsearch es un motor de búsqueda y análisis distribuido y de código abierto para todo tipo de datos, incluidos los textuales, numéricos, geoespaciales, estructurados y no estructurados. Elasticsearch está construido sobre Apache Lucene y fue lanzado por primera vez en 2010 por Elasticsearch N.V. (ahora conocido como Elastic). Conocido por sus sencillas API REST, su naturaleza distribuida, velocidad y escalabilidad, Elasticsearch es el componente central de Elastic Stack, un conjunto de herramientas de código abierto para la ingestión, enriquecimiento, almacenamiento, análisis y visualización de datos. Comúnmente conocido como ELK Stack (por Elasticsearch, Logstash y Kibana), Elastic Stack ahora incluye una rica colección de agentes de envío ligeros conocidos como Beats para enviar datos a Elasticsearch. ### ¿Qué es un índice de Elasticsearch? Un _índice_ de Elasticsearch **es una colección de documentos** que están relacionados entre sí. Elasticsearch almacena los datos como documentos JSON. Cada documento correlaciona un conjunto de _claves_ (nombres de campos o propiedades) con sus valores correspondientes (cadenas, números, booleanos, fechas, matrices de _valores_, geolocalizaciones u otros tipos de datos). Elasticsearch utiliza una estructura de datos llamada _índice invertido_, que está diseñada para permitir búsquedas de texto completo muy rápidas. Un índice invertido lista cada palabra única que aparece en cualquier documento e identifica todos los documentos en los que aparece cada palabra. Durante el proceso de indexación, Elasticsearch almacena documentos y construye un índice invertido para hacer que los datos del documento sean buscables en tiempo real. La indexación se inicia con la API de índice, a través de la cual se puede agregar o actualizar un documento JSON en un índice específico. **Puerto predeterminado**: 9200/tcp ## Enumeración manual ### Banner El protocolo utilizado para acceder a Elasticsearch es **HTTP**. Cuando se accede a él a través de HTTP, se encontrará información interesante: `http://10.10.10.115:9200/` ![](<../.gitbook/assets/image (264).png>) Si no se ve esa respuesta al acceder a `/`, consulte la siguiente sección. ### Autenticación **Por defecto, Elasticsearch no tiene la autenticación habilitada**, por lo que por defecto se puede acceder a todo lo que hay dentro de la base de datos sin usar credenciales. Se puede verificar que la autenticación está deshabilitada con una solicitud a: ```bash 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} ``` **Sin embargo**, si envías una solicitud a `/` y recibes una respuesta como la siguiente: ```bash {"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} ``` Esto significa que la autenticación está configurada y **necesitas credenciales válidas** para obtener cualquier información de Elasticsearch. Entonces, puedes [**intentar hacer fuerza bruta**](../generic-methodologies-and-resources/brute-force.md#elasticsearch) (usa autenticación básica HTTP, por lo que cualquier cosa que haga fuerza bruta en autenticación básica HTTP puede ser utilizada).\ Aquí tienes una **lista de nombres de usuario predeterminados**: _**elastic** (superusuario), remote\_monitoring\_user, beats\_system, logstash\_system, kibana, kibana\_system, apm\_system,_ \_anonymous\_.\_ Las versiones antiguas de Elasticsearch tienen la contraseña predeterminada **changeme** para este usuario. ``` curl -X GET http://user:password@IP:9200/ ``` ### Enumeración básica de usuarios ```bash #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/" ``` ### Información de Elastic Aquí hay algunos puntos finales a los que puedes **acceder mediante GET** para **obtener** información sobre 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 | | | Estos puntos finales fueron [**tomados de la documentación**](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) donde puedes **encontrar más**.\ Además, si accedes a `/_cat`, la respuesta contendrá los puntos finales `/_cat/*` soportados por la instancia. En `/_security/user` (si la autenticación está habilitada) puedes ver qué usuario tiene el rol de `superuser`. ### Índices Puedes **obtener todos los índices** accediendo 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 ``` Para obtener **información sobre qué tipo de datos se guardan dentro de un índice**, puedes acceder a: `http://host:9200/<índice>` como en este ejemplo `http://10.10.10.115:9200/bank` ![](<../.gitbook/assets/image (265).png>) ### Volcar índice Si deseas **volcar todo el contenido** de un índice, puedes acceder a: `http://host:9200/<índice>/_search?pretty=true` como en `http://10.10.10.115:9200/bank/_search?pretty=true` ![](<../.gitbook/assets/image (266).png>) _Tómate un momento para comparar el contenido de cada documento (entrada) dentro del índice bank y los campos de este índice que vimos en la sección anterior._ Entonces, en este punto, puedes notar que **hay un campo llamado "total" dentro de "hits"** que indica que **se encontraron 1000 documentos** dentro de este índice, pero solo se recuperaron 10. Esto se debe a que **por defecto hay un límite de 10 documentos**.\ Pero, ahora que sabes que **este índice contiene 1000 documentos**, puedes **volcarlos todos** indicando el número de entradas que deseas volcar en el parámetro **`size`**: `http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`\ _Nota: Si indicas un número mayor, todas las entradas se volcarán de todos modos, por ejemplo, podrías indicar `size=9999` y sería extraño si hubiera más entradas (pero deberías verificar)._ ### Volcar todo Para volcar todo, simplemente puedes ir a la **misma ruta que antes pero sin indicar ningún índice** `http://host:9200/_search?pretty=true` como en `http://10.10.10.115:9200/_search?pretty=true`\ Recuerda que en este caso se aplicará el **límite predeterminado de 10** resultados. Puedes usar el parámetro `size` para volcar una **mayor cantidad de resultados**. Lee la sección anterior para obtener más información. ### Búsqueda Si estás buscando información, puedes hacer una **búsqueda en bruto en todos los índices** yendo a `http://host:9200/_search?pretty=true&q=` como en `http://10.10.10.115:9200/_search?pretty=true&q=Rockwell` ![](<../.gitbook/assets/image (267).png>) Si solo deseas **buscar en un índice**, simplemente **especifica** en la **ruta**: `http://host:9200/<índice>/_search?pretty=true&q=` _Nota que el parámetro q utilizado para buscar contenido **admite expresiones regulares**_ También puedes usar algo como [https://github.com/misalabs/horuz](https://github.com/misalabs/horuz) para fuzzear un servicio de Elasticsearch. ### Permisos de escritura Puedes verificar tus permisos de escritura intentando crear un nuevo documento dentro de un nuevo índice ejecutando algo como lo siguiente: ```bash 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" }' ``` Esa cmd creará un **nuevo índice** llamado `bookindex` con un documento de tipo `books` que tiene los atributos "_bookId_", "_author_", "_publisher_" y "_name_" Observe cómo el **nuevo índice aparece ahora en la lista**: ![](<../.gitbook/assets/image (268).png>) Y observe las **propiedades creadas automáticamente**: ![](<../.gitbook/assets/image (269).png>) ## Enumeración Automática Algunas herramientas obtendrán algunos de los datos presentados anteriormente: ```bash msf > use auxiliary/scanner/elasticsearch/indices_enum ``` ## Shodan * `port:9200 elasticsearch`
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! - Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family) - Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com) - **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.