Spring4Shell CVE-2022-22965攻擊腳本說明
程式碼結構與執行流程
1. Imports
1 | import requests |
requests: 用於發送 HTTP 請求,這個庫是 Python 中常用的網路請求工具,可以輕鬆地構建和發送各種 HTTP 請求。
argparse: 用於解析命令列參數,這個模組讓程式可以處理用戶在命令行中輸入的參數和選項。
urljoin: 用於將基礎 URL 與特定路徑組合成完整的 URL,以便於動態構建請求目標。
2. Exploit 函式
1 | def Exploit(url): |
Headers 設置:
suffix: 被設置為 “%>//“,這是一個 JSP 代碼片段,用來閉合現有的 JSP 腳本標籤,使得後續的惡意代碼可以被插入並執行。
c1: 設置為 “Runtime”,表示將在惡意代碼中調用 Java 的 Runtime 類來執行系統命令。
c2: 設置為 “<%”,這是一個 JSP 代碼片段,用來打開 JSP 腳本標籤。
DNT: 設置為 “1”,表示請求不希望被追蹤 (Do Not Track),這與漏洞利用無關,但有時候用來迷惑目標伺服器。
Content-Type: 設置為 “application/x-www-form-urlencoded”,指定了請求體的內容類型,這是 HTTP POST 請求中常用的表單數據編碼方式。
Payload (data):
這段 data 是核心的利用載荷,利用了 Spring Framework 的內部機制來覆蓋 pipeline 的日誌記錄配置。
具體來說,它修改了 class.module.classLoader.resources.context.parent.pipeline.first.pattern 屬性,插入惡意 JSP 代碼。
惡意代碼嘗試將用戶輸入的 cmd 參數作為系統命令執行,並將結果回傳給用戶。這個命令僅在 pwd=j 的條件下執行,以此作為簡單的認證機制。
JSP 文件最終被寫入到 Tomcat 的 webapps/ROOT 目錄中,文件名為 tomcatwar.jsp,因此可以通過訪問 /tomcatwar.jsp 來觸發這段惡意代碼。
請求邏輯:
利用 requests.post 發送載荷以觸發漏洞。
利用 requests.get 嘗試訪問剛剛寫入的 JSP 文件,以確認利用是否成功。
如果成功訪問該 JSP 文件,則表示漏洞被成功利用,程式會打印出後門地址,並附上用來驗證的命令 whoami。
3. Main 函式
1 | def main(): |
argparse 配置:
設置了兩個命令行選項:–url 用來指定單個目標 URL,–file 用來指定一個包含多個 URL 的文件。
程式會根據這些參數來決定是對單個 URL 還是批量 URL 進行漏洞利用。
批量利用:
- 如果指定了 –file,程式會讀取文件中的每一行,假設每一行是一個 URL,並對每個 URL 執行 Exploit 函數。
解析
這段代碼展示了如何利用 Spring 框架中的一個高危漏洞。以下是其中幾個關鍵點:
- Spring Framework 的 classLoader 繞過:
Spring Framework 使用了一個靈活但複雜的類加載機制來處理配置和依賴注入。攻擊者利用了這一點,通過傳遞特殊的 HTTP 請求來改變應用程序的內部配置。
在這個案例中,攻擊者將一段惡意的日誌模式設置傳遞給 pipeline.first.pattern,這使得應用在處理日誌的同時,將惡意代碼注入到 JSP 文件中。
- JSP 代碼注入:
JSP 是 Java 開發環境中用來生成動態網頁的技術,這裡被用來作為後門文件。利用者將惡意代碼插入 JSP 中,並在目標的 webapps/ROOT 目錄下生成這個 JSP 文件。
這樣一來,攻擊者便可以通過訪問這個 JSP 文件來執行任意系統命令,從而達到遠程控制受害系統的目的。
- 後門文件創建與檢測:
- 代碼邏輯設計得相當巧妙,利用標準的 HTTP 請求去生成並檢測後門 JSP 文件的存在。這讓攻擊者可以輕鬆地確認漏洞是否被成功利用,並快速進行下一步的攻擊操作。
- 安全性與防禦:
這種攻擊利用了應用框架層級的漏洞,僅僅依賴於傳統的邊界防禦(如防火牆)無法有效防禦這類攻擊。需要在應用程序層面進行嚴格的輸入驗證和安全配置管理,並對 Spring 等框架的安全更新保持敏感。
採用 Web Application Firewall (WAF)、監控異常 HTTP 請求模式,及時更新軟體和修補漏洞等措施,是防範此類攻