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

13 KiB

9200 - Pentesting Elasticsearch

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Información básica

Elasticsearch es un motor de búsqueda y análisis distribuido, de código abierto para todo tipo de datos. Es conocido por su velocidad, escalabilidad y API REST simple. Construido sobre Apache Lucene, fue lanzado por primera vez en 2010 por Elasticsearch N.V. (ahora conocido como Elastic). Elasticsearch es el componente principal de Elastic Stack, una colección de herramientas de código abierto para ingestión, enriquecimiento, almacenamiento, análisis y visualización de datos. Esta pila, comúnmente conocida como ELK Stack, también incluye Logstash y Kibana, y ahora tiene agentes ligeros de envío de datos llamados Beats.

¿Qué es un índice de Elasticsearch?

Un índice de Elasticsearch es una colección de documentos relacionados almacenados como JSON. Cada documento consta de claves y sus correspondientes valores (cadenas, números, booleanos, fechas, matrices, 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, lo que permite búsquedas casi en tiempo real. El API de índice se utiliza para agregar o actualizar documentos JSON dentro de un índice específico.

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/

Si no ves esa respuesta al acceder a /, consulta la siguiente sección.

Autenticación

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

Puedes verificar que la autenticación está deshabilitada con una solicitud 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}

Sin embargo, si envías una solicitud a / y recibes una respuesta como la siguiente:

{"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 información de Elasticsearch. Luego, puedes intentar hacer fuerza bruta (utiliza autenticación básica HTTP, por lo que cualquier herramienta de fuerza bruta para 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

#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 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 donde puedes encontrar más.
Además, si accedes a /_cat, la respuesta contendrá los puntos finales /_cat/* admitidos por la instancia.

En /_security/user (si la autenticación está habilitada) puedes ver qué usuario tiene el rol superuser.

Índices

Puedes recopilar 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> por ejemplo en este caso http://10.10.10.115:9200/bank

Volcar índice

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

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í, 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=1000asd
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 al mismo camino 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.

Búsqueda

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=<término_de_búsqueda> como en http://10.10.10.115:9200/_search?pretty=true&q=Rockwell

Si solo deseas buscar en un índice puedes simplemente especificarlo en la ruta: http://host:9200/<index>/_search?pretty=true&q=<término_de_búsqueda>

Nota que el parámetro q utilizado para buscar contenido admite expresiones regulares

También puedes usar algo como 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:

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 comando creará un nuevo índice llamado bookindex con un documento de tipo books que tiene los atributos "bookId", "author", "publisher" y "name"

Observa cómo el nuevo índice aparece ahora en la lista:

Y nota las propiedades creadas automáticamente:

Enumeración Automática

Algunas herramientas obtendrán algunos de los datos presentados anteriormente:

msf > use auxiliary/scanner/elasticsearch/indices_enum

{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}

Shodan

  • port:9200 elasticsearch
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: