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

194 lines
15 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>htARTEHackTricks AWS Red Team Expert</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でAWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong></strong></summary>
HackTricksをサポートする他の方法
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**公式PEASSHackTricksスワッグ**](https://peass.creator-spring.com)を入手する
- [**The PEASS Family**](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/hacktricks_live)をフォローする。
- **ハッキングトリックを共有するには、[HackTricks](https://github.com/carlospolop/hacktricks)と[HackTricks Cloud](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
</details>
## 基本情報
Elasticsearchは、**分散型**、**オープンソース**の検索および分析エンジンで、**あらゆる種類のデータ**に対応しています。**速度**、**拡張性**、および**シンプルなREST API**で知られています。Apache Lucene上に構築され、2010年にElasticsearch N.V.現在はElasticとして知られていますによって最初にリリースされました。ElasticsearchはElastic Stackの中核コンポーネントであり、データの取り込み、拡張、保存、分析、可視化のためのオープンソースツールのコレクションです。このスタックは一般的にELKスタックと呼ばれ、LogstashとKibanaも含まれており、Beatsと呼ばれる軽量データ転送エージェントも含まれています。
### Elasticsearchインデックスとは
Elasticsearchの**インデックス**は、**JSON**として保存された**関連するドキュメント**のコレクションです。各ドキュメントは、**キー**とそれに対応する**値**(文字列、数値、ブール値、日付、配列、地理位置など)で構成されています。
Elasticsearchは、高速な全文検索を可能にする効率的なデータ構造である**転置インデックス**を使用しています。このインデックスは、ドキュメント内のすべての一意の単語をリストし、各単語が現れるドキュメントを特定します。
インデックス作成プロセス中、Elasticsearchはドキュメントを保存し、転置インデックスを構築し、リアルタイムに検索を可能にします。**インデックス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 Info
以下は、Elasticsearchに関する情報を取得するために**GET経由でアクセス**できるいくつかのエンドポイントです:
| \_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`(認証が有効な場合)では、どのユーザーが`superuser`の役割を持っているかを確認できます。
### Indices
`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`\
_注より大きな数値を指定すると、すべてのエントリが無条件にダンプされます。たとえば、`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"
}'
```
そのコマンドは、タイプが`books`で、属性が"_bookId_"、"_author_"、"_publisher_"、"_name_"であるドキュメントを持つ`bookindex`という**新しいインデックス**を作成します。
**新しいインデックスがリストに表示**される方法に注目してください:
![](<../.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>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
HackTricksをサポートする他の方法
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASSHackTricksのグッズ**](https://peass.creator-spring.com)を入手する
* [**The PEASS Family**](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/hacktricks_live)を**フォロー**する。
* **HackTricks**および**HackTricks Cloud**のgithubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
</details>