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

196 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 9200 - Elasticsearch渗透测试
<details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零到英雄学习AWS黑客攻击</strong></summary>
支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
</details>
## 基本信息
从[主页](https://www.elastic.co/what-is/elasticsearch)上,您可以找到一些有用的描述:
> Elasticsearch是一个分布式的开源搜索和分析引擎适用于所有类型的数据包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch基于Apache Lucene构建由Elasticsearch N.V.现在称为Elastic于2010年首次发布。以其简单的REST API、分布式特性、速度和可扩展性而闻名Elasticsearch是Elastic Stack的核心组件Elastic Stack是一套开源工具用于数据摄取、丰富、存储、分析和可视化。通常被称为ELK Stack取自Elasticsearch、Logstash和KibanaElastic Stack现在包括一系列称为Beats的轻量级数据传输代理用于将数据发送到Elasticsearch。
### 什么是Elasticsearch索引
Elasticsearch _索引_ **是一组相关文档的集合**。Elasticsearch将数据存储为JSON文档。每个文档将一组_keys_字段或属性的名称与其对应的_values_字符串、数字、布尔值、日期、_values_数组、地理位置或其他类型的数据相关联。
Elasticsearch使用一种称为_倒排索引_的数据结构该结构旨在允许非常快速的全文搜索。倒排索引列出了在任何文档中出现的每个独特单词并标识了每个单词出现的所有文档。
在索引过程中Elasticsearch存储文档并构建倒排索引以便在近乎实时的情况下使文档数据可搜索。索引是通过索引API启动的通过该API您可以在特定索引中添加或更新JSON文档。
**默认端口**9200/tcp
## 手动枚举
### 横幅
用于访问Elasticsearch的协议是**HTTP**。当您通过HTTP访问它时您会发现一些有趣的信息`http://10.10.10.115:9200/`
![](<../.gitbook/assets/image (264).png>)
如果您在访问`/`时没有看到该响应,请参阅以下部分。
### 认证
**默认情况下Elasticsearch没有启用认证**,所以默认情况下,您可以在不使用任何凭据的情况下访问数据库内的所有内容。
您可以通过以下请求来验证认证是否被禁用:
```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}
```
**然而**,如果你向 `/` 发送请求并收到如下响应:
```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}
```
这意味着配置了认证,**你需要有效的凭据**才能从elasticsearch获取任何信息。然后你可以[**尝试暴力破解**](../generic-methodologies-and-resources/brute-force.md#elasticsearch)它使用HTTP基本认证所以任何可以暴力破解HTTP基本认证的工具都可以使用。\
这里有一个**默认用户名列表**_**elastic**超级用户remote\_monitoring\_user, beats\_system, logstash\_system, kibana, kibana\_system, apm\_system,_ \_anonymous\_。\_旧版本的Elasticsearch默认密码为**changeme**。
```
curl -X GET http://user:password@IP:9200/
```
### 基本用户枚举
```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信息
以下是一些端点,您可以通过**GET访问**以获取有关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 | | |
这些端点是从[**文档中获取的**](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html),您可以在那里**找到更多信息**。\
此外,如果您访问`/_cat`,响应将包含实例支持的`/_cat/*`端点。
在`/_security/user`中如果启用了auth您可以看到哪个用户具有`superuser`角色。
### 索引
您可以通过访问`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
```
要获取**有关索引内保存了哪种数据的信息**,您可以访问:`http://host:9200/<index>`,例如在这个案例中是 `http://10.10.10.115:9200/bank`
![](<../.gitbook/assets/image (265).png>)
### 转储索引
如果您想要**转储索引的所有内容**,您可以访问:`http://host:9200/<index>/_search?pretty=true`,如 `http://10.10.10.115:9200/bank/_search?pretty=true`
![](<../.gitbook/assets/image (266).png>)
_花点时间比较一下银行索引内每个文档条目的内容以及我们在上一节中看到的这个索引的字段。_
此时,您可能会注意到**在 "hits" 中有一个名为 "total" 的字段**,它表明在此索引内**发现了1000个文档**但只检索了10个。这是因为**默认情况下有一个10个文档的限制**。\
但是,现在您知道**这个索引包含1000个文档**,您可以通过在**`size`** 参数中指定您想要转储的条目数量来**转储所有这些文档**`http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`asd\
_注意如果您指定更大的数字所有条目都会被转储例如您可以指定 `size=9999`如果有更多条目但您应该检查这将是奇怪的。_
### 转储全部
为了转储全部,您可以直接访问**与之前相同的路径,但不指定任何索引**`http://host:9200/_search?pretty=true`,如 `http://10.10.10.115:9200/_search?pretty=true`\
请记住,在这种情况下,将应用**默认的10个结果限制**。您可以使用 `size` 参数来转储**更多的结果**。阅读上一节以获取更多信息。
### 搜索
如果您正在寻找一些信息,您可以对所有索引进行**原始搜索**,访问 `http://host:9200/_search?pretty=true&q=<search_term>`,如在 `http://10.10.10.115:9200/_search?pretty=true&q=Rockwell`
![](<../.gitbook/assets/image (267).png>)
如果您只想在一个索引上**搜索**,您可以在**路径**上**指定**它:`http://host:9200/<index>/_search?pretty=true&q=<search_term>`
_请注意用于搜索内容的 q 参数**支持正则表达式**_
您也可以使用类似 [https://github.com/misalabs/horuz](https://github.com/misalabs/horuz) 的工具来对elasticsearch服务进行模糊测试。
### 写入权限
您可以尝试在一个新索引内创建一个新文档来检查您的写入权限,运行类似以下的操作:
```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"
}'
```
该命令将创建一个名为 `bookindex` 的**新索引**,其中包含一个类型为 `books` 的文档,该文档具有属性 "_bookId_"、"_author_"、"_publisher_" 和 "_name_"
注意**新索引现在出现在列表中**
![](<../.gitbook/assets/image (268).png>)
并注意**自动创建的属性**
![](<../.gitbook/assets/image (269).png>)
## 自动枚举
一些工具将获取之前呈现的一些数据:
```bash
msf > use auxiliary/scanner/elasticsearch/indices_enum
```
{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}
## Shodan
* `port:9200 elasticsearch`
<details>
<summary><strong>从零开始学习AWS黑客技术成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary>
其他支持HackTricks的方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
</details>