1. 程式人生 > 其它 >Apache ActiveMQ 遠端程式碼執行漏洞 (CVE-2016-3088)分析

Apache ActiveMQ 遠端程式碼執行漏洞 (CVE-2016-3088)分析

作者:知道創宇404實驗室

發表時間:2017年7月7日

1. 背景概述

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)。

2. 原理分析

ActiveMQ 中的 FileServer 服務允許使用者通過 HTTP PUT 方法上傳檔案到指定目錄,下載 ActiveMQ 5.7.0 原始碼 ,可以看到後臺處理 PUT 的關鍵程式碼如下

使用者可以上傳檔案到指定目錄,該路徑在 conf/jetty.xml 中定義,如下

有趣的是,我們偽造一個特殊的上傳路徑,可以爆出絕對路徑

順著 PUT 方法追蹤,可以看到呼叫瞭如下函式

同時看到後臺處理 MOVE 的關鍵程式碼如下,可以看到該方法沒有對目的路徑做任何限制或者過濾。

由此,我們可以構造PUT請求上傳 webshell 到 fileserver 目錄,然後通過 Move 方法將其移動到有執行許可權的 admin/ 目錄。

3. 漏洞利用的多種姿勢

根據以上漏洞原理,我們可以想到多種利用姿勢。

(注:以下結果均在 ActiveMQ 5.7.0 中復現,復現過程中出現了 MOVE 方法利用很不穩定的情況。)

  • 上傳Webshell方式

首先 PUT 一個 Jsp 的 Webshell 到 fileserver 目錄

在 fileserver/ 目錄中 Webshell 並沒有執行許可權

爆一下絕對路徑

然後利用 MOVE 方法將 Webshell 移入 admin/ 目錄(也可以利用相對路徑)

訪問http://localhost:8161/admin/1.jsp?cmd=ls ,命令成功執行,效果如下

  • 上傳SSH公鑰方式

既然可以任意檔案上傳和移動,很自然的可以想到上傳我們的 ssh 公鑰,從而實現 SSH 方式登入。

首先生成金鑰對。(如果已存在則不需要)

然後上傳、移動到/root/.ssh/並重命名為authorized_keys

之後直接ssh登入即可。

4. 漏洞影響

漏洞影響版本:Apache ActiveMQ 5.x ~ 5.14.0

ZoomEye 上用 日期 和 ActiveMQ 作為關鍵詞檢索,分別探測了2015年1月1日(漏洞爆發前一年)和2017年1月1日(漏洞爆發後一年)網際網路上 ActiveMQ 的總量情況,如下。

可以看到,ActiveMQ的數量在漏洞爆發前後有很大幅度的減少,從這我們大致可以猜測漏洞爆發後很多ActiveMQ的Web服務限制了來自公網的訪問。

5. 漏洞防護方案

1、ActiveMQ Fileserver 的功能在 5.14.0 及其以後的版本中已被移除。建議使用者升級至 5.14.0 及其以後版本。

2、通過移除 confjetty.xml 的以下配置來禁用 ActiveMQ Fileserver 功能

6. 參考連結

1 http://activemq.apache.org/security-advisories.data/CVE-2016-3088-announcement.txt

2 https://www.seebug.org/vuldb/ssvid-96268