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

196 lines
17 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
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Основна інформація
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/`
![](<../.gitbook/assets/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-methodologies-and-resources/brute-force.md#elasticsearch) (він використовує HTTP basic auth, тому можна використовувати все, що BF HTTP basic auth може використовувати).\
Ось у вас є **список стандартних імен користувачів**: _**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
Ось кілька кінцевих точок, до яких ви можете **доступитися через 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` (якщо автентифікація увімкнена) ви можете побачити, який користувач має роль `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 (342).png>)
### Вивантаження індексу
Якщо ви хочете **вивантажити всі вмісти** індексу, ви можете отримати доступ до: `http://host:9200/<index>/_search?pretty=true`, як `http://10.10.10.115:9200/bank/_search?pretty=true`
![](<../.gitbook/assets/image (914).png>)
_Витратьте хвилину, щоб порівняти вміст кожного документа (запису) в індексі bank та поля цього індексу, які ми бачили в попередньому розділі._
Отже, на цьому етапі ви можете помітити, що **існує поле під назвою "total" всередині "hits"**, яке вказує на те, що **в цьому індексі знайдено 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 (335).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 (130).png>)
І зверніть увагу на **автоматично створені властивості**:
![](<../.gitbook/assets/image (434).png>)
## Автоматична енумерація
Деякі інструменти отримають частину даних, представлених раніше:
```bash
msf > use auxiliary/scanner/elasticsearch/indices_enum
```
{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}
## Shodan
* `port:9200 elasticsearch`
{% hint style="success" %}
Вивчайте та практикуйте Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Вивчайте та практикуйте Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Підтримайте HackTricks</summary>
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
</details>
{% endhint %}