#10 Bug Bounty v.2 — Основные базы данных для взлома. ElasticSearch
Здравствуйте, дорогие друзья.
Вы, вероятно, слышали о популярной реляционной базе данных под названием MySQL. ElasticSearch, как и MySQL, является базой данных, используемой для хранения и запроса информации. Однако ElasticSearch обычно используется для выполнения полнотекстового поиска в очень больших наборах данных. Следует также отметить, что ElasticSearch по умолчанию не проходит проверку подлинности, что может вызвать множество проблем с безопасностью, как описано в следующих разделах.
Основы ElasticSearch
Согласно Google, “ElasticSearch — это документно-ориентированная база данных, предназначенная для хранения, извлечения и управления документно-ориентированными или полуструктурированными данными. При использовании Elasticsearch вы сохраняете данные в виде документа JSON. Когда вы запрашиваете их для извлечения”. В отличие от MySQL, который хранит свою информацию в таблицах, elasticsearch использует так называемые типы. Каждый тип может содержать несколько строк, которые называются документами. Документы — это, по сути, большой двоичный файл в формате json, содержащий ваши данные, как показано в примере ниже:
● {«id»:1, «имя»: «timcore», «пароль»:»SuperSecureP@ssword»}
В MySQL мы используем имена столбцов, но в Elasticsearch мы используем имена полей. Именами полей в приведенном выше json-двоичном файле будут id, name и password. В MySQL мы будем хранить все наши таблицы в базе данных.
![В MySQL мы используем имена столбцов, но в Elasticsearch мы используем имена полей](https://timcore.ru/wp-content/uploads/2024/07/037.jpg)
В ElasticSearch мы храним наши документы в так называемом индексе. Индекс — это, по сути, набор документов.
База данных ElasticSearch, не прошедшая проверку подлинности
В Elasticsearch есть http-сервер, работающий на порту 9200, который можно использовать для запроса к базе данных. Основная проблема здесь заключается в том, что многие пользователи предоставляют доступ к этому порту в общедоступном Интернете без какой-либо проверки подлинности. Это означает, что любой может запросить базу данных и извлечь информацию. Быстрый поиск по Shodan даст множество результатов, как показано ниже:
![Быстрый поиск по Shodan](https://timcore.ru/wp-content/uploads/2024/07/038.jpg)
Как только вы определите, что у вашей целевой базы данных открыт порт 9200, вы можете легко проверить, является ли она базой данных ElasticSearch, отправив запрос GET в корневой каталог. Ответ должен выглядеть примерно так:
![запрос GET в корневой каталог](https://timcore.ru/wp-content/uploads/2024/07/039.jpg)
Как только вы узнаете, что у конечной точки есть доступная база данных Elastic Search, попробуйте найти все доступные индексы(базы данных). Это можно сделать, нажав “/_cat/indexes?v” отправив запрос GET в конечную точку. При этом будут перечислены все индексы, как показано ниже:
![Перечисление всех индексов](https://timcore.ru/wp-content/uploads/2024/07/040.jpg)
Эту информацию, а также другие сведения о сервисе можно найти, запросив конечную точку “/_stats/?pretty=1”.
Для выполнения полнотекстового поиска в базе данных вы можете использовать следующую команду “/_all/_search?q=электронная почта”. При этом во всех индексах будет запрашиваться слово “электронная почта”. Есть несколько слов, которые мне нравятся для поиска, в том числе:
● Имя пользователя
● Адрес электронной почты
● Пароль
● Токен
● Секрет
● Ключ
Если вы хотите запросить определенный индекс, вы можете заменить слово “_all” на название индекса, по которому вы хотите выполнить поиск. Другой полезный метод — перечислить все имена полей, отправив запрос GET в конечную точку “/INDEX_NAME_HERE/_mapping?pretty=1”. Обычно я ищу интересные имена полей, такие как:
● Имя пользователя
● Адрес электронной почты
● Пароль
● Токен
● Секрет
● Ключ
Результат должен выглядеть примерно так:
![mapping?pretty=1](https://timcore.ru/wp-content/uploads/2024/07/041.jpg)
Как вы можете видеть выше, у нас есть имена полей addressable_type, city и многое другое, которые не отображаются, поскольку выходные данные были слишком большими. Чтобы запросить все значения, содержащие определенное имя поля, используйте следующую команду “/_all/_search?q=_exists:email&pretty=1” . При этом будут возвращены документы, содержащие имя поля(столбца) с именем email, как показано ниже:
![будут возвращены документы, содержащие имя поля(столбца) с именем email](https://timcore.ru/wp-content/uploads/2024/07/042.jpg)
Опять же, вы можете заменить “_all” именем индекса, чтобы выполнять поиск конкретно по этой конечной точке.
Резюме
ElasticSearch — это просто еще одна база данных, в которой вы можете хранить информацию и запрашивать ее. Основная проблема заключается в том, что пользователи открывают доступ к веб-сервису, не прошедшему проверку подлинности. Имея доступ к веб-сервису без проверки подлинности, злоумышленники могут легко удалить всю базу данных. Всегда следите за портом 9200.
На этом все. Всем хорошего дня!