mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
196 lines
17 KiB
Markdown
196 lines
17 KiB
Markdown
# 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 %}
|