9200 - Pentesting Elasticsearch
Informações Básicas
O Elasticsearch é um mecanismo de pesquisa e análise distribuído, código aberto para todos os tipos de dados. É conhecido por sua velocidade, escalabilidade e APIs REST simples. Construído sobre o Apache Lucene, foi lançado pela primeira vez em 2010 pela Elasticsearch N.V. (agora conhecida como Elastic). O Elasticsearch é o componente principal do Elastic Stack, uma coleção de ferramentas de código aberto para ingestão, enriquecimento, armazenamento, análise e visualização de dados. Este conjunto, comumente referido como ELK Stack, também inclui o Logstash e o Kibana, e agora possui agentes leves de envio de dados chamados Beats.
O que é um índice Elasticsearch?
Um índice Elasticsearch é uma coleção de documentos relacionados armazenados como JSON. Cada documento consiste em chaves e seus respectivos valores (strings, números, booleanos, datas, arrays, geolocalizações, etc.).
O Elasticsearch utiliza uma estrutura de dados eficiente chamada de índice invertido para facilitar buscas rápidas de texto completo. Este índice lista cada palavra única nos documentos e identifica os documentos nos quais cada palavra aparece.
Durante o processo de indexação, o Elasticsearch armazena os documentos e constrói o índice invertido, permitindo buscas quase em tempo real. A API de índice é usada para adicionar ou atualizar documentos JSON dentro de um índice específico.
Porta padrão: 9200/tcp
Enumeração Manual
Banner
O protocolo usado para acessar o Elasticsearch é HTTP. Ao acessá-lo via HTTP, você encontrará algumas informações interessantes: http://10.10.10.115:9200/
Se você não ver essa resposta acessando /
, veja a seção a seguir.
Autenticação
Por padrão, o Elasticsearch não tem autenticação habilitada, então por padrão você pode acessar tudo dentro do banco de dados sem usar credenciais.
Você pode verificar que a autenticação está desativada com uma solicitação para:
No entanto, se você enviar uma solicitação para /
e receber uma resposta como a seguinte:
Isso significa que a autenticação está configurada e você precisa de credenciais válidas para obter qualquer informação do Elasticsearch. Em seguida, você pode tentar fazer força bruta (ele usa autenticação básica HTTP, então qualquer coisa que faça força bruta na autenticação básica HTTP pode ser usada). Aqui você tem uma lista de nomes de usuário padrão: elastic (superusuário), remote_monitoring_user, beats_system, logstash_system, kibana, kibana_system, apm_system, _anonymous_._ Versões mais antigas do Elasticsearch têm a senha padrão changeme para este usuário.
Enumeração Básica de Usuários
Informações do Elastic
Aqui estão alguns endpoints aos quais você pode acessar via GET para obter algumas informações sobre o 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 |
Esses endpoints foram retirados da documentação onde você pode encontrar mais.
Além disso, se você acessar /_cat
, a resposta conterá os endpoints /_cat/*
suportados pela instância.
Em /_security/user
(se a autenticação estiver habilitada), você pode ver qual usuário tem a função superuser
.
Índices
Você pode reunir todos os índices acessando http://10.10.10.115:9200/_cat/indices?v
Para obter informações sobre que tipo de dados estão salvos dentro de um índice você pode acessar: http://host:9200/<index>
por exemplo, neste caso http://10.10.10.115:9200/bank
Despejar índice
Se você deseja despejar todo o conteúdo de um índice, você pode acessar: http://host:9200/<index>/_search?pretty=true
como http://10.10.10.115:9200/bank/_search?pretty=true
Dê um momento para comparar o conteúdo de cada documento (entrada) dentro do índice bank e os campos deste índice que vimos na seção anterior.
Então, neste ponto você pode notar que existe um campo chamado "total" dentro de "hits" que indica que 1000 documentos foram encontrados dentro deste índice, mas apenas 10 foram recuperados. Isso ocorre porque por padrão há um limite de 10 documentos.
Mas, agora que você sabe que este índice contém 1000 documentos, você pode despejar todos eles indicando o número de entradas que deseja despejar no parâmetro size
: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000
Nota: Se você indicar um número maior, todas as entradas serão despejadas de qualquer maneira, por exemplo, você poderia indicar size=9999
e será estranho se houver mais entradas (mas você deve verificar).
Despejar tudo
Para despejar tudo, você pode simplesmente ir para o mesmo caminho que antes, mas sem indicar nenhum índice http://host:9200/_search?pretty=true
como http://10.10.10.115:9200/_search?pretty=true
Lembre-se de que, neste caso, o limite padrão de 10 resultados será aplicado. Você pode usar o parâmetro size
para despejar uma quantidade maior de resultados. Leia a seção anterior para mais informações.
Busca
Se você está procurando por alguma informação, você pode fazer uma busca bruta em todos os índices indo para http://host:9200/_search?pretty=true&q=<termo_de_busca>
como em http://10.10.10.115:9200/_search?pretty=true&q=Rockwell
Se você deseja apenas buscar em um índice, você pode simplesmente especificá-lo no caminho: http://host:9200/<index>/_search?pretty=true&q=<termo_de_busca>
Obsere que o parâmetro q usado para buscar conteúdo suporta expressões regulares
Você também pode usar algo como https://github.com/misalabs/horuz para fuzz um serviço elasticsearch.
Permissões de escrita
Você pode verificar suas permissões de escrita tentando criar um novo documento dentro de um novo índice executando algo como o seguinte:
O seguinte comando irá criar um novo índice chamado bookindex
com um documento do tipo books
que possui os atributos "bookId", "author", "publisher" e "name"
Observe como o novo índice aparece agora na lista:
E observe as propriedades criadas automaticamente:
Enumeração Automática
Algumas ferramentas obterão alguns dos dados apresentados anteriormente:
Shodan
port:9200 elasticsearch
Last updated