mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-01 00:49:40 +00:00
212 lines
14 KiB
Markdown
212 lines
14 KiB
Markdown
# 9200 - Pentesting Elasticsearch
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
<figure><img src="../.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
|
|
|
**Get a hacker's perspective on your web apps, network, and cloud**
|
|
|
|
**Find and report critical, exploitable vulnerabilities with real business impact.** Use our 20+ custom tools to map the attack surface, find security issues that let you escalate privileges, and use automated exploits to collect essential evidence, turning your hard work into persuasive reports.
|
|
|
|
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
|
|
|
|
## Basic information
|
|
|
|
Elasticsearch es un **motor de búsqueda** y **análisis** **distribuido** y **de código abierto** para **todo tipo de datos**. Es conocido por su **velocidad**, **escalabilidad** y **APIs REST simples**. Construido sobre Apache Lucene, fue lanzado por primera vez en 2010 por Elasticsearch N.V. (ahora conocido como Elastic). Elasticsearch es el componente central del Elastic Stack, una colección de herramientas de código abierto para la ingestión, enriquecimiento, almacenamiento, análisis y visualización de datos. Este stack, comúnmente conocido como ELK Stack, también incluye Logstash y Kibana, y ahora tiene agentes de envío de datos ligeros llamados Beats.
|
|
|
|
### What is an Elasticsearch index?
|
|
|
|
Un **índice** de Elasticsearch es una colección de **documentos relacionados** almacenados como **JSON**. Cada documento consiste en **claves** y sus correspondientes **valores** (cadenas, números, booleanos, fechas, arreglos, geolocalizaciones, etc.).
|
|
|
|
Elasticsearch utiliza una estructura de datos eficiente llamada **índice invertido** para facilitar búsquedas de texto completo rápidas. Este índice lista cada palabra única en los documentos e identifica los documentos en los que aparece cada palabra.
|
|
|
|
Durante el proceso de indexación, Elasticsearch almacena los documentos y construye el índice invertido, permitiendo búsquedas casi en tiempo real. La **API de índice** se utiliza para agregar o actualizar documentos JSON dentro de un índice específico.
|
|
|
|
**Puerto por defecto**: 9200/tcp
|
|
|
|
## Manual Enumeration
|
|
|
|
### 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/`
|
|
|
|
![](<../.gitbook/assets/image (294).png>)
|
|
|
|
Si no ves esa respuesta al acceder a `/`, consulta la siguiente sección.
|
|
|
|
### Authentication
|
|
|
|
**Por defecto, Elasticsearch no tiene la autenticación habilitada**, por lo que, por defecto, puedes acceder a todo dentro de la base de datos sin usar ninguna credencial.
|
|
|
|
Puedes 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}
|
|
```
|
|
Eso significará que la autenticación está configurada y **necesitas credenciales válidas** para obtener cualquier información de Elasticsearch. Luego, puedes [**intentar forzarla**](../generic-methodologies-and-resources/brute-force.md#elasticsearch) (utiliza autenticación básica HTTP, por lo que cualquier cosa que pueda forzar la autenticación básica HTTP se puede usar).\
|
|
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 más 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/<USERNAME>"
|
|
```
|
|
### Elastic Info
|
|
|
|
Aquí hay algunos endpoints a los que puedes **acceder a través de 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 endpoints 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 endpoints `/_cat/*` soportados por la instancia.
|
|
|
|
En `/_security/user` (si la autenticación está habilitada) puedes ver qué usuario tiene el rol `superuser`.
|
|
|
|
### Indices
|
|
|
|
Puedes **reunir 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 guarda dentro de un índice** puedes acceder a: `http://host:9200/<index>` en este caso `http://10.10.10.115:9200/bank`
|
|
|
|
![](<../.gitbook/assets/image (342).png>)
|
|
|
|
### Dump index
|
|
|
|
Si deseas **volcar todo el contenido** de un índice puedes acceder a: `http://host:9200/<index>/_search?pretty=true` como `http://10.10.10.115:9200/bank/_search?pretty=true`
|
|
|
|
![](<../.gitbook/assets/image (914).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 deseas volcar en el parámetro **`size`**: `http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`asd\
|
|
&#xNAN;_Note: 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)._
|
|
|
|
### Dump all
|
|
|
|
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 `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 más información.
|
|
|
|
### Search
|
|
|
|
Si estás buscando alguna información, puedes hacer una **búsqueda en bruto 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`
|
|
|
|
![](<../.gitbook/assets/image (335).png>)
|
|
|
|
Si solo deseas **buscar en un índice** puedes **especificarlo** en la **ruta**: `http://host:9200/<index>/_search?pretty=true&q=<search_term>`
|
|
|
|
_Ten en cuenta que el parámetro q utilizado para buscar contenido **soporta 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.
|
|
|
|
### Write permissions
|
|
|
|
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"
|
|
}'
|
|
```
|
|
Ese cmd creará un **nuevo índice** llamado `bookindex` con un documento de tipo `books` que tiene los atributos "_bookId_", "_author_", "_publisher_" y "_name_"
|
|
|
|
Nota cómo el **nuevo índice aparece ahora en la lista**:
|
|
|
|
![](<../.gitbook/assets/image (130).png>)
|
|
|
|
Y observa las **propiedades creadas automáticamente**:
|
|
|
|
![](<../.gitbook/assets/image (434).png>)
|
|
|
|
## Enumeración Automática
|
|
|
|
Algunas herramientas obtendrán algunos de los datos presentados anteriormente:
|
|
```bash
|
|
msf > use auxiliary/scanner/elasticsearch/indices_enum
|
|
```
|
|
{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}
|
|
|
|
## Shodan
|
|
|
|
* `port:9200 elasticsearch`
|
|
|
|
<figure><img src="../.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
|
|
|
**Obtén la perspectiva de un hacker sobre tus aplicaciones web, red y nube**
|
|
|
|
**Encuentra e informa sobre vulnerabilidades críticas y explotables con un impacto real en el negocio.** Utiliza nuestras más de 20 herramientas personalizadas para mapear la superficie de ataque, encontrar problemas de seguridad que te permitan escalar privilegios y usar exploits automatizados para recopilar evidencia esencial, convirtiendo tu arduo trabajo en informes persuasivos.
|
|
|
|
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
|
|
|
|
{% hint style="success" %}
|
|
Aprende y practica Hacking en AWS:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Aprende y practica Hacking en GCP: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Apoya a HackTricks</summary>
|
|
|
|
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
|
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
|
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
|
|
|
</details>
|
|
{% endhint %}
|