# 9200 - Elasticsearchのペンテスト
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- **サイバーセキュリティ会社**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう、私たちの独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクション
- [**公式のPEASS&HackTricks swag**](https://peass.creator-spring.com)を手に入れましょう
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **ハッキングのトリックを共有するには、[hacktricks repo](https://github.com/carlospolop/hacktricks)と[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
## 基本情報
[メインページ](https://www.elastic.co/what-is/elasticsearch)から、いくつかの有用な説明を見つけることができます:
> Elasticsearchは、テキスト、数値、地理空間、構造化、非構造化を含むあらゆるタイプのデータのための分散型オープンソースの検索および分析エンジンです。ElasticsearchはApache Lucene上に構築され、2010年にElasticsearch N.V.(現在はElasticとして知られています)によって最初にリリースされました。シンプルなREST API、分散性、スピード、スケーラビリティで知られており、ElasticsearchはElastic Stackの中心的なコンポーネントです。Elastic Stackは、データの取り込み、エンリッチメント、ストレージ、分析、可視化のための一連のオープンソースツールで構成されています。Elasticsearch、Logstash、Kibanaの頭文字を取ってELK Stackとも呼ばれ、Elastic Stackには現在、データをElasticsearchに送信するための軽量な配信エージェントであるBeatsの豊富なコレクションも含まれています。
### Elasticsearchインデックスとは何ですか?
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/
```
### 基本的なユーザー列挙
Elasticsearchは、デフォルトで匿名アクセスが有効になっているため、ユーザー列挙の可能性があります。以下の手法を使用して、有効なユーザーを特定することができます。
1. **空のパスワードでのログイン試行**: Elasticsearchは、空のパスワードでのログインを許可する場合があります。したがって、空のパスワードでログインを試みることができます。
2. **一般的なユーザー名の試行**: Elasticsearchには、デフォルトでいくつかの一般的なユーザー名が設定されています。これらのユーザー名を使用してログインを試みることができます。一般的なユーザー名には、"admin"、"root"、"user"などがあります。
3. **ユーザー名の辞書攻撃**: ユーザー名の辞書攻撃を使用して、有効なユーザー名を特定することもできます。一般的な辞書攻撃ツールを使用して、ユーザー名のリストを作成し、それらを使用してログインを試みることができます。
ユーザー名を特定した後は、パスワードの推測や他の攻撃手法を使用して、アクセス権を取得することができます。
```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/"
```
### Elastic情報
以下は、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`の役割を持つユーザーを確認できます。
### インデックス
すべてのインデックスを収集するには、`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/` 例えば、この場合は `http://10.10.10.115:9200/bank`
![](<../.gitbook/assets/image (265).png>)
### インデックスのダンプ
インデックスの**すべての内容をダンプ**したい場合は、次のようにアクセスできます:`http://host:9200//_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=` のように、**すべてのインデックスでの生の検索**を行うことができます。例えば、`http://10.10.10.115:9200/_search?pretty=true&q=Rockwell`
![](<../.gitbook/assets/image (267).png>)
**インデックス内での検索**を行いたい場合は、**パス**でそれを**指定**するだけです:`http://host:9200//_search?pretty=true&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`
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- あなたは**サイバーセキュリティ会社**で働いていますか? HackTricksであなたの**会社を宣伝**したいですか?または、**PEASSの最新バージョンを入手**したいですか?または、HackTricksを**PDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう、私たちの独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクション
- [**公式のPEASS&HackTricks swag**](https://peass.creator-spring.com)を手に入れましょう
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。