9200 - Pentesting Elasticsearch

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Основна інформація

Elasticsearch - це розподілений, відкритий пошуковий та аналітичний движок для всіх типів даних. Він відомий своєю швидкістю, масштабованістю та простими REST API. Побудований на Apache Lucene, вперше був випущений в 2010 році компанією Elasticsearch N.V. (тепер відомою як Elastic). Elasticsearch є основним компонентом Elastic Stack, колекції відкритих інструментів для впровадження, збагачення, зберігання, аналізу та візуалізації даних. Цей стек, який часто називають ELK Stack, також включає Logstash та Kibana, а тепер має легкі агенти доставки даних, які називаються Beats.

Що таке індекс Elasticsearch?

Індекс Elasticsearch - це колекція пов'язаних документів, збережених у форматі JSON. Кожен документ складається з ключів та відповідних значень (рядків, чисел, булевих значень, дат, масивів, геолокацій тощо).

Elasticsearch використовує ефективну структуру даних, яка називається інвертованим індексом, для забезпечення швидкого повнотекстового пошуку. Цей індекс перелічує кожне унікальне слово в документах та визначає документи, в яких з'являється кожне слово.

Під час індексації Elasticsearch зберігає документи та створює інвертований індекс, що дозволяє здійснювати майже миттєвий пошук. Для додавання або оновлення JSON-документів у конкретний індекс використовується індексовий API.

Порт за замовчуванням: 9200/tcp

Ручна перелічення

Банер

Протокол, який використовується для доступу до Elasticsearch, - HTTP. При доступі до нього через HTTP ви знайдете цікаву інформацію: http://10.10.10.115:9200/

Якщо ви не бачите цю відповідь при доступі до /, подивіться наступний розділ.

Аутентифікація

За замовчуванням Elasticsearch не має ввімкненої аутентифікації, тому за замовчуванням ви можете отримати доступ до всього всередині бази даних без використання будь-яких облікових даних.

Ви можете перевірити, що аутентифікація вимкнена, зробивши запит до:

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}

Однак, якщо ви надсилаєте запит до / і отримуєте відповідь, подібну до наступної:

{"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. Потім ви можете спробувати зламати його (використовує 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/

Основна перелік користувачів

#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

Ось деякі кінцеві точки, до яких ви можете отримати доступ за допомогою 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

Ці кінцеві точки були взяті з документації, де ви можете знайти більше. Також, якщо ви звернетесь до /_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/<index> наприклад, у цьому випадку http://10.10.10.115:9200/bank

Дамп індексу

Якщо ви хочете вивантажити всі вміст індексу, ви можете отримати доступ до: http://host:9200/<index>/_search?pretty=true наприклад, http://10.10.10.115:9200/bank/_search?pretty=true

Приділіть хвилину, щоб порівняти вміст кожного документа (запису) в індексі банку та поля цього індексу, які ми бачили в попередньому розділі.

Таким чином, на цьому етапі ви можете помітити, що є поле з назвою "total" всередині "hits", яке вказує на те, що всередині цього індексу було знайдено 1000 документів, але лише 10 було витягнуто. Це тому, що за замовчуванням є обмеження на 10 документів. Але, тепер, коли ви знаєте, що цей індекс містить 1000 документів, ви можете вивантажити всі з них, вказавши кількість записів, які ви хочете вивантажити в параметрі size: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000asd Примітка: Якщо ви вкажете більше число, всі записи все одно будуть вивантажені, наприклад, ви можете вказати 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

Якщо ви хочете просто шукати в індексі, ви можете просто вказати його в шляху: http://host:9200/<index>/_search?pretty=true&q=<search_term>

Зверніть увагу, що параметр q, використаний для пошуку вмісту, підтримує регулярні вирази

Ви також можете використовувати щось на зразок https://github.com/misalabs/horuz, щоб провести фаззинг сервісу Elasticsearch.

Права на запис

Ви можете перевірити свої права на запис, спробувавши створити новий документ всередині нового індексу, запустивши щось на зразок:

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"

Зверніть увагу, як новий індекс з'являється у списку:

І помітіть автоматично створені властивості:

Автоматичне перелічення

Деякі інструменти отримають деякі дані, представлені раніше:

msf > use auxiliary/scanner/elasticsearch/indices_enum

Shodan

  • port:9200 elasticsearch

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated