hacktricks/network-services-pentesting/9200-pentesting-elasticsearch.md

195 lines
14 KiB
Markdown
Raw Normal View History

2023-06-05 18:33:24 +00:00
# 9200 - Pentesting Elasticsearch
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>
## Información básica
Desde la [página principal](https://www.elastic.co/what-is/elasticsearch) puedes encontrar algunas descripciones útiles:
2023-06-05 18:33:24 +00:00
> Elasticsearch es un motor de búsqueda y análisis distribuido y de código abierto para todo tipo de datos, incluyendo 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 simples APIs REST, naturaleza distribuida, velocidad y escalabilidad, Elasticsearch es el componente central del Elastic Stack, un conjunto de herramientas de código abierto para la ingesta, enriquecimiento, almacenamiento, análisis y visualización de datos. Comúnmente conocido como ELK Stack (por Elasticsearch, Logstash y Kibana), el Elastic Stack ahora incluye una rica colección de agentes de envío ligeros conocidos como Beats para enviar datos a Elasticsearch.
2023-06-05 18:33:24 +00:00
### ¿Qué es un índice de Elasticsearch?
Un _índice_ de Elasticsearch **es una colección de documentos** que están relacionados entre sí. Elasticsearch almacena 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, arreglos de _valores_, geolocalizaciones u otros tipos de datos).
2023-06-05 18:33:24 +00:00
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 enumera cada palabra única que aparece en cualquier documento e identifica todos los documentos en los que aparece cada palabra.
2023-06-05 18:33:24 +00:00
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 casi real. La indexación se inicia con la API de índice, a través de la cual puedes agregar o actualizar un documento JSON en un índice específico.
2023-06-05 18:33:24 +00:00
**Puerto predeterminado**: 9200/tcp
## Enumeración manual
### Banner
El protocolo utilizado para acceder a Elasticsearch es **HTTP**. Cuando accedes a él a través de HTTP encontrarás información interesante: `http://10.10.10.115:9200/`
2023-06-05 18:33:24 +00:00
![](<../.gitbook/assets/image (264).png>)
Si no ves esa respuesta al acceder a `/`, consulta la siguiente sección.
2023-06-05 18:33:24 +00:00
### Autenticación
**Por defecto Elasticsearch no tiene autenticación habilitada**, por lo que por defecto puedes acceder a todo dentro de la base de datos sin usar credenciales.
2023-06-05 18:33:24 +00:00
Puedes verificar que la autenticación está deshabilitada con una solicitud a:
2023-06-05 18:33:24 +00:00
```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}
```
Eso significa que la autenticación está configurada y **necesitas credenciales válidas** para obtener cualquier información de Elasticsearch. Luego, puedes [**intentar forzar la entrada**](../generic-methodologies-and-resources/brute-force.md#elasticsearch) (utiliza autenticación básica HTTP, así que cualquier cosa que fuerce la entrada a 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 anteriores de Elasticsearch tienen la contraseña predeterminada **changeme** para este usuario
2023-06-05 18:33:24 +00:00
```
curl -X GET http://user:password@IP:9200/
```
### Enumeración Básica de Usuarios
2023-06-05 18:33:24 +00:00
```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/<USERNAME>"
```
### Información de Elastic
Aquí hay algunos puntos finales a los que puedes **acceder vía GET** para **obtener** información sobre elasticsearch:
2023-06-05 18:33:24 +00:00
| \_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 **reunir todos los índices** accediendo a `http://10.10.10.115:9200/_cat/indices?v`
2023-06-05 18:33:24 +00:00
```
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/<index>`, por ejemplo en este caso `http://10.10.10.115:9200/bank`
2023-06-05 18:33:24 +00:00
![](<../.gitbook/assets/image (265).png>)
### Volcar índice
Si quieres **volcar todo el contenido** de un índice, puedes acceder a: `http://host:9200/<index>/_search?pretty=true` como en `http://10.10.10.115:9200/bank/_search?pretty=true`
2023-06-05 18:33:24 +00:00
![](<../.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._
Así que, 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 **volcar todos ellos** indicando el número de entradas que quieres volcar en el parámetro **`size`**: `http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`asd\
_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 comprobarlo)._
2023-06-05 18:33:24 +00:00
### Volcar todo
Para volcar todo, puedes ir al **mismo camino 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 **cantidad mayor de resultados**. Lee la sección anterior para más información.
2023-06-05 18:33:24 +00:00
### Búsqueda
Si estás buscando alguna información, puedes realizar una **búsqueda cruda en todos los índices** yendo a `http://host:9200/_search?pretty=true&q=<search_term>` como en `http://10.10.10.115:9200/_search?pretty=true&q=Rockwell`
2023-06-05 18:33:24 +00:00
![](<../.gitbook/assets/image (267).png>)
Si solo quieres **buscar en un índice**, puedes **especificarlo** en el **camino**: `http://host:9200/<index>/_search?pretty=true&q=<search_term>`
2023-06-05 18:33:24 +00:00
_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 hacer fuzzing a un servicio de elasticsearch.
2023-06-05 18:33:24 +00:00
### 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"
}'
2023-06-05 18:33:24 +00:00
```
Ese comando creará un **nuevo índice** llamado `bookindex` con un documento de tipo `books` que tiene los atributos "_bookId_", "_author_", "_publisher_" y "_name_"
2023-06-05 18:33:24 +00:00
Observa cómo el **nuevo índice aparece ahora en la lista**:
2023-06-05 18:33:24 +00:00
![](<../.gitbook/assets/image (268).png>)
Y nota las **propiedades creadas automáticamente**:
2023-06-05 18:33:24 +00:00
![](<../.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`
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>