Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Мы проводили пентест одной большой компании с хорошим бюджетом на ИБ и обнаружили баг в коробочном решении WebTutor. Эта уязвимость позволила нам получить доступ во внутреннюю сеть, где мы столкнулись с EDR и антивирусом. Обойти их помогла возможность исполнять команды из запросов к БД. Pentest Award
Этот текст получил третье место на премии Pentest Award 2024 в категории «Пробив web». Это соревнование ежегодно проводится компанией Awilix.
Здесь я не буду обсуждать весь ход работ — скоуп был большим, и в него входило много самописных приложений и несколько коробочных. Расскажу лишь об атаке на WebTutor — как о наиболее интересном моменте.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Websoft HCM (ранее называлась WebTutor) — это система управления талантами, предлагающая инструменты подбора, обучения, оценки компетенций, планирования карьеры, управления знаниями. Это коробочное решение, которое используется многими компаниями для автоматизации работы по найму и обучению сотрудников.
Встретив этот продукт в сети заказчика, мы решили его изучить подробнее. Для этого можно скачать демоверсию, но в ней есть ряд ограничений по сравнению с установленной на сервере полной. Зато доступны исходные коды продукта, и они как раз идентичны той версии, что развернута у заказчика.
Основное ограничение демоверсии — это возможность использовать только файловую базу данных, но при этом все возможности приложения работают. Сейчас демоверсия продукта предоставляется только по запросу.
Для хранения данных приложение использует файловую базу данных или Microsoft SQL в зависимости от настроек.
После установки находим в файловой системе папку WebTutorAdmin
с веб‑сервером. В ней две папки: снова WebTutorAdmin
, где лежит админка, и WebTutorServer
с прочими функциями сервера.
Я поискал известные нам страницы (логин и регистрация) и понял, что все файлы HTML из папки WebTutorServer/wt/web
доступны через веб‑интерфейс. Также в этой папке находятся файлы .xml и .bs, которые можно читать и выполнять через вызовы API.
info
WebTutor написан на языке JScript. JScript — это реализация ECMAScript компании Microsoft. Приложение также использует .NET Core и множество DLL-библиотек. Для управления логикой приложения используются три типа файлов: .html — страницы с кодом клиентской и серверной части вместе, .xml и .bs. Последний используется для описания методов API, которые доступны в приложении. Файлы HTML в JScript напоминают шаблоны PHP, где серверный код чередуется с кодом страницы.
Доступ к большинству эндпоинтов API возможен без дополнительной авторизации, так как там есть проверка пользователя. В шаблонах HTML за проверки сессии отвечают подгружаемые в начале скрипты:
Server.Execute( "include/user_init.html" );Server.Execute( "include/host_init.html" );
После установки WebTutor регистрация включена. Однако на целевой системе она недоступна, к тому же ограничен доступ к административным страницам. Следовательно, нам нужно найти лазейку в доступных неавторизованному пользователю шаблонах HTML.
Быстро находим простую XSS вот в этом файле:
WebTutorAdmin/WebTutorServer/wt/web/replace_photo.html
Переменная URL берется из запроса и без всякой фильтрации вставляется в код страницы.
<% try { _url = UrlDecode( Trim( Request.Form.GetProperty( "url" ) ) ); //... <script type="text/javascript"> location.href = "<%=_url%>"; </script>
Пример встраивания кода на JScript
Полный HTTP-запрос для XSS:
POST /replace_photo.html HTTP/1.1 Host: 10.3.89.104 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/119.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/* ;q=0.8 Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Connection: close Cookie: SessionID=7303593220364327493 Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Content-Length: 25 foto=1&url=1";alert(1);//
Перепроверяем все эндпоинты API без авторизации и находим метод /api/spxml2/get_image
. Он доступен и позволяет читать произвольные файлы в системе.
Пример чтения файла win.ini
Расширить зону поиска можно, например, получив учетную запись. Ищем файлы, где происходит работа с пользователями, и находим возможность изменения профиля в следующем файле:
WebTutorAdmin/WebTutorServer/wt/web/user_change.html
Из запроса берутся все данные и дальше сохраняются в БД, при этом не делается проверка на активную сессию. Хоть приложение ломается при таком запросе и выдает 500, оно все равно успевает вызвать первый блок кода, где выполняется сохранение пользователя в БД.
Все параметры для создаваемого пользователя берутся из запроса, включая логин и пароль. Для создания незаблокированного пользователя необходимо передать аргументы view=new
без поля web_banned
.
_login = tools_web.convert_xss(Request.Form.GetOptProperty("login", ""));_password = tools_web.convert_xss(Request.Form.GetOptProperty("password", ""));_lastname = tools_web.convert_xss(Request.Form.GetOptProperty("lastname", ""));_firstname = tools_web.convert_xss( Request.Form.GetOptProperty("firstname", ""));_middlename = tools_web.convert_xss( Request.Form.GetOptProperty("middlename", ""));_position_name = tools_web.convert_xss( Request.Form.GetOptProperty("position_name", ""));_view = tools_web.convert_xss(Request.Form.GetOptProperty("view", "self"));_email = tools_web.convert_xss(Request.Form.GetOptProperty("email", ""));_phone = tools_web.convert_xss(Request.Form.GetOptProperty("phone", ""));_sex = tools_web.convert_xss(Request.Form.GetOptProperty("sex", "")); //...if (_view == "new") _web_banned = Request.Form.HasProperty("web_banned");
Источник: xakep.ru