# 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/" ``` ### 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/`にアクセスできます。この場合の例は`http://10.10.10.115:9200/bank`です。 ![](<../images/image (342).png>) ### インデックスのダンプ インデックスの**すべての内容をダンプしたい場合**は、`http://host:9200//_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=`にアクセスします。例えば、`http://10.10.10.115:9200/_search?pretty=true&q=Rockwell`のように。 ![](<../images/image (335).png>) 特定のインデックスで**検索したい場合は**、**パス**にそれを**指定**するだけです:`http://host:9200//_search?pretty=true&q=` _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}}