作者:知道創宇404實驗室
ActiveMQ 是 Apache 軟件基金會下的一個開源消息驅動中間件軟件。Jetty 是一個開源的 servlet 容器,它為基于 Java 的 web 容器,例如 JSP 和 servlet 提供運行環境。ActiveMQ 5.0 及以后版本默認集成了jetty。在啟動后提供一個監控 ActiveMQ 的 Web 應用。
2016年4月14日,國外安全研究人員 Simon Zuckerbraun 曝光 Apache ActiveMQ Fileserver 存在多個安全漏洞,可使遠程攻擊者用惡意代碼替代Web應用,在受影響系統上執行遠程代碼(CVE-2016-3088)。
ActiveMQ 中的 FileServer 服務允許用戶通過 HTTP PUT 方法上傳文件到指定目錄,下載 ActiveMQ 5.7.0 源碼 ,可以看到后臺處理 PUT 的關鍵代碼如下
用戶可以上傳文件到指定目錄,該路徑在 conf/jetty.xml
中定義,如下
有趣的是,我們偽造一個特殊的上傳路徑,可以爆出絕對路徑
順著 PUT 方法追蹤,可以看到調用了如下函數
同時看到后臺處理 MOVE 的關鍵代碼如下,可以看到該方法沒有對目的路徑做任何限制或者過濾。
由此,我們可以構造PUT請求上傳 webshell 到 fileserver 目錄,然后通過 Move 方法將其移動到有執行權限的 admin/ 目錄。
根據以上漏洞原理,我們可以想到多種利用姿勢。
(注:以下結果均在 ActiveMQ 5.7.0 中復現,復現過程中出現了 MOVE 方法利用很不穩定的情況。)
首先 PUT 一個 Jsp 的 Webshell 到 fileserver 目錄
在 fileserver/ 目錄中 Webshell 并沒有執行權限
爆一下絕對路徑
然后利用 MOVE 方法將 Webshell 移入 admin/ 目錄(也可以利用相對路徑)
訪問http://localhost:8161/admin/1.jsp?cmd=ls ,命令成功執行,效果如下
既然可以任意文件上傳和移動,很自然的可以想到上傳我們的 ssh 公鑰,從而實現 SSH 方式登錄。
首先生成密鑰對。(如果已存在則不需要)
然后上傳、移動到/root/.ssh/
并重命名為authorized_keys
之后直接ssh登錄即可。
漏洞影響版本:Apache ActiveMQ 5.x ~ 5.14.0
在 ZoomEye 上用 日期 和 ActiveMQ 作為關鍵詞檢索,分別探測了2015年1月1日(漏洞爆發前一年)和2017年1月1日(漏洞爆發后一年)互聯網上 ActiveMQ 的總量情況,如下。
可以看到,ActiveMQ的數量在漏洞爆發前后有很大幅度的減少,從這我們大致可以猜測漏洞爆發后很多ActiveMQ的Web服務限制了來自公網的訪問。
1、ActiveMQ Fileserver 的功能在 5.14.0 及其以后的版本中已被移除。建議用戶升級至 5.14.0 及其以后版本。
2、通過移除 conf\jetty.xml
的以下配置來禁用 ActiveMQ Fileserver 功能
[1] http://activemq.apache.org/security-advisories.data/CVE-2016-3088-announcement.txt
[2] https://www.seebug.org/vuldb/ssvid-96268