rmi远程反序列化rce漏洞_Apache Dubbo Provider默认反序列化远程代
背景
????近日,Apache Dubbo披露了Provider默認反序列化遠程代碼執行漏洞(CVE-2020-1948),攻擊者可構造惡意請求,從而執行任意代碼。具體信息如上圖所示。
????在官方郵件中,漏洞報告者還提供了官方的PoC腳本,感興趣的讀者可以自行抓包和學習。本文旨在復現漏洞,找出漏洞利用條件,提出漏洞修復方案。
dubbo基礎知識?簡 介?是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動注冊和發現。
?序列化協議既然是遠程過程調用,那必然會使用到Java的序列化和反序列化。Dubbo支持多種序列化協議,包括:1. dubbo 序列化?
2. hessian2 序列化?
3. json 序列化
4. Java 序列化
由于本文不是序列化相關文章,所以這里對這四種序列化方式不做過多解釋,只著重科普一下hessian2 序列化協議。?? hessian2反序列化攻擊利用分析?gadget分析
在marshalsec工具中,有4種針對該協議的gadgets:
1. SpringCompAdv?2. Resin3. ROME4. XBean在復現過程中,我們使用了rometools,所以這里只分析ROME,其他幾種方式會陸續分析。?
???ROME分析① 常規觸發條件(EqualsBean/ToStringBean)
1.?創建一個 EqualBean 對象,設置其obj屬性為一個 ToStringBean 的實例;將 ToStringBean 實例的beanClass,obj屬性設置為 JdbcRowSetImpl。2. 將最終的對象插入進一個集合中(此時會調用 hashCode()?)。3. 調用EqualBean的hashCode()?方法,觸發EqualBean obj屬性的 toString()?方法,這里即 ToStringBean 的 toString()?方法。4. 此 toString()?方法會調用其beanClass字段中全部 getter 方法,這里即是JdbcRowSetImpl 。其中getDatabaseMetaData()?方法會調用 connect()?方法,即通過 lookup方式觸發了RCE。注: JNDI注入參照參考鏈接5。②?觸發代碼(參照鏈接3)③ 觸發命令執行分析在1中總結了常規的觸發條件,可以根據這個條件來編寫如下EXP,為了進一步說明1中的常規觸發條件跟蹤調試一下該EXP,調用棧如下:
1. hessian2在處理map反序列化時調用了 MapDeserializer.java 的 readMap() 方法Dubbo
2. 在 readMap() 方法中又調用了hashMap的 put() 方法
3. 在 put() 方法中調用 hash(key) ,該函數會計算對象的hash,即調用了 EqualBean 的 hashCode() 方法。而此方法又會調用obj的 toString() 方法,即調用了 ToStringBean 中的?toString()?方法。
4. 在 toString() 方法中又調用了 beanClass 的全部getter方法,即調用了 JdbcRowSetImpl 中全部的getter方法。
5. 調用 JdbcRowSetImpl 中的 getDatabaseMetaData() 方法,進而調用 connect() 方法。
以上即是ROME Gadget的利用鏈。
環境搭建?● ○?環境搭建主要有兩種:1. 如鏈接1所示,構建 Dubbo Provider 和惡意的 Dubbo Consumer 。2. 如鏈接2所示,使用官方示例 dubbo-spring-boot-auto-configure-provider-sample 。這里為了方便,我使用的第一種環境搭建方式。復現過程?● ○?復現步驟如下:
1. 下載文件。其中 DubboModules 為服務提供方, dubboconsumer 為服務消費方,此項目使用JDK8,且為了能 夠使用ldap來進行JNDI注入,也需要選取指定版本的JDK8,否則可能導致復現不成功。
2. 導入idea中,這一步直接打開項目即可,但有些可能會遇到 Spring 配置文件相關問題,就需要各位自己踩坑了。
3. 開啟 zookeeper 服務,這一步各位自行谷歌解決,根據自己的配置對 provider.xml 進行修改。
4. 編寫惡意Java代碼,這里使用百年不變的彈計算器來演示。
5. 編譯惡意代碼生成class文件,需要使用被攻擊的目標Dubbo同樣JDK版本進行編譯。
6. 啟動http服務,此時應該啟動http服務的目錄應為惡意class文件所在的目錄?
7. 啟動ldap服務,這里為了方便使用 marshalsec這里有幾個點需要注意:1. 8000為啟動的HTTP服務監聽的端口
2. EvilObject為惡意class文件的名稱
3. 7777為ldap服務的監聽端口,應與exp文件中的端口對應
8. 運行惡意消費者,然后彈計算器成功
到此為止,復現了漏洞利用過程。有興趣的可以使用發現者提供的PoC去體驗一波,這里就不過多展開了,發現者的分析為鏈接6。漏洞利用與修復?● ○?? 漏洞利用總結
整個漏洞利用流程是很典型的反序列化利用流程,利用該類漏洞的難點在于找到gadgets chain。在上述復現過程中,我們構造了完整的服務消費者和服務提供者。根據漏洞報告者的文章,官方Exp如下所示:
在復現過程中,我們通過注冊中心獲取service信息并用來進行攻擊,所以我們實際上是利用了hessian 協議的漏洞,因為該序列化協議自身并沒有針對rometools的gadgets的防護。而dubbo出現此次漏洞的原因,根據官方修復可以推斷出是現在的版本沒有對進入的service方法進行簽名之類的驗證,所以不用獲取注冊中心權限以掌握service信息就可以實施攻擊。
??漏洞修復建議升級到dubbo最新版本,但官方提供的修復只是增加反序列化前的service name的判斷,如果能控制中間注冊中心還是會存在攻擊風險。
對hessian協議進行擴展,主流方法就是增加對應的黑名單過濾器,維護一個黑名單,過濾可以觸發gadget的類,如下圖所示,詳情可參照sofa-hessian(鏈接7)的處理。
1.?https://gist.github.com/OneSourceCat/01277dceba635eefbc010af36d3704d7
2.?https://www.mail-archive.com/dev@dubbo.apache.org/msg06544.html
3.?https://blog.csdn.net/u011721501/java/article/details/79443598
4.?https://www.jianshu.com/p/93c00a391e09
5.?https://www.mi1k7ea.com/2019/09/15/%E6%B5%85%E6%9E%90JNDI%E6%B3%A8%E5%85% A5/
6.?https://www.tuicool.com/articles/bYRveej
7.?https://github.com/sofastack/sofa-hessian
Thanks!
團隊簡介:
民生科技公司智能云技術部應用安全組,主要負責公司自營業務相關的安全規劃、安全建設,保障項目的安全開發和系統的安全運營。
目前團隊成員包括:李東,陳峰衛,安戰超
總結
以上是生活随笔為你收集整理的rmi远程反序列化rce漏洞_Apache Dubbo Provider默认反序列化远程代的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA中的那些名词解释
- 下一篇: Java数据库篇4——表的约束