Лазейка в Webmin. Как работает бэкдор в панели управления сервером

В популярной панели управления сервером Webmin обнаружилась уязвимость, которая больше всего похожа на оставленную кем-то закладку. Атакующий в результате может выполнять произвольный код на целевой системе с правами суперпользователя. Давай посмотрим, как это работает, в чем заключается проблема и как с ней бороться.

Webmin полностью написан на Perl, без использования нестандартных модулей. Он состоит из простого веб-сервера и нескольких скриптов — они связывают команды, обеспечивающие исполнение команд, которые пользователь отдает в веб-интерфейсе, на уровне операционной системы и внешних программ. Через веб-админку можно создавать новые учетные записи пользователей, почтовые ящики, изменять настройки служб и разных сервисов и все в таком духе.

Уязвимость находится в модуле восстановления пароля. Манипулируя параметром old в скрипте password_change.cgi, атакующий может выполнять произвольный код на целевой системе с правами суперпользователя, что наводит на мысли об умышленном характере этого бага. Что еще подозрительнее — проблема присутствует только в готовых сборках дистрибутива с SourceForge, а в исходниках на GitHub ее нет.

INFO

Уязвимость получила идентификатор CVE-2019-15107.

Стенд

Для демонстрации уязвимости нам понадобятся две версии дистрибутива Webmin — 1.890 и 1.920, так как тестовые окружения для них немного различаются. Для этого воспользуемся двумя контейнерами Docker.

$ docker run -it --rm -p10000:10000 --name=webminrce18 --hostname=webminrce18.vh debian /bin/bash
$ docker run -it --rm -p20000:10000 --name=webminrce19 --hostname=webminrce19.vh debian /bin/bash

Теперь установим необходимые зависимости.

$ apt-get update -y && apt install -y perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl nano wget python apt-show-versions

Во время установки apt-show-versions у меня возникла проблема (на скриншоте ниже).

Проблема при установке apt-show-versions через apt

Следующие команды помогают ее устранить:

$ apt-get purge -y apt-show-versions
$ rm /var/lib/apt/lists/*lz4
$ apt-get -o Acquire::GzipIndexes=false update -y
$ apt install -y apt-show-versions

После этого скачиваем соответствующие версии дистрибутивов с SourceForge.

$ wget http://prdownloads.sourceforge.net/webadmin/webmin_1.890_all.deb
$ wget http://prdownloads.sourceforge.net/webadmin/webmin_1.920_all.deb

И устанавливаем их.

$ dpkg --install webmin_1.890_all.deb
$ dpkg --install webmin_1.920_all.deb
Установка обеих версий Webmin закончена

Теперь запускаем демоны Webmin.

$ service webmin start

Версия 1.890 доступна на дефолтном порте 10000, а 1.920 — на 20000.

Готовые к эксплуатации стенды с Webmin

Осталось только установить пароль для пользователя root при помощи команды passwd, и стенды готовы. Переходим к деталям уязвимости.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

aLLy: Специалист по информационной безопасности в ONsec. Research, ethical hacking and Photoshop.