14 KiB
9200 - Pentesting Elasticsearch
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF, consulta los PLANES DE SUSCRIPCIÓN!
- Consigue el merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección de NFTs exclusivos
- Únete al 💬 grupo de Discord o al grupo de telegram o sigue a Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de github de HackTricks y HackTricks Cloud.
Información básica
Desde la página principal puedes 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, 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.
¿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).
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.
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.
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 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}
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 (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
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 vía 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/*
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
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
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
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).
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.
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
Si solo quieres buscar en un índice, puedes especificarlo en el camino: http://host:9200/<index>/_search?pretty=true&q=<search_term>
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 hacer fuzzing a 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
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:
- Si quieres ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF revisa los PLANES DE SUSCRIPCIÓN!
- Consigue el merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección de NFTs exclusivos
- Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub HackTricks y HackTricks Cloud.