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

173 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 - Pentesting Elasticsearch
{{#include ../banners/hacktricks-training.md}}
## 基本情報
Elasticsearchは、**分散型**、**オープンソース**の検索および分析エンジンで、**あらゆる種類のデータ**に対応しています。**速度**、**スケーラビリティ**、および**シンプルなREST API**で知られています。Apache Luceneの上に構築され、2010年にElasticsearch N.V.現在のElasticによって最初にリリースされました。Elasticsearchは、データの取り込み、強化、保存、分析、視覚化のためのオープンソースツールのコレクションであるElastic Stackのコアコンポーネントです。このスタックは一般にELK Stackと呼ばれ、LogstashやKibanaも含まれ、現在はBeatsと呼ばれる軽量データ送信エージェントがあります。
### Elasticsearchインデックスとは
Elasticsearchの**インデックス**は、**関連するドキュメント**のコレクションで、**JSON**として保存されています。各ドキュメントは、**キー**とそれに対応する**値**(文字列、数値、ブール値、日付、配列、地理位置情報など)で構成されています。
Elasticsearchは、効率的なデータ構造である**逆インデックス**を使用して、高速な全文検索を実現しています。このインデックスは、ドキュメント内のすべてのユニークな単語をリストし、各単語が出現するドキュメントを特定します。
インデックス作成プロセス中に、Elasticsearchはドキュメントを保存し、逆インデックスを構築して、ほぼリアルタイムの検索を可能にします。**インデックスAPI**は、特定のインデックス内のJSONドキュメントを追加または更新するために使用されます。
**デフォルトポート**: 9200/tcp
## 手動列挙
### バナー
Elasticsearchにアクセスするために使用されるプロトコルは**HTTP**です。HTTP経由でアクセスすると、いくつかの興味深い情報が見つかります: `http://10.10.10.115:9200/`
![](<../images/image (294).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-hacking/brute-force.md#elasticsearch)HTTP基本認証を使用しているため、BF 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`です。
![](<../images/image (342).png>)
### インデックスのダンプ
インデックスの**すべての内容をダンプしたい場合**は、`http://host:9200/<index>/_search?pretty=true`にアクセスできます。例えば、`http://10.10.10.115:9200/bank/_search?pretty=true`のように。
![](<../images/image (914).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`のように。
![](<../images/image (335).png>)
特定のインデックスで**検索したい場合は**、**パス**にそれを**指定**するだけです:`http://host:9200/<index>/_search?pretty=true&q=<search_term>`
_qパラメータは、コンテンツを検索するために**正規表現をサポートしています**。_
また、Elasticsearchサービスをファズするために、[https://github.com/misalabs/horuz](https://github.com/misalabs/horuz)のようなものを使用することもできます。
### 書き込み権限
新しいインデックス内に新しいドキュメントを作成しようとして、次のようなコマンドを実行することで、書き込み権限を確認できます。
```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"
}'
```
そのコマンドは、属性 "_bookId_"、"_author_"、"_publisher_"、および "_name_" を持つ `books` タイプのドキュメントを持つ **新しいインデックス** `bookindex` を作成します。
**新しいインデックスがリストに表示される**ことに注意してください:
![](<../images/image (130).png>)
また、**自動的に作成されたプロパティ**にも注意してください:
![](<../images/image (434).png>)
## 自動列挙
いくつかのツールは、前述のデータの一部を取得します:
```bash
msf > use auxiliary/scanner/elasticsearch/indices_enum
```
{{#ref}}
https://github.com/theMiddleBlue/nmap-elasticsearch-nse
{{#endref}}
## Shodan
- `port:9200 elasticsearch`
{{#include ../banners/hacktricks-training.md}}