15 KiB
9200 - Teste de penetração no Elasticsearch
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
-
Descubra A Família PEASS, nossa coleção exclusiva de NFTs
-
Adquira o swag oficial do PEASS & HackTricks
-
Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
-
Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.
Informações básicas
Na página principal você pode encontrar algumas descrições úteis:
Elasticsearch é um mecanismo de busca e análise distribuído e de código aberto para todos os tipos de dados, incluindo dados textuais, numéricos, geoespaciais, estruturados e não estruturados. O Elasticsearch é construído sobre o Apache Lucene e foi lançado pela primeira vez em 2010 pela Elasticsearch N.V. (agora conhecida como Elastic). Conhecido por suas APIs REST simples, natureza distribuída, velocidade e escalabilidade, o Elasticsearch é o componente central do Elastic Stack, um conjunto de ferramentas de código aberto para ingestão, enriquecimento, armazenamento, análise e visualização de dados. Comumente referido como ELK Stack (depois de Elasticsearch, Logstash e Kibana), o Elastic Stack agora inclui uma rica coleção de agentes de envio leves conhecidos como Beats para enviar dados para o Elasticsearch.
O que é um índice Elasticsearch?
Um índice do Elasticsearch é uma coleção de documentos que estão relacionados entre si. O Elasticsearch armazena dados como documentos JSON. Cada documento correlaciona um conjunto de chaves (nomes de campos ou propriedades) com seus valores correspondentes (strings, números, Booleans, datas, matrizes de valores, geolocalizações ou outros tipos de dados).
O Elasticsearch usa uma estrutura de dados chamada índice invertido, que é projetada para permitir pesquisas de texto completo muito rápidas. Um índice invertido lista cada palavra única que aparece em qualquer documento e identifica todos os documentos em que cada palavra ocorre.
Durante o processo de indexação, o Elasticsearch armazena documentos e constrói um índice invertido para tornar os dados do documento pesquisáveis em tempo quase real. A indexação é iniciada com a API de índice, por meio da qual você pode adicionar ou atualizar um documento JSON em um índice específico.
Porta padrão: 9200/tcp
Enumeração manual
Banner
O protocolo usado para acessar o Elasticsearch é HTTP. Quando você acessa via HTTP, encontrará algumas informações interessantes: http://10.10.10.115:9200/
Se você não vir essa resposta acessando /
, consulte a seguinte seção.
Autenticação
Por padrão, o Elasticsearch não tem autenticação habilitada, portanto, por padrão, você pode acessar tudo dentro do banco de dados sem usar credenciais.
Você pode verificar se a autenticação está desativada com uma solicitação para:
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}
No entanto, se você enviar uma solicitação para /
e receber uma resposta como a seguinte:
{"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}
Isso significa que a autenticação está configurada e você precisa de credenciais válidas para obter qualquer informação do Elasticsearch. Então, você pode tentar fazer brute force (ele usa autenticação básica HTTP, então qualquer coisa que faça brute force em 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.
curl -X GET http://user:password@IP:9200/
Enumeração Básica de Usuários
#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>"
Informações do Elastic
Aqui estão alguns endpoints que 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
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 obter informações sobre que tipo de dados são salvos em um índice, você pode acessar: http://host:9200/<index>
como, por exemplo, neste caso http://10.10.10.115:9200/bank
Despejar índice
Se você quiser 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
Dedique 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 há 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
asd
Observação: Se você indicar um número maior, todas as entradas serão despejadas de qualquer maneira, por exemplo, você poderia indicar size=9999
e seria estranho se houvesse 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 obter mais informações.
Pesquisa
Se você está procurando por alguma informação, pode fazer uma pesquisa bruta em todos os índices indo para http://host:9200/_search?pretty=true&q=<search_term>
como em http://10.10.10.115:9200/_search?pretty=true&q=Rockwell
Se você quiser apenas pesquisar em um índice, pode apenas especificá-lo no caminho: http://host:9200/<index>/_search?pretty=true&q=<search_term>
Obsere que o parâmetro q usado para pesquisar 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:
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"
}'
Esse comando irá criar um novo índice chamado bookindex
com um documento do tipo books
que tem 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:
msf > use auxiliary/scanner/elasticsearch/indices_enum
Shodan
port:9200 elasticsearch
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
-
Descubra A Família PEASS, nossa coleção exclusiva de NFTs
-
Adquira o swag oficial do PEASS & HackTricks
-
Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
-
Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.