Содержание статьи
SQL Privilege Escalation бывает двух типов: повышение привилегий внутри базы данных и повышение привилегий в операционной системе. При повышении привилегий в ОС важно, чтобы база данных была запущена от имени привилегированного пользователя. Как минимум это должен быть другой пользователь, чтобы можно было поискать другие векторы для эскалации.
info
Для краткости в статье вольно использую термин «база данных» по отношению к MySQL и прочим системам управления базами данных (СУБД). База данных — это набор таблиц, индексов и подобного. Система управления базами данных — программное обеспечение, которое предоставляет возможность создания баз данных и доступа к ним.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
От MySQL до root на сервере
Для демонстрации уязвимости будем использовать лабораторную работу с VulnHub под названием Kioptrix: Level 1.3. Скачай ее, если собираешься повторять все упражнения из статьи. Рекомендую: так ты гораздо лучше поймешь изложенное, плюс у тебя будет возможность поэкспериментировать самостоятельно.
Для запуска в VirtualBox бери версию VMware. В архиве лежит файл Kioptrix4_vmware., VirtualBox понимает этот формат. Создай новую машину, задай название, выбери тип Linux и укажи ОС Ubuntu. Образ ISO выбирать не нужно. В настройках жесткого диска выбери «Использовать существующий». Нажми кнопку выбора диска, добавь новый носитель, указав путь к Kioptrix4_vmware.. Машина готова к старту.
Я не буду описывать путь получения логина и пароля. Если интересно, попробуй пройти этот путь полностью — начиная со сканирования портов и до момента получения кред.
Для аутентичности атаки подключись по SSH. Или, как я, используй терминал запущенной машины. Разницы никакой нет: все команды и реакция на них одинаковые.
Залогинься с учетными данными john/. Машина выдаст приветствие, но это ограниченная оболочка lshell. Limited Shell фильтрует команды пользователя, оставляя только самое необходимое. Например, ls, cd, echo. Если попытаешься выполнить mysql, получишь сообщение о неизвестной команде. Чтобы загрузить привычный bash, выполни
echo os.system('/bin/bash')Оболочка написана на Python, поэтому echo пробросит интерпретатору os.. Функция system( из стандартного пакета os выполнит системный вызов. Теперь у тебя есть полноценный шелл.

Попробуй запустить mysql от рута: mysql . На тестовой машине для пользователя root базы данных пароль не установлен. Современные версии MySQL всеми способами защищают от входа под root с пустым паролем, но среди айтишников много талантливых ребят, которые не признают пароль для root.
Чекни пользовательские функции:
select * from mysql.func;Пользовательские функции — это способ расширить возможности MySQL. Код пишут на системном языке программирования, вроде C или C++. Его компилируют в обычные библиотеки: . для Linux или . для Windows. Библиотеку помещают в папку плагинов MySQL, после чего функцию можно добавить как UDF (user-defined function). UDF нужны, например, при обработке сложных структур данных и реализации собственных алгоритмов, а еще когда нужны системные вызов и прочие вещи, которые не поддерживает MySQL.

В выводе есть интересная функция sys_exec из библиотеки lib_mysqludf_sys.. Скорее всего, такая функция выполняет системные вызовы, а название библиотеки lib_mysqludf_sys. довольно популярно в среде хакинга, исходный код может быть подобен этому коду на GitHub.
Но жесткого регламента по названиям нет. В учебной машине функция и либа так названы для удобства и простоты. В реальности название может не отображать назначение. Ситуацию осложняет то, что по выводу тоже не всегда понятно назначение. Попробуй
select sys_exec("id");В результате будет NULL, а не ожидаемый вывод id. Напрямую функция не раскрывает информацию, но остается косвенный вариант — некорректный вызов:
select sys_exec("brbrbr");MySQL отвалится с ошибкой. Значит, есть хороший шанс, что UDF действительно выполняет системные вызовы, но при этом не обрабатывает ошибки. Попробуй добавить пользователя john в группу администраторов:
select sys_exec(“usermod -aG admin john”);
warning
В примере я добавил пользователя в группу admin, это особенность конкретной лабы. В большинстве случаев добавлять нужно в группу sudo.
Ответ NULL дает надежду, что все прошло успешно. Выйди из MySQL в оболочку и выполни sudo . Бинго! Ты добился эскалации привилегий через MySQL.

Загрузка UDF на сервер
Использовать буду ту же машину — Kioptrix: Level 1.3.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
