Attacking MongoDB

4,863 views

Published on

My presentation about mongoDB vulns from ZeroNights'12

My E-mail: mfirstov@ptsecurity.ru
Programs: https://github.com/cyberpunkych/attacking_mongodb

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,863
On SlideShare
0
From Embeds
0
Number of Embeds
602
Actions
Shares
0
Downloads
59
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Attacking MongoDB

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

×