Advertisement

More Related Content

Slideshows for you(20)

Similar to Attacking MongoDB(20)

Advertisement

Recently uploaded(20)

Advertisement

Attacking MongoDB

  1. Удар по MongoDB Фирстов Михаил
  2. Что это вообще такое? MongoDB — документо-ориентированная СУБД с открытым исходным кодом, не требующая описания схемы таблиц. (wiki) Особенности: 1. Документо-ориентированное хранилище. 2. Достаточно гибкий язык для формирования запросов 3. Динамические запросы 4. Полная поддержка индексов 5. Профилирование запросов 6. Поддержка отказоустойчивости и масштабируемости
  3. А на чем он? ./mongod — это серверная часть, написанная на C++ ./mongo – офф. клиент, написанный на C++ и JS У Mongodb существуют официальные драйвера для основных ЯП: C C++ Java Javascript .NET (C# F#, PowerShell, etc) Node.js Perl PHP Python Ruby Scala
  4. Где используются Краткий список компаний использующих MongoDB: 1. SAP (Крупный производитель программного обеспечения) 2. SourceForge (Хостинг открытого исходного кода) 3. The New York Times 4. GitHub (Проект социального хостинга) 5. Foursquare (Достаточно крупный и известный стартап) 6. Yandex (некоторые сервисы)
  5. Что такое RESTful? Веб-службы RESTful в MongoDB используют интерфейс API для связи с базами данных, просмотра логов и исполнения других ф-ций администрирования.
  6. А как я узнаю его? Он по дефолту запускается на порту «28017». Он может быть запущен без параметра –rest, тогда будет вот эта ошибка:
  7. А как я узнаю его?
  8. Какие там уязвимости? Во время исследования были найдены следующие уязвимости: Исполнение произвольного серверного JS кода Хранимая XSS в логах обращения к БД Хранимая XSS в журнале запросов CSRF в удаленном обращении к БД Our SSJS code
  9. Проведение атаки 1) Посылаем запрос с тегом script, и адресом Site with нашего скрипта. mongoDB driver support Hacker Admin’s browser Hacker’s Server MongoDB --REST
  10. Проведение атаки 1) Посылаем запрос с тегом script, и адресом Site with нашего скрипта. mongoDB driver support Hacker Admin’s browser 2) В результате нашего запроса, в REST интерфейсе будет подгружаться наш скрипт Hacker’s Server MongoDB --REST
  11. Проведение атаки 1) Посылаем запрос с тегом script, и адресом Site with нашего скрипта. mongoDB driver support Hacker Admin’s browser 2) В результате нашего запроса, в REST интерфейсе будет подгружаться наш скрипт Hacker’s Server 3) Через XSS в браузере MongoDB подгружается наш скрипт --REST
  12. Проведение атаки 1) Посылаем запрос с тегом script, и адресом Site with нашего скрипта. mongoDB driver support Hacker 4) Посылаем команду, Admin’s browser браузеру жертвы 2) В результате нашего запроса, в REST интерфейсе будет подгружаться наш скрипт Hacker’s Server 3) Через XSS в браузере MongoDB подгружается наш скрипт --REST
  13. Проведение атаки 1) Посылаем запрос с тегом script, и адресом Site with нашего скрипта. mongoDB driver support Hacker 4) Посылаем команду, Admin’s browser браузеру жертвы 2) В результате нашего запроса, в REST интерфейсе будет 5) Ждем, пока скрипт не запросит подгружаться наш команду (JSONP) ( скрипт скрипт запрашивает новую команду каждые 30 секунд) Hacker’s Server 3) Через XSS в браузере MongoDB подгружается наш скрипт --REST
  14. Проведение атаки 1) Посылаем запрос с тегом script, и адресом Site with нашего скрипта. mongoDB driver support Hacker 4) Посылаем команду, Admin’s browser браузеру жертвы 2) В результате нашего запроса, в 6) Выполняем полученную REST интерфейсе команду, через будет недокументированное 5) Ждем, пока скрипт не запросит подгружаться наш команду (JSONP) ( скрипт исполнение SSJS, и получаем скрипт ответ запрашивает новую команду каждые 30 секунд) Hacker’s Server 3) Через XSS в браузере MongoDB подгружается наш скрипт --REST
  15. Проведение атаки 1) Посылаем запрос с тегом script, и адресом Site with нашего скрипта. mongoDB driver support Hacker 4) Посылаем команду, Admin’s browser браузеру 7) Отправляем результат исполнения жертвы команды на запись в БД 2) В результате нашего запроса, в 6) Выполняем полученную REST интерфейсе команду, через будет недокументированное 5) Ждем, пока скрипт не запросит подгружаться наш команду (JSONP) ( скрипт исполнение SSJS, и получаем скрипт ответ запрашивает новую команду каждые 30 секунд) Hacker’s Server 3) Через XSS в браузере MongoDB подгружается наш скрипт --REST
  16. Проведение атаки 1) Посылаем запрос с тегом script, и адресом Site with нашего скрипта. mongoDB driver support Hacker 4) Посылаем команду, 8) Получаем Admin’s browser браузеру результат 7) Отправляем результат исполнения жертвы исполнения команды на запись в БД команды 2) В результате нашего запроса, в 6) Выполняем полученную REST интерфейсе команду, через будет недокументированное 5) Ждем, пока скрипт не запросит подгружаться наш команду (JSONP) ( скрипт исполнение SSJS, и получаем скрипт ответ запрашивает новую команду каждые 30 секунд) Hacker’s Server 3) Через XSS в браузере MongoDB подгружается наш скрипт --REST
  17. Видео
  18. Разве такое можно встретить?
  19. Стабильный CRASH MongoDB очень часто падает если вызвать ф-цию с нестандартными параметрами. На скриншотах можно увидеть результат:
  20. Интересные фичи  Ф-ции ls, cat, (остальные - help admin) работают только из самой консоли Mongo.  Скорее всего существуют и другие варианты NoSQL-инъекций, с другими языками программирования.  Очень интересна ф-ция nativeHelper, которая как раз и отвечает за работу с ФС из консоли mongo.  Чаще всего путь к файлам бд – «/data/db» или «/var/lib/mongodb». Структура каталога простая: (dbname).(num). Чтобы извлечь информацию достаточно сделать $ strings users.*
  21. Сетевое взаимодействие Добавление пользователя: Расшифровываем соль: Исходный код:
  22. Сетевое взаимодействие Перехваченные пакеты авторизации: Нужные нам данные передаются в открытом виде:
  23. Сетевое взаимодействие Логика работы скрипта, для перехвата и перебора паролей: Перехватываем n Получаем пакетов, связанных следующую строку из с mongodb словаря key2 = md5(nonce + user + md5(user + ":mongo:" + passw)), где passw это строка из словаря Получаем из данных key, nonce, login Проверяем key == key2 Выводим их на user:passwd наличие пакетов авторизации false true Нашли Выход Не нашли
  24. Сетевое взаимодействие
  25. Сетевое взаимодействие. MiTM атака 1. Запрос авторизации mongoDB admin Hacker
  26. Сетевое взаимодействие. MiTM атака 1. Запрос авторизации mongoDB admin 2. Отдаем nonce, под который сгенерированы rainbow tables Hacker
  27. Сетевое взаимодействие. MiTM атака 1. Запрос авторизации mongoDB admin 2. Отдаем nonce, под который сгенерированы rainbow tables Hacker 3. Клиент отдает нам login и получившийся key
  28. Сетевое взаимодействие. MiTM атака 4. Подбираем 1. Запрос пароль по заранее авторизации сгенерированным mongoDB к этому nonce радужным admin 2. Отдаем nonce, под таблицам который сгенерированы rainbow tables Hacker 3. Клиент отдает нам login и получившийся key
  29. Сетевое взаимодействие. MiTM атака 4. Подбираем 1. Запрос пароль по заранее авторизации сгенерированным mongoDB к этому nonce радужным admin 2. Отдаем nonce, под таблицам который сгенерированы rainbow tables 5. Успешно авторизовываемся с полученными данными Hacker 3. Клиент отдает нам login и получившийся key
  30. Что такое BSON Что такое BSON? Типы данных Это Бинарный JSON. BSON это string – строка расширение JSON, которое int - целое число позволяет хранить данные в double - двойное число с плавающей различных форматах: дата и запятой время, бинарные данные и т.п. DateTime – дата byte[] - массив байт (бинарные данные) bool - булевые (true/false) null - ноль Пример? BsonObject - BSON объект BsonObject[] - массив BSON объектов
  31. Перезапись переменных Имеется таблица с двумя записями: Также запрос, в который мы можем внедриться: Вставляем BSON документ, который перезаписывает переменную isadmin: Проверяем:
  32. Чтение произвольных участков памяти Exploit: Length В действии:
  33. Чтение произвольных участков памяти В действии:
  34. Особенности разных ЯП Ruby on Rails nodejs PHP
  35. Особенности разных ЯП Ruby on Rails
  36. Особенности разных ЯП Mass assignment в Ruby on Rails:
  37. Особенности разных ЯП Mass assignment в Ruby on Rails:
  38. Особенности разных ЯП NodeJS
  39. Особенности разных ЯП JSON injection в NodeJS + MongoDB: SEND SEND VULNERABLE SOURCE CODE: VULNERABLE SOURCE CODE: RESULT QUERY: RESULT QUERY: Хакер 02/12 (157)
  40. Особенности разных ЯП PHP
  41. Уязвимости Типы обнаруженных уязвимостей: Обход авторизации через подстановку массива в php Внедрение SSJS (Server Side JavaScript) кода Слепое внедрение SSJS, Time-based
  42. Особенности разных ЯП Как известно, php обрабатывает символы “[]” из GPC как массив: password[$ne]=parol1 В официальном классе mongoDB для для php есть ф-ция find()
  43. Особенности разных ЯП Формируется вот такой NoSQL запрос к MongoDB, и авторизация проходит успешно: Таким образом, если в коде нет проверки, мы можем обойти авторизацию разными способами:
  44. Особенности разных ЯП Внедрение напрямую в js запрос. Предположим в коде вот такие вот строки: $q = “function() { var loginn = ‘$login’; var passs = ‘$pass’; db.members.insert({id : 2, login : loginn, pass : passs}); }”; $db->execute($q); Также в ответ выводятся наш id и login. Теперь пробуем внедриться в запрос: Видно, что тут идет перезапись переменной «loginn» на результат команды db.version()
  45. Особенности разных ЯП Иногда невозможно увидеть результат исполнения SSJS-кода. Для этих случаем лучше использовать технику Time-based: Специально для этого был написан скрипт для перебора и вывода нужных пользователю данных.
  46. NoSQL-injection Cheat Sheet  db.getName() - имя текущей БД можно просто db  db.members.count() - количество записей в таблице members  db.members.validate({ full : true}) - основная информация о таблице members  db.members.stats() - почти то же что и предыдущее, но немного в укороченном варианте  db.members.remove() - очистить таблицу members, синтаксис такой-же как и у ф-ции find()  db.members.find().skip(0).limit(1) - еще один способ получения записи. Просто перебираем значение skip.  db.getMongo().getDBNames().toString() – Получаем список всех доступных БД  db.members.find()[0][‘pass’] – получаем значение поля pass из первой записи
  47. Спасибо за внимание! Фирстов Михаил Ноябрь 2012
Advertisement